Files
OrcaSlicer-KX/src/slic3r/GUI/PrintOptionsDialog.hpp
yw4z 0bee82cee5 Hyperlink class (#9947)
### FIXES
• 3mf file version check dialog opens bambu releases page instead Orca

### CODE COMPARISON

<img width="112" height="36" alt="Screenshot-20251128125737" src="https://github.com/user-attachments/assets/73718a18-8159-43d5-bb80-0eb90d59a8f6" />

**wxHyperlinkCtrl**
• System decides what colors to use. so blue color is visible even with colors set
• No need to use SetCursor()
```
auto wiki_url = "https://github.com/OrcaSlicer/OrcaSlicer/wiki/Built-in-placeholders-variables";
wxHyperlinkCtrl* wiki = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide"), wiki_url);
wiki->SetToolTip(wiki_url); // required to showing navigation point to user
wiki->SetFont(Label::Body_14); // not works properly
wiki->SetVisitedColour(wxColour("#009687")); // not works properly
wiki->SetHoverColour(  wxColour("#26A69A")); // not works properly
wiki->SetNormalColour( wxColour("#009687")); // not works properly
```

<img width="132" height="39" alt="Screenshot-20251128125847" src="https://github.com/user-attachments/assets/f6818dc0-5078-498a-bf09-1fd36e81ebe5" />

**wxStaticText**
• Works reliably on colors and fonts
• All event has to defined manually
```
wxStaticText* wiki = new wxStaticText(this, wxID_ANY, _L("Wiki Guide"));
auto wiki_url = "https://github.com/OrcaSlicer/OrcaSlicer/wiki/Built-in-placeholders-variables";
wiki->SetToolTip(wiki_url); // required to showing navigation point to user
wiki->SetForegroundColour(wxColour("#009687"));
wiki->SetCursor(wxCURSOR_HAND);
wxFont font = Label::Body_14;
font.SetUnderlined(true);
wiki->SetFont(font);
wiki->Bind(wxEVT_LEFT_DOWN   ,[this, wiki_url](wxMouseEvent e) {wxLaunchDefaultBrowser(wiki_url);});
wiki->Bind(wxEVT_ENTER_WINDOW,[this, wiki    ](wxMouseEvent e) {SetForegroundColour(wxColour("#26A69A"));});
wiki->Bind(wxEVT_LEAVE_WINDOW,[this, wiki    ](wxMouseEvent e) {SetForegroundColour(wxColour("#009687"));});
```

<img width="132" height="39" alt="Screenshot-20251128125847" src="https://github.com/user-attachments/assets/f6818dc0-5078-498a-bf09-1fd36e81ebe5" />

**HyperLink**
• Fully automated and single line solution
• Colors can be controllable from one place
• Works reliably on colors and fonts
• Reduces duplicate code
```
HyperLink* wiki = new HyperLink(this, _L("Wiki Guide"), "https://github.com/OrcaSlicer/OrcaSlicer/wiki/Built-in-placeholders-variables");
wiki->SetFont(Label::Body_14) // OPTIONAL default is Label::Body_14;
```


### CHANGES
• Unifies all hyperlinks with same style and makes them controllable from one place
• Replaces all wxHyperlink with simple custom class. Problem with wxHyperlink it mostly rendered as blue even color set
• Reduces duplicate code
• Adds wiki links for calibration dialogs
• Probably will add "Wiki Guide" to more dialogs overtime

<img width="349" height="238" alt="Screenshot-20251127212007" src="https://github.com/user-attachments/assets/69da2732-ea35-44de-8ebc-97a01f86328f" />

<img width="355" height="459" alt="Screenshot-20251127212021" src="https://github.com/user-attachments/assets/c0df40f8-c15d-47fa-b31a-cf8d8b337472" />

<img width="442" height="382" alt="Screenshot-20251127212046" src="https://github.com/user-attachments/assets/5d94242b-6364-4b0a-8b2f-a1f482199bd1" />

<img width="225" height="241" alt="Screenshot-20250824171339" src="https://github.com/user-attachments/assets/39ca6af3-6f8a-42ee-bf1d-c13d0f54bb63" />

<img width="442" height="639" alt="Screenshot-20251127212403" src="https://github.com/user-attachments/assets/c1c580f8-3e1b-42f0-aa8e-bac41c2ff76b" />

<img width="476" height="286" alt="Screenshot-20251127212515" src="https://github.com/user-attachments/assets/28b130ce-c7c0-4ada-9842-ff7154c00c21" />

<img width="1460" height="245" alt="Screenshot-20251127212541" src="https://github.com/user-attachments/assets/3fca2649-9cd3-4aea-9153-b2f508fdfefe" />

<img width="401" height="291" alt="Screenshot-20251127213243" src="https://github.com/user-attachments/assets/82b4ec1f-6074-4018-9efa-a1b6b819ae28" />
2026-01-03 23:06:57 +08:00

193 lines
6.0 KiB
C++

#ifndef slic3r_GUI_PrintOptionsDialog_hpp_
#define slic3r_GUI_PrintOptionsDialog_hpp_
#include <wx/wx.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/string.h>
#include <wx/sizer.h>
#include <wx/dialog.h>
#include "GUI_Utils.hpp"
#include "wxExtensions.hpp"
#include "DeviceManager.hpp"
#include "Widgets/Button.hpp"
#include "Widgets/Label.hpp"
#include "Widgets/CheckBox.hpp"
#include "Widgets/StaticLine.hpp"
#include "Widgets/ComboBox.hpp"
#include "Widgets/HyperLink.hpp"
// Previous definitions
class SwitchBoard;
namespace Slic3r { namespace GUI {
class PrinterPartsDialog : public DPIDialog
{
protected:
MachineObject* obj{ nullptr };
ComboBox* nozzle_type_checkbox;
ComboBox* nozzle_diameter_checkbox;
Label* nozzle_flow_type_label;
ComboBox* nozzle_flow_type_checkbox;
Label *change_nozzle_tips;
HyperLink* m_wiki_link;
Button* m_single_update_nozzle_button;
Button* m_multiple_update_nozzle_button;
ComboBox* multiple_left_nozzle_type_checkbox;
ComboBox *multiple_left_nozzle_diameter_checkbox;
ComboBox *multiple_left_nozzle_flow_checkbox;
ComboBox *multiple_right_nozzle_type_checkbox;
ComboBox *multiple_right_nozzle_diameter_checkbox;
ComboBox *multiple_right_nozzle_flow_checkbox;
Label *multiple_change_nozzle_tips;
HyperLink* multiple_wiki_link;
wxPanel *single_panel;
wxPanel *multiple_panel;
public:
PrinterPartsDialog(wxWindow* parent);
~PrinterPartsDialog();
void on_dpi_changed(const wxRect& suggested_rect) override;
void update_machine_obj(MachineObject* obj_);
bool Show(bool show) override;
void UpdateNozzleInfo();
private:
void EnableEditing(bool enable);
void OnWikiClicked(wxMouseEvent& e);
void OnNozzleRefresh(wxCommandEvent& e);
wxString GetString(NozzleType nozzle_type) const;
wxString GetString(NozzleFlowType nozzle_flow_type) const;
wxString GetString(float diameter) const { return wxString::FromDouble(diameter); };
};
class PrintOptionsDialog : public DPIDialog
{
protected:
// settings
wxScrolledWindow* m_scrollwindow;
CheckBox* m_cb_first_layer;
CheckBox * m_cb_ai_monitoring;
CheckBox* m_cb_spaghetti_detection;
CheckBox* m_cb_purgechutepileup_detection;
CheckBox* m_cb_nozzleclumping_detection;
CheckBox* m_cb_airprinting_detection;
CheckBox* m_cb_plate_mark;
CheckBox* m_cb_auto_recovery;
CheckBox* m_cb_save_remote_print_file_to_storage;
CheckBox* m_cb_sup_sound;
CheckBox* m_cb_filament_tangle;
CheckBox* m_cb_nozzle_blob;
CheckBox* m_cb_open_door;
Label* text_first_layer;
Label* text_ai_detections;
Label* text_ai_detections_caption;
wxPanel *ai_refine_panel;
wxSizerItem *ai_detections_bottom_space;
wxSizerItem *ai_monitoring_bottom_space;
wxSizerItem *spaghetti_bottom_space;
wxSizerItem *purgechutepileup_bottom_space;
wxSizerItem *nozzleclumping_bottom_space;
wxSizerItem *airprinting_bottom_space;
Label * text_ai_monitoring;
Label * text_ai_monitoring_caption;
Label* text_spaghetti_detection;
Label* text_spaghetti_detection_caption0;
Label* text_spaghetti_detection_caption1;
Label* text_purgechutepileup_detection;
Label* text_purgechutepileup_detection_caption0;
Label* text_purgechutepileup_detection_caption1;
Label* text_nozzleclumping_detection;
Label* text_nozzleclumping_detection_caption0;
Label* text_nozzleclumping_detection_caption1;
Label *text_airprinting_detection;
Label *text_airprinting_detection_caption0;
Label *text_airprinting_detection_caption1;
ComboBox * ai_monitoring_level_list;
ComboBox *spaghetti_detection_level_list;
ComboBox* purgechutepileup_detection_level_list;
ComboBox* nozzleclumping_detection_level_list;
ComboBox* airprinting_detection_level_list;
Label* text_plate_mark;
Label* text_plate_mark_caption;
Label* text_auto_recovery;
Label* text_save_remote_print_file_to_storage;
Label* text_save_remote_print_file_to_storage_explain;
Label* text_sup_sound;
Label* text_filament_tangle;
Label* text_nozzle_blob;
Label* text_nozzle_blob_caption;
Label* text_open_door;
StaticLine* line1;
StaticLine* line2;
StaticLine* line3;
StaticLine* line4;
StaticLine* line5;
StaticLine* line6;
StaticLine* line7;
SwitchBoard* open_door_switch_board;
wxBoxSizer* create_settings_group(wxWindow* parent);
wxPanel *m_line;
bool print_halt = false;
public:
PrintOptionsDialog(wxWindow* parent);
~PrintOptionsDialog();
void on_dpi_changed(const wxRect &suggested_rect) override;
void update_ai_monitor_status();
//refine printer function options
void update_spaghetti_detection_status();
void update_purgechutepileup_detection_status();
void update_nozzleclumping_detection_status();
void update_airprinting_detection_status();
MachineObject *obj { nullptr };
std::vector<int> last_stage_list_info;
int m_state{0};
void update_options(MachineObject *obj_);
void update_machine_obj(MachineObject *obj_);
bool Show(bool show) override;
enum AiMonitorSensitivityLevel {
LOW = 0,
MEDIUM = 1,
HIGH = 2,
LEVELS_NUM = 3
};
wxString sensitivity_level_to_label_string(enum AiMonitorSensitivityLevel level);
std::string sensitivity_level_to_msg_string(enum AiMonitorSensitivityLevel level);
void set_ai_monitor_sensitivity(wxCommandEvent &evt);
void set_spaghetti_detection_sensitivity(wxCommandEvent& evt);
void set_purgechutepileup_detection_sensitivity(wxCommandEvent &evt);
void set_nozzleclumping_detection_sensitivity(wxCommandEvent &evt);
void set_airprinting_detection_sensitivity(wxCommandEvent &evt);
private:
void UpdateOptionSavePrintFileToStorage(MachineObject *obj);
void UpdateOptionOpenDoorCheck(MachineObject *obj);
};
}} // namespace Slic3r::GUI
#endif