diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 597c48896..586f58e7e 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4201,8 +4201,10 @@ static bool string_getter(const bool is_undo, int idx, const char** out_text) return wxGetApp().plater()->undo_redo_string_getter(is_undo, idx, out_text); } -void GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const +bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const { + bool action_taken = false; + ImGuiWrapper* imgui = wxGetApp().imgui(); const float x = pos_x * (float)get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width(); @@ -4223,11 +4225,16 @@ void GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const m_imgui_undo_redo_hovered_pos = -1; if (selected >= 0) + { is_undo ? wxGetApp().plater()->undo_to(selected) : wxGetApp().plater()->redo_to(selected); + action_taken = true; + } imgui->text(wxString::Format(is_undo ? _L_PLURAL("Undo %1$d Action", "Undo %1$d Actions", hovered + 1) : _L_PLURAL("Redo %1$d Action", "Redo %1$d Actions", hovered + 1), hovered + 1)); imgui->end(); + + return action_taken; } #if ENABLE_THUMBNAIL_GENERATOR @@ -4784,12 +4791,18 @@ bool GLCanvas3D::_init_undoredo_toolbar() item.name = "undo"; item.icon_filename = "undo_toolbar.svg"; - item.tooltip = _utf8(L("Undo")) + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _utf8(L("Click right mouse button to open History")); + item.tooltip = _utf8(L("Undo")) + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _utf8(L("Click right mouse button to open/close History")); item.sprite_id = 0; item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); }; item.right.toggable = true; item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; - item.right.render_callback = [this](float left, float right, float, float) { if (m_canvas != nullptr) _render_undo_redo_stack(true, 0.5f * (left + right)); }; + item.right.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) + { + if (_render_undo_redo_stack(true, 0.5f * (left + right))) + _deactivate_undo_redo_toolbar_items(); + } + }; item.enabling_callback = [this]()->bool { bool can_undo = wxGetApp().plater()->can_undo(); int id = m_undoredo_toolbar.get_item_id("undo"); @@ -4817,11 +4830,17 @@ bool GLCanvas3D::_init_undoredo_toolbar() item.name = "redo"; item.icon_filename = "redo_toolbar.svg"; - item.tooltip = _utf8(L("Redo")) + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _utf8(L("Click right mouse button to open History")); + item.tooltip = _utf8(L("Redo")) + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _utf8(L("Click right mouse button to open/close History")); item.sprite_id = 1; item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_REDO)); }; item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; - item.right.render_callback = [this](float left, float right, float, float) { if (m_canvas != nullptr) _render_undo_redo_stack(false, 0.5f * (left + right)); }; + item.right.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) + { + if (_render_undo_redo_stack(false, 0.5f * (left + right))) + _deactivate_undo_redo_toolbar_items(); + } + }; item.enabling_callback = [this]()->bool { bool can_redo = wxGetApp().plater()->can_redo(); int id = m_undoredo_toolbar.get_item_id("redo"); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 0f9cf7d63..e3d29960b 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -743,7 +743,7 @@ private: #endif // ENABLE_SHOW_CAMERA_TARGET void _render_sla_slices() const; void _render_selection_sidebar_hints() const; - void _render_undo_redo_stack(const bool is_undo, float pos_x) const; + bool _render_undo_redo_stack(const bool is_undo, float pos_x) const; #if ENABLE_THUMBNAIL_GENERATOR void _render_thumbnail_internal(ThumbnailData& thumbnail_data, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const; // render thumbnail using an off-screen framebuffer