Add right click popup menu
This commit is contained in:
parent
903914c7ef
commit
359f20e7fd
35 changed files with 191 additions and 29 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<DrawingProgramToolBase> 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<std::chrono::steady_clock::time_point> badFrametimeTimePoint;
|
||||
std::optional<std::chrono::steady_clock::time_point> unorderedObjectsExistTimePoint;
|
||||
|
||||
bool selection_action_menu(Vector2f popupPos);
|
||||
|
||||
void client_erase_set(std::unordered_set<CollabListType::ObjectInfoPtr> erasedComponents); // The set might be modified while this is being called, so dont pass by reference
|
||||
|
||||
void check_delayed_update_timers();
|
||||
|
|
|
|||
|
|
@ -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<std::shared_ptr<DrawComponent>> 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);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@ class DrawingProgramSelection {
|
|||
void invalidate_cache_at_optional_aabb_before_pos(const std::optional<SCollision::AABB<WorldScalar>>& 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<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>&, std::vector<CollabListType::ObjectInfoPtr>&)> erase_select_objects_in_bvh_func(std::unordered_set<CollabListType::ObjectInfoPtr>& selectedComponents, const SCollision::ColliderCollection<float>& cC, const SCollision::ColliderCollection<WorldScalar>& cCWorld);
|
||||
void fully_collided_erase_select_objects_func(std::unordered_set<CollabListType::ObjectInfoPtr>& selectedComponents, const std::shared_ptr<DrawingProgramCacheBVHNode>& 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<CollabListType::ObjectInfoPtr>& newSelection);
|
||||
void add_to_selection(const std::unordered_set<CollabListType::ObjectInfoPtr>& newSelection);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<std::pair<std::string, std::function<void()>>>& actions) {
|
||||
push_id(id);
|
||||
|
||||
std::string& uniqueID = insert_any_with_id_with_function<std::string>(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<Clay_Color>(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;
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ class GUIManager {
|
|||
void dropdown_select(const std::string& id, size_t* val, const std::vector<std::string>& selections, float width = 200.0f, const std::function<void()>& hoverboxElemUpdate = nullptr);
|
||||
|
||||
void paint_circle_popup_menu(const std::string& id, const Vector2f& centerPos, const PaintCircleMenu::Data& val, const std::function<void()>& elemUpdate = nullptr);
|
||||
bool action_list_popup_menu(const std::string& id, Vector2f popupPos, const std::vector<std::pair<std::string, std::function<void()>>>& actions);
|
||||
|
||||
void obstructing_window();
|
||||
|
||||
|
|
|
|||
|
|
@ -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<float>() * 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<float>() * 0.5f), newRotationAngle - main.world->drawData.cam.c.rotation);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<void(const std::filesystem::path&, const ExtensionFilter& extensionSelected)> OpenFileSelectorCallback;
|
||||
void open_file_selector(const std::string& filePickerName, const std::vector<ExtensionFilter>& extensionFilters, OpenFileSelectorCallback postSelectionFunc, const std::string& fileName = "", bool isSaving = false);
|
||||
|
|
@ -84,7 +85,7 @@ class Toolbar {
|
|||
bool isUpdatingColorLeft = false;
|
||||
bool isUpdatingColorRight = false;
|
||||
|
||||
std::optional<Vector2f> paintPopupLocation;
|
||||
std::optional<Vector2f> 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();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue