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);