Added GUI to add bookmarks and folders
This commit is contained in:
parent
cd4d2572f8
commit
c2e85e8a62
14 changed files with 400 additions and 110 deletions
63
data/icons/droparrowbold.svg
Normal file
63
data/icons/droparrowbold.svg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<?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="droparrowbold.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.020096"
|
||||
inkscape:cx="19.613298"
|
||||
inkscape:cy="14.20498"
|
||||
inkscape:window-width="2286"
|
||||
inkscape:window-height="1214"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
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:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 1.0583333,2.3812499 H 7.408333 L 4.2333331,6.0854164 Z"
|
||||
id="path1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
93
data/icons/folderbold.svg
Normal file
93
data/icons/folderbold.svg
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
<?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="folderbold.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.020096"
|
||||
inkscape:cx="17.289242"
|
||||
inkscape:cy="18.114607"
|
||||
inkscape:window-width="2089"
|
||||
inkscape:window-height="1354"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
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:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="m 0.90185393,2.0032736 v 5.442857"
|
||||
id="path1" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 0.90185393,7.4461306 H 7.5542345 v -5.442857"
|
||||
id="path2" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 0.90185393,2.0032736 H 2.7161396"
|
||||
id="path9" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 2.7161396,2.0032736 3.3209012,1.0961309"
|
||||
id="path10" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 3.3209012,1.0961309 H 6.6470917"
|
||||
id="path11" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 6.6470917,1.0961309 7.5542345,2.0032736"
|
||||
id="path12" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 2.7214284,2.1922617 3.6285712,3.0994046"
|
||||
id="path13"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.32291666;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
d="M 3.6285712,3.0994046 H 7.5595234"
|
||||
id="path14"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
69
data/icons/plusbold.svg
Normal file
69
data/icons/plusbold.svg
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?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="plusbold.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.020096"
|
||||
inkscape:cx="4.4960716"
|
||||
inkscape:cy="13.857457"
|
||||
inkscape:window-width="2882"
|
||||
inkscape:window-height="1354"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
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:#000000;fill-opacity:0;stroke:#000000;stroke-width:1.58749999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="M 1.0583333,4.2333331 H 7.4083329 Z"
|
||||
id="path5"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1.58749999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 4.2333331,1.0583333 0,6.3499996 z"
|
||||
id="path5-5"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
using namespace NetworkingObjects;
|
||||
|
||||
void BookmarkData::jump_to(World& world) {
|
||||
void BookmarkData::jump_to(World& world) const {
|
||||
world.drawData.cam.smooth_move_to(world, coords, windowSize.cast<float>());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ struct BookmarkData {
|
|||
template <class Archive> void serialize(Archive& a) {
|
||||
a(coords, windowSize);
|
||||
}
|
||||
void jump_to(World& world);
|
||||
void jump_to(World& world) const;
|
||||
};
|
||||
|
||||
class BookmarkListItem {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#include "BookmarkManager.hpp"
|
||||
#include "../World.hpp"
|
||||
#include "../MainProgram.hpp"
|
||||
#include "BookmarkListItem.hpp"
|
||||
#include "Helpers/NetworkingObjects/NetObjOrderedList.hpp"
|
||||
#include "Helpers/NetworkingObjects/NetObjTemporaryPtr.decl.hpp"
|
||||
|
||||
|
|
@ -12,45 +13,15 @@ void BookmarkManager::init() {
|
|||
// NOTE: Should find a way for bookmarks added from the network to take into account the client's canvasScale
|
||||
// Have the canvasScale variable come with the ClientData object, and the grid scale commands can be part of
|
||||
// the client data class
|
||||
if(world.netObjMan.is_server()) {
|
||||
if(world.netObjMan.is_server())
|
||||
bookmarkListRoot = world.netObjMan.make_obj_from_ptr<BookmarkListItem>(new BookmarkListItem(world.netObjMan, "ROOT", true, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 1", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 2", false, {}));
|
||||
auto folder1Ptr = bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Folder 1", true, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark A", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark B", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark C", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark D", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark E", false, {}));
|
||||
auto folderAPtr = folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Folder A", true, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 1", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 2", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 3", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 4", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 5", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 6", false, {}));
|
||||
folderAPtr->obj->get_folder_list()->push_back_and_send_create(folderAPtr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 7", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark F", false, {}));
|
||||
folder1Ptr->obj->get_folder_list()->push_back_and_send_create(folder1Ptr->obj->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark G", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 3", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 4", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 5", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 6", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 7", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 8", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 9", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 10", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 11", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 12", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 13", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 14", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 15", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 16", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 17", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 18", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 19", false, {}));
|
||||
bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), new BookmarkListItem(world.netObjMan, "Bookmark 20", false, {}));
|
||||
}
|
||||
}
|
||||
|
||||
void BookmarkManager::refresh_gui_data() {
|
||||
selectionData = GUIStuff::TreeListing::SelectionData();
|
||||
oldSelection.clear();
|
||||
nameToEdit.clear();
|
||||
nameForNew.clear();
|
||||
}
|
||||
|
||||
void BookmarkManager::setup_list_gui(const std::string& id) {
|
||||
|
|
@ -59,7 +30,8 @@ void BookmarkManager::setup_list_gui(const std::string& id) {
|
|||
std::optional<NetObjID> toDeleteParent;
|
||||
std::optional<NetObjID> toDeleteObject;
|
||||
auto& gui = world.main.toolbar.gui;
|
||||
gui.tree_listing(id, bookmarkListRoot.get_net_id(), GUIStuff::TreeListing::DisplayData{
|
||||
gui.push_id(id);
|
||||
gui.tree_listing("list", bookmarkListRoot.get_net_id(), GUIStuff::TreeListing::DisplayData{
|
||||
.getObjInListAtIndex = [&](NetObjID parentId, size_t index) -> std::optional<GUIStuff::TreeListing::DisplayData::ObjInList> {
|
||||
NetObjOrderedList<BookmarkListItem>& bookmarkParentFolder = *world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(parentId)->get_folder_list();
|
||||
if(bookmarkParentFolder.size() <= index)
|
||||
|
|
@ -88,17 +60,25 @@ void BookmarkManager::setup_list_gui(const std::string& id) {
|
|||
return false;
|
||||
},
|
||||
.drawObjGUI = [&](const GUIStuff::TreeListing::ParentObjectIDPair& idPair) {
|
||||
auto tempPtr = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(idPair.object);
|
||||
if(Clay_Hovered() && gui.io->mouse.leftClick >= 2 && !tempPtr->is_folder())
|
||||
tempPtr->get_bookmark_data().jump_to(world);
|
||||
CLAY_AUTO_ID({
|
||||
.layout = {
|
||||
.sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)},
|
||||
.childAlignment = {.x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}
|
||||
},
|
||||
}) {
|
||||
gui.text_label(world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(idPair.object)->get_name());
|
||||
gui.text_label(tempPtr->get_name());
|
||||
}
|
||||
if(!tempPtr->is_folder() && gui.svg_icon_button_transparent("jump button", "data/icons/jump.svg", false, GUIStuff::TreeListing::ENTRY_HEIGHT)) {
|
||||
tempPtr->get_bookmark_data().jump_to(world);
|
||||
return true;
|
||||
}
|
||||
if(gui.svg_icon_button_transparent("delete button", "data/icons/trash.svg", false, GUIStuff::TreeListing::ENTRY_HEIGHT)) {
|
||||
toDeleteParent = idPair.parent;
|
||||
toDeleteObject = idPair.object;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
|
@ -131,13 +111,80 @@ void BookmarkManager::setup_list_gui(const std::string& id) {
|
|||
listPtr->insert_ordered_list_and_send_create(listPtr, toInsert);
|
||||
}, NetObjManager::SendUpdateType::SEND_TO_ALL, nullptr);
|
||||
}
|
||||
});
|
||||
}, selectionData);
|
||||
|
||||
if(selectionData.objsSelected != oldSelection) {
|
||||
oldSelection = selectionData.objsSelected;
|
||||
if(selectionData.objsSelected.size() == 1) {
|
||||
NetObjTemporaryPtr<BookmarkListItem> tempPtr = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(*selectionData.objsSelected.begin());
|
||||
if(tempPtr)
|
||||
nameToEdit = tempPtr->get_name();
|
||||
else {
|
||||
nameToEdit.clear();
|
||||
}
|
||||
}
|
||||
else
|
||||
nameToEdit.clear();
|
||||
}
|
||||
|
||||
if(toDeleteObject.has_value()) {
|
||||
auto& folderList = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(toDeleteParent.value())->get_folder_list();
|
||||
folderList->erase(folderList, toDeleteObject.value());
|
||||
}
|
||||
|
||||
gui.left_to_right_line_layout([&]() {
|
||||
bool addByEnter = false;
|
||||
gui.input_text("input new name", &nameForNew, true, [&](GUIStuff::SelectionHelper& s) {
|
||||
addByEnter = s.selected && gui.io->key.enter;
|
||||
});
|
||||
|
||||
if(gui.svg_icon_button("create new bookmark", "data/icons/plusbold.svg", false, gui.SMALL_BUTTON_SIZE) || addByEnter)
|
||||
create_in_proper_position(new BookmarkListItem(world.netObjMan, nameForNew, false, {world.drawData.cam.c, world.main.window.size.cast<int32_t>()}));
|
||||
else if(gui.svg_icon_button("create new folder", "data/icons/folderbold.svg", false, gui.SMALL_BUTTON_SIZE)) {
|
||||
auto newFolderObjInfo = create_in_proper_position(new BookmarkListItem(world.netObjMan, nameForNew, true, {}));
|
||||
newFolderObjInfo->obj->set_folder_open(true);
|
||||
}
|
||||
});
|
||||
|
||||
if(selectionData.objsSelected.size() == 1) {
|
||||
NetObjTemporaryPtr<BookmarkListItem> tempPtr = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(*selectionData.objsSelected.begin());
|
||||
if(tempPtr) {
|
||||
gui.text_label_centered(tempPtr->is_folder() ? "Edit Bookmark Folder" : "Edit Bookmark");
|
||||
gui.input_text_field("input edit name", "Name", &nameToEdit);
|
||||
if(nameToEdit != tempPtr->get_name())
|
||||
tempPtr->set_name(tempPtr, nameToEdit);
|
||||
}
|
||||
}
|
||||
|
||||
gui.pop_id();
|
||||
}
|
||||
}
|
||||
|
||||
NetworkingObjects::NetObjOrderedListObjectInfoPtr<BookmarkListItem> BookmarkManager::try_to_create_in_proper_position(BookmarkListItem* newItem) {
|
||||
using namespace NetworkingObjects;
|
||||
if(selectionData.orderedObjsSelected.empty())
|
||||
return nullptr;
|
||||
auto& backObjParentObjectPair = selectionData.orderedObjsSelected.back();
|
||||
NetObjTemporaryPtr<BookmarkListItem> parentPtr = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(backObjParentObjectPair.parent);
|
||||
if(!parentPtr)
|
||||
return nullptr;
|
||||
NetObjTemporaryPtr<BookmarkListItem> objectPtr = world.netObjMan.get_obj_temporary_ref_from_id<BookmarkListItem>(backObjParentObjectPair.object);
|
||||
if(!objectPtr)
|
||||
return nullptr;
|
||||
if(objectPtr->is_folder()) {
|
||||
objectPtr->set_folder_open(true);
|
||||
return objectPtr->get_folder_list()->push_back_and_send_create(objectPtr->get_folder_list(), newItem);
|
||||
}
|
||||
uint32_t insertPos = parentPtr->get_folder_list()->get(objectPtr.get_net_id())->pos;
|
||||
return parentPtr->get_folder_list()->insert_and_send_create(parentPtr->get_folder_list(), insertPos + 1, newItem);
|
||||
}
|
||||
|
||||
NetworkingObjects::NetObjOrderedListObjectInfoPtr<BookmarkListItem> BookmarkManager::create_in_proper_position(BookmarkListItem* newItem) {
|
||||
auto toRet = try_to_create_in_proper_position(newItem);
|
||||
if(!toRet)
|
||||
return bookmarkListRoot->get_folder_list()->push_back_and_send_create(bookmarkListRoot->get_folder_list(), newItem);
|
||||
return toRet;
|
||||
}
|
||||
|
||||
void BookmarkManager::scale_up(const WorldScalar& scaleUpAmount) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#include <Helpers/Serializers.hpp>
|
||||
#include <cereal/types/string.hpp>
|
||||
#include <Helpers/NetworkingObjects/NetObjOrderedList.hpp>
|
||||
#include "../GUIStuff/Elements/TreeListing.hpp"
|
||||
#include "BookmarkListItem.hpp"
|
||||
|
||||
class World;
|
||||
|
|
@ -12,6 +13,7 @@ class BookmarkManager {
|
|||
void init();
|
||||
void scale_up(const WorldScalar& scaleUpAmount);
|
||||
void setup_list_gui(const std::string& id);
|
||||
void refresh_gui_data();
|
||||
|
||||
template <typename Archive> void save(Archive& a) const {
|
||||
}
|
||||
|
|
@ -21,5 +23,12 @@ class BookmarkManager {
|
|||
|
||||
NetworkingObjects::NetObjOwnerPtr<BookmarkListItem> bookmarkListRoot;
|
||||
private:
|
||||
NetworkingObjects::NetObjOrderedListObjectInfoPtr<BookmarkListItem> create_in_proper_position(BookmarkListItem* newItem);
|
||||
NetworkingObjects::NetObjOrderedListObjectInfoPtr<BookmarkListItem> try_to_create_in_proper_position(BookmarkListItem* newItem);
|
||||
GUIStuff::TreeListing::SelectionData selectionData;
|
||||
std::unordered_set<NetworkingObjects::NetObjID> oldSelection;
|
||||
std::string nameToEdit;
|
||||
std::string nameForNew;
|
||||
|
||||
World& world;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ bool GUIStuff::FontPicker::update(UpdateInputData& io, std::string* fontName, GU
|
|||
else
|
||||
val = it - sortedFontList.begin();
|
||||
|
||||
if(gui->svg_icon_button("Open font dropdown", "data/icons/droparrow.svg", dropdownOpen, GUIManager::SMALL_BUTTON_SIZE)) {
|
||||
if(gui->svg_icon_button("Open font dropdown", "data/icons/droparrowbold.svg", dropdownOpen, GUIManager::SMALL_BUTTON_SIZE)) {
|
||||
dropdownOpen = !dropdownOpen;
|
||||
clickedOut = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@
|
|||
|
||||
namespace GUIStuff {
|
||||
|
||||
void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData) {
|
||||
void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData, SelectionData& selectionData) {
|
||||
if(!io.mouse.leftHeld)
|
||||
dragHoldSelected = false;
|
||||
|
||||
orderedObjsSelected.clear();
|
||||
selectionData.orderedObjsSelected.clear();
|
||||
std::optional<ParentObjectIDStack> hoveredObject;
|
||||
|
||||
CLAY_AUTO_ID({
|
||||
|
|
@ -20,11 +20,13 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
}) {
|
||||
Clay_ElementId localID = CLAY_ID_LOCAL("scroll area");
|
||||
float setScrollAmount;
|
||||
float setScrollContentHeight;
|
||||
CLAY(localID, {
|
||||
.layout = {.sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}}
|
||||
}) {
|
||||
gui.scroll_bar_area("scroll area", true, [&](float scrollContentHeight, float containerHeight, float& scrollAmount) {
|
||||
setScrollAmount = scrollAmount;
|
||||
setScrollContentHeight = scrollContentHeight;
|
||||
size_t itemCount = 0;
|
||||
size_t itemCountToStartAt = -scrollAmount / ENTRY_HEIGHT;
|
||||
size_t itemCountToEndAt = (containerHeight - scrollAmount) / ENTRY_HEIGHT;
|
||||
|
|
@ -35,7 +37,7 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
.sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(ENTRY_HEIGHT * itemCountToStartAt)}
|
||||
}
|
||||
}) {}
|
||||
recursive_gui(io, gui, displayData, rootObjID, itemCount, itemCountToStartAt, itemCountToEndAt, 0, hoveredObject, parentIDStack, false);
|
||||
recursive_gui(io, gui, displayData, selectionData, rootObjID, itemCount, itemCountToStartAt, itemCountToEndAt, 0, hoveredObject, parentIDStack, false);
|
||||
if(itemCount > itemCountToEndAt) {
|
||||
CLAY_AUTO_ID({
|
||||
.layout = {
|
||||
|
|
@ -47,18 +49,19 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
}
|
||||
Clay_ElementData scrollAreaBB = Clay_GetElementData(localID);
|
||||
if(scrollAreaBB.found) {
|
||||
float mouseRelativeYPos = std::fabs(io.mouse.pos.y() - scrollAreaBB.boundingBox.y - setScrollAmount);
|
||||
// Clamp by fabs(scrollcontentheight - 3), small offset is added to account for error (when youre at the very edge it might assume youre at the top of an element)
|
||||
float mouseRelativeYPos = std::clamp(std::fabs(io.mouse.pos.y() - scrollAreaBB.boundingBox.y - setScrollAmount), 0.0f, std::fabs(setScrollContentHeight - 3.0f));
|
||||
topHalfOfHovered = std::fmod(mouseRelativeYPos, ENTRY_HEIGHT) < (ENTRY_HEIGHT / 2.0f);
|
||||
}
|
||||
}
|
||||
|
||||
// Any objects that were part of a collapsed directory will be unselected
|
||||
objsSelected.clear();
|
||||
for(auto& [parent, object] : orderedObjsSelected)
|
||||
objsSelected.emplace(object);
|
||||
selectionData.objsSelected.clear();
|
||||
for(auto& [parent, object] : selectionData.orderedObjsSelected)
|
||||
selectionData.objsSelected.emplace(object);
|
||||
|
||||
if(objDragged.has_value()) {
|
||||
if(hoveredObject.has_value() && !objsSelected.contains(hoveredObject.value().object) && (std::chrono::steady_clock::now() - timeStartedHoveringOverObject) >= TIME_TO_HOVER_TO_OPEN_DIRECTORY) {
|
||||
if(hoveredObject.has_value() && !selectionData.objsSelected.contains(hoveredObject.value().object) && (std::chrono::steady_clock::now() - timeStartedHoveringOverObject) >= TIME_TO_HOVER_TO_OPEN_DIRECTORY) {
|
||||
ParentObjectIDStack& hoveredObjVal = hoveredObject.value();
|
||||
size_t hoveredObjIndex = displayData.getIndexOfObjInList({hoveredObjVal.parents.back(), hoveredObjVal.object});
|
||||
std::optional<DisplayData::ObjInList> objHoveringOver = displayData.getObjInListAtIndex(hoveredObjVal.parents.back(), hoveredObjIndex);
|
||||
|
|
@ -67,11 +70,11 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
}
|
||||
|
||||
ParentObjectIDPair& objDraggedVal = objDragged.value();
|
||||
if(!objsSelected.contains(objDraggedVal.object))
|
||||
if(!selectionData.objsSelected.contains(objDraggedVal.object))
|
||||
objDragged = std::nullopt;
|
||||
else if(!io.mouse.leftHeld) {
|
||||
if(!hoveredObject.has_value())
|
||||
set_single_selected_object();
|
||||
set_single_selected_object(selectionData);
|
||||
else {
|
||||
ParentObjectIDStack hoveredObjValToUse = hoveredObject.value(); // By value since it'll be edited
|
||||
size_t indexToMoveFrom = displayData.getIndexOfObjInList(objDraggedVal);
|
||||
|
|
@ -84,23 +87,23 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
else if(!topHalfOfHovered)
|
||||
indexToMoveTo++;
|
||||
if((indexToMoveFrom == indexToMoveTo || (indexToMoveFrom + 1) == indexToMoveTo) && objDraggedVal.parent == hoveredObjValToUse.parents.back())
|
||||
set_single_selected_object();
|
||||
set_single_selected_object(selectionData);
|
||||
else {
|
||||
bool wrongMovement = false;
|
||||
// Check if object is about to move into itself
|
||||
for(const NetworkingObjects::NetObjID& parent : hoveredObjValToUse.parents) {
|
||||
if(objsSelected.contains(parent)) {
|
||||
if(selectionData.objsSelected.contains(parent)) {
|
||||
wrongMovement = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!wrongMovement) {
|
||||
displayData.moveObjectsToListAtIndex(hoveredObjValToUse.parents.back(), indexToMoveTo, orderedObjsSelected);
|
||||
objsSelected.clear();
|
||||
orderedObjsSelected.clear();
|
||||
displayData.moveObjectsToListAtIndex(hoveredObjValToUse.parents.back(), indexToMoveTo, selectionData.orderedObjsSelected);
|
||||
selectionData.objsSelected.clear();
|
||||
selectionData.orderedObjsSelected.clear();
|
||||
}
|
||||
else
|
||||
set_single_selected_object();
|
||||
set_single_selected_object(selectionData);
|
||||
}
|
||||
}
|
||||
objDragged = std::nullopt;
|
||||
|
|
@ -110,14 +113,14 @@ void TreeListing::update(UpdateInputData& io, GUIManager& gui, NetworkingObjects
|
|||
oldHoveredObject = hoveredObject;
|
||||
}
|
||||
|
||||
void TreeListing::set_single_selected_object() {
|
||||
objsSelected.clear();
|
||||
orderedObjsSelected.clear();
|
||||
objsSelected.emplace(objDragged.value().object);
|
||||
orderedObjsSelected.emplace_back(objDragged.value());
|
||||
void TreeListing::set_single_selected_object(SelectionData& selectionData) {
|
||||
selectionData.objsSelected.clear();
|
||||
selectionData.orderedObjsSelected.clear();
|
||||
selectionData.objsSelected.emplace(objDragged.value().object);
|
||||
selectionData.orderedObjsSelected.emplace_back(objDragged.value());
|
||||
}
|
||||
|
||||
void TreeListing::recursive_gui(UpdateInputData& io, GUIManager& gui, const DisplayData& displayData, NetworkingObjects::NetObjID objID, size_t& itemCount, size_t itemCountToStartAt, size_t itemCountToEndAt, size_t listDepth, std::optional<ParentObjectIDStack>& hoveredObject, std::vector<NetworkingObjects::NetObjID>& parentIDStack, bool parentJustSelected) {
|
||||
void TreeListing::recursive_gui(UpdateInputData& io, GUIManager& gui, const DisplayData& displayData, SelectionData& selectionData, NetworkingObjects::NetObjID objID, size_t& itemCount, size_t itemCountToStartAt, size_t itemCountToEndAt, size_t listDepth, std::optional<ParentObjectIDStack>& hoveredObject, std::vector<NetworkingObjects::NetObjID>& parentIDStack, bool parentJustSelected) {
|
||||
parentIDStack.emplace_back(objID);
|
||||
for(size_t i = 0;; i++) {
|
||||
std::optional<DisplayData::ObjInList> objInListOptional = displayData.getObjInListAtIndex(objID, i);
|
||||
|
|
@ -134,7 +137,7 @@ void TreeListing::recursive_gui(UpdateInputData& io, GUIManager& gui, const Disp
|
|||
|
||||
bool isOldHoveredObject = oldHoveredObject.has_value() && oldHoveredObject.value().object == objInList.id;
|
||||
SkColor4f backgroundColor;
|
||||
if(objsSelected.contains(objInList.id))
|
||||
if(selectionData.objsSelected.contains(objInList.id))
|
||||
backgroundColor = io.theme->backColor1;
|
||||
else if(isOldHoveredObject && objInList.isDirectory && !objInList.isDirectoryOpen && objDragged.has_value())
|
||||
backgroundColor = lerp_vec(io.theme->backColor2, io.theme->fillColor1, std::clamp(std::chrono::duration<float, std::chrono::milliseconds::period>(std::chrono::steady_clock::now() - timeStartedHoveringOverObject) / TIME_TO_HOVER_TO_OPEN_DIRECTORY, 0.0f, 1.0f));
|
||||
|
|
@ -215,26 +218,26 @@ void TreeListing::recursive_gui(UpdateInputData& io, GUIManager& gui, const Disp
|
|||
if(io.key.leftShift)
|
||||
dragHoldSelected = true;
|
||||
else if(io.key.leftCtrl) {
|
||||
bool alreadySelected = objsSelected.contains(objInList.id);
|
||||
bool alreadySelected = selectionData.objsSelected.contains(objInList.id);
|
||||
if(alreadySelected)
|
||||
objsSelected.erase(objInList.id);
|
||||
selectionData.objsSelected.erase(objInList.id);
|
||||
else {
|
||||
select_and_unselect_parents(parentIDStack, objInList.id);
|
||||
select_and_unselect_parents(parentIDStack, objInList.id, selectionData);
|
||||
selfJustSelected = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(!objsSelected.contains(objInList.id)) {
|
||||
objsSelected.clear();
|
||||
orderedObjsSelected.clear();
|
||||
objsSelected.emplace(objInList.id);
|
||||
if(!selectionData.objsSelected.contains(objInList.id)) {
|
||||
selectionData.objsSelected.clear();
|
||||
selectionData.orderedObjsSelected.clear();
|
||||
selectionData.objsSelected.emplace(objInList.id);
|
||||
selfJustSelected = true;
|
||||
}
|
||||
objDragged = {objID, objInList.id};
|
||||
}
|
||||
}
|
||||
if(io.key.leftShift && dragHoldSelected && !parentJustSelected) {
|
||||
select_and_unselect_parents(parentIDStack, objInList.id);
|
||||
select_and_unselect_parents(parentIDStack, objInList.id, selectionData);
|
||||
selfJustSelected = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -242,34 +245,34 @@ void TreeListing::recursive_gui(UpdateInputData& io, GUIManager& gui, const Disp
|
|||
gui.pop_id();
|
||||
}
|
||||
if(!parentJustSelected) {
|
||||
if(objsSelected.contains(objInList.id))
|
||||
orderedObjsSelected.emplace_back(objID, objInList.id);
|
||||
if(selectionData.objsSelected.contains(objInList.id))
|
||||
selectionData.orderedObjsSelected.emplace_back(objID, objInList.id);
|
||||
}
|
||||
else
|
||||
unselect_object(objInList.id);
|
||||
unselect_object(objInList.id, selectionData);
|
||||
itemCount++;
|
||||
if(objInList.isDirectoryOpen)
|
||||
recursive_gui(io, gui, displayData, objInList.id, itemCount, itemCountToStartAt, itemCountToEndAt, listDepth + 1, hoveredObject, parentIDStack, selfJustSelected | parentJustSelected);
|
||||
recursive_gui(io, gui, displayData, selectionData, objInList.id, itemCount, itemCountToStartAt, itemCountToEndAt, listDepth + 1, hoveredObject, parentIDStack, selfJustSelected | parentJustSelected);
|
||||
}
|
||||
}
|
||||
parentIDStack.pop_back();
|
||||
}
|
||||
|
||||
void TreeListing::unselect_object(NetworkingObjects::NetObjID id) {
|
||||
objsSelected.erase(id);
|
||||
std::erase_if(orderedObjsSelected, [&id](const auto& p) {
|
||||
void TreeListing::unselect_object(NetworkingObjects::NetObjID id, SelectionData& selectionData) {
|
||||
selectionData.objsSelected.erase(id);
|
||||
std::erase_if(selectionData.orderedObjsSelected, [&id](const auto& p) {
|
||||
return p.object == id;
|
||||
});
|
||||
}
|
||||
|
||||
void TreeListing::select_and_unselect_parents(const std::vector<NetworkingObjects::NetObjID>& parentIDStack, NetworkingObjects::NetObjID newSelectedObj) {
|
||||
void TreeListing::select_and_unselect_parents(const std::vector<NetworkingObjects::NetObjID>& parentIDStack, NetworkingObjects::NetObjID newSelectedObj, SelectionData& selectionData) {
|
||||
for(const NetworkingObjects::NetObjID& parent : parentIDStack) {
|
||||
if(objsSelected.contains(parent)) {
|
||||
unselect_object(parent);
|
||||
if(selectionData.objsSelected.contains(parent)) {
|
||||
unselect_object(parent, selectionData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
objsSelected.emplace(newSelectedObj);
|
||||
selectionData.objsSelected.emplace(newSelectedObj);
|
||||
}
|
||||
|
||||
void TreeListing::clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command) {
|
||||
|
|
|
|||
|
|
@ -34,20 +34,24 @@ class TreeListing : public Element {
|
|||
std::function<bool(const ParentObjectIDPair&)> drawObjGUI;
|
||||
std::function<void(NetworkingObjects::NetObjID, size_t, const std::vector<ParentObjectIDPair>&)> moveObjectsToListAtIndex;
|
||||
};
|
||||
void update(UpdateInputData& io, GUIManager& gui, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData);
|
||||
|
||||
struct SelectionData {
|
||||
std::vector<ParentObjectIDPair> orderedObjsSelected;
|
||||
std::unordered_set<NetworkingObjects::NetObjID> objsSelected;
|
||||
};
|
||||
|
||||
void update(UpdateInputData& io, GUIManager& gui, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData, SelectionData& selectionData);
|
||||
virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command) override;
|
||||
private:
|
||||
bool dragHoldSelected = false;
|
||||
|
||||
void set_single_selected_object();
|
||||
void set_single_selected_object(SelectionData& selectionData);
|
||||
|
||||
void recursive_gui(UpdateInputData& io, GUIManager& gui, const DisplayData& displayData, NetworkingObjects::NetObjID objID, size_t& itemCount, size_t itemCountToStartAt, size_t itemCountToEndAt, size_t listDepth, std::optional<ParentObjectIDStack>& hoveredObject, std::vector<NetworkingObjects::NetObjID>& parentIDStack, bool parentJustSelected);
|
||||
std::vector<ParentObjectIDPair> orderedObjsSelected;
|
||||
std::unordered_set<NetworkingObjects::NetObjID> objsSelected;
|
||||
void recursive_gui(UpdateInputData& io, GUIManager& gui, const DisplayData& displayData, SelectionData& selectionData, NetworkingObjects::NetObjID objID, size_t& itemCount, size_t itemCountToStartAt, size_t itemCountToEndAt, size_t listDepth, std::optional<ParentObjectIDStack>& hoveredObject, std::vector<NetworkingObjects::NetObjID>& parentIDStack, bool parentJustSelected);
|
||||
|
||||
void select_and_unselect_parents(const std::vector<NetworkingObjects::NetObjID>& parentIDStack, NetworkingObjects::NetObjID newSelectedObj);
|
||||
void select_and_unselect_parents(const std::vector<NetworkingObjects::NetObjID>& parentIDStack, NetworkingObjects::NetObjID newSelectedObj, SelectionData& selectionData);
|
||||
|
||||
void unselect_object(NetworkingObjects::NetObjID id);
|
||||
void unselect_object(NetworkingObjects::NetObjID id, SelectionData& selectionData);
|
||||
|
||||
bool topHalfOfHovered = false;
|
||||
std::optional<ParentObjectIDPair> objDragged;
|
||||
|
|
|
|||
|
|
@ -346,11 +346,13 @@ void GUIManager::checkbox(const std::string& id, bool* val, const std::function<
|
|||
pop_id();
|
||||
}
|
||||
|
||||
void GUIManager::input_text_field(const std::string& id, const std::string& name, std::string* val, bool updateEveryEdit, const std::function<void(SelectionHelper&)>& elemUpdate) {
|
||||
bool GUIManager::input_text_field(const std::string& id, const std::string& name, std::string* val, bool updateEveryEdit, const std::function<void(SelectionHelper&)>& elemUpdate) {
|
||||
bool toRet = false;
|
||||
left_to_right_line_layout([&]() {
|
||||
text_label(name);
|
||||
input_text(id, val, updateEveryEdit, elemUpdate);
|
||||
toRet = input_text(id, val, updateEveryEdit, elemUpdate);
|
||||
});
|
||||
return toRet;
|
||||
}
|
||||
|
||||
void GUIManager::input_path_field(const std::string& id, const std::string& name, std::filesystem::path* val, std::filesystem::file_type fileTypeRestriction, const std::function<void(SelectionHelper&)>& elemUpdate) {
|
||||
|
|
@ -897,9 +899,9 @@ void GUIManager::list_popup_menu(const std::string& id, Vector2f popupPos, const
|
|||
}
|
||||
}
|
||||
|
||||
void GUIManager::tree_listing(const std::string& id, NetworkingObjects::NetObjID rootObjID, const TreeListing::DisplayData& displayData) {
|
||||
void GUIManager::tree_listing(const std::string& id, NetworkingObjects::NetObjID rootObjID, const TreeListing::DisplayData& displayData, TreeListing::SelectionData& selectionData) {
|
||||
push_id(id);
|
||||
insert_element<TreeListing>()->update(*io, *this, rootObjID, displayData);
|
||||
insert_element<TreeListing>()->update(*io, *this, rootObjID, displayData, selectionData);
|
||||
pop_id();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class GUIManager {
|
|||
Vector2f screen_pos_to_window_pos(const Vector2f& screenPos);
|
||||
Vector2f get_mouse_pos();
|
||||
|
||||
void input_text_field(const std::string& id, const std::string& name, std::string* val, bool updateEveryEdit = true, const std::function<void(SelectionHelper&)>& elemUpdate = nullptr);
|
||||
bool input_text_field(const std::string& id, const std::string& name, std::string* val, bool updateEveryEdit = true, const std::function<void(SelectionHelper&)>& elemUpdate = nullptr);
|
||||
|
||||
void text_paragraph(const std::string& id, std::unique_ptr<skia::textlayout::Paragraph> paragraph, float width, const std::function<void()>& elemUpdate = nullptr);
|
||||
void text_label_color(const std::string& val, const SkColor4f& color);
|
||||
|
|
@ -102,7 +102,7 @@ class GUIManager {
|
|||
void paint_circle_popup_menu(const std::string& id, const Vector2f& centerPos, const PaintCircleMenu::Data& val, const std::function<void()>& elemUpdate = nullptr);
|
||||
void list_popup_menu(const std::string& id, Vector2f popupPos, const std::function<void()>& elemUpdate);
|
||||
|
||||
void tree_listing(const std::string& id, NetworkingObjects::NetObjID rootObjID, const TreeListing::DisplayData& displayData);
|
||||
void tree_listing(const std::string& id, NetworkingObjects::NetObjID rootObjID, const TreeListing::DisplayData& displayData, TreeListing::SelectionData& selectionData);
|
||||
|
||||
void obstructing_window();
|
||||
|
||||
|
|
|
|||
|
|
@ -486,11 +486,11 @@ void Toolbar::top_toolbar() {
|
|||
gridMenuPopUpJustOpen = true;
|
||||
}
|
||||
}
|
||||
if(gui.svg_icon_button_transparent("Bookmark Menu Button", "data/icons/bookmark.svg", bookMenu.popupOpen)) {
|
||||
if(bookMenu.popupOpen)
|
||||
bookMenu.popupOpen = false;
|
||||
if(gui.svg_icon_button_transparent("Bookmark Menu Button", "data/icons/bookmark.svg", bookmarkMenuPopupOpen)) {
|
||||
if(bookmarkMenuPopupOpen)
|
||||
bookmarkMenuPopupOpen = false;
|
||||
else {
|
||||
bookMenu.popupOpen = true;
|
||||
bookmarkMenuPopupOpen = true;
|
||||
bookmarkMenuPopUpJustOpen = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -500,7 +500,7 @@ void Toolbar::top_toolbar() {
|
|||
main.set_tab_to_close(closedTab.value());
|
||||
if(gridMenu.popupOpen)
|
||||
grid_menu(gridMenuPopUpJustOpen);
|
||||
if(bookMenu.popupOpen)
|
||||
if(bookmarkMenuPopupOpen)
|
||||
bookmark_menu(bookmarkMenuPopUpJustOpen);
|
||||
if(menuPopUpOpen) {
|
||||
CLAY_AUTO_ID({
|
||||
|
|
@ -765,7 +765,7 @@ void Toolbar::grid_menu(bool justOpened) {
|
|||
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/plus.svg", false, GUIStuff::GUIManager::SMALL_BUTTON_SIZE) || (addByEnter && !gridMenu.newName.empty())) {
|
||||
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();
|
||||
|
|
@ -802,8 +802,10 @@ void Toolbar::bookmark_menu(bool justOpened) {
|
|||
gui.obstructing_window();
|
||||
gui.text_label_centered("Bookmarks");
|
||||
main.world->bMan.setup_list_gui("bookmark menu list");
|
||||
if(io->mouse.leftClick && !Clay_Hovered() && !justOpened)
|
||||
bookMenu.popupOpen = false;
|
||||
if(io->mouse.leftClick && !Clay_Hovered() && !justOpened) {
|
||||
bookmarkMenuPopupOpen = false;
|
||||
main.world->bMan.refresh_gui_data();
|
||||
}
|
||||
}
|
||||
gui.pop_id();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -188,9 +188,7 @@ class Toolbar {
|
|||
GSETTINGS_DEBUG
|
||||
} generalSettingsOptions = GSETTINGS_GENERAL;
|
||||
|
||||
struct BookmarkMenu {
|
||||
bool popupOpen = false;
|
||||
} bookMenu;
|
||||
bool bookmarkMenuPopupOpen = false;
|
||||
|
||||
struct GridMenu {
|
||||
bool popupOpen = false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue