diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ddd7de..59cc691 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,7 @@ set(sources "src/main.cpp" "src/DrawingProgram/ScreenshotTool.cpp" "src/DrawingProgram/EditTool.cpp" "src/DrawingProgram/ImageEditTool.cpp" + "src/DrawingProgram/GridModifyTool.cpp" "src/DrawingProgram/DrawingProgramSelection.cpp" "src/DrawingProgram/DrawingProgramEditToolBase.cpp" "src/DrawingProgram/DrawingProgramToolBase.cpp" diff --git a/data/icons/eyeclose.svg b/data/icons/eyeclose.svg new file mode 100644 index 0000000..698bb1e --- /dev/null +++ b/data/icons/eyeclose.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + diff --git a/data/icons/eyeopen.svg b/data/icons/eyeopen.svg new file mode 100644 index 0000000..4238cba --- /dev/null +++ b/data/icons/eyeopen.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 7231e9d..e51f4cd 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -6,6 +6,7 @@ #include "../DrawComponents/DrawComponent.hpp" #include "EllipseDrawTool.hpp" #include "EyeDropperTool.hpp" +#include "GridModifyTool.hpp" #include "../InputManager.hpp" #include "../SharedTypes.hpp" #include "../Server/CommandList.hpp" @@ -231,6 +232,17 @@ void DrawingProgram::tool_options_gui() { } } +void DrawingProgram::modify_grid(const std::string& gridToModifyName) { + if(world.gridMan.grids.contains(gridToModifyName)) { + if(drawTool->get_type() != DrawingProgramToolType::GRIDMODIFY) + switch_to_tool(DrawingProgramToolType::GRIDMODIFY); + GridModifyTool* gridModToolPtr = static_cast(drawTool.get()); + gridModToolPtr->set_grid_name(gridToModifyName); + } + else if(drawTool->get_type() == DrawingProgramToolType::GRIDMODIFY) + switch_to_tool(DrawingProgramToolType::EDIT); +} + void DrawingProgram::update() { if(world.main.window.lastFrameTime > std::chrono::milliseconds(33)) { // Around 30FPS if(!badFrametimeTimePoint) diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 971332c..f914ead 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -55,6 +55,8 @@ class DrawingProgram { void switch_to_tool_ptr(std::unique_ptr newTool); void clear_draw_cache(); + + void modify_grid(const std::string& gridToModifyName); private: std::optional badFrametimeTimePoint; std::optional unorderedObjectsExistTimePoint; @@ -122,4 +124,5 @@ class DrawingProgram { friend class DrawingProgramCache; friend class DrawingProgramSelection; friend class LassoSelectTool; + friend class GridEditTool; }; diff --git a/src/DrawingProgram/DrawingProgramToolBase.cpp b/src/DrawingProgram/DrawingProgramToolBase.cpp index 0ddd6da..7c537ca 100644 --- a/src/DrawingProgram/DrawingProgramToolBase.cpp +++ b/src/DrawingProgram/DrawingProgramToolBase.cpp @@ -10,6 +10,7 @@ #include "EyeDropperTool.hpp" #include "ScreenshotTool.hpp" #include "EditTool.hpp" +#include "GridModifyTool.hpp" DrawingProgramToolBase::DrawingProgramToolBase(DrawingProgram& initDrawP): drawP(initDrawP) @@ -37,6 +38,8 @@ std::unique_ptr DrawingProgramToolBase::allocate_tool_ty return std::make_unique(drawP); case DrawingProgramToolType::SCREENSHOT: return std::make_unique(drawP); + case DrawingProgramToolType::GRIDMODIFY: + return std::make_unique(drawP); case DrawingProgramToolType::EDIT: return std::make_unique(drawP); } diff --git a/src/DrawingProgram/DrawingProgramToolBase.hpp b/src/DrawingProgram/DrawingProgramToolBase.hpp index 2f173ec..976501b 100644 --- a/src/DrawingProgram/DrawingProgramToolBase.hpp +++ b/src/DrawingProgram/DrawingProgramToolBase.hpp @@ -16,6 +16,7 @@ enum class DrawingProgramToolType : int { TEXTBOX, EYEDROPPER, SCREENSHOT, + GRIDMODIFY, EDIT }; diff --git a/src/DrawingProgram/GridModifyTool.cpp b/src/DrawingProgram/GridModifyTool.cpp new file mode 100644 index 0000000..094c210 --- /dev/null +++ b/src/DrawingProgram/GridModifyTool.cpp @@ -0,0 +1,38 @@ +#include "GridModifyTool.hpp" +#include "DrawingProgram.hpp" +#include "../MainProgram.hpp" +#include "../DrawData.hpp" + +GridModifyTool::GridModifyTool(DrawingProgram& initDrawP): + DrawingProgramToolBase(initDrawP) +{ +} + +void GridModifyTool::set_grid_name(const std::string& gridToModifyName) { + gridName = gridToModifyName; +} + +DrawingProgramToolType GridModifyTool::get_type() { + return DrawingProgramToolType::GRIDMODIFY; +} + +void GridModifyTool::gui_toolbox() { + Toolbar& t = drawP.world.main.toolbar; + t.gui.push_id("Grid modify tool"); + t.gui.text_label_centered("Edit Grid"); + t.gui.text_label_centered(gridName); + t.gui.pop_id(); +} + +void GridModifyTool::tool_update() { +} + +bool GridModifyTool::prevent_undo_or_redo() { + return false; +} + +void GridModifyTool::draw(SkCanvas* canvas, const DrawData& drawData) { +} + +void GridModifyTool::switch_tool(DrawingProgramToolType newTool) { +} diff --git a/src/DrawingProgram/GridModifyTool.hpp b/src/DrawingProgram/GridModifyTool.hpp new file mode 100644 index 0000000..9e5f618 --- /dev/null +++ b/src/DrawingProgram/GridModifyTool.hpp @@ -0,0 +1,18 @@ +#pragma once +#include "DrawingProgramToolBase.hpp" + +class DrawingProgram; + +class GridModifyTool : public DrawingProgramToolBase { + public: + GridModifyTool(DrawingProgram& initDrawP); + void set_grid_name(const std::string& gridToModifyName); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; + virtual void switch_tool(DrawingProgramToolType newTool) override; + private: + std::string gridName; +}; diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index f410965..832ac57 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -348,7 +348,7 @@ void GUIManager::svg_icon(const std::string& id, const std::string& svgPath, boo pop_id(); } -bool GUIManager::svg_icon_button(const std::string& id, const std::string& svgPath, bool isSelected, float size, const std::function& elemUpdate) { +bool GUIManager::svg_icon_button(const std::string& id, const std::string& svgPath, bool isSelected, float size, bool hasBorder, const std::function& elemUpdate) { bool toRet = false; push_id(id); CLAY ({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(size), .height = CLAY_SIZING_FIXED(size) } } }) { @@ -356,7 +356,7 @@ bool GUIManager::svg_icon_button(const std::string& id, const std::string& svgPa svg_icon("1", svgPath, is || s.held || s.hovered); if(elemUpdate) elemUpdate(); - }, true, true, isSelected); + }, hasBorder, true, isSelected); } pop_id(); return toRet; diff --git a/src/GUIStuff/GUIManager.hpp b/src/GUIStuff/GUIManager.hpp index d05360a..8830673 100644 --- a/src/GUIStuff/GUIManager.hpp +++ b/src/GUIStuff/GUIManager.hpp @@ -51,7 +51,7 @@ class GUIManager { bool text_button_sized(const std::string& id, const std::string& text, Clay_SizingAxis x, Clay_SizingAxis y, bool isSelected = false, const std::function& elemUpdate = nullptr); void svg_icon(const std::string& id, const std::string& svgPath, bool isHighlighted = false, const std::function& elemUpdate = nullptr); - bool svg_icon_button(const std::string& id, const std::string& svgPath, bool isSelected = false, float size = 40.0f, const std::function& elemUpdate = nullptr); + bool svg_icon_button(const std::string& id, const std::string& svgPath, bool isSelected = false, float size = 40.0f, bool hasBorder = true, const std::function& elemUpdate = nullptr); void top_to_bottom_window_popup_layout(Clay_SizingAxis x, Clay_SizingAxis y, const std::function& elemUpdate); void left_to_right_layout(Clay_SizingAxis x, Clay_SizingAxis y, const std::function& elemUpdate); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index c20fe20..b76ca97 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -562,7 +562,8 @@ void Toolbar::grid_menu(bool justOpened) { gui.text_label_centered("No grids yet..."); gui.scroll_bar_many_entries_area("grid menu entries", entryHeight, main.world->gridMan.sorted_names().size(), [&](size_t i, bool isListHovered) { const std::string& gridName = main.world->gridMan.sorted_names()[i]; - bool selectedEntry = gridName == gridMenu.currentSelectedGrid; + WorldGrid& grid = main.world->gridMan.grids[gridName]; + bool selectedEntry = gridName == gridMenu.newName; CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(entryHeight)}, @@ -573,10 +574,21 @@ void Toolbar::grid_menu(bool justOpened) { .backgroundColor = selectedEntry ? convert_vec4(io->theme->backColor1) : convert_vec4(io->theme->backColor2) }) { gui.text_label(gridName); - if(Clay_Hovered() && io->mouse.leftClick && isListHovered) { - gridMenu.currentSelectedGrid = gridName; - gridMenu.newName = gridName; + bool changeHappened = false; + CLAY({ + .layout = { + .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}, + .childAlignment = {.x = CLAY_ALIGN_X_RIGHT, .y = CLAY_ALIGN_Y_CENTER}, + .layoutDirection = CLAY_LEFT_TO_RIGHT + } + }) { + if(gui.svg_icon_button("visibility eye", grid.visible ? "data/icons/eyeopen.svg" : "data/icons/eyeclose.svg", false, entryHeight - 2.0f, false)) { + changeHappened = true; + grid.visible = !grid.visible; + } } + if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !changeHappened) + gridMenu.newName = gridName; } }); bool gridExists = std::find(main.world->gridMan.sorted_names().begin(), main.world->gridMan.sorted_names().end(), gridMenu.newName) != main.world->gridMan.sorted_names().end(); @@ -615,8 +627,12 @@ void Toolbar::grid_menu(bool justOpened) { g.gridType = static_cast(typeSelected); } } - if(io->mouse.leftClick && !Clay_Hovered() && !justOpened && !dropdownHover) + main.world->drawProg.modify_grid(gridMenu.newName); + if(io->mouse.leftClick && !Clay_Hovered() && !justOpened && !dropdownHover) { + main.world->drawProg.modify_grid(""); + gridMenu.newName.clear(); gridMenu.popupOpen = false; + } } gui.pop_id(); } @@ -643,7 +659,7 @@ void Toolbar::bookmark_menu(bool justOpened) { gui.text_label_centered("No bookmarks yet..."); gui.scroll_bar_many_entries_area("bookmark menu entries", entryHeight, main.world->bMan.sorted_names().size(), [&](size_t i, bool isListHovered) { const std::string& bookmark = main.world->bMan.sorted_names()[i]; - bool selectedEntry = bookmark == bookMenu.currentSelectedBookmark; + bool selectedEntry = bookmark == bookMenu.newName; CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(entryHeight)}, @@ -657,10 +673,8 @@ void Toolbar::bookmark_menu(bool justOpened) { if(Clay_Hovered() && io->mouse.leftClick && isListHovered) { if(selectedEntry && io->mouse.leftClick >= 2) main.world->bMan.jump_to_bookmark(bookmark); - else { - bookMenu.currentSelectedBookmark = bookmark; + else bookMenu.newName = bookmark; - } } } }); @@ -680,8 +694,10 @@ void Toolbar::bookmark_menu(bool justOpened) { main.world->bMan.add_bookmark(bookMenu.newName); } }); - if(io->mouse.leftClick && !Clay_Hovered() && !justOpened) + if(io->mouse.leftClick && !Clay_Hovered() && !justOpened) { + bookMenu.newName.clear(); bookMenu.popupOpen = false; + } } gui.pop_id(); } diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index d96e402..1f5f183 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -165,13 +165,11 @@ class Toolbar { struct BookmarkMenu { bool popupOpen = false; - std::string currentSelectedBookmark; std::string newName; } bookMenu; struct GridMenu { bool popupOpen = false; - std::string currentSelectedGrid; std::string newName; } gridMenu; diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index 5fdfc62..979d17f 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -105,6 +105,9 @@ sk_sp WorldGrid::get_shader(GridType gType, const SkColor4f& gridColor } void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawData) { + if(!visible) + return; + if(!circlePointEffect) { circlePointEffect = compile_effect_shader_init("Circle Point", circlePointShaderCode); squarePointEffect = compile_effect_shader_init("Square Point", squarePointShaderCode); @@ -113,7 +116,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa } float alteredZoom = static_cast(((size / WorldScalar(GRID_CACHE_SIZE_INT)) / drawData.cam.c.inverseScale)); - if(alteredZoom > 0.5f) { + if(alteredZoom > 0.4f) { Vector2f fracCamPos; fracCamPos.x() = static_cast((drawData.cam.c.pos.x() % size) / drawData.cam.c.inverseScale); diff --git a/src/WorldGrid.hpp b/src/WorldGrid.hpp index 938faf7..bfceb75 100644 --- a/src/WorldGrid.hpp +++ b/src/WorldGrid.hpp @@ -15,6 +15,7 @@ class WorldGrid { RULED } gridType = GridType::CIRCLE_POINTS; WorldScalar size{50000000}; + bool visible = true; private: static sk_sp get_shader(GridType gType, const SkColor4f& gridColor, float gridScale); static sk_sp compile_effect_shader_init(const char* shaderName, const char* shaderCode);