diff --git a/data/icons/pencil.svg b/data/icons/pencil.svg new file mode 100644 index 0000000..c3cdc61 --- /dev/null +++ b/data/icons/pencil.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index d4e095e..561f3fe 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -233,18 +233,9 @@ 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); -} - -bool DrawingProgram::is_modifying_grid() { - return drawTool->get_type() == DrawingProgramToolType::GRIDMODIFY; + switch_to_tool(DrawingProgramToolType::GRIDMODIFY); + GridModifyTool* gridModToolPtr = static_cast(drawTool.get()); + gridModToolPtr->set_grid_name(gridToModifyName); } void DrawingProgram::update() { diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 7b063d6..f914ead 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -57,7 +57,6 @@ class DrawingProgram { void clear_draw_cache(); void modify_grid(const std::string& gridToModifyName); - bool is_modifying_grid(); private: std::optional badFrametimeTimePoint; std::optional unorderedObjectsExistTimePoint; diff --git a/src/DrawingProgram/GridModifyTool.cpp b/src/DrawingProgram/GridModifyTool.cpp index 172db37..01714bf 100644 --- a/src/DrawingProgram/GridModifyTool.cpp +++ b/src/DrawingProgram/GridModifyTool.cpp @@ -20,6 +20,36 @@ void GridModifyTool::gui_toolbox() { Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("Grid modify tool"); t.gui.text_label_centered("Edit Grid"); + auto gridFoundIt = drawP.world.gridMan.grids.find(gridName); + if(gridFoundIt != drawP.world.gridMan.grids.end()) { + WorldGrid& g = gridFoundIt->second; + t.gui.text_label("Name: " + gridName); + size_t typeSelected = static_cast(g.gridType); + std::vector listOfGridTypes = { + "Circle Points", + "Square Points", + "Square Lines", + "Ruled" + }; + t.gui.left_to_right_line_layout([&]() { + t.gui.text_label("Type"); + t.gui.dropdown_select("filepicker select type", &typeSelected, listOfGridTypes, 200.0f); + }); + g.gridType = static_cast(typeSelected); + uint32_t sDiv = g.get_subdivisions(); + t.gui.input_scalar_field("Subdivisions", "Subdivisions", &sDiv, 0, 10); + g.set_subdivisions(sDiv); + bool divOut = g.get_remove_divisions_outwards(); + t.gui.checkbox_field("Subdivide outwards", "Subdivide outwards", &divOut); + g.set_remove_divisions_outwards(divOut); + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Grid Color", &g.color, &g.color == t.colorRight)) + t.color_selector_right(&g.color == t.colorRight ? nullptr : &g.color); + } + t.gui.text_label("Grid Color"); + }); + } t.gui.pop_id(); } diff --git a/src/GridManager.cpp b/src/GridManager.cpp index 5a9fd30..0069b2d 100644 --- a/src/GridManager.cpp +++ b/src/GridManager.cpp @@ -1,4 +1,5 @@ #include "GridManager.hpp" +#include "World.hpp" GridManager::GridManager(World& w): world(w) {} @@ -8,6 +9,7 @@ void GridManager::init_client_callbacks() { void GridManager::add_grid(const std::string& name) { WorldGrid g; + g.color = color_mul_alpha(convert_vec4(world.canvasTheme.toolFrontColor), 0.6f); grids[name] = g; changed = true; } diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index ac7d223..fd4c243 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -399,6 +399,10 @@ void Toolbar::top_toolbar() { gui.tab_list("file tab list", tabNames, main.worldIndex, closedTab); if(main.world->network_being_used() && gui.svg_icon_button("Player List Toggle Button", "data/icons/list.svg", playerMenuOpen)) playerMenuOpen = !playerMenuOpen; + if(gui.svg_icon_button("Menu Undo Button", "data/icons/undo.svg")) + main.world->undo_with_checks(); + if(gui.svg_icon_button("Menu Redo Button", "data/icons/redo.svg")) + main.world->redo_with_checks(); if(gui.svg_icon_button("Grids Button", "data/icons/grid.svg", gridMenu.popupOpen)) { if(gridMenu.popupOpen) stop_displaying_grid_menu(); @@ -407,10 +411,6 @@ void Toolbar::top_toolbar() { gridMenuPopUpJustOpen = true; } } - if(gui.svg_icon_button("Menu Undo Button", "data/icons/undo.svg")) - main.world->undo_with_checks(); - if(gui.svg_icon_button("Menu Redo Button", "data/icons/redo.svg")) - main.world->redo_with_checks(); if(gui.svg_icon_button("Bookmark Menu Button", "data/icons/bookmark.svg", bookMenu.popupOpen)) { if(bookMenu.popupOpen) bookMenu.popupOpen = false; @@ -560,6 +560,7 @@ void Toolbar::grid_menu(bool justOpened) { float entryHeight = 25.0f; if(main.world->gridMan.sorted_names().empty()) gui.text_label_centered("No grids yet..."); + std::string toDelete; 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]; WorldGrid& grid = main.world->gridMan.grids[gridName]; @@ -574,66 +575,53 @@ void Toolbar::grid_menu(bool justOpened) { .backgroundColor = selectedEntry ? convert_vec4(io->theme->backColor1) : convert_vec4(io->theme->backColor2) }) { gui.text_label(gridName); - bool changeHappened = false; + bool miniButtonClicked = false; CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}, + .childGap = 1, .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; + if(gui.svg_icon_button("visibility eye", grid.visible ? "data/icons/eyeopen.svg" : "data/icons/eyeclose.svg", false, entryHeight, false)) { + miniButtonClicked = true; grid.visible = !grid.visible; } + if(gui.svg_icon_button("edit pencil", "data/icons/pencil.svg", false, entryHeight, false)) { + miniButtonClicked = true; + main.world->drawProg.modify_grid(gridName); + stop_displaying_grid_menu(); + } + if(gui.svg_icon_button("delete trash", "data/icons/trash.svg", false, entryHeight, false)) { + miniButtonClicked = true; + toDelete = gridName; + } } - if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !changeHappened) + if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !miniButtonClicked) { gridMenu.newName = gridName; + if(io->mouse.leftClick >= 2) { + main.world->drawProg.modify_grid(gridName); + stop_displaying_grid_menu(); + } + } } }); + if(!toDelete.empty()) + main.world->gridMan.remove_grid(toDelete); bool gridExists = std::find(main.world->gridMan.sorted_names().begin(), main.world->gridMan.sorted_names().end(), gridMenu.newName) != main.world->gridMan.sorted_names().end(); gui.left_to_right_line_layout([&]() { gui.input_text("grid text input", &gridMenu.newName); - if(gridExists) { - if(gui.svg_icon_button("grid remove button", "data/icons/trash.svg", false, 25.0f)) { - main.world->gridMan.remove_grid(gridMenu.newName); - gridMenu.newName.clear(); - gridExists = false; + if(!gridExists) { + if(gui.svg_icon_button("grid add button", "data/icons/plus.svg", false, 25.0f) && !gridMenu.newName.empty()) { + main.world->gridMan.add_grid(gridMenu.newName); + main.world->drawProg.modify_grid(gridMenu.newName); + stop_displaying_grid_menu(); } } - else { - if(gui.svg_icon_button("grid add button", "data/icons/plus.svg", false, 25.0f) && !gridMenu.newName.empty()) - main.world->gridMan.add_grid(gridMenu.newName); - } }); + bool dropdownHover = false; - if(gridExists) { - auto gridFoundIt = main.world->gridMan.grids.find(gridMenu.newName); - if(gridFoundIt != main.world->gridMan.grids.end()) { - WorldGrid& g = gridFoundIt->second; - size_t typeSelected = static_cast(g.gridType); - std::vector listOfGridTypes = { - "Circle Points", - "Square Points", - "Square Lines", - "Ruled" - }; - gui.left_to_right_line_layout([&]() { - gui.text_label("Type"); - gui.dropdown_select("filepicker select type", &typeSelected, listOfGridTypes, 200.0f, [&]() { - dropdownHover = Clay_Hovered(); - }); - }); - g.gridType = static_cast(typeSelected); - uint32_t sDiv = g.get_subdivisions(); - gui.input_scalar_field("Subdivisions", "Subdivisions", &sDiv, 0, 10); - g.set_subdivisions(sDiv); - bool divOut = g.get_remove_divisions_outwards(); - gui.checkbox_field("Subdivide outwards", "Subdivide outwards", &divOut); - g.set_remove_divisions_outwards(divOut); - } - } - main.world->drawProg.modify_grid(gridMenu.newName); if(io->mouse.leftClick && !Clay_Hovered() && !justOpened && !dropdownHover) stop_displaying_grid_menu(); } @@ -665,6 +653,7 @@ void Toolbar::bookmark_menu(bool justOpened) { gui.text_label_centered("Bookmarks"); if(main.world->bMan.sorted_names().empty()) gui.text_label_centered("No bookmarks yet..."); + std::string toDelete; 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.newName; @@ -678,26 +667,37 @@ void Toolbar::bookmark_menu(bool justOpened) { .backgroundColor = selectedEntry ? convert_vec4(io->theme->backColor1) : convert_vec4(io->theme->backColor2) }) { gui.text_label(bookmark); - if(Clay_Hovered() && io->mouse.leftClick && isListHovered) { - if(selectedEntry && io->mouse.leftClick >= 2) + bool miniButtonClicked = false; + CLAY({ + .layout = { + .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}, + .childGap = 1, + .childAlignment = {.x = CLAY_ALIGN_X_RIGHT, .y = CLAY_ALIGN_Y_CENTER}, + .layoutDirection = CLAY_LEFT_TO_RIGHT + } + }) { + if(gui.svg_icon_button("bookmark jump button", "data/icons/jump.svg", false, entryHeight, false)) { + miniButtonClicked = true; + main.world->bMan.jump_to_bookmark(bookmark); + } + if(gui.svg_icon_button("delete trash", "data/icons/trash.svg", false, entryHeight, false)) { + miniButtonClicked = true; + toDelete = bookmark; + } + } + if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !miniButtonClicked) { + bookMenu.newName = bookmark; + if(io->mouse.leftClick >= 2) main.world->bMan.jump_to_bookmark(bookmark); - else - bookMenu.newName = bookmark; } } }); + if(!toDelete.empty()) + main.world->bMan.remove_bookmark(bookMenu.newName); bool bookmarkExists = std::find(main.world->bMan.sorted_names().begin(), main.world->bMan.sorted_names().end(), bookMenu.newName) != main.world->bMan.sorted_names().end(); gui.left_to_right_line_layout([&]() { gui.input_text("bookmark text input", &bookMenu.newName); - if(bookmarkExists) { - if(gui.svg_icon_button("bookmark jump button", "data/icons/jump.svg", false, 25.0f)) - main.world->bMan.jump_to_bookmark(bookMenu.newName); - if(gui.svg_icon_button("bookmark remove button", "data/icons/trash.svg", false, 25.0f)) { - main.world->bMan.remove_bookmark(bookMenu.newName); - bookMenu.newName.clear(); - } - } - else { + if(!bookmarkExists) { if(gui.svg_icon_button("bookmark add button", "data/icons/plus.svg", false, 25.0f) && !bookMenu.newName.empty()) main.world->bMan.add_bookmark(bookMenu.newName); } diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index db22f2d..d943dc7 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -244,8 +244,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa Vector2f closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); Vector2f subClosestGridPointScreenPos = get_closest_grid_point(offset, subDivSize, drawData); - SkColor4f pointColor = gMan.world.canvasTheme.toolFrontColor; - pointColor.fA = std::clamp(floatDivWorldSize / 100.0f, 0.0f, 0.6f); + SkColor4f pointColor = convert_vec4(color_mul_alpha(color, std::clamp(floatDivWorldSize / 100.0f, 0.0f, 1.0f))); float gridPointSize = 5.0f; float finalDivMultiplier = (1.0 - divLogFraction) * ((divLog == 0) ? 0.5 : 1.0); @@ -290,8 +289,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa Vector2f closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData); Vector2f subClosestGridPointScreenPos = get_closest_grid_point(offset, subDivSize, drawData); - SkColor4f pointColor = gMan.world.canvasTheme.toolFrontColor; - pointColor.fA = std::clamp(floatDivWorldSize / 100.0f, 0.0f, 0.6f); + SkColor4f pointColor = convert_vec4(color_mul_alpha(color, std::clamp(floatDivWorldSize / 100.0f, 0.0f, 1.0f))); float gridPointSize = std::clamp(floatDivWorldSize / 10.0f, 0.0f, 5.0f); linePaint.setShader(get_shader(gridType, { diff --git a/src/WorldGrid.hpp b/src/WorldGrid.hpp index 439e13a..316f149 100644 --- a/src/WorldGrid.hpp +++ b/src/WorldGrid.hpp @@ -24,6 +24,7 @@ class WorldGrid { void set_subdivisions(uint32_t v); uint32_t get_subdivisions(); + Vector4f color{1.0f, 1.0f, 1.0f, 1.0f}; private: bool removeDivisionsOutwards = false; uint32_t subdivisions = 1;