Move retained popups to checked handles
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user