diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index bb50dbf..98e7705 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -141,7 +141,7 @@ void DrawCamera::input_key_callback(const InputManager::KeyCallbackArgs& key) { } void DrawCamera::input_mouse_button_on_canvas_callback(World& w, const InputManager::MouseButtonCallbackArgs& button) { - if(!smoothMove.occurring && !isTouchTransforming) { + if(!smoothMove.occurring && !isTouchTransforming && !w.main.g.gui.cursor_obstructed()) { bool newIsAccurateZooming = (w.drawProg.controls.middleClickHeld && w.main.input.pen.isDown && w.main.conf.tabletOptions.zoomWhilePenDownAndButtonHeld) || // Hold middle click (pen button assigned to middle click) while pen is down (w.drawProg.controls.middleClickHeld && w.main.input.key(InputManager::KEY_GENERIC_LCTRL).held) || // Hold middle click/pen button while holding control (w.drawProg.controls.leftClickHeld && w.drawProg.drawTool->get_type() == DrawingProgramToolType::ZOOM); // Hold left click while on zoom tool @@ -178,7 +178,7 @@ void DrawCamera::input_mouse_motion_callback(World& w, const InputManager::Mouse } void DrawCamera::input_mouse_wheel_callback(World& w, const InputManager::MouseWheelCallbackArgs& wheel) { - if(!smoothMove.occurring && !isTouchTransforming && wheel.tickAmount.y()) { + if(!smoothMove.occurring && !isTouchTransforming && wheel.tickAmount.y() && !w.main.g.gui.cursor_obstructed()) { WorldVec mouseWorldPos = c.from_space(wheel.mousePos); WorldScalar zoomFactor(1.0 + w.main.conf.scrollZoomSpeed); diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index bb18fd8..80e0a5c 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -470,8 +470,6 @@ void DrawingProgram::modify_grid(const NetworkingObjects::NetObjWeakPtrworld->drawProg.controls.cursorHoveringOverCanvas) { + if(!drawP.world.main.input.isTouchDevice && !drawData.main->g.gui.cursor_obstructed()) { auto relativeWidthResult = drawP.world.main.toolConfig.get_relative_width_stroke_size(drawP, drawP.world.drawData.cam.c.inverseScale); if(relativeWidthResult.first.has_value()) { float width = relativeWidthResult.first.value(); diff --git a/src/DrawingProgram/Tools/EditTool.cpp b/src/DrawingProgram/Tools/EditTool.cpp index 5a437c1..e938e7a 100644 --- a/src/DrawingProgram/Tools/EditTool.cpp +++ b/src/DrawingProgram/Tools/EditTool.cpp @@ -53,7 +53,7 @@ void EditTool::input_key_callback(const InputManager::KeyCallbackArgs& key) { void EditTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { drawP.selection.input_mouse_button_on_canvas_callback_modify_selection(button); if(button.button == InputManager::MouseButton::LEFT) { - if(button.down) { + if(button.down && !drawP.world.main.g.gui.cursor_obstructed()) { if(!objInfoBeingEdited) { WorldVec mouseWorldPos = drawP.world.drawData.cam.c.from_space(button.pos); diff --git a/src/DrawingProgram/Tools/EllipseDrawTool.cpp b/src/DrawingProgram/Tools/EllipseDrawTool.cpp index ffb3918..5b42954 100644 --- a/src/DrawingProgram/Tools/EllipseDrawTool.cpp +++ b/src/DrawingProgram/Tools/EllipseDrawTool.cpp @@ -42,7 +42,7 @@ void EllipseDrawTool::gui_toolbox() { void EllipseDrawTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { if(button.button == InputManager::MouseButton::LEFT) { - if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited && !drawP.world.main.g.gui.cursor_obstructed()) { auto& toolConfig = drawP.world.main.toolConfig; auto relativeWidthResult = drawP.world.main.toolConfig.get_relative_width_stroke_size(drawP, drawP.world.drawData.cam.c.inverseScale); diff --git a/src/DrawingProgram/Tools/EraserTool.cpp b/src/DrawingProgram/Tools/EraserTool.cpp index 221daa0..4ec049a 100644 --- a/src/DrawingProgram/Tools/EraserTool.cpp +++ b/src/DrawingProgram/Tools/EraserTool.cpp @@ -40,7 +40,7 @@ void EraserTool::right_click_popup_gui(Vector2f popupPos) { void EraserTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { if(button.button == InputManager::MouseButton::LEFT) { - if(button.down && !isErasing) { + if(button.down && !isErasing && !drawP.world.main.g.gui.cursor_obstructed()) { isErasing = true; erase_between_points(button.pos, button.pos); } @@ -108,7 +108,7 @@ void EraserTool::switch_tool(DrawingProgramToolType newTool) { } void EraserTool::tool_update() { - if(drawP.controls.cursorHoveringOverCanvas) + if(!drawP.world.main.g.gui.cursor_obstructed()) drawP.world.main.input.hideCursor = true; } @@ -117,7 +117,7 @@ bool EraserTool::prevent_undo_or_redo() { } void EraserTool::draw(SkCanvas* canvas, const DrawData& drawData) { - if(!drawP.world.main.input.isTouchDevice && drawData.main->world->drawProg.controls.cursorHoveringOverCanvas) { + if(!drawP.world.main.input.isTouchDevice && !drawData.main->g.gui.cursor_obstructed()) { if(!lastPosOpt.has_value()) lastPosOpt = drawData.main->input.mouse.pos; auto& lastPos = lastPosOpt.value(); diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index 8668df8..a85013a 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -52,7 +52,7 @@ void EyeDropperTool::input_mouse_button_on_canvas_callback(const InputManager::M auto& toolConfig = drawP.world.main.toolConfig; auto& selectingStrokeColor = drawP.world.main.toolConfig.eyeDropper.selectingStrokeColor; - if(button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed()) { + if(button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed() && !drawP.world.main.g.gui.cursor_obstructed()) { auto& surface = drawP.world.main.window.intermediateSurface; int xPos = std::clamp(button.pos.x(), 0, drawP.world.main.window.size.x() - 1); diff --git a/src/DrawingProgram/Tools/GridModifyTool.cpp b/src/DrawingProgram/Tools/GridModifyTool.cpp index b5e222f..90d4eb4 100644 --- a/src/DrawingProgram/Tools/GridModifyTool.cpp +++ b/src/DrawingProgram/Tools/GridModifyTool.cpp @@ -46,7 +46,7 @@ void GridModifyTool::input_mouse_button_on_canvas_callback(const InputManager::M if(button.button == InputManager::MouseButton::LEFT) { switch(selectionMode) { case 0: - if(button.down) { + if(button.down && !drawP.world.main.g.gui.cursor_obstructed()) { NetworkingObjects::NetObjTemporaryPtr gLock = grid.lock(); if(gLock) { WorldGrid& g = *gLock; diff --git a/src/DrawingProgram/Tools/LassoSelectTool.cpp b/src/DrawingProgram/Tools/LassoSelectTool.cpp index 52c869f..83ef2ee 100644 --- a/src/DrawingProgram/Tools/LassoSelectTool.cpp +++ b/src/DrawingProgram/Tools/LassoSelectTool.cpp @@ -59,7 +59,7 @@ void LassoSelectTool::input_key_callback(const InputManager::KeyCallbackArgs& ke void LassoSelectTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { drawP.selection.input_mouse_button_on_canvas_callback_modify_selection(button); - if(!controls.isSelecting && button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed()) { + if(!controls.isSelecting && button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed() && !drawP.world.main.g.gui.cursor_obstructed()) { controls = LassoSelectControls(); controls.coords = drawP.world.drawData.cam.c; controls.lassoPoints.emplace_back(controls.coords.get_mouse_pos(drawP.world)); diff --git a/src/DrawingProgram/Tools/LineDrawTool.cpp b/src/DrawingProgram/Tools/LineDrawTool.cpp index 6a40253..ee5d307 100644 --- a/src/DrawingProgram/Tools/LineDrawTool.cpp +++ b/src/DrawingProgram/Tools/LineDrawTool.cpp @@ -35,7 +35,7 @@ void LineDrawTool::gui_toolbox() { void LineDrawTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { if(button.button == InputManager::MouseButton::LEFT) { auto& toolConfig = drawP.world.main.toolConfig; - if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited && !drawP.world.main.g.gui.cursor_obstructed()) { auto relativeWidthResult = drawP.world.main.toolConfig.get_relative_width_stroke_size(drawP, drawP.world.drawData.cam.c.inverseScale); if(!relativeWidthResult.first.has_value()) { drawP.world.main.toolConfig.print_relative_width_fail_message(relativeWidthResult.second); diff --git a/src/DrawingProgram/Tools/RectDrawTool.cpp b/src/DrawingProgram/Tools/RectDrawTool.cpp index 0b363e3..e02064f 100644 --- a/src/DrawingProgram/Tools/RectDrawTool.cpp +++ b/src/DrawingProgram/Tools/RectDrawTool.cpp @@ -42,7 +42,7 @@ void RectDrawTool::gui_toolbox() { void RectDrawTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { if(button.button == InputManager::MouseButton::LEFT) { - if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited && !drawP.world.main.g.gui.cursor_obstructed()) { auto& toolConfig = drawP.world.main.toolConfig; auto& fillStrokeMode = toolConfig.rectDraw.fillStrokeMode; auto& relativeRadiusWidth = toolConfig.rectDraw.relativeRadiusWidth; diff --git a/src/DrawingProgram/Tools/RectSelectTool.cpp b/src/DrawingProgram/Tools/RectSelectTool.cpp index e1cc927..2a13924 100644 --- a/src/DrawingProgram/Tools/RectSelectTool.cpp +++ b/src/DrawingProgram/Tools/RectSelectTool.cpp @@ -33,7 +33,7 @@ void RectSelectTool::input_key_callback(const InputManager::KeyCallbackArgs& key void RectSelectTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { drawP.selection.input_mouse_button_on_canvas_callback_modify_selection(button); - if(!controls.isSelecting && button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed()) { + if(!controls.isSelecting && button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed() && !drawP.world.main.g.gui.cursor_obstructed()) { controls = RectSelectControls(); controls.coords = drawP.world.drawData.cam.c; controls.selectStartAt = controls.selectEndAt = button.pos; diff --git a/src/DrawingProgram/Tools/ScreenshotTool.cpp b/src/DrawingProgram/Tools/ScreenshotTool.cpp index 12e3bec..37665e3 100644 --- a/src/DrawingProgram/Tools/ScreenshotTool.cpp +++ b/src/DrawingProgram/Tools/ScreenshotTool.cpp @@ -135,7 +135,7 @@ void ScreenshotTool::input_mouse_button_on_canvas_callback(const InputManager::M if(button.button == InputManager::MouseButton::LEFT) { switch(controls.selectionMode) { case ScreenshotControls::SelectionMode::NO_SELECTION: { - if(button.down) { + if(button.down && !drawP.world.main.g.gui.cursor_obstructed()) { controls.rectX1 = controls.rectX2 = button.pos.x(); controls.rectY1 = controls.rectY2 = button.pos.y(); controls.coords = drawP.world.drawData.cam.c; @@ -152,7 +152,7 @@ void ScreenshotTool::input_mouse_button_on_canvas_callback(const InputManager::M break; } case ScreenshotControls::SelectionMode::SELECTION_EXISTS: { - if(button.down && selection_exists_update()) { + if(button.down && selection_exists_update() && !drawP.world.main.g.gui.cursor_obstructed()) { for(int i = 0; i < 8; i++) if(SCollision::collide(controls.circles[i], drawP.world.main.input.mouse.pos)) controls.dragType = i; diff --git a/src/DrawingProgram/Tools/TextBoxTool.cpp b/src/DrawingProgram/Tools/TextBoxTool.cpp index aad34e9..dc39cac 100644 --- a/src/DrawingProgram/Tools/TextBoxTool.cpp +++ b/src/DrawingProgram/Tools/TextBoxTool.cpp @@ -31,7 +31,7 @@ void TextBoxTool::gui_toolbox() { void TextBoxTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { if(button.button == InputManager::MouseButton::LEFT) { - if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited && !drawP.world.main.g.gui.cursor_obstructed()) { startAt = button.pos; endAt = startAt; diff --git a/src/GUIStuff/ElementHelpers/ButtonHelpers.cpp b/src/GUIStuff/ElementHelpers/ButtonHelpers.cpp index b41f7d1..23970d2 100644 --- a/src/GUIStuff/ElementHelpers/ButtonHelpers.cpp +++ b/src/GUIStuff/ElementHelpers/ButtonHelpers.cpp @@ -6,13 +6,19 @@ namespace GUIStuff { namespace ElementHelpers { void text_button(GUIManager& gui, const char* id, std::string_view text, const TextButtonOptions& options) { SelectableButton::Data d = selectable_button_options_to_data(options); - d.innerContent = [&gui, text] (const SelectableButton::InnerContentCallbackParameters&) { - text_label(gui, text); + d.innerContent = [&gui, text, centered = options.centered] (const SelectableButton::InnerContentCallbackParameters&) { + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0) }, + .childAlignment = {.x = centered ? CLAY_ALIGN_X_CENTER : CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER} + } + }) { + text_label(gui, text); + } }; CLAY_AUTO_ID({ .layout = { - .sizing = {.width = options.wide ? CLAY_SIZING_GROW(0) : CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) }, - .childAlignment = {.x = options.centered ? CLAY_ALIGN_X_CENTER : CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER} + .sizing = {.width = options.wide ? CLAY_SIZING_GROW(0) : CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) } } }) { gui.element(id, d); diff --git a/src/GUIStuff/Elements/TextBox.impl.hpp b/src/GUIStuff/Elements/TextBox.impl.hpp index 408a908..a0735ca 100644 --- a/src/GUIStuff/Elements/TextBox.impl.hpp +++ b/src/GUIStuff/Elements/TextBox.impl.hpp @@ -69,7 +69,7 @@ template bool TextBox::input_mouse_button_callback(const InputMa textbox->process_mouse_left_button(*cur, button.pos - boundingBox.value().min, button.clicks, true, gui.io.input->key(InputManager::KEY_TEXT_SHIFT).held); isSelected = true; } - else { + else if(isSelected) { gui.io.input->remove_rich_text_box_input(textbox); if(update_data()) gui.set_post_callback_func(userInfo.onEdit); diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 832b130..a439cea 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -237,7 +237,7 @@ void GUIManager::set_to_layout() { void GUIManager::layout_if_necessary() { if(setToLayout) { layout(); - setToLayout = true; + setToLayout = false; } } diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 9759528..bd7699b 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -297,103 +297,90 @@ void Toolbar::close_popup_gui() { std::erase_if(closePopupData.worldsToClose, [](auto& wPair) { return wPair.w.expired(); }); - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_FIT(0), .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 = {.zIndex = 1, .attachPoints = {.element = CLAY_ATTACH_POINT_CENTER_CENTER, .parent = CLAY_ATTACH_POINT_CENTER_CENTER}, .attachTo = CLAY_ATTACH_TO_PARENT} - }) { - gui.new_id("Close single file popup gui", [&] { - text_label(gui, "Files may contain unsaved changes"); - gui.element("close file popup gui scroll area", ScrollArea::Options{ - .scrollVertical = true, - .clipVertical = true, - .showScrollbarY = true, - .innerContent = [&](const ScrollArea::InnerContentParameters&) { - CLAY_AUTO_ID({ - .layout = { - .childGap = io.theme->childGap1, - .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, - .layoutDirection = CLAY_TOP_TO_BOTTOM - } - }) { - size_t i = 0; - for(auto& [w, setToSave] : closePopupData.worldsToClose) { - auto wLock = w.lock(); - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(0) }, - .padding = CLAY_PADDING_ALL(io.theme->padding1), - .childGap = io.theme->childGap1, - .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, - .layoutDirection = CLAY_LEFT_TO_RIGHT - }, - .backgroundColor = convert_vec4(io.theme->backColor2), - .cornerRadius = CLAY_CORNER_RADIUS(io.theme->windowCorners1), - }) { - gui.new_id(i, [&] { - checkbox_boolean(gui, "set to save checkbox", &setToSave); - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) }, - .childGap = 0, - .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, - .layoutDirection = CLAY_TOP_TO_BOTTOM - } - }) { - text_label(gui, wLock->name); - text_label_light(gui, wLock->filePath.empty() ? "Autosave in " + main.documentsPath.string() : wLock->filePath.string()); - } - }); - } - ++i; - } + center_obstructing_window_gui("Close program popup GUI", CLAY_SIZING_FIT(0), CLAY_SIZING_FIT(0, 600), [&] { + text_label(gui, "Files may contain unsaved changes"); + gui.element("close file popup gui scroll area", ScrollArea::Options{ + .scrollVertical = true, + .clipVertical = true, + .showScrollbarY = true, + .innerContent = [&](const ScrollArea::InnerContentParameters&) { + CLAY_AUTO_ID({ + .layout = { + .childGap = io.theme->childGap1, + .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, + .layoutDirection = CLAY_TOP_TO_BOTTOM } - } - }); - text_button(gui, "Save", "Save", { - .wide = true, - .onClick = [&] { + }) { + size_t i = 0; for(auto& [w, setToSave] : closePopupData.worldsToClose) { auto wLock = w.lock(); - if(setToSave) { - if(wLock->filePath.empty()) - wLock->autosave_to_directory(main.documentsPath); - else - wLock->save_to_file(wLock->filePath); + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(0) }, + .padding = CLAY_PADDING_ALL(io.theme->padding1), + .childGap = io.theme->childGap1, + .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, + .layoutDirection = CLAY_LEFT_TO_RIGHT + }, + .backgroundColor = convert_vec4(io.theme->backColor2), + .cornerRadius = CLAY_CORNER_RADIUS(io.theme->windowCorners1), + }) { + gui.new_id(i, [&] { + checkbox_boolean(gui, "set to save checkbox", &setToSave); + CLAY_AUTO_ID({ + .layout = { + .sizing = {.width = CLAY_SIZING_FIT(0), .height = CLAY_SIZING_FIT(0) }, + .childGap = 0, + .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER}, + .layoutDirection = CLAY_TOP_TO_BOTTOM + } + }) { + text_label(gui, wLock->name); + text_label_light(gui, wLock->filePath.empty() ? "Autosave in " + main.documentsPath.string() : wLock->filePath.string()); + } + }); } - main.set_tab_to_close(w); + ++i; } - closePopupData.worldsToClose.clear(); - if(closePopupData.closeAppWhenDone) - main.setToQuit = true; } - }); - text_button(gui, "Discard All", "Discard All", { - .wide = true, - .onClick = [&] { - for(auto& [w, setToSave] : closePopupData.worldsToClose) - main.set_tab_to_close(w); - closePopupData.worldsToClose.clear(); - if(closePopupData.closeAppWhenDone) - main.setToQuit = true; - } - }); - text_button(gui, "Cancel", "Cancel", { - .wide = true, - .onClick = [&] { - closePopupData.worldsToClose.clear(); - closePopupData.closeAppWhenDone = false; - } - }); + } }); - } + text_button(gui, "Save", "Save", { + .wide = true, + .onClick = [&] { + for(auto& [w, setToSave] : closePopupData.worldsToClose) { + auto wLock = w.lock(); + if(setToSave) { + if(wLock->filePath.empty()) + wLock->autosave_to_directory(main.documentsPath); + else + wLock->save_to_file(wLock->filePath); + } + main.set_tab_to_close(w); + } + closePopupData.worldsToClose.clear(); + if(closePopupData.closeAppWhenDone) + main.setToQuit = true; + } + }); + text_button(gui, "Discard All", "Discard All", { + .wide = true, + .onClick = [&] { + for(auto& [w, setToSave] : closePopupData.worldsToClose) + main.set_tab_to_close(w); + closePopupData.worldsToClose.clear(); + if(closePopupData.closeAppWhenDone) + main.setToQuit = true; + } + }); + text_button(gui, "Cancel", "Cancel", { + .wide = true, + .onClick = [&] { + closePopupData.worldsToClose.clear(); + closePopupData.closeAppWhenDone = false; + } + }); + }); } void Toolbar::save_func() { @@ -451,10 +438,10 @@ void Toolbar::top_toolbar() { }) { gui.new_id("menu top toolbar", [&] { global_log(); - bool menuPopUpJustOpen = false; bool bookmarkMenuPopUpJustOpen = false; bool gridMenuPopUpJustOpen = false; bool layerMenuPopUpJustOpen = false; + auto icon_button_top_toolbar = [&](const char* id, const std::string& svgPath, bool isSelected, const std::function& onClick) { svg_icon_button(gui, id, svgPath, { .drawType = SelectableButton::DrawType::TRANSPARENT_ALL, @@ -462,12 +449,12 @@ void Toolbar::top_toolbar() { .onClick = onClick }); }; + + menuPopupOpenFlipped = false; icon_button_top_toolbar("Main Menu Button", "data/icons/menu.svg", menuPopUpOpen, [&] { - if(menuPopUpOpen) - menuPopUpOpen = false; - else { - menuPopUpOpen = true; - menuPopUpJustOpen = true; + if(!menuPopupOpenFlipped) { + menuPopUpOpen = !menuPopUpOpen; + menuPopupOpenFlipped = false; } }); @@ -563,6 +550,7 @@ void Toolbar::top_toolbar() { text_button(gui, id, str, { .drawType = SelectableButton::DrawType::TRANSPARENT_ALL, .wide = true, + .centered = false, .onClick = [&]{ onClick(); menuPopUpOpen = false; @@ -641,8 +629,9 @@ void Toolbar::top_toolbar() { } }, LayoutElement::Callbacks { .mouseButton = [&](const InputManager::MouseButtonCallbackArgs& button, bool mouseHovering) { - if(!mouseHovering && button.down) { + if(!mouseHovering && button.down && !menuPopupOpenFlipped) { menuPopUpOpen = false; + menuPopupOpenFlipped = true; gui.set_to_layout(); } return mouseHovering; @@ -749,8 +738,10 @@ void Toolbar::update_notification_check() { VersionNumber& currentV = currentVersion.value(); updateCheckerData.newVersionStr = version_numbers_to_version_str(newV); Logger::get().log("INFO", "Latest online version is v" + updateCheckerData.newVersionStr); - if(newV > currentV) + if(newV > currentV) { updateCheckerData.showGui = true; + main.g.gui.set_to_layout(); + } else if(newV == currentV) Logger::get().log("INFO", "Current version is up to date"); else @@ -776,20 +767,8 @@ void Toolbar::update_notification_check() { void Toolbar::update_notification_gui() { auto& gui = main.g.gui; - auto& io = gui.io; - CLAY_AUTO_ID({ - .layout = { - .sizing = {.width = CLAY_SIZING_FIXED(700), .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} - }) { + center_obstructing_window_gui("Update notifications GUI", CLAY_SIZING_FIXED(700), CLAY_SIZING_FIT(0), [&] { gui.new_id("update notification gui", [&] { text_label_centered(gui, "Update v" + updateCheckerData.newVersionStr + " available!"); text_button(gui, "download", "Open download page in web browser", { @@ -813,7 +792,7 @@ void Toolbar::update_notification_gui() { } }); }); - } + }); } #endif diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index 45cb8f1..e881978 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -147,6 +147,7 @@ class Toolbar { bool showPerformance = false; bool menuPopUpOpen = false; + bool menuPopupOpenFlipped = false; bool optionsMenuOpen = false; bool playerMenuOpen = false;