Move retained popups to checked handles

This commit is contained in:
2026-06-15 19:33:06 +02:00
parent 168404433c
commit ce169a3fd6
6 changed files with 397 additions and 142 deletions

View File

@@ -10,6 +10,75 @@
namespace pp::panopainter {
namespace {
void close_legacy_overlay_handle_ignoring_status(
Node& anchor,
const pp::foundation::Result<pp::ui::NodeHandle>& overlay) noexcept
{
if (!overlay) {
return;
}
(void)close_legacy_overlay_node(anchor, overlay.value());
}
void close_legacy_overlay_handles_if_open(
Node& anchor,
const pp::foundation::Result<pp::ui::NodeHandle>& popup,
const pp::foundation::Result<pp::ui::NodeHandle>& tick) noexcept
{
if (popup) {
close_legacy_overlay_handle_ignoring_status(anchor, popup);
}
if (tick) {
close_legacy_overlay_handle_ignoring_status(anchor, tick);
}
}
struct CheckedPopupAndTickOverlays {
bool opened;
pp::foundation::Result<pp::ui::NodeHandle> popup;
pp::foundation::Result<pp::ui::NodeHandle> tick;
};
template <typename PopupT>
void set_popup_ticker_overlay_close_handler(
Node& anchor,
PopupT& popup,
const CheckedPopupAndTickOverlays& popup_and_tick) noexcept
{
popup.on_popup_close = [&anchor, popup_and_tick](Node*) {
close_legacy_overlay_handles_if_open(anchor, popup_and_tick.popup, popup_and_tick.tick);
};
}
CheckedPopupAndTickOverlays open_checked_popup_and_tick_overlays(
Node& anchor,
const std::shared_ptr<Node>& popup,
const std::shared_ptr<Node>& tick) noexcept
{
auto popup_overlay = open_legacy_overlay_node_with_handle(anchor, popup);
auto tick_overlay = open_legacy_overlay_node_with_handle(anchor, tick);
if (!popup_overlay || !tick_overlay) {
close_legacy_overlay_handles_if_open(anchor, popup_overlay, tick_overlay);
return { false, popup_overlay, tick_overlay };
}
return { true, popup_overlay, tick_overlay };
}
std::shared_ptr<NodeImage> create_checked_popup_tick(
Node& anchor,
const glm::vec2& tick_pos,
float anchor_height,
const glm::vec2& tick_sz) noexcept
{
auto tick = make_legacy_overlay_node_for_anchor<NodeImage>(anchor);
tick->SetPositioning(YGPositionTypeAbsolute);
tick->SetPosition(tick_pos.x, tick_pos.y + (anchor_height - tick_sz.y) * 0.5f);
tick->SetSize(tick_sz);
tick->set_image("data/ui/popup-tick.png");
tick->m_scale = { 1, 1 };
return tick;
}
class LegacyQuickUiServices final : public pp::app::QuickUiServices {
public:
LegacyQuickUiServices(NodePanelQuick& panel, const NodePanelQuick::MiniState* restore_state = nullptr) noexcept
@@ -84,20 +153,18 @@ private:
glm::vec2 tick_pos = button->m_pos + glm::vec2(button->m_size.x, 0);
glm::vec2 popup_pos = { tick_pos.x + tick_sz.x, tick_pos.y };
auto tick = make_legacy_overlay_node_for_anchor<NodeImage>(panel_);
tick->SetPositioning(YGPositionTypeAbsolute);
tick->SetPosition(tick_pos.x, tick_pos.y + (button->m_size.y - tick_sz.y) * 0.5f);
tick->SetSize(tick_sz);
tick->set_image("data/ui/popup-tick.png");
tick->m_scale = { 1, 1 };
(void)attach_legacy_overlay_node_to_root(panel_, tick);
auto tick = create_checked_popup_tick(panel_, tick_pos, button->m_size.y, tick_sz);
float hh = popup->m_container->m_children.size() > 10 ? (screen.y - 90.f) : 400.f;
popup->SetWidth(350);
popup->SetHeight(glm::max(hh, 400.f));
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(popup_pos);
(void)attach_legacy_overlay_node_to_root(panel_, popup);
const auto popup_overlays = open_checked_popup_and_tick_overlays(panel_, popup, tick);
if (!popup_overlays.opened) {
return;
}
panel_.root()->update();
popup->tick(0);
@@ -115,8 +182,7 @@ private:
popup->update();
activate_legacy_popup_overlay(*popup);
pp::panopainter::bind_legacy_popup_close_destroys_overlay(*popup, tick);
set_popup_ticker_overlay_close_handler(panel_, *popup, popup_overlays);
auto* panel = &panel_;
popup->on_brush_changed = [panel, button](Node*, std::shared_ptr<Brush>& b) {
@@ -141,17 +207,14 @@ private:
glm::vec2 tick_pos = target->m_pos + glm::vec2(target->m_size.x, 0);
glm::vec2 popup_pos = { tick_pos.x + tick_sz.x, tick_pos.y - 140.f };
auto tick = make_legacy_overlay_node_for_anchor<NodeImage>(panel_);
tick->SetPositioning(YGPositionTypeAbsolute);
tick->SetPosition(tick_pos.x, tick_pos.y + (target->m_size.y - tick_sz.y) * 0.5f);
tick->SetSize(tick_sz);
tick->set_image("data/ui/popup-tick.png");
tick->m_scale = { 1, 1 };
(void)attach_legacy_overlay_node_to_root(panel_, tick);
auto tick = create_checked_popup_tick(panel_, tick_pos, target->m_size.y, tick_sz);
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(popup_pos);
(void)attach_legacy_overlay_node_to_root(panel_, popup);
const auto popup_overlays = open_checked_popup_and_tick_overlays(panel_, popup, tick);
if (!popup_overlays.opened) {
return;
}
panel_.root()->update();
popup->tick(0);
@@ -172,7 +235,7 @@ private:
auto c = static_cast<NodeBorder*>(target->m_children[0].get());
panel_.m_picker->set_color(c->m_color);
pp::panopainter::bind_legacy_popup_close_destroys_overlay(*panel_.m_picker, tick);
set_popup_ticker_overlay_close_handler(panel_, *popup, popup_overlays);
auto* panel = &panel_;
panel_.m_picker->on_color_change = [panel, c](Node*, glm::vec3 rgb) {