diff --git a/libs/ui/include/psemek/ui/rich_image_view.hpp b/libs/ui/include/psemek/ui/rich_image_view.hpp index a324e037..ae1c02c4 100644 --- a/libs/ui/include/psemek/ui/rich_image_view.hpp +++ b/libs/ui/include/psemek/ui/rich_image_view.hpp @@ -53,6 +53,8 @@ namespace psemek::ui bool mouseover_ = false; std::optional> mouse_; std::optional> drag_; + + void post_region_changed(); }; } diff --git a/libs/ui/source/rich_image_view.cpp b/libs/ui/source/rich_image_view.cpp index 593ace71..459614ed 100644 --- a/libs/ui/source/rich_image_view.cpp +++ b/libs/ui/source/rich_image_view.cpp @@ -8,8 +8,7 @@ namespace psemek::ui void rich_image_view::set_image(std::shared_ptr image) { image_ = std::move(image); - element::reshape(); - on_region_changed(); + post_reshape(); } void rich_image_view::set_zoom_range(geom::interval range) @@ -35,7 +34,7 @@ namespace psemek::ui center_ = geom::clamp(center_, b); } - on_region_changed(); + post_region_changed(); } void rich_image_view::set_zoom(float zoom) @@ -135,7 +134,7 @@ namespace psemek::ui void rich_image_view::reshape(geom::box const & bbox) { shape_.box = bbox; - on_region_changed(); + post_region_changed(); } void rich_image_view::draw(painter & p) const @@ -171,4 +170,14 @@ namespace psemek::ui } } + void rich_image_view::post_region_changed() + { + auto weak_self = std::weak_ptr{std::dynamic_pointer_cast(shared_from_this())}; + post([weak_self]{ + auto self = weak_self.lock(); + if (!self) return; + self->on_region_changed(); + }); + } + }