Grid edit tool, grid menu, and bookmark menu improved
This commit is contained in:
parent
ffc9d42c5b
commit
47232ec7e9
8 changed files with 179 additions and 74 deletions
84
data/icons/pencil.svg
Normal file
84
data/icons/pencil.svg
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 8.4666666 8.4666666"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
sodipodi:docname="pencil.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:zoom="23.020094"
|
||||
inkscape:cx="5.8427216"
|
||||
inkscape:cy="3.9965084"
|
||||
inkscape:window-width="3440"
|
||||
inkscape:window-height="1354"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1">
|
||||
<inkscape:grid
|
||||
id="grid1"
|
||||
units="px"
|
||||
originx="0"
|
||||
originy="0"
|
||||
spacingx="0.26458333"
|
||||
spacingy="0.26458333"
|
||||
empcolor="#0099e5"
|
||||
empopacity="0.30196078"
|
||||
color="#0099e5"
|
||||
opacity="0.14901961"
|
||||
empspacing="5"
|
||||
enabled="true"
|
||||
visible="true"
|
||||
dotted="false" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 3.4395832,7.1437496 0.92604153,7.5406246 1.3229166,5.0270831 Z"
|
||||
id="path6"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 1.3229167,5.027083 4.7624997,1.5874999"
|
||||
id="path7"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 3.4395832,7.1437496 6.8791662,3.7041665"
|
||||
id="path7-9"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 4.7624997,1.5874999 6.8791662,3.7041665"
|
||||
id="path8"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 4.7624996,1.5874999 5.423958,0.9260416 C 6.614583,0.52916664 7.9374996,1.8520832 7.5406245,3.0427081 L 6.8791662,3.7041663"
|
||||
id="path9"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
|
@ -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<GridModifyTool*>(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<GridModifyTool*>(drawTool.get());
|
||||
gridModToolPtr->set_grid_name(gridToModifyName);
|
||||
}
|
||||
|
||||
void DrawingProgram::update() {
|
||||
|
|
|
|||
|
|
@ -57,7 +57,6 @@ class DrawingProgram {
|
|||
void clear_draw_cache();
|
||||
|
||||
void modify_grid(const std::string& gridToModifyName);
|
||||
bool is_modifying_grid();
|
||||
private:
|
||||
std::optional<std::chrono::steady_clock::time_point> badFrametimeTimePoint;
|
||||
std::optional<std::chrono::steady_clock::time_point> unorderedObjectsExistTimePoint;
|
||||
|
|
|
|||
|
|
@ -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<size_t>(g.gridType);
|
||||
std::vector<std::string> 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<WorldGrid::GridType>(typeSelected);
|
||||
uint32_t sDiv = g.get_subdivisions();
|
||||
t.gui.input_scalar_field<uint32_t>("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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<Vector4f>(world.canvasTheme.toolFrontColor), 0.6f);
|
||||
grids[name] = g;
|
||||
changed = true;
|
||||
}
|
||||
|
|
|
|||
114
src/Toolbar.cpp
114
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<Clay_Color>(io->theme->backColor1) : convert_vec4<Clay_Color>(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<size_t>(g.gridType);
|
||||
std::vector<std::string> 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<WorldGrid::GridType>(typeSelected);
|
||||
uint32_t sDiv = g.get_subdivisions();
|
||||
gui.input_scalar_field<uint32_t>("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<Clay_Color>(io->theme->backColor1) : convert_vec4<Clay_Color>(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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<SkColor4f>(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<SkColor4f>(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, {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue