diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp index 1acbf47..777a218 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp @@ -33,3 +33,19 @@ void DrawingProgramLayerFolder::get_flattened_component_list(std::vectorget_flattened_component_list(objList); } + +NetworkingObjects::NetObjWeakPtr DrawingProgramLayerFolder::get_initial_editing_layer() const { + // BFS, select a layer that's closest to root as possible + for(auto& c : *folderList) { + if(!c.obj->is_folder()) + return c.obj; + } + for(auto& c : *folderList) { + if(c.obj->is_folder()) { + NetworkingObjects::NetObjWeakPtr toRet = c.obj->get_folder().get_initial_editing_layer(); + if(!toRet.expired()) + return toRet; + } + } + return {}; +} diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp index 0f0892b..2ff3cc4 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp @@ -14,6 +14,7 @@ class DrawingProgramLayerFolder { void commit_update_dont_invalidate_cache(DrawingProgramLayerManager& layerMan) const; void get_flattened_component_list(std::vector& objList) const; void set_to_erase(); + NetworkingObjects::NetObjWeakPtr get_initial_editing_layer() const; NetworkingObjects::NetObjOwnerPtr> folderList; bool isFolderOpen = false; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp index b071411..189effa 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp @@ -23,6 +23,7 @@ void DrawingProgramLayerManager::read_components_client(cereal::PortableBinaryIn layerTreeRoot = drawP.world.netObjMan.read_create_message(a, nullptr); layerTreeRoot->commit_update_dont_invalidate_cache(*this); layerTreeRoot->set_component_list_callbacks(*this); + editingLayer = layerTreeRoot->get_folder().get_initial_editing_layer(); } bool DrawingProgramLayerManager::is_a_layer_being_edited() { diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp b/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp index 9ad4856..9553636 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp @@ -12,6 +12,7 @@ class DrawingProgramLayerManager { friend class DrawingProgramLayerFolder; NetworkingObjects::NetObjOwnerPtr layerTreeRoot; NetworkingObjects::NetObjWeakPtr editingLayer; + void set_initial_editing_layer(); public: enum class LayerSelector { ALL_VISIBLE_LAYERS, diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 19ddbf6..5f15326 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -703,90 +703,92 @@ void Toolbar::update_notification_gui() { #endif void Toolbar::grid_menu(bool justOpened) { - gui.push_id("grid menu"); - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_FIT(300), .height = CLAY_SIZING_FIT(0, 600) }, - .padding = CLAY_PADDING_ALL(io->theme->padding1), - .childGap = io->theme->childGap1, - .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, - .layoutDirection = CLAY_TOP_TO_BOTTOM - }, - .backgroundColor = convert_vec4(io->theme->backColor1), - .cornerRadius = CLAY_CORNER_RADIUS(io->theme->windowCorners1), - .floating = {.offset = {.x = 0, .y = static_cast(io->theme->padding1)}, .attachPoints = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_BOTTOM}, .attachTo = CLAY_ATTACH_TO_PARENT} - }) { - gui.obstructing_window(); - gui.text_label_centered("Grids"); - float entryHeight = 25.0f; - if(main.world->gridMan.grids->empty()) - gui.text_label_centered("No grids yet..."); - uint32_t toDelete = std::numeric_limits::max(); - gui.scroll_bar_many_entries_area("grid menu entries", entryHeight, main.world->gridMan.grids->size(), true, [&](size_t i, bool isListHovered) { - auto& grid = main.world->gridMan.grids->at(i)->obj; - bool selectedEntry = gridMenu.selectedGrid == i; - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(entryHeight)}, - .childGap = 2, - .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, - .layoutDirection = CLAY_LEFT_TO_RIGHT - }, - .backgroundColor = selectedEntry ? convert_vec4(io->theme->backColor1) : convert_vec4(io->theme->backColor2) - }) { - gui.text_label(grid->get_display_name()); - bool miniButtonClicked = false; + if(main.world->gridMan.grids) { + gui.push_id("grid menu"); + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_FIT(300), .height = CLAY_SIZING_FIT(0, 600) }, + .padding = CLAY_PADDING_ALL(io->theme->padding1), + .childGap = io->theme->childGap1, + .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, + .layoutDirection = CLAY_TOP_TO_BOTTOM + }, + .backgroundColor = convert_vec4(io->theme->backColor1), + .cornerRadius = CLAY_CORNER_RADIUS(io->theme->windowCorners1), + .floating = {.offset = {.x = 0, .y = static_cast(io->theme->padding1)}, .attachPoints = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_BOTTOM}, .attachTo = CLAY_ATTACH_TO_PARENT} + }) { + gui.obstructing_window(); + gui.text_label_centered("Grids"); + float entryHeight = 25.0f; + if(main.world->gridMan.grids->empty()) + gui.text_label_centered("No grids yet..."); + uint32_t toDelete = std::numeric_limits::max(); + gui.scroll_bar_many_entries_area("grid menu entries", entryHeight, main.world->gridMan.grids->size(), true, [&](size_t i, bool isListHovered) { + auto& grid = main.world->gridMan.grids->at(i)->obj; + bool selectedEntry = gridMenu.selectedGrid == i; CLAY_AUTO_ID({ .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 - } + .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(entryHeight)}, + .childGap = 2, + .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, + .layoutDirection = CLAY_LEFT_TO_RIGHT + }, + .backgroundColor = selectedEntry ? convert_vec4(io->theme->backColor1) : convert_vec4(io->theme->backColor2) }) { - if(gui.svg_icon_button_transparent("visibility eye", grid->visible ? "data/icons/eyeopen.svg" : "data/icons/eyeclose.svg", false, entryHeight, false)) { - miniButtonClicked = true; - grid->visible = !grid->visible; - NetworkingObjects::generic_serialized_class_send_update_to_all(grid); + gui.text_label(grid->get_display_name()); + bool miniButtonClicked = false; + CLAY_AUTO_ID({ + .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_transparent("visibility eye", grid->visible ? "data/icons/eyeopen.svg" : "data/icons/eyeclose.svg", false, entryHeight, false)) { + miniButtonClicked = true; + grid->visible = !grid->visible; + NetworkingObjects::generic_serialized_class_send_update_to_all(grid); + } + if(gui.svg_icon_button_transparent("edit pencil", "data/icons/pencil.svg", false, entryHeight, false)) { + miniButtonClicked = true; + main.world->drawProg.modify_grid(grid); + stop_displaying_grid_menu(); + } + if(gui.svg_icon_button_transparent("delete trash", "data/icons/trash.svg", false, entryHeight, false)) { + miniButtonClicked = true; + toDelete = i; + } } - if(gui.svg_icon_button_transparent("edit pencil", "data/icons/pencil.svg", false, entryHeight, false)) { - miniButtonClicked = true; - main.world->drawProg.modify_grid(grid); - stop_displaying_grid_menu(); - } - if(gui.svg_icon_button_transparent("delete trash", "data/icons/trash.svg", false, entryHeight, false)) { - miniButtonClicked = true; - toDelete = i; + if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !miniButtonClicked) { + gridMenu.selectedGrid = i; + if(io->mouse.leftClick >= 2) { + main.world->drawProg.modify_grid(grid); + stop_displaying_grid_menu(); + } } } - if(Clay_Hovered() && io->mouse.leftClick && isListHovered && !miniButtonClicked) { - gridMenu.selectedGrid = i; - if(io->mouse.leftClick >= 2) { - main.world->drawProg.modify_grid(grid); - stop_displaying_grid_menu(); - } - } - } - }); - if(toDelete != std::numeric_limits::max()) - main.world->gridMan.remove_grid(toDelete); - gui.left_to_right_line_layout([&]() { - bool addByEnter = false; - gui.input_text("grid text input", &gridMenu.newName, true, [&](GUIStuff::SelectionHelper& s) { - addByEnter = s.selected && io->key.enter; }); - if(gui.svg_icon_button("grid add button", "data/icons/plusbold.svg", false, GUIStuff::GUIManager::SMALL_BUTTON_SIZE) || (addByEnter && !gridMenu.newName.empty())) { - main.world->gridMan.add_default_grid(gridMenu.newName); - main.world->drawProg.modify_grid(main.world->gridMan.grids->at(main.world->gridMan.grids->size() - 1)->obj); - stop_displaying_grid_menu(); - } - }); + if(toDelete != std::numeric_limits::max()) + main.world->gridMan.remove_grid(toDelete); + gui.left_to_right_line_layout([&]() { + bool addByEnter = false; + gui.input_text("grid text input", &gridMenu.newName, true, [&](GUIStuff::SelectionHelper& s) { + addByEnter = s.selected && io->key.enter; + }); + if(gui.svg_icon_button("grid add button", "data/icons/plusbold.svg", false, GUIStuff::GUIManager::SMALL_BUTTON_SIZE) || (addByEnter && !gridMenu.newName.empty())) { + main.world->gridMan.add_default_grid(gridMenu.newName); + main.world->drawProg.modify_grid(main.world->gridMan.grids->at(main.world->gridMan.grids->size() - 1)->obj); + stop_displaying_grid_menu(); + } + }); - bool dropdownHover = false; - if(io->mouse.leftClick && !Clay_Hovered() && !justOpened && !dropdownHover) - stop_displaying_grid_menu(); + bool dropdownHover = false; + if(io->mouse.leftClick && !Clay_Hovered() && !justOpened && !dropdownHover) + stop_displaying_grid_menu(); + } + gui.pop_id(); } - gui.pop_id(); } void Toolbar::stop_displaying_grid_menu() {