diff --git a/resources/images/toolbar_tooltip.svg b/resources/images/toolbar_tooltip.svg index 96c5684cb0..49279b8ed9 100644 --- a/resources/images/toolbar_tooltip.svg +++ b/resources/images/toolbar_tooltip.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/images/toolbar_tooltip_hover.svg b/resources/images/toolbar_tooltip_hover.svg deleted file mode 100644 index c8d606829e..0000000000 --- a/resources/images/toolbar_tooltip_hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/resources/images/toolbar_video_guide.svg b/resources/images/toolbar_video_guide.svg new file mode 100644 index 0000000000..b39e485af2 --- /dev/null +++ b/resources/images/toolbar_video_guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/toolbar_wiki.svg b/resources/images/toolbar_wiki.svg new file mode 100644 index 0000000000..b10b1dcb17 --- /dev/null +++ b/resources/images/toolbar_wiki.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 3859daf8e9..903524caaa 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -19,7 +19,6 @@ #include "slic3r/GUI/Widgets/Label.hpp" #include #include "slic3r/GUI/wxExtensions.hpp" -#include "slic3r/GUI/Widgets/HyperLink.hpp" #include #include #include "slic3r/GUI/DeviceCore/DevDefs.h" @@ -48,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -103,6 +103,14 @@ void AMSMaterialsSetting::create() m_sizer_button->Add(0, 0, 1, wxEXPAND, 0); + // Orca: link to the Orca Slicer pressure-advance wiki (region-agnostic). + m_wiki_ctrl = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/pressure_advance_calib"; + m_wiki_ctrl->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + m_wiki_ctrl->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + m_wiki_ctrl->SetCanFocus(false); + m_wiki_ctrl->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + m_button_confirm = new Button(this, _L("Confirm")); m_button_confirm->SetStyle(ButtonStyle::Confirm, ButtonType::Choice); m_button_confirm->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_ok, this); @@ -115,8 +123,9 @@ void AMSMaterialsSetting::create() m_button_close->SetStyle(ButtonStyle::Regular, ButtonType::Choice); m_button_close->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_close, this); - m_sizer_button->Add(m_button_confirm, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); - m_sizer_button->Add(m_button_reset, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); + m_sizer_button->Add(m_wiki_ctrl, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); + m_sizer_button->Add(m_button_confirm, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); + m_sizer_button->Add(m_button_reset, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); m_sizer_button->Add(m_button_close, 0, wxALIGN_CENTER, 0); m_sizer_main->Add(m_panel_normal, 0, wxALL, FromDIP(2)); @@ -340,11 +349,7 @@ void AMSMaterialsSetting::create_panel_kn(wxWindow* parent) m_ratio_text->SetForegroundColour(wxColour(50, 58, 61)); m_ratio_text->SetFont(Label::Head_14); - // Orca: link to the Orca Slicer pressure-advance wiki (region-agnostic). - wxString link_url = "https://www.orcaslicer.com/wiki/pressure_advance_calib"; - m_wiki_ctrl = new HyperLink(parent, _L("Wiki Guide"), link_url); cali_title_sizer->Add(m_ratio_text, 0, wxALIGN_CENTER_VERTICAL); - cali_title_sizer->Add(m_wiki_ctrl, 0, wxALIGN_CENTER_VERTICAL); wxBoxSizer *m_sizer_cali_resutl = new wxBoxSizer(wxHORIZONTAL); // pa profile diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index 0ecc8809be..2628e6caf4 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -14,7 +14,6 @@ #include "Widgets/CheckBox.hpp" #include "Widgets/ComboBox.hpp" #include "Widgets/TextInput.hpp" -#include "Widgets/HyperLink.hpp" #include "slic3r/Utils/CalibUtils.hpp" #include #include @@ -194,7 +193,7 @@ protected: wxPanel * m_panel_kn; wxStaticText* m_ratio_text; - HyperLink * m_wiki_ctrl; + Button * m_wiki_ctrl; wxStaticText* m_k_param; TextInput* m_input_k_val; wxStaticText* m_n_param; diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index 7017d52e34..d80bf4edf7 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -21,7 +21,6 @@ #include "slic3r/GUI/PresetComboBoxes.hpp" #include "slic3r/GUI/wxExtensions.hpp" #include -#include "slic3r/GUI/Widgets/HyperLink.hpp" #include #include #include "slic3r/GUI/Widgets/PopupWindow.hpp" @@ -494,7 +493,10 @@ void CaliPageCaption::init_bitmaps() { void CaliPageCaption::create_wiki(wxWindow* parent) { // ORCA standardized HyperLink - m_wiki_text = new HyperLink(parent, _L("Wiki Guide")); + m_wiki_text = new Button(parent, "", "toolbar_wiki", 0, 15); + m_wiki_text->SetToolTip(_L("Wiki Guide")); + m_wiki_text->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + m_wiki_text->SetCanFocus(false); m_wiki_text->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); diff --git a/src/slic3r/GUI/CalibrationWizardPage.hpp b/src/slic3r/GUI/CalibrationWizardPage.hpp index 8624d7c9f7..8f95137e4d 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPage.hpp @@ -7,7 +7,6 @@ #include "Widgets/TextInput.hpp" #include "Widgets/AMSControl.hpp" #include "Widgets/ProgressBar.hpp" -#include "Widgets/HyperLink.hpp" #include "wxExtensions.hpp" #include "PresetComboBoxes.hpp" @@ -155,7 +154,7 @@ private: void init_bitmaps(); void create_wiki(wxWindow* parent); - HyperLink* m_wiki_text; // ORCA + Button* m_wiki_text; // ORCA wxString m_wiki_url; ScalableBitmap m_prev_bmp_normal; ScalableBitmap m_prev_bmp_hover; diff --git a/src/slic3r/GUI/FilamentGroupPopup.cpp b/src/slic3r/GUI/FilamentGroupPopup.cpp index d8442071b4..bb081a6fc1 100644 --- a/src/slic3r/GUI/FilamentGroupPopup.cpp +++ b/src/slic3r/GUI/FilamentGroupPopup.cpp @@ -4,7 +4,6 @@ #include "wx/dcgraph.h" #include "I18N.hpp" #include "PartPlate.hpp" -#include "Widgets/HyperLink.hpp" #include #include "libslic3r/Config.hpp" #include "libslic3r/PrintConfig.hpp" @@ -27,6 +26,7 @@ #include "slic3r/GUI/Widgets/StaticBox.hpp" #include #include "slic3r/GUI/Widgets/SwitchButton.hpp" +#include "slic3r/GUI/Widgets/Button.hpp" #include namespace Slic3r { namespace GUI { @@ -203,18 +203,24 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w { wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL); // ORCA Unified hyperlinks - video_link = new HyperLink(this, _L("Video tutorial")); - video_link->Bind(wxEVT_LEFT_DOWN, [](wxMouseEvent& e) - { - play_dual_extruder_slice_video(); - wxGetApp().app_config->set("play_slicing_video", "false"); - }); - button_sizer->Add(video_link, 0, wxLEFT, horizontal_margin + FromDIP(3)); - button_sizer->AddStretchSpacer(); - wiki_link = new HyperLink(this, _L("Wiki Guide")); - wiki_link->Bind(wxEVT_LEFT_DOWN, [](wxMouseEvent&) { open_filament_group_wiki(); }); - button_sizer->Add(wiki_link, 0, wxLEFT, horizontal_margin); + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + "https://e.bambulab.com/t?c=mOkvsXkJ9pldGYp9"); + wiki_btn->SetStyle(ButtonStyle::Confirm, ::ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([](auto& e) {open_filament_group_wiki();})); + + auto video_btn = new Button(this, "", "toolbar_video_guide", 0, 15); + video_btn->SetToolTip(_L("Video Guide")); + video_btn->SetStyle(ButtonStyle::Confirm, ::ButtonType::Circle); + video_btn->SetCanFocus(false); + video_btn->Bind(wxEVT_LEFT_DOWN, ([](auto& e) { + play_dual_extruder_slice_video(); + wxGetApp().app_config->set("play_slicing_video", "false"); + })); + + button_sizer->Add(wiki_btn , 0, wxLEFT, horizontal_margin + FromDIP(3)); + button_sizer->Add(video_btn, 0, wxLEFT, FromDIP(10)); top_sizer->Add(button_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, horizontal_margin); } diff --git a/src/slic3r/GUI/FilamentGroupPopup.hpp b/src/slic3r/GUI/FilamentGroupPopup.hpp index e50c04317f..bc43876af7 100644 --- a/src/slic3r/GUI/FilamentGroupPopup.hpp +++ b/src/slic3r/GUI/FilamentGroupPopup.hpp @@ -80,10 +80,6 @@ private: wxBitmap unchecked_hover_bmp; wxBitmap global_tag_bmp; - - wxStaticText *wiki_link; - wxStaticText *video_link; - StaticBox *m_smart_filament_panel{nullptr}; wxSizerItem *m_smart_filament_spacer{nullptr}; SwitchButton *m_smart_filament_switch{nullptr}; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index f21ce9ac15..97b566530d 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -32,6 +32,7 @@ #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/GLShader.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoUtils.hpp" #include "libslic3r/Point.hpp" #include #include "libvgcode/include/Viewer.hpp" @@ -3127,27 +3128,6 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) } }; - auto link_filament_group_wiki = [&](const std::string& label) { - ImVec2 wiki_part_size = ImGui::CalcTextSize(label.c_str()); - ImColor HyperColor = ImColor(0, 150, 136, 255); // ORCA match color - ImGui::PushStyleColor(ImGuiCol_Text, HyperColor.Value); - imgui.text(label.c_str()); - ImGui::PopStyleColor(); - - // ORCA use underline to match hyperlink style - ImVec2 lineEnd = ImGui::GetItemRectMax(); - lineEnd.y -= 2.0f; - ImVec2 lineStart = lineEnd; - lineStart.x = ImGui::GetItemRectMin().x; - ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, HyperColor); - // click behavior - if (ImGui::IsMouseHoveringRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), true)) { - if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { - open_filament_group_wiki(); - } - } - }; - auto draw_dash_line = [&](ImDrawList* draw_list, int dash_length = 5, int gap_length = 3) { ImVec2 p1 = ImGui::GetCursorScreenPos(); ImVec2 p2 = ImVec2(p1.x + ImGui::GetContentRegionAvail().x, p1.y); @@ -3221,7 +3201,7 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) else tips_count = 5; - float AMS_container_height = ams_item_height + line_height * tips_count + line_height; + float AMS_container_height = ams_item_height + line_height * tips_count + line_height + window_padding * 2.f; ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0, 0, 0, 0)); // this shold be 0 since its child of gcodeviewer ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 1, 1, 1)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(window_padding * 3, 0)); @@ -3236,10 +3216,6 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) ImGui::Dummy({window_padding, window_padding}); ImGui::PushStyleColor(ImGuiCol_Separator, ImVec4(1.0f,1.0f,1.0f,0.6f)); imgui.bold_text(_u8L("Filament Grouping")); - ImGui::SameLine(); - std::string tip_str = _u8L("Why this grouping"); - ImGui::SetCursorPosX(ImGui::GetWindowContentRegionWidth() - window_padding - ImGui::CalcTextSize(tip_str.c_str()).x); - link_filament_group_wiki(tip_str); ImGui::Separator(); ImGui::PopStyleColor(); ImGui::Dummy({window_padding, window_padding}); @@ -3344,6 +3320,9 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) } ImGui::Dummy({window_padding, window_padding}); + GLGizmoUtils::render_wiki_guide_button(*wxGetApp().plater()->get_current_canvas3D(), m_scale,"https://e.bambulab.com/t?c=mOkvsXkJ9pldGYp9"); + ImGui::SameLine(); + if (!is_optimal_group) { link_text_set_to_optional(_u8L("Set to Optimal")); ImGui::SameLine(); @@ -3352,10 +3331,7 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) } link_text(_u8L("Regroup filament")); - ImGui::SameLine(); - std::string wiki_str = _u8L("Wiki Guide"); // ORCA - ImGui::SetCursorPosX(ImGui::GetWindowContentRegionWidth() - window_padding - ImGui::CalcTextSize(wiki_str.c_str()).x); - link_filament_group_wiki(wiki_str); + ImGui::Dummy({window_padding, window_padding}); ImGui::EndChild(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp index f1b0e2b2ee..0e3e99634c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp @@ -27,6 +27,7 @@ #include "slic3r/GUI/MsgDialog.hpp" #include "slic3r/GUI/OpenGLManager.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Shortcuts.hpp" #include "slic3r/GUI/TextureLibrary.hpp" #include "slic3r/GUI/TextureProjectorFrame.hpp" #include "slic3r/GUI/UVEditorCanvas.hpp" @@ -407,11 +408,48 @@ GLGizmoTextureDisplacement::GLGizmoTextureDisplacement(GLCanvas3D& parent, const bool GLGizmoTextureDisplacement::on_init() { + m_shortcut = Shortcut::GizmoDisplacement; + const wxString ctrl = GUI::shortkey_ctrl_prefix(); + const wxString alt = GUI::shortkey_alt_prefix(); + const wxString shift = GUI::shortkey_shift_prefix(); + + m_desc["cursor_size"] = _L("Brush size"); m_desc["circle"] = _L("Circle"); m_desc["sphere"] = _L("Sphere"); m_desc["remove_layer"] = _L("Remove"); m_desc["bake"] = _L_CONTEXT("Bake", "Texture Displacement"); + + + m_desc["paint"] = _L("Paint"); + m_desc["erase"] = _L("Erase"); + m_desc["gap_area"] = _L("Gap area"); + m_desc["smart_fill_angle"] = _L("Smart fill angle"); + m_desc["toggle_wireframe"] = _L("Toggle Wireframe"); + + std::pair paint_shortcut = {_L("Left mouse button"), m_desc["paint"]}; + std::pair erase_shortcut = {shift + _L("Left mouse button"), m_desc["erase"]}; + std::pair toggle_wireframe_shortcut = {alt + shift + _L_CONTEXT("Enter", "Keyboard Shortcut"), m_desc["toggle_wireframe"]}; + + m_shortcuts_brush = { + paint_shortcut, + erase_shortcut, + {ctrl + _L("Mouse wheel"), m_desc["cursor_size"]}, + toggle_wireframe_shortcut + }; + + m_shortcuts_bucket_fill = { + paint_shortcut, + erase_shortcut, + {ctrl + _L("Mouse wheel"), m_desc["smart_fill_angle"]}, + toggle_wireframe_shortcut + }; + + m_shortcuts_gap_fill = { + {ctrl + _L("Mouse wheel"), m_desc["gap_area"]}, + toggle_wireframe_shortcut + }; + return true; } @@ -5313,6 +5351,12 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float return; ModelVolume *mv = texture_volume(); + float scale = m_parent.get_scale(); + #ifdef WIN32 + int dpi = get_dpi_for_window(wxGetApp().GetTopWindow()); + scale *= (float) dpi / (float) DPI_DEFAULT; + #endif // WIN32 + const float approx_height = m_imgui->scaled(24.f); y = std::min(y, bottom_limit - approx_height); @@ -6891,18 +6935,34 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float } const float button_h = std::round(frame_h * 1.25f); - const float third = std::floor((panel_w - style.ItemSpacing.x) / 3.f); - if (busy) { - if (ImGui::Button((_u8L("Stop") + "##stop").c_str(), ImVec2(third, button_h))) - wxGetApp().plater()->get_ui_job_worker().cancel_all(); - hover_tip(_u8L("Stops the bake. Whatever it had already finished stays on the model, and can be undone.")); - } else { - if (ImGui::Button((_u8L("Close") + "##close").c_str(), ImVec2(third, button_h))) - m_parent.reset_all_gizmos(); - hover_tip(_u8L("Closes the tool without baking. Your paint, layers and settings stay with the model.")); - } + const float button_w = std::max({ + ImGui::CalcTextSize(_u8L("Close").c_str()).x, + ImGui::CalcTextSize(_u8L("Stop").c_str()).x, + ImGui::CalcTextSize(_u8L("Preparing...").c_str()).x, + ImGui::CalcTextSize(_u8L("Baking...").c_str()).x, + }) + m_imgui->scaled(0.5f); + const float row_y = ImGui::GetCursorPosY(); + const float icon_h = 21.f * scale; + const float row_h = std::max(icon_h, button_h); + const std::vector> shortcut = + m_tool_type == ToolType::BUCKET_FILL ? m_shortcuts_bucket_fill + : m_tool_type == ToolType::SMART_FILL ? m_shortcuts_bucket_fill + : m_tool_type == ToolType::BRUSH ? m_shortcuts_brush + : m_tool_type == ToolType::GAP_FILL ? m_shortcuts_gap_fill + : std::vector>{}; + + ImGui::SetCursorPosY(row_y + (row_h - icon_h) * .5f); // center vertically + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(int(m_imgui->scaled(.5f)), style.ItemSpacing.y)); + GLGizmoUtils::render_tooltip_button(m_imgui, m_parent, shortcut, x, y); ImGui::SameLine(); + GLGizmoUtils::render_wiki_guide_button(m_parent, scale, "https://www.orcaslicer.com/wiki/print_prepare/prepare_texture_displacement"); + ImGui::SameLine(); + GLGizmoUtils::render_video_guide_button(m_parent, scale, "https://www.youtube.com/watch?v=D7w3tG1kdvE"); + ImGui::PopStyleVar(1); + + ImGui::SameLine(x0 + panel_w - button_w * 2 - style.ItemSpacing.x); + const bool can_bake = !busy && mv != nullptr && mv->is_texture_displacement_painted(); const std::string bake_label = m_prepare_in_progress ? _u8L("Preparing...") : m_bake_in_progress ? _u8L("Baking...") : @@ -6910,7 +6970,8 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float GLGizmoUtils::push_orca_button_style(); m_imgui->push_bold_font(); m_imgui->disabled_begin(!can_bake); - if (ImGui::Button((bake_label + "##bake").c_str(), ImVec2(x0 + panel_w - ImGui::GetCursorPosX(), button_h))) { + ImGui::SetCursorPosY(row_y + (row_h - button_h) * .5f); // center vertically + if (ImGui::Button((bake_label + "##bake").c_str(), ImVec2(button_w, button_h))) { // Standard mode's Bake is the whole pipeline (remesh -> refine -> displace); Pro's is only the // displacement, because there the user has already prepared the mesh with the controls above. if (pro_mode()) @@ -6935,6 +6996,17 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float "land on - all in one step."), wrap_w); + ImGui::SameLine(); + if (busy) { + if (ImGui::Button((_u8L("Stop") + "##stop").c_str(), ImVec2(button_w, button_h))) + wxGetApp().plater()->get_ui_job_worker().cancel_all(); + hover_tip(_u8L("Stops the bake. Whatever it had already finished stays on the model, and can be undone.")); + } else { + if (ImGui::Button((_u8L("Close") + "##close").c_str(), ImVec2(button_w, button_h))) + m_parent.reset_all_gizmos(); + hover_tip(_u8L("Closes the tool without baking. Your paint, layers and settings stay with the model.")); + } + // What Bake will produce, and which layers it will skip. if (mv != nullptr) { const std::string base_count = base_k > 0 ? Slic3r::format(_u8L("%1% k"), base_k) : diff --git a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp index 6685f8d713..2c6f5bc6c7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp @@ -943,6 +943,13 @@ private: std::map m_desc; + // Contains all shortcuts in the format of {shortcut, description}, e.g. {alt + _L("Left mouse button"), _L("Part_selection")} + std::vector> m_shortcuts_brush; + // Contains all shortcuts in the format of {shortcut, description}, e.g. {alt + _L("Left mouse button"), _L("Part_selection")} + std::vector> m_shortcuts_bucket_fill; + // Contains all shortcuts in the format of {shortcut, description}, e.g. {alt + _L("Left mouse button"), _L("Part_selection")} + std::vector> m_shortcuts_gap_fill; + // Icons for the panel's icon buttons (tools, views, mapping, tiling, layer actions). Loaded through IconManager with // the same colour/monochrome variants the main toolbar uses, so an inactive button shows the icon in // the theme's normal (grey) foreground colour and an active one shows it in its original colours - diff --git a/src/slic3r/GUI/Gizmos/GLGizmoUtils.cpp b/src/slic3r/GUI/Gizmos/GLGizmoUtils.cpp index 19bd47fb6c..2b52fc486e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoUtils.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoUtils.cpp @@ -3,6 +3,7 @@ #include "GLGizmosManager.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/I18N.hpp" #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #include "slic3r/GUI/GUI_Utils.hpp" @@ -55,7 +57,6 @@ namespace Slic3r::GUI::GLGizmoUtils { auto& gizmos_manager = canvas.get_gizmos_manager(); ImTextureID normal_id = gizmos_manager.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); - ImTextureID hover_id = gizmos_manager.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); float scale = canvas.get_scale(); #ifdef WIN32 @@ -63,13 +64,7 @@ namespace Slic3r::GUI::GLGizmoUtils { scale *= (float)dpi / (float)DPI_DEFAULT; #endif - ImVec2 button_size = ImVec2(25 * scale, 25 * scale); - - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 0, 0 }); - - ImGui::ImageButton3(normal_id, hover_id, button_size); - + toolbar_circular_button(normal_id, "##tooltip_btn", scale); if (ImGui::IsItemHovered()) { ImGui::BeginTooltip2(ImVec2(x, caption_y)); for (const auto& item : shortcuts) { @@ -79,7 +74,60 @@ namespace Slic3r::GUI::GLGizmoUtils { } ImGui::EndTooltip(); } - ImGui::PopStyleVar(2); + } + + bool render_wiki_guide_button(const GLCanvas3D& canvas, float scale, const char* url) + { + auto& gm = canvas.get_gizmos_manager(); + auto icon = gm.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_WIKI_GUIDE); + bool clicked = toolbar_circular_button(icon, "##wiki_guide_btn", scale); + if (url && *url && clicked) + wxLaunchDefaultBrowser(wxString::FromUTF8(url)); + if (ImGui::IsItemHovered()){ + if(url && *url) + ImGui::SetTooltip("%s\n%s", _u8L("Wiki Guide").c_str(), url); + else + ImGui::SetTooltip("%s", _u8L("Wiki Guide").c_str()); + } + return clicked; // for dynamically generated links + } + + bool render_video_guide_button(const GLCanvas3D& canvas, float scale, const char* url) + { + auto& gm = canvas.get_gizmos_manager(); + auto icon = gm.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_VIDEO_GUIDE); + bool clicked = toolbar_circular_button(icon, "##video_guide_btn", scale); + if (url && *url && clicked) + wxLaunchDefaultBrowser(wxString::FromUTF8(url)); + if (ImGui::IsItemHovered()){ + if(url && *url) + ImGui::SetTooltip("%s\n%s", _u8L("Video Guide").c_str(), url); + else + ImGui::SetTooltip("%s", _u8L("Video Guide").c_str()); + } + return clicked; // for dynamically generated links + } + + bool toolbar_circular_button(ImTextureID textureID, const char* id, float scale) + { + ImVec2 btn_sz = ImVec2(21 * scale, 21 * scale); + ImVec2 icon_sz = ImVec2(15 * scale, 15 * scale); + float btn_pad = (btn_sz.x - icon_sz.x) * .5f; + + ImVec2 p = ImGui::GetCursorScreenPos(); + bool clicked = ImGui::InvisibleButton(id, btn_sz); + ImDrawList* dl = ImGui::GetWindowDrawList(); + bool is_dark = ImGuiWrapper::COL_WINDOW_BG.x != ImGui::GetStyleColorVec4(ImGuiCol_WindowBg).x; + ImVec4 col = is_dark ? ImGuiWrapper::COL_ORCA_DARK : ImGuiWrapper::COL_ORCA; + ImVec4 col_hvr = is_dark ? ImGuiWrapper::COL_ORCA_HOVER_DARK : ImGuiWrapper::COL_ORCA_HOVER; + dl->AddCircleFilled( + ImVec2(p.x + btn_sz.x * .5f, p.y + btn_sz.y * .5f), + btn_sz.x * .5f, + ImGui::ColorConvertFloat4ToU32((ImGui::IsItemActive()||ImGui::IsItemHovered()) ? col_hvr : col) + ); + dl->AddImage(textureID, ImVec2(p.x + btn_pad, p.y + btn_pad), ImVec2(p.x + btn_sz.x - btn_pad, p.y + btn_sz.y - btn_pad)); + + return clicked; } void begin_right_aligned_buttons(const std::vector& labels) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoUtils.hpp b/src/slic3r/GUI/Gizmos/GLGizmoUtils.hpp index f6feee3df1..83699f8347 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoUtils.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoUtils.hpp @@ -19,6 +19,11 @@ namespace GLGizmoUtils { // Renders a tooltip button using the provided shortcuts void render_tooltip_button( ImGuiWrapper* imgui_wrapper, const GLCanvas3D& canvas, const std::vector>& shortcuts, float x, float y); + + void render_wiki_buttons( + ImGuiWrapper* imgui_wrapper, const GLCanvas3D& canvas, const char* wiki_url, const char* video_url = ""); + bool render_wiki_guide_button(const GLCanvas3D& canvas, float scale, const char* url = ""); + bool render_video_guide_button(const GLCanvas3D& canvas, float scale, const char* url = ""); // Sets up ImGui to render buttons that are right-aligned within the current window, using the provided labels to calculate spacing. void begin_right_aligned_buttons(const std::vector& labels); @@ -27,6 +32,8 @@ namespace GLGizmoUtils { void pop_orca_button_style(); + bool toolbar_circular_button(ImTextureID textureID, const char* id, float scale); + } // namespace GLGizmoUtils } // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 00bdd13bcb..d840754ac2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -308,13 +308,18 @@ bool GLGizmosManager::init_icon_textures() else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_tooltip.svg", 25, 25, texture_id)) // ORCA: Use same resolution with gizmos to prevent blur on icon + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_tooltip.svg", 15, 15, texture_id)) // ORCA: Use same resolution with gizmos to prevent blur on icon icon_list.insert(std::make_pair((int)IC_TOOLBAR_TOOLTIP, texture_id)); else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_tooltip_hover.svg", 25, 25, texture_id)) // ORCA: Use same resolution with gizmos to prevent blur on icon - icon_list.insert(std::make_pair((int)IC_TOOLBAR_TOOLTIP_HOVER, texture_id)); + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_wiki.svg", 15, 15, texture_id)) + icon_list.insert(std::make_pair((int)IC_TOOLBAR_WIKI_GUIDE, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_video_guide.svg", 15, 15, texture_id)) + icon_list.insert(std::make_pair((int)IC_TOOLBAR_VIDEO_GUIDE, texture_id)); else return false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 3f53eeaa93..0914f8d958 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -182,7 +182,8 @@ public: IC_TOOLBAR_RESET_ZERO, IC_TOOLBAR_RESET_ZERO_HOVER, IC_TOOLBAR_TOOLTIP, - IC_TOOLBAR_TOOLTIP_HOVER, + IC_TOOLBAR_WIKI_GUIDE, + IC_TOOLBAR_VIDEO_GUIDE, IC_NAME_COUNT, IC_CANVAS_MENU, IC_CANVAS_MENU_HOVER, diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index e43e47c9aa..571ec0114a 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -20,7 +20,6 @@ #include "slic3r/GUI/DeviceCore/DevConfigUtil.h" #include "slic3r/GUI/DeviceManager.hpp" #include -#include "slic3r/GUI/Widgets/HyperLink.hpp" #include "slic3r/GUI/Widgets/Button.hpp" #include "libslic3r/CommonDefs.hpp" #include "slic3r/GUI/DeviceCore/DevDefs.h" @@ -1545,12 +1544,14 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) change_nozzle_tips->SetFont(Label::Body_13); change_nozzle_tips->SetForegroundColour(STATIC_TEXT_CAPTION_COL); - m_wiki_link = new HyperLink(single_panel, _L("Wiki Guide")); // ORCA - m_wiki_link->SetFont(Label::Body_13); + m_wiki_link = new Button(single_panel, "", "toolbar_wiki", 0, 15); + m_wiki_link->SetToolTip(_L("Wiki Guide")); + m_wiki_link->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + m_wiki_link->SetCanFocus(false); m_wiki_link->Bind(wxEVT_LEFT_DOWN, &PrinterPartsDialog::OnWikiClicked, this); - h_tips_sizer->Add(change_nozzle_tips, 0, wxLEFT); - h_tips_sizer->Add(m_wiki_link, 0, wxLEFT, FromDIP(5)); + h_tips_sizer->Add(m_wiki_link); + h_tips_sizer->Add(change_nozzle_tips, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); wxSizer* single_update_nozzle_sizer = new wxBoxSizer(wxHORIZONTAL); m_single_update_nozzle_button = new Button(single_panel, _L("Refresh")); @@ -1656,13 +1657,15 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) multiple_change_nozzle_tips->SetFont(Label::Body_13); multiple_change_nozzle_tips->SetForegroundColour(STATIC_TEXT_CAPTION_COL); - multiple_wiki_link = new HyperLink(multiple_panel, _L("Wiki Guide")); // ORCA - multiple_wiki_link->SetFont(Label::Body_13); + multiple_wiki_link = new Button(multiple_panel, "", "toolbar_wiki", 0, 15); + multiple_wiki_link->SetToolTip(_L("Wiki Guide")); + multiple_wiki_link->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + multiple_wiki_link->SetCanFocus(false); multiple_wiki_link->Bind(wxEVT_LEFT_DOWN, &PrinterPartsDialog::OnWikiClicked, this); wxSizer* multiple_change_tips_sizer = new wxBoxSizer(wxHORIZONTAL); - multiple_change_tips_sizer->Add(multiple_change_nozzle_tips, 0, wxLEFT); - multiple_change_tips_sizer->Add(multiple_wiki_link, 0, wxLEFT, FromDIP(5)); + multiple_change_tips_sizer->Add(multiple_wiki_link); + multiple_change_tips_sizer->Add(multiple_change_nozzle_tips, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); wxSizer* multiple_update_nozzle_sizer = new wxBoxSizer(wxHORIZONTAL); m_multiple_update_nozzle_button = new Button(multiple_panel, _L("Refresh")); diff --git a/src/slic3r/GUI/PrintOptionsDialog.hpp b/src/slic3r/GUI/PrintOptionsDialog.hpp index 803f35c7ff..6e49e19625 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.hpp +++ b/src/slic3r/GUI/PrintOptionsDialog.hpp @@ -22,9 +22,9 @@ #include "Widgets/CheckBox.hpp" #include "Widgets/StaticLine.hpp" #include "Widgets/ComboBox.hpp" -#include "Widgets/HyperLink.hpp" // Previous definitions +class Button; class SwitchBoard; class MultiSwitchButton; @@ -41,7 +41,7 @@ protected: Label* nozzle_flow_type_label; ComboBox* nozzle_flow_type_checkbox; Label *change_nozzle_tips; - HyperLink* m_wiki_link; + Button* m_wiki_link; Button* m_single_update_nozzle_button; Button* m_multiple_update_nozzle_button; @@ -54,7 +54,7 @@ protected: ComboBox *multiple_right_nozzle_flow_checkbox; Label *multiple_change_nozzle_tips; - HyperLink* multiple_wiki_link; + Button* multiple_wiki_link; wxPanel *single_panel; wxPanel *multiple_panel; diff --git a/src/slic3r/GUI/PublishSettingsDialog.cpp b/src/slic3r/GUI/PublishSettingsDialog.cpp index 7beb3bd9dd..080182a1b6 100644 --- a/src/slic3r/GUI/PublishSettingsDialog.cpp +++ b/src/slic3r/GUI/PublishSettingsDialog.cpp @@ -8,8 +8,8 @@ #include "ConfigValueFormatter.hpp" #include "FilamentBitmapUtils.hpp" #include "Widgets/Label.hpp" +#include "Widgets/Button.hpp" #include "Widgets/CheckBox.hpp" -#include "Widgets/HyperLink.hpp" #include "Widgets/TextInput.hpp" #include "Widgets/DialogButtons.hpp" #include "Widgets/StaticLine.hpp" @@ -756,11 +756,24 @@ PublishSettingsDialog::PublishSettingsDialog(wxWindow* parent, dlg_btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_CANCEL); }); // Guide links, bottom-left, sharing the footer row with the OK/Cancel buttons (pushed right). - wxBoxSizer* links_sizer = new wxBoxSizer(wxVERTICAL); - auto* wiki_link = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/publishing_3mf/publish_3mf.html"); - auto* video_link = new HyperLink(this, _L("Video Guide"), "https://www.youtube.com/watch?v=-xt1N29UIOg"); - links_sizer->Add(wiki_link , 0, wxALIGN_LEFT); - links_sizer->Add(video_link, 0, wxTOP | wxALIGN_LEFT, FromDIP(4)); + wxBoxSizer* links_sizer = new wxBoxSizer(wxHORIZONTAL); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/publishing_3mf/publish_3mf"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + auto video_btn = new Button(this, "", "toolbar_video_guide", 0, 15); + auto video_url = "https://www.youtube.com/watch?v=-xt1N29UIOg"; + video_btn->SetToolTip(_L("Video Guide") + "\n" + video_url); + video_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + video_btn->SetCanFocus(false); + video_btn->Bind(wxEVT_LEFT_DOWN, ([video_url](auto& e) {wxLaunchDefaultBrowser(video_url);})); + + links_sizer->Add(wiki_btn , 0, wxLEFT, FromDIP(10)); + links_sizer->Add(video_btn, 0, wxLEFT, FromDIP(10)); wxBoxSizer* footer = new wxBoxSizer(wxHORIZONTAL); footer->Add(links_sizer, 0, wxALIGN_CENTER_VERTICAL); @@ -771,7 +784,7 @@ PublishSettingsDialog::PublishSettingsDialog(wxWindow* parent, footer_line->SetMinSize(wxSize(-1, 1)); footer_line->SetMaxSize(wxSize(-1, 1)); w_sizer->Add(footer_line, 0, wxRIGHT | wxLEFT | wxTOP | wxEXPAND, FromDIP(10)); - w_sizer->Add(footer, 0, wxRIGHT | wxLEFT | wxTOP | wxBOTTOM | wxEXPAND, FromDIP(10)); + w_sizer->Add(footer, 0, wxEXPAND, FromDIP(10)); SetSizerAndFit(w_sizer); fit_to_content(); // initial size only; the dialog is resizable diff --git a/src/slic3r/GUI/Shortcuts.cpp b/src/slic3r/GUI/Shortcuts.cpp index 8773c6f364..07ff5bda63 100644 --- a/src/slic3r/GUI/Shortcuts.cpp +++ b/src/slic3r/GUI/Shortcuts.cpp @@ -113,6 +113,7 @@ constexpr std::array shortcut_table = {{ SHORTCUT(GizmoMeasure, "gizmo_measure", L("Gizmo measure"), PLATER, { 'U' }), SHORTCUT(GizmoAssembly, "gizmo_assembly", L("Gizmo assemble"), PLATER, { 'Y' }), SHORTCUT(GizmoBrimEars, "gizmo_brim_ears", L("Gizmo brim ears"), PLATER, { 'E' }), + SHORTCUT(GizmoDisplacement, "gizmo_displacement", L("Gizmo texture displacement painting"), PLATER, { 'D' }), // Sliders SHORTCUT(GoToLayer, "go_to_layer", L("Jump to layer"), PREVIEW, { 'G', SHIFT }), diff --git a/src/slic3r/GUI/Shortcuts.hpp b/src/slic3r/GUI/Shortcuts.hpp index 0e61554e2f..a7c6bda8cf 100644 --- a/src/slic3r/GUI/Shortcuts.hpp +++ b/src/slic3r/GUI/Shortcuts.hpp @@ -38,7 +38,7 @@ enum class Shortcut : uint8_t { MoveSelectionLeft, MoveSelectionRight, MoveSelectionUp, MoveSelectionDown, RotateSelectionLeft, RotateSelectionRight, // Gizmos GizmoMove, GizmoRotate, GizmoScale, GizmoFlatten, GizmoCut, GizmoMeshBoolean, GizmoFdmSupports, GizmoSeam, GizmoFuzzySkin, - GizmoMmuSegmentation, GizmoEmboss, GizmoMeasure, GizmoAssembly, GizmoBrimEars, + GizmoMmuSegmentation, GizmoEmboss, GizmoMeasure, GizmoAssembly, GizmoBrimEars, GizmoDisplacement, // Sliders GoToLayer, LayerSliderUp, LayerSliderDown, MovesSliderLeft, MovesSliderRight, MovesSliderStart, MovesSliderEnd, // Painting tools diff --git a/src/slic3r/GUI/StepMeshDialog.cpp b/src/slic3r/GUI/StepMeshDialog.cpp index 07dc559528..379c354e72 100644 --- a/src/slic3r/GUI/StepMeshDialog.cpp +++ b/src/slic3r/GUI/StepMeshDialog.cpp @@ -4,7 +4,6 @@ #include "slic3r/GUI/GUI_Utils.hpp" #include "slic3r/GUI/Widgets/StateColor.hpp" #include "slic3r/GUI/Widgets/Label.hpp" -#include "slic3r/GUI/Widgets/HyperLink.hpp" #include "slic3r/GUI/MsgDialog.hpp" #include "libslic3r/LocalesUtils.hpp" #include "libslic3r/Thread.hpp" @@ -26,6 +25,7 @@ #include #include #include +#include #include using namespace Slic3r; @@ -131,19 +131,14 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line auto tip_frame = new RoundedRectangle(this, StateColor::darkModeColorFor(wxColour("#F1F1F1")), wxDefaultPosition, wxSize(-1,-1), 6, 0); - wxBoxSizer* tips_sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* tips_sizer = new wxBoxSizer(wxHORIZONTAL); wxStaticText* info = new wxStaticText(tip_frame, wxID_ANY, _L("Smaller linear and angular deflections result in higher-quality transformations but increase the processing time.")); info->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#363636"))); info->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F1F1F1"))); info->SetFont(::Label::Body_14); info->Wrap(FromDIP(450)); - // ORCA standardized HyperLink - HyperLink *tips = new HyperLink(tip_frame, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/import_export#step"); - tips->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F1F1F1"))); - - tips_sizer->Add(info, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(10)); - tips_sizer->Add(tips, 0, wxALL, FromDIP(10)); + tips_sizer->Add(info, 0, wxEXPAND |wxALL , FromDIP(10)); tip_frame->SetSizer(tips_sizer); tip_frame->Layout(); @@ -289,12 +284,24 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line save_default_sizer->Add(m_save_default_checkbox, 0, wxALIGN_LEFT); bSizer->Add(save_default_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, LEFT_RIGHT_PADING); - wxBoxSizer* bSizer_button = new wxBoxSizer(wxHORIZONTAL); - bSizer_button->SetMinSize(wxSize(FromDIP(100), -1)); + bSizer->AddSpacer(FromDIP(10)); + m_checkbox = new wxCheckBox(this, wxID_ANY, _L("Don't show again"), wxDefaultPosition, wxDefaultSize, 0); m_checkbox->SetFont(::Label::Body_14); m_checkbox->SetForegroundColour(StateColor::darkModeColorFor(FONT_COLOR)); - bSizer_button->Add(m_checkbox, 0, wxALIGN_LEFT | wxLEFT | wxALIGN_CENTER_VERTICAL, LEFT_RIGHT_PADING); + bSizer->Add(m_checkbox, 0, wxLEFT, LEFT_RIGHT_PADING); + + wxBoxSizer* bSizer_button = new wxBoxSizer(wxHORIZONTAL); + + // ORCA standardized HyperLink + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/import_export#step"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + bSizer_button->Add(wiki_btn, 0, wxALIGN_LEFT | wxLEFT | wxALIGN_CENTER_VERTICAL, LEFT_RIGHT_PADING); + bSizer_button->AddStretchSpacer(1); auto dlg_btns = new DialogButtons(this, {"OK", "Cancel"}); diff --git a/src/slic3r/GUI/TroubleshootDialog.cpp b/src/slic3r/GUI/TroubleshootDialog.cpp index 04e53fa4e4..aa6aa44fb2 100644 --- a/src/slic3r/GUI/TroubleshootDialog.cpp +++ b/src/slic3r/GUI/TroubleshootDialog.cpp @@ -236,7 +236,19 @@ TroubleshootDialog::TroubleshootDialog() Fit(); }); - auto link_wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/troubleshoot_center"); + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/troubleshoot_center"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + auto video_btn = new Button(this, "", "toolbar_video_guide", 0, 15); + auto video_url = "https://www.youtube.com/watch?v=CFzt8W7OCx0"; + video_btn->SetToolTip(_L("Video Guide") + "\n" + video_url); + video_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + video_btn->SetCanFocus(false); + video_btn->Bind(wxEVT_LEFT_DOWN, ([video_url](auto& e) {wxLaunchDefaultBrowser(video_url);})); // RIGHT SIZER ////////////////////// @@ -367,6 +379,10 @@ TroubleshootDialog::TroubleshootDialog() sys_btn_sizer->AddStretchSpacer(); sys_btn_sizer->Add(sys_copy_btn, 0, wxLEFT | wxRIGHT, FromDIP(5)); + wxBoxSizer *link_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + link_btn_sizer->Add(wiki_btn); + link_btn_sizer->Add(video_btn, 0, wxLEFT, FromDIP(10)); + left_sizer->Add(m_header_logo , 0, wxEXPAND | wxALIGN_CENTER); left_sizer->Add(logo_line , 0, wxEXPAND | wxTOP, FromDIP(12)); left_sizer->Add(version , 0, wxEXPAND | wxTOP, FromDIP(6)); @@ -374,8 +390,7 @@ TroubleshootDialog::TroubleshootDialog() left_sizer->Add(sys_panel , 0, wxEXPAND | wxTOP, FromDIP(15)); left_sizer->AddStretchSpacer(); left_sizer->Add(sys_btn_sizer , 0, wxEXPAND | wxTOP, FromDIP(15)); - left_sizer->Add(link_wiki , 0, wxALIGN_CENTER | wxTOP, FromDIP(15)); - left_sizer->AddSpacer(FromDIP(5)); + left_sizer->Add(link_btn_sizer , 0, wxALIGN_CENTER | wxTOP, FromDIP(15)); wxBoxSizer *right_sizer = new wxBoxSizer(wxVERTICAL); diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index b2bc818ad1..ffb3724411 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -62,7 +63,6 @@ #include "PresetComboBoxes.hpp" #include "Widgets/CheckBox.hpp" #include "Widgets/DialogButtons.hpp" -#include "Widgets/HyperLink.hpp" #ifdef __linux__ #define wxLinux true @@ -1011,8 +1011,14 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection *dependent_ checkbox_sizer->Show(bool(m_buttons & REMEMBER_CHOISE)); if (dependent_presets != nullptr) { - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/transfer_discard_changes"); - m_sizer_button->Add(wiki, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(22)); + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/transfer_discard_changes"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + m_sizer_button->Add(wiki_btn, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(22)); } m_sizer_button->Add(0, 0, 1, 0, 0); diff --git a/src/slic3r/GUI/Widgets/Button.cpp b/src/slic3r/GUI/Widgets/Button.cpp index 5ecbafda2b..63558245c8 100644 --- a/src/slic3r/GUI/Widgets/Button.cpp +++ b/src/slic3r/GUI/Widgets/Button.cpp @@ -223,6 +223,12 @@ void Button::SetStyle(const ButtonStyle style, const ButtonType type) this->SetMinSize(FromDIP(wxSize(26, 26))); this->SetSize(FromDIP(wxSize(26, 26))); this->SetCornerRadius(this->FromDIP(4)); + } else if (type == ButtonType::Circle) { + this->SetPaddingSize(FromDIP(wxSize(6, 6))); + this->SetMinSize(FromDIP(wxSize(25, 25))); + this->SetMaxSize(FromDIP(wxSize(25, 25))); + this->SetSize(FromDIP(wxSize(25, 25))); + this->SetCornerRadius(this->FromDIP(12)); } else if (type == ButtonType::Expanded) { this->SetMinSize(FromDIP(wxSize(-1, 32))); this->SetPaddingSize(FromDIP(wxSize(12, 8))); diff --git a/src/slic3r/GUI/Widgets/Button.hpp b/src/slic3r/GUI/Widgets/Button.hpp index b4b1e24bb2..f5f675051f 100644 --- a/src/slic3r/GUI/Widgets/Button.hpp +++ b/src/slic3r/GUI/Widgets/Button.hpp @@ -34,6 +34,7 @@ enum class ButtonType { Parameter, // Font14 Semi-Rounded For buttons that near parameter boxes Icon, // ------ Semi-Rounded For buttons that only has icons. icons should be 16x16 and iconSize has to be defined as 16 while // creation of button + Circle, // ------ FullyRounded Same as icon Expanded, // Font14 Semi-Rounded For full length buttons. ex. buttons in static box }; diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 18b6d5ae3e..10896ad693 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -12,6 +12,7 @@ #include #include "slic3r/GUI/GUI_Utils.hpp" #include +#include "slic3r/GUI/Widgets/Button.hpp" #include "slic3r/GUI/Widgets/Label.hpp" #include "slic3r/GUI/Widgets/LabeledStaticBox.hpp" #include "slic3r/GUI/Widgets/RadioGroup.hpp" @@ -25,7 +26,6 @@ #include #include "MainFrame.hpp" #include "Widgets/DialogButtons.hpp" -#include "Widgets/HyperLink.hpp" #include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "libslic3r/PrintConfig.hpp" #include "libslic3r/Flow.hpp" @@ -237,8 +238,15 @@ PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/pressure_advance_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/pressure_advance_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -459,8 +467,15 @@ Temp_Calibration_Dlg::Temp_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plat auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/temp_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/temp_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -642,8 +657,15 @@ MaxVolumetricSpeed_Test_Dlg::MaxVolumetricSpeed_Test_Dlg(wxWindow* parent, wxWin auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/volumetric_speed_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/volumetric_speed_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -766,8 +788,15 @@ VFA_Test_Dlg::VFA_Test_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/vfa_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/vfa_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -1005,8 +1034,15 @@ Retraction_Test_Dlg::Retraction_Test_Dlg(wxWindow* parent, wxWindowID id, Plater auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/retraction_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/retraction_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -1185,8 +1221,15 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/input_shaping_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/input_shaping_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -1384,8 +1427,15 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/input_shaping_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/input_shaping_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -1580,8 +1630,15 @@ Cornering_Test_Dlg::Cornering_Test_Dlg(wxWindow* parent, wxWindowID id, Plater* auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/cornering_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/cornering_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND); @@ -1719,8 +1776,15 @@ FlowRateCalibrationDialog::FlowRateCalibrationDialog(wxWindow* parent, wxWindowI auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/flow_ratio_calib"); - bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + + auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15); + auto wiki_url = "https://www.orcaslicer.com/wiki/flow_ratio_calib"; + wiki_btn->SetToolTip(_L("Wiki Guide") + "\n" + wiki_url); + wiki_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Circle); + wiki_btn->SetCanFocus(false); + wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);})); + + bottom_sizer->Add(wiki_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(10)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); v_sizer->Add(bottom_sizer, 0, wxEXPAND);