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;