From f227e074f8126dfd1c642f6a3f34c5c14cc3d127 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 1 Dec 2025 18:12:22 +0300 Subject: [PATCH] Generalize list popup function --- src/DrawingProgram/DrawingProgram.cpp | 43 ++++++++++++++++----------- src/GUIStuff/GUIManager.cpp | 13 ++------ src/GUIStuff/GUIManager.hpp | 2 +- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index a40240d..8c0d6ed 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -226,27 +226,34 @@ void DrawingProgram::toolbar_gui() { t.gui.pop_id(); } +// Should only be used in selection allowing tools bool DrawingProgram::selection_action_menu(Vector2f popupPos) { Toolbar& t = world.main.toolbar; - // Paste objects action only works on selection allowing tools - std::vector>> actions; - actions.emplace_back("Paste Objects", [&]() { - selection.deselect_all(); - selection.paste_clipboard(popupPos); + bool shouldClose = false; + t.gui.list_popup_menu("Selection popup menu", popupPos, [&]() { + t.gui.text_label_light("Selection menu"); + if(t.gui.text_button_left_transparent("Paste", "Paste")) { + selection.deselect_all(); + selection.paste_clipboard(popupPos); + shouldClose = true; + } + if(selection.is_something_selected()) { + if(t.gui.text_button_left_transparent("Copy", "Copy")) { + selection.selection_to_clipboard(); + shouldClose = true; + } + if(t.gui.text_button_left_transparent("Cut", "Cut")) { + selection.selection_to_clipboard(); + selection.delete_all(); + shouldClose = true; + } + if(t.gui.text_button_left_transparent("Delete", "Delete")) { + selection.delete_all(); + shouldClose = true; + } + } }); - if(selection.is_something_selected()) { - actions.emplace_back("Copy Selection", [&]() { - selection.selection_to_clipboard(); - }); - actions.emplace_back("Cut Selection", [&]() { - selection.selection_to_clipboard(); - selection.delete_all(); - }); - actions.emplace_back("Delete Selection", [&]() { - selection.delete_all(); - }); - } - return !t.gui.action_list_popup_menu("General popup menu", popupPos, actions); + return !shouldClose; } bool DrawingProgram::right_click_popup_gui(Vector2f popupPos) { diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 562f284..7f8fcea 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -870,7 +870,7 @@ void GUIManager::paint_circle_popup_menu(const std::string& id, const Vector2f& pop_id(); } -bool GUIManager::action_list_popup_menu(const std::string& id, Vector2f popupPos, const std::vector>>& actions) { +void GUIManager::list_popup_menu(const std::string& id, Vector2f popupPos, const std::function& elemUpdate) { push_id(id); std::string& uniqueID = insert_any_with_id_with_function(0, [&]() { @@ -886,8 +886,6 @@ bool GUIManager::action_list_popup_menu(const std::string& id, Vector2f popupPos } } - bool toRet = false; - CLAY({ .id = clayID, .layout = { @@ -907,17 +905,10 @@ bool GUIManager::action_list_popup_menu(const std::string& id, Vector2f popupPos }) { obstructing_window(); push_id(1); - for(auto& [actionName, actionFunc] : actions) { - if(text_button_left_transparent(actionName, actionName)) { - actionFunc(); - toRet = true; - } - } + elemUpdate(); pop_id(); } pop_id(); - - return toRet; } void GUIManager::obstructing_window() { diff --git a/src/GUIStuff/GUIManager.hpp b/src/GUIStuff/GUIManager.hpp index 0f0b59c..29159f1 100644 --- a/src/GUIStuff/GUIManager.hpp +++ b/src/GUIStuff/GUIManager.hpp @@ -99,7 +99,7 @@ class GUIManager { void dropdown_select(const std::string& id, size_t* val, const std::vector& selections, float width = 200.0f, const std::function& hoverboxElemUpdate = nullptr); void paint_circle_popup_menu(const std::string& id, const Vector2f& centerPos, const PaintCircleMenu::Data& val, const std::function& elemUpdate = nullptr); - bool action_list_popup_menu(const std::string& id, Vector2f popupPos, const std::vector>>& actions); + void list_popup_menu(const std::string& id, Vector2f popupPos, const std::function& elemUpdate); void obstructing_window();