From 49b58f76c506f490941cff4a93bbd1d9dc5320b3 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 5 Mar 2021 12:29:31 +0300 Subject: [PATCH] UI: rich_image_view use loop instead of calling reshape & region_changed directly --- libs/ui/include/psemek/ui/rich_image_view.hpp | 2 ++ libs/ui/source/rich_image_view.cpp | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) 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(); + }); + } + }