diff --git a/src/DrawingProgram/BrushTool.cpp b/src/DrawingProgram/BrushTool.cpp index 8ecb044..681dabe 100644 --- a/src/DrawingProgram/BrushTool.cpp +++ b/src/DrawingProgram/BrushTool.cpp @@ -154,6 +154,12 @@ void BrushTool::gui_toolbox() { t.gui.pop_id(); } +bool BrushTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + bool BrushTool::prevent_undo_or_redo() { return controls.intermediateItem != nullptr; } diff --git a/src/DrawingProgram/BrushTool.hpp b/src/DrawingProgram/BrushTool.hpp index 796cdf9..86c5848 100644 --- a/src/DrawingProgram/BrushTool.hpp +++ b/src/DrawingProgram/BrushTool.hpp @@ -19,6 +19,7 @@ class BrushTool : public DrawingProgramToolBase { virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; virtual void tool_update() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index d600bad..2d1d0a1 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -188,6 +188,7 @@ void DrawingProgram::clear_draw_cache() { void DrawingProgram::toolbar_gui() { Toolbar& t = world.main.toolbar; + t.gui.push_id("Drawing Program Toolbar GUI"); CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0)}, @@ -222,6 +223,26 @@ void DrawingProgram::toolbar_gui() { if(t.gui.big_color_button("Background Color", &controls.backgroundColor, &controls.backgroundColor == t.colorLeft)) t.color_selector_left(&controls.backgroundColor == t.colorLeft ? nullptr : &controls.backgroundColor); } + t.gui.pop_id(); +} + +bool DrawingProgram::selection_action_menu(Vector2f popupPos) { + Toolbar& t = world.main.toolbar; + // Paste objects action only works on selection allowing tools + return !t.gui.action_list_popup_menu("General popup menu", popupPos, { + {"Paste Objects", [&]() { + selection.deselect_all(); + selection.paste_clipboard(popupPos); + }} + }); +} + +bool DrawingProgram::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = world.main.toolbar; + t.gui.push_id("Drawing Program right click GUI"); + bool toRet = drawTool->right_click_popup_gui(popupPos); + t.gui.pop_id(); + return toRet; } void DrawingProgram::tool_options_gui() { @@ -295,7 +316,7 @@ void DrawingProgram::update() { controls.leftClick = controls.cursorHoveringOverCanvas && world.main.input.mouse.leftClicks; if(controls.leftClick) { controls.leftClickHeld = true; - world.main.toolbar.paintPopupLocation = std::nullopt; + world.main.toolbar.rightClickPopupLocation = std::nullopt; } if(controls.leftClickHeld && !world.main.input.mouse.leftDown) { controls.leftClick = false; @@ -307,7 +328,7 @@ void DrawingProgram::update() { bool middleHeld = world.main.input.mouse.middleDown || world.main.input.pen.buttons[world.main.toolbar.tabletOptions.middleClickButton].held; if(controls.middleClick) { controls.middleClickHeld = true; - world.main.toolbar.paintPopupLocation = std::nullopt; + world.main.toolbar.rightClickPopupLocation = std::nullopt; } if(controls.middleClickHeld && !middleHeld) { controls.middleClick = false; @@ -316,10 +337,10 @@ void DrawingProgram::update() { } if(controls.cursorHoveringOverCanvas && (world.main.input.mouse.rightClicks || world.main.input.pen.buttons[world.main.toolbar.tabletOptions.rightClickButton].pressed)) { - if(world.main.toolbar.paintPopupLocation) - world.main.toolbar.paintPopupLocation = std::nullopt; + if(world.main.toolbar.rightClickPopupLocation) + world.main.toolbar.rightClickPopupLocation = std::nullopt; else - world.main.toolbar.paintPopupLocation = world.main.input.mouse.pos / world.main.toolbar.final_gui_scale(); + world.main.toolbar.rightClickPopupLocation = world.main.input.mouse.pos / world.main.toolbar.final_gui_scale(); } controls.previousMouseWorldPos = controls.currentMouseWorldPos; @@ -385,12 +406,14 @@ bool DrawingProgram::is_selection_allowing_tool(DrawingProgramToolType typeToChe void DrawingProgram::switch_to_tool_ptr(std::unique_ptr newTool) { drawTool->switch_tool(newTool->get_type()); drawTool = std::move(newTool); + world.main.toolbar.rightClickPopupLocation = std::nullopt; } void DrawingProgram::switch_to_tool(DrawingProgramToolType newToolType, bool force) { if(newToolType != drawTool->get_type() || force) { drawTool->switch_tool(newToolType); drawTool = DrawingProgramToolBase::allocate_tool_type(*this, newToolType); + world.main.toolbar.rightClickPopupLocation = std::nullopt; } } diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 08a464a..8f6383e 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -25,6 +25,7 @@ class DrawingProgram { void init_client_callbacks(); void toolbar_gui(); void tool_options_gui(); + bool right_click_popup_gui(Vector2f popupPos); void update(); void scale_up(const WorldScalar& scaleUpAmount); void draw(SkCanvas* canvas, const DrawData& drawData); @@ -68,6 +69,8 @@ class DrawingProgram { std::optional badFrametimeTimePoint; std::optional unorderedObjectsExistTimePoint; + bool selection_action_menu(Vector2f popupPos); + void client_erase_set(std::unordered_set erasedComponents); // The set might be modified while this is being called, so dont pass by reference void check_delayed_update_timers(); diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index bdffc1a..f141335 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -383,11 +383,11 @@ void DrawingProgramSelection::update() { } else if(drawP.world.main.input.key(InputManager::KEY_PASTE).pressed) { deselect_all(); - paste_clipboard(); + paste_clipboard(drawP.world.main.input.mouse.pos); } } else if(drawP.world.main.input.key(InputManager::KEY_PASTE).pressed && !drawP.prevent_undo_or_redo()) - paste_clipboard(); + paste_clipboard(drawP.world.main.input.mouse.pos); else if(drawP.world.main.input.key(InputManager::KEY_GENERIC_ESCAPE).pressed) drawP.switch_to_tool(DrawingProgramToolType::EDIT, true); } @@ -396,14 +396,15 @@ bool DrawingProgramSelection::is_being_transformed() { return transformOpHappening != TransformOperation::NONE; } -void DrawingProgramSelection::paste_clipboard() { +void DrawingProgramSelection::paste_clipboard(Vector2f pasteScreenPos) { auto& clipboard = drawP.world.main.clipboard; - drawP.switch_to_tool(DrawingProgramToolType::RECTSELECT); + if(!drawP.is_selection_allowing_tool(drawP.drawTool->get_type())) + drawP.switch_to_tool(DrawingProgramToolType::EDIT); uint64_t allPlacement = drawP.components.client_list().size(); std::vector> placedComponents; - WorldVec mousePos = drawP.world.get_mouse_world_pos(); + WorldVec mousePos = drawP.world.drawData.cam.c.from_space(pasteScreenPos); WorldVec moveVec = drawP.world.main.clipboard.pos - mousePos; WorldMultiplier scaleMultiplier = WorldMultiplier(drawP.world.main.clipboard.inverseScale) / WorldMultiplier(drawP.world.drawData.cam.c.inverseScale); WorldScalar scaleLimit(0.001); diff --git a/src/DrawingProgram/DrawingProgramSelection.hpp b/src/DrawingProgram/DrawingProgramSelection.hpp index 0218d07..672ed63 100644 --- a/src/DrawingProgram/DrawingProgramSelection.hpp +++ b/src/DrawingProgram/DrawingProgramSelection.hpp @@ -27,6 +27,9 @@ class DrawingProgramSelection { void invalidate_cache_at_optional_aabb_before_pos(const std::optional>& aabb, uint64_t placementToInvalidateAt); void clear_own_cached_surfaces(); void preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck); + + void selection_to_clipboard(); + void paste_clipboard(Vector2f pasteScreenPos); private: std::function&, std::vector&)> erase_select_objects_in_bvh_func(std::unordered_set& selectedComponents, const SCollision::ColliderCollection& cC, const SCollision::ColliderCollection& cCWorld); void fully_collided_erase_select_objects_func(std::unordered_set& selectedComponents, const std::shared_ptr& bvhNode); @@ -36,8 +39,6 @@ class DrawingProgramSelection { bool mouse_collided_with_scale_point(); bool mouse_collided_with_rotate_center_handle_point(); bool mouse_collided_with_rotate_handle_point(); - void selection_to_clipboard(); - void paste_clipboard(); void set_to_selection(const std::unordered_set& newSelection); void add_to_selection(const std::unordered_set& newSelection); diff --git a/src/DrawingProgram/DrawingProgramToolBase.hpp b/src/DrawingProgram/DrawingProgramToolBase.hpp index 31788cc..beec85d 100644 --- a/src/DrawingProgram/DrawingProgramToolBase.hpp +++ b/src/DrawingProgram/DrawingProgramToolBase.hpp @@ -27,6 +27,7 @@ class DrawingProgramToolBase { DrawingProgramToolBase(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() = 0; virtual void gui_toolbox() = 0; + virtual bool right_click_popup_gui(Vector2f popupPos) = 0; virtual void tool_update() = 0; virtual void draw(SkCanvas* canvas, const DrawData& drawData) = 0; virtual void switch_tool(DrawingProgramToolType newTool) = 0; diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index 05e8619..4141e8b 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -41,6 +41,10 @@ void EditTool::gui_toolbox() { } } +bool EditTool::right_click_popup_gui(Vector2f popupPos) { + return drawP.selection_action_menu(popupPos); +} + void EditTool::add_point_handle(const HandleData& handle) { controls.pointHandles.emplace_back(handle); } diff --git a/src/DrawingProgram/EditTool.hpp b/src/DrawingProgram/EditTool.hpp index 361abf1..25c6351 100644 --- a/src/DrawingProgram/EditTool.hpp +++ b/src/DrawingProgram/EditTool.hpp @@ -20,6 +20,7 @@ class EditTool : public DrawingProgramToolBase { EditTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; diff --git a/src/DrawingProgram/EllipseDrawTool.cpp b/src/DrawingProgram/EllipseDrawTool.cpp index 289f8e7..73c8282 100644 --- a/src/DrawingProgram/EllipseDrawTool.cpp +++ b/src/DrawingProgram/EllipseDrawTool.cpp @@ -32,6 +32,12 @@ void EllipseDrawTool::gui_toolbox() { t.gui.pop_id(); } +bool EllipseDrawTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void EllipseDrawTool::switch_tool(DrawingProgramToolType newTool) { commit(); } diff --git a/src/DrawingProgram/EllipseDrawTool.hpp b/src/DrawingProgram/EllipseDrawTool.hpp index becd1cc..02cca2b 100644 --- a/src/DrawingProgram/EllipseDrawTool.hpp +++ b/src/DrawingProgram/EllipseDrawTool.hpp @@ -11,6 +11,7 @@ class EllipseDrawTool : public DrawingProgramToolBase { EllipseDrawTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; diff --git a/src/DrawingProgram/EraserTool.cpp b/src/DrawingProgram/EraserTool.cpp index 0130239..1a73521 100644 --- a/src/DrawingProgram/EraserTool.cpp +++ b/src/DrawingProgram/EraserTool.cpp @@ -20,6 +20,12 @@ void EraserTool::gui_toolbox() { t.gui.pop_id(); } +bool EraserTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void EraserTool::switch_tool(DrawingProgramToolType newTool) { if(!erasedComponents.empty()) { DrawingProgramCache::move_components_from_bvh_nodes_to_set(erasedComponents, erasedBVHNodes); diff --git a/src/DrawingProgram/EraserTool.hpp b/src/DrawingProgram/EraserTool.hpp index 6ae6032..e521ab7 100644 --- a/src/DrawingProgram/EraserTool.hpp +++ b/src/DrawingProgram/EraserTool.hpp @@ -11,6 +11,7 @@ class EraserTool : public DrawingProgramToolBase { EraserTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; diff --git a/src/DrawingProgram/EyeDropperTool.cpp b/src/DrawingProgram/EyeDropperTool.cpp index f141346..3fde576 100644 --- a/src/DrawingProgram/EyeDropperTool.cpp +++ b/src/DrawingProgram/EyeDropperTool.cpp @@ -39,6 +39,12 @@ void EyeDropperTool::gui_toolbox() { t.gui.pop_id(); } +bool EyeDropperTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void EyeDropperTool::tool_update() { if(drawP.controls.leftClick) { SkSurfaceProps props; diff --git a/src/DrawingProgram/EyeDropperTool.hpp b/src/DrawingProgram/EyeDropperTool.hpp index ff31c73..6dc5913 100644 --- a/src/DrawingProgram/EyeDropperTool.hpp +++ b/src/DrawingProgram/EyeDropperTool.hpp @@ -8,6 +8,7 @@ class EyeDropperTool : public DrawingProgramToolBase { EyeDropperTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; diff --git a/src/DrawingProgram/GridModifyTool.cpp b/src/DrawingProgram/GridModifyTool.cpp index b276667..e9e2fbd 100644 --- a/src/DrawingProgram/GridModifyTool.cpp +++ b/src/DrawingProgram/GridModifyTool.cpp @@ -76,6 +76,12 @@ void GridModifyTool::gui_toolbox() { t.gui.pop_id(); } +bool GridModifyTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void GridModifyTool::tool_update() { auto gridFoundIt = drawP.world.gridMan.grids.find(gridID); if(gridFoundIt != drawP.world.gridMan.grids.end()) { diff --git a/src/DrawingProgram/GridModifyTool.hpp b/src/DrawingProgram/GridModifyTool.hpp index 06b603f..2801cef 100644 --- a/src/DrawingProgram/GridModifyTool.hpp +++ b/src/DrawingProgram/GridModifyTool.hpp @@ -10,6 +10,7 @@ class GridModifyTool : public DrawingProgramToolBase { void set_grid_id(ServerClientID newGridID); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; diff --git a/src/DrawingProgram/LassoSelectTool.cpp b/src/DrawingProgram/LassoSelectTool.cpp index 034d36b..cbb9ff7 100644 --- a/src/DrawingProgram/LassoSelectTool.cpp +++ b/src/DrawingProgram/LassoSelectTool.cpp @@ -42,6 +42,10 @@ void LassoSelectTool::gui_toolbox() { drawP.world.main.toolbar.gui.text_label_centered("Lasso Select"); } +bool LassoSelectTool::right_click_popup_gui(Vector2f popupPos) { + return drawP.selection_action_menu(popupPos); +} + void LassoSelectTool::switch_tool(DrawingProgramToolType newTool) { if(!drawP.is_selection_allowing_tool(newTool)) drawP.selection.deselect_all(); diff --git a/src/DrawingProgram/LassoSelectTool.hpp b/src/DrawingProgram/LassoSelectTool.hpp index 0915888..2c975f8 100644 --- a/src/DrawingProgram/LassoSelectTool.hpp +++ b/src/DrawingProgram/LassoSelectTool.hpp @@ -13,6 +13,7 @@ class LassoSelectTool : public DrawingProgramToolBase { LassoSelectTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void switch_tool(DrawingProgramToolType newTool) override; diff --git a/src/DrawingProgram/PanCanvasTool.cpp b/src/DrawingProgram/PanCanvasTool.cpp index 7ea66e7..ca51816 100644 --- a/src/DrawingProgram/PanCanvasTool.cpp +++ b/src/DrawingProgram/PanCanvasTool.cpp @@ -21,6 +21,10 @@ void PanCanvasTool::gui_toolbox() { t.gui.pop_id(); } +bool PanCanvasTool::right_click_popup_gui(Vector2f popupPos) { + return drawP.selection_action_menu(popupPos); +} + void PanCanvasTool::tool_update() { } diff --git a/src/DrawingProgram/PanCanvasTool.hpp b/src/DrawingProgram/PanCanvasTool.hpp index 6ca579d..9848499 100644 --- a/src/DrawingProgram/PanCanvasTool.hpp +++ b/src/DrawingProgram/PanCanvasTool.hpp @@ -8,6 +8,7 @@ class PanCanvasTool : public DrawingProgramToolBase { PanCanvasTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; diff --git a/src/DrawingProgram/RectDrawTool.cpp b/src/DrawingProgram/RectDrawTool.cpp index be043e9..42b328d 100644 --- a/src/DrawingProgram/RectDrawTool.cpp +++ b/src/DrawingProgram/RectDrawTool.cpp @@ -26,6 +26,12 @@ void RectDrawTool::gui_toolbox() { t.gui.pop_id(); } +bool RectDrawTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void RectDrawTool::switch_tool(DrawingProgramToolType newTool) { commit_rectangle(); controls.drawStage = 0; diff --git a/src/DrawingProgram/RectDrawTool.hpp b/src/DrawingProgram/RectDrawTool.hpp index 24dab98..73c7ab6 100644 --- a/src/DrawingProgram/RectDrawTool.hpp +++ b/src/DrawingProgram/RectDrawTool.hpp @@ -11,6 +11,7 @@ class RectDrawTool : public DrawingProgramToolBase { RectDrawTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; diff --git a/src/DrawingProgram/RectSelectTool.cpp b/src/DrawingProgram/RectSelectTool.cpp index 2c79acd..b5d86b7 100644 --- a/src/DrawingProgram/RectSelectTool.cpp +++ b/src/DrawingProgram/RectSelectTool.cpp @@ -20,6 +20,10 @@ void RectSelectTool::gui_toolbox() { drawP.world.main.toolbar.gui.text_label_centered("Rectangle Select"); } +bool RectSelectTool::right_click_popup_gui(Vector2f popupPos) { + return drawP.selection_action_menu(popupPos); +} + void RectSelectTool::switch_tool(DrawingProgramToolType newTool) { if(!drawP.is_selection_allowing_tool(newTool)) drawP.selection.deselect_all(); diff --git a/src/DrawingProgram/RectSelectTool.hpp b/src/DrawingProgram/RectSelectTool.hpp index 20465e1..e2bc60f 100644 --- a/src/DrawingProgram/RectSelectTool.hpp +++ b/src/DrawingProgram/RectSelectTool.hpp @@ -11,6 +11,7 @@ class RectSelectTool : public DrawingProgramToolBase { RectSelectTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void switch_tool(DrawingProgramToolType newTool) override; diff --git a/src/DrawingProgram/ScreenshotTool.cpp b/src/DrawingProgram/ScreenshotTool.cpp index 05e9834..1ac43c7 100644 --- a/src/DrawingProgram/ScreenshotTool.cpp +++ b/src/DrawingProgram/ScreenshotTool.cpp @@ -111,6 +111,12 @@ void ScreenshotTool::gui_toolbox() { t.gui.pop_id(); } +bool ScreenshotTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void ScreenshotTool::take_screenshot(const std::filesystem::path& filePath) { if(controls.imageSize.x() <= 0 || controls.imageSize.y() <= 0) { std::cout << "[ScreenshotTool::take_screenshot] Image size is 0 or negative" << std::endl; diff --git a/src/DrawingProgram/ScreenshotTool.hpp b/src/DrawingProgram/ScreenshotTool.hpp index 36c1c0d..a24cfc9 100644 --- a/src/DrawingProgram/ScreenshotTool.hpp +++ b/src/DrawingProgram/ScreenshotTool.hpp @@ -12,6 +12,7 @@ class ScreenshotTool : public DrawingProgramToolBase { ScreenshotTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void switch_tool(DrawingProgramToolType newTool) override; diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index 5060703..ad92844 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -24,6 +24,12 @@ void TextBoxTool::gui_toolbox() { t.gui.pop_id(); } +bool TextBoxTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + void TextBoxTool::switch_tool(DrawingProgramToolType newTool) { commit(); controls.drawStage = 0; diff --git a/src/DrawingProgram/TextBoxTool.hpp b/src/DrawingProgram/TextBoxTool.hpp index 266546d..7696e1e 100644 --- a/src/DrawingProgram/TextBoxTool.hpp +++ b/src/DrawingProgram/TextBoxTool.hpp @@ -11,6 +11,7 @@ class TextBoxTool : public DrawingProgramToolBase { TextBoxTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void switch_tool(DrawingProgramToolType newTool) override; diff --git a/src/DrawingProgram/ZoomCanvasTool.cpp b/src/DrawingProgram/ZoomCanvasTool.cpp index b27a8a7..af56e08 100644 --- a/src/DrawingProgram/ZoomCanvasTool.cpp +++ b/src/DrawingProgram/ZoomCanvasTool.cpp @@ -21,6 +21,10 @@ void ZoomCanvasTool::gui_toolbox() { t.gui.pop_id(); } +bool ZoomCanvasTool::right_click_popup_gui(Vector2f popupPos) { + return drawP.selection_action_menu(popupPos); +} + void ZoomCanvasTool::tool_update() { } diff --git a/src/DrawingProgram/ZoomCanvasTool.hpp b/src/DrawingProgram/ZoomCanvasTool.hpp index 13f268e..8545918 100644 --- a/src/DrawingProgram/ZoomCanvasTool.hpp +++ b/src/DrawingProgram/ZoomCanvasTool.hpp @@ -8,6 +8,7 @@ class ZoomCanvasTool : public DrawingProgramToolBase { ZoomCanvasTool(DrawingProgram& initDrawP); virtual DrawingProgramToolType get_type() override; virtual void gui_toolbox() override; + virtual bool right_click_popup_gui(Vector2f popupPos) override; virtual void tool_update() override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index f802fc1..562f284 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -870,6 +870,56 @@ 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) { + push_id(id); + + std::string& uniqueID = insert_any_with_id_with_function(0, [&]() { + return get_clay_unique_id(); + }); + + Clay_ElementId clayID = Clay_GetElementId(strArena.std_str_to_clay_str(uniqueID)); + Clay_ElementData actionListElemData = Clay_GetElementData(clayID); + + if(actionListElemData.found) { + if((popupPos.y() + actionListElemData.boundingBox.height) > windowSize.y()) { + popupPos.y() -= actionListElemData.boundingBox.height; + } + } + + bool toRet = false; + + CLAY({ + .id = clayID, + .layout = { + .sizing = {.width = CLAY_SIZING_FIT(100), .height = CLAY_SIZING_FIT(0)}, + .padding = CLAY_PADDING_ALL(io->theme->padding1), + .childGap = 1, + .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, + .layoutDirection = CLAY_TOP_TO_BOTTOM + }, + .backgroundColor = convert_vec4(io->theme->backColor1), + .cornerRadius = CLAY_CORNER_RADIUS(io->theme->windowCorners1), + .floating = { + .offset = {popupPos.x(), popupPos.y()}, + .zIndex = -1, + .attachTo = CLAY_ATTACH_TO_ROOT + } + }) { + obstructing_window(); + push_id(1); + for(auto& [actionName, actionFunc] : actions) { + if(text_button_left_transparent(actionName, actionName)) { + actionFunc(); + toRet = true; + } + } + pop_id(); + } + pop_id(); + + return toRet; +} + void GUIManager::obstructing_window() { if(Clay_Hovered()) io->hoverObstructed = true; diff --git a/src/GUIStuff/GUIManager.hpp b/src/GUIStuff/GUIManager.hpp index fc852bb..0f0b59c 100644 --- a/src/GUIStuff/GUIManager.hpp +++ b/src/GUIStuff/GUIManager.hpp @@ -99,6 +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 obstructing_window(); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 49cf69c..744b3a4 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -390,12 +390,15 @@ void Toolbar::update() { } if(io->hoverObstructed && (io->mouse.leftClick || io->mouse.rightClick)) - paintPopupLocation = std::nullopt; + rightClickPopupLocation = std::nullopt; - paint_popup(); + if(rightClickPopupLocation.has_value()) { + if(!main.world->drawProg.right_click_popup_gui(rightClickPopupLocation.value())) + rightClickPopupLocation = std::nullopt; + } if(io->hoverObstructed && io->mouse.rightClick) // This runs specifically if the paint popup has the cursor - paintPopupLocation = std::nullopt; + rightClickPopupLocation = std::nullopt; end_gui(); @@ -428,18 +431,16 @@ void Toolbar::save_as_func() { #endif } -void Toolbar::paint_popup() { - if(paintPopupLocation) { - double newRotationAngle = 0.0; - gui.paint_circle_popup_menu("paint circle popup", paintPopupLocation.value(), { - .currentRotationAngle = main.world->drawData.cam.c.rotation, - .newRotationAngle = &newRotationAngle, - .selectedColor = main.world->drawProg.get_foreground_color_ptr(), - .palette = paletteData.palettes[paletteData.selectedPalette].colors - }); - if(newRotationAngle != main.world->drawData.cam.c.rotation) { - main.world->drawData.cam.c.rotate_about(main.world->drawData.cam.c.from_space(main.window.size.cast() * 0.5f), newRotationAngle - main.world->drawData.cam.c.rotation); - } +void Toolbar::paint_popup(Vector2f popupPos) { + double newRotationAngle = 0.0; + gui.paint_circle_popup_menu("paint circle popup", popupPos, { + .currentRotationAngle = main.world->drawData.cam.c.rotation, + .newRotationAngle = &newRotationAngle, + .selectedColor = main.world->drawProg.get_foreground_color_ptr(), + .palette = paletteData.palettes[paletteData.selectedPalette].colors + }); + if(newRotationAngle != main.world->drawData.cam.c.rotation) { + main.world->drawData.cam.c.rotate_about(main.world->drawData.cam.c.from_space(main.window.size.cast() * 0.5f), newRotationAngle - main.world->drawData.cam.c.rotation); } } diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index de3184a..f0b88e0 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -46,6 +46,7 @@ class Toolbar { void draw(SkCanvas* canvas); void color_selector_left(Vector4f* color); void color_selector_right(Vector4f* color); + void paint_popup(Vector2f popupPos); typedef std::function OpenFileSelectorCallback; void open_file_selector(const std::string& filePickerName, const std::vector& extensionFilters, OpenFileSelectorCallback postSelectionFunc, const std::string& fileName = "", bool isSaving = false); @@ -84,7 +85,7 @@ class Toolbar { bool isUpdatingColorLeft = false; bool isUpdatingColorRight = false; - std::optional paintPopupLocation; + std::optional rightClickPopupLocation; bool flipZoomToolDirection = false; @@ -111,7 +112,6 @@ class Toolbar { void open_world_file(int conType, const std::string& netSource, const std::string& serverLocalID); void load_default_palette(); void load_default_theme(); - void paint_popup(); void about_menu_gui(); void web_version_welcome();