From 777b6540db9abd2f03f66d473e6eade6a2601f96 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Fri, 9 Jan 2026 21:56:58 +0300 Subject: [PATCH] Make connecting client GUI, and added warning when no layers are selected --- src/Toolbar.cpp | 231 +++++++++++++++++++++++++++++------------------- src/Toolbar.hpp | 2 + src/World.cpp | 16 ++-- 3 files changed, 150 insertions(+), 99 deletions(-) diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index d45ae68..e42dc80 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -371,7 +371,8 @@ void Toolbar::update() { } }) { top_toolbar(); - drawing_program_gui(); + if(!main.world->clientStillConnecting) + drawing_program_gui(); if(viewWebVersionWelcome) web_version_welcome(); #ifndef __EMSCRIPTEN__ @@ -382,25 +383,33 @@ void Toolbar::update() { file_picker_gui(); else if(optionsMenuOpen) options_menu(); + else if(main.world->clientStillConnecting) + still_connecting_center_message(); else if(playerMenuOpen) player_list(); + else if(!main.world->drawProg.layerMan.is_a_layer_being_edited()) + no_layers_being_edited_message(); + if(showPerformance) performance_metrics(); } - chat_box(); + if(!main.world->clientStillConnecting) + chat_box(); } - if(io->hoverObstructed && (io->mouse.leftClick || io->mouse.rightClick)) - rightClickPopupLocation = std::nullopt; + if(!main.world->clientStillConnecting) { + if(io->hoverObstructed && (io->mouse.leftClick || io->mouse.rightClick)) + rightClickPopupLocation = std::nullopt; - if(rightClickPopupLocation.has_value()) { - if(!main.world->drawProg.right_click_popup_gui(rightClickPopupLocation.value())) + if(rightClickPopupLocation.has_value()) { + if(!main.world->drawProg.right_click_popup_gui(rightClickPopupLocation.value())) + rightClickPopupLocation = std::nullopt; + } + + if(io->hoverObstructed && io->mouse.rightClick) // This runs specifically if the paint popup has the cursor rightClickPopupLocation = std::nullopt; } - if(io->hoverObstructed && io->mouse.rightClick) // This runs specifically if the paint popup has the cursor - rightClickPopupLocation = std::nullopt; - end_gui(); justAssignedColorLeft = false; @@ -477,50 +486,52 @@ void Toolbar::top_toolbar() { tabNames.emplace_back(main.worlds[i]->netObjMan.is_connected() ? "data/icons/network.svg" : "", main.worlds[i]->name); std::optional closedTab; gui.tab_list("file tab list", tabNames, main.worldIndex, closedTab); - if(main.world->netObjMan.is_connected() && gui.svg_icon_button_transparent("Player List Toggle Button", "data/icons/list.svg", playerMenuOpen)) - playerMenuOpen = !playerMenuOpen; - if(gui.svg_icon_button_transparent("Menu Undo Button", "data/icons/undo.svg")) - main.world->undo_with_checks(); - if(gui.svg_icon_button_transparent("Menu Redo Button", "data/icons/redo.svg")) - main.world->redo_with_checks(); - if(gui.svg_icon_button_transparent("Grids Button", "data/icons/grid.svg", gridMenu.popupOpen)) { + if(!main.world->clientStillConnecting) { + if(main.world->netObjMan.is_connected() && gui.svg_icon_button_transparent("Player List Toggle Button", "data/icons/list.svg", playerMenuOpen)) + playerMenuOpen = !playerMenuOpen; + if(gui.svg_icon_button_transparent("Menu Undo Button", "data/icons/undo.svg")) + main.world->undo_with_checks(); + if(gui.svg_icon_button_transparent("Menu Redo Button", "data/icons/redo.svg")) + main.world->redo_with_checks(); + if(gui.svg_icon_button_transparent("Grids Button", "data/icons/grid.svg", gridMenu.popupOpen)) { + if(gridMenu.popupOpen) + stop_displaying_grid_menu(); + else { + gridMenu.popupOpen = true; + gridMenuPopUpJustOpen = true; + } + } + if(gui.svg_icon_button_transparent("Layer Menu Button", "data/icons/layer.svg", layerMenuPopupOpen)) { + if(layerMenuPopupOpen) { + main.world->drawProg.layerMan.listGUI.refresh_gui_data(); + layerMenuPopupOpen = false; + } + else { + layerMenuPopupOpen = true; + layerMenuPopUpJustOpen = true; + } + } + if(gui.svg_icon_button_transparent("Bookmark Menu Button", "data/icons/bookmark.svg", bookmarkMenuPopupOpen)) { + if(bookmarkMenuPopupOpen) { + main.world->bMan.refresh_gui_data(); + bookmarkMenuPopupOpen = false; + } + else { + bookmarkMenuPopupOpen = true; + bookmarkMenuPopUpJustOpen = true; + } + } + + + if(closedTab) + main.set_tab_to_close(closedTab.value()); if(gridMenu.popupOpen) - stop_displaying_grid_menu(); - else { - gridMenu.popupOpen = true; - gridMenuPopUpJustOpen = true; - } + grid_menu(gridMenuPopUpJustOpen); + if(bookmarkMenuPopupOpen) + bookmark_menu(bookmarkMenuPopUpJustOpen); + if(layerMenuPopupOpen) + layer_menu(layerMenuPopUpJustOpen); } - if(gui.svg_icon_button_transparent("Layer Menu Button", "data/icons/layer.svg", layerMenuPopupOpen)) { - if(layerMenuPopupOpen) { - main.world->drawProg.layerMan.listGUI.refresh_gui_data(); - layerMenuPopupOpen = false; - } - else { - layerMenuPopupOpen = true; - layerMenuPopUpJustOpen = true; - } - } - if(gui.svg_icon_button_transparent("Bookmark Menu Button", "data/icons/bookmark.svg", bookmarkMenuPopupOpen)) { - if(bookmarkMenuPopupOpen) { - main.world->bMan.refresh_gui_data(); - bookmarkMenuPopupOpen = false; - } - else { - bookmarkMenuPopupOpen = true; - bookmarkMenuPopUpJustOpen = true; - } - } - - - if(closedTab) - main.set_tab_to_close(closedTab.value()); - if(gridMenu.popupOpen) - grid_menu(gridMenuPopUpJustOpen); - if(bookmarkMenuPopupOpen) - bookmark_menu(bookmarkMenuPopUpJustOpen); - if(layerMenuPopupOpen) - layer_menu(layerMenuPopUpJustOpen); if(menuPopUpOpen) { CLAY_AUTO_ID({ .layout = { @@ -540,58 +551,60 @@ void Toolbar::top_toolbar() { .isClient = false }, true); } - if(gui.text_button_left_transparent("save file", "Save")) - save_func(); - if(gui.text_button_left_transparent("save as file", "Save As")) - save_as_func(); if(gui.text_button_left_transparent("open file", "Open")) open_world_file(false, "", ""); - if(gui.text_button_left_transparent("screenshot", "Take Screenshot")) - main.world->drawProg.switch_to_tool(DrawingProgramToolType::SCREENSHOT); - if(gui.text_button_left_transparent("add image or file to canvas", "Add Image/File to Canvas")) { - #ifdef __EMSCRIPTEN__ - static std::weak_ptr worldWeakPtr; - worldWeakPtr = make_weak_ptr(main.world); - emscripten_browser_file::upload("*", [](std::string const& fileName, std::string const& mimeType, std::string_view buffer, void* callbackData) { - if(!buffer.empty()) { - auto world = ((std::weak_ptr*)callbackData)->lock(); - if(world) - world->drawProg.add_file_to_canvas_by_data(fileName, buffer, world->main.window.size.cast() / 2.0f); + if(!main.world->clientStillConnecting) { + if(gui.text_button_left_transparent("save file", "Save")) + save_func(); + if(gui.text_button_left_transparent("save as file", "Save As")) + save_as_func(); + if(gui.text_button_left_transparent("screenshot", "Take Screenshot")) + main.world->drawProg.switch_to_tool(DrawingProgramToolType::SCREENSHOT); + if(gui.text_button_left_transparent("add image or file to canvas", "Add Image/File to Canvas")) { + #ifdef __EMSCRIPTEN__ + static std::weak_ptr worldWeakPtr; + worldWeakPtr = make_weak_ptr(main.world); + emscripten_browser_file::upload("*", [](std::string const& fileName, std::string const& mimeType, std::string_view buffer, void* callbackData) { + if(!buffer.empty()) { + auto world = ((std::weak_ptr*)callbackData)->lock(); + if(world) + world->drawProg.add_file_to_canvas_by_data(fileName, buffer, world->main.window.size.cast() / 2.0f); + else + Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); + } + }, &worldWeakPtr); + #else + open_file_selector("Open File", {{"Any File", "*"}}, [w = make_weak_ptr(main.world)](const std::filesystem::path& p, const auto& e) { + auto wLock = w.lock(); + if(wLock) + wLock->drawProg.add_file_to_canvas_by_path(p.string(), wLock->main.window.size.cast() / 2.0f, false); else Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); - } - }, &worldWeakPtr); - #else - open_file_selector("Open File", {{"Any File", "*"}}, [w = make_weak_ptr(main.world)](const std::filesystem::path& p, const auto& e) { - auto wLock = w.lock(); - if(wLock) - wLock->drawProg.add_file_to_canvas_by_path(p.string(), wLock->main.window.size.cast() / 2.0f, false); - else - Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); - }); - #endif - } - if(main.world->netObjMan.is_connected()) { - if(gui.text_button_left_transparent("lobby info", "Lobby Info")) { - optionsMenuOpen = true; - optionsMenuType = LOBBY_INFO_MENU; + }); + #endif + } + if(main.world->netObjMan.is_connected()) { + if(gui.text_button_left_transparent("lobby info", "Lobby Info")) { + optionsMenuOpen = true; + optionsMenuType = LOBBY_INFO_MENU; + } + } + else if(gui.text_button_left_transparent("start hosting", "Host")) { + serverLocalID = NetLibrary::get_random_server_local_id(); + serverToConnectTo = NetLibrary::get_global_id() + serverLocalID; + optionsMenuOpen = true; + optionsMenuType = HOST_MENU; + } + if(gui.text_button_left_transparent("canvas specific settings", "Canvas Settings")) { + optionsMenuOpen = true; + optionsMenuType = CANVAS_SETTINGS_MENU; } - } - else if(gui.text_button_left_transparent("start hosting", "Host")) { - serverLocalID = NetLibrary::get_random_server_local_id(); - serverToConnectTo = NetLibrary::get_global_id() + serverLocalID; - optionsMenuOpen = true; - optionsMenuType = HOST_MENU; } if(gui.text_button_left_transparent("start connecting", "Connect")) { serverToConnectTo.clear(); optionsMenuOpen = true; optionsMenuType = CONNECT_MENU; } - if(gui.text_button_left_transparent("canvas specific settings", "Canvas Settings")) { - optionsMenuOpen = true; - optionsMenuType = CANVAS_SETTINGS_MENU; - } if(gui.text_button_left_transparent("open options", "Settings")) { optionsMenuOpen = true; optionsMenuType = GENERAL_SETTINGS_MENU; @@ -643,6 +656,40 @@ If you like this app, consider downloading the native version for your system)") } } +void Toolbar::still_connecting_center_message() { + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) }, + .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 = {.attachPoints = {.element = CLAY_ATTACH_POINT_CENTER_CENTER, .parent = CLAY_ATTACH_POINT_CENTER_CENTER}, .attachTo = CLAY_ATTACH_TO_PARENT} + }) { + gui.text_label("Connecting to server..."); + } +} + +void Toolbar::no_layers_being_edited_message() { + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) }, + .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 = {.attachPoints = {.element = CLAY_ATTACH_POINT_CENTER_CENTER, .parent = CLAY_ATTACH_POINT_CENTER_CENTER}, .attachTo = CLAY_ATTACH_TO_PARENT} + }) { + gui.text_label("Select a layer to edit"); + } +} + #ifndef __EMSCRIPTEN__ void Toolbar::update_notification_check() { if(!updateCheckerData.updateCheckDone) { diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index a2703c4..2f6231a 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -114,6 +114,8 @@ class Toolbar { void load_default_theme(); void about_menu_gui(); void web_version_welcome(); + void still_connecting_center_message(); + void no_layers_being_edited_message(); #ifndef __EMSCRIPTEN__ void update_notification_gui(); diff --git a/src/World.cpp b/src/World.cpp index fe67c08..3491694 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -548,12 +548,14 @@ void World::list_debug_test_update() { void World::draw(SkCanvas* canvas) { drawData.refresh_draw_optimizing_values(); - if(drawData.drawGrids) - gridMan.draw_back(canvas, drawData); - drawProg.draw(canvas, drawData); - if(drawData.drawGrids) { - gridMan.draw_front(canvas, drawData); - gridMan.draw_coordinates(canvas, drawData); + if(!clientStillConnecting) { + if(drawData.drawGrids) + gridMan.draw_back(canvas, drawData); + drawProg.draw(canvas, drawData); + if(drawData.drawGrids) { + gridMan.draw_front(canvas, drawData); + gridMan.draw_coordinates(canvas, drawData); + } + draw_other_player_cursors(canvas, drawData); } - draw_other_player_cursors(canvas, drawData); }