#ifndef slic3r_MsgDialog_hpp_ #define slic3r_MsgDialog_hpp_ #include #include #include "GUI_Utils.hpp" #include #include #include #include #include #include #include #include "Widgets/Button.hpp" #include "Widgets/CheckBox.hpp" #include "Widgets/TextInput.hpp" #include "BBLStatusBar.hpp" #include "BBLStatusBarSend.hpp" #include "libslic3r/Semver.hpp" class wxBoxSizer; class wxCheckBox; class wxStaticBitmap; enum ButtonSizeType{ ButtonSizeNormal = 0, ButtonSizeMiddle = 1, ButtonSizeLong = 2, }; #define MSG_DIALOG_BUTTON_SIZE wxSize(FromDIP(58), FromDIP(24)) #define MSG_DIALOG_MIDDLE_BUTTON_SIZE wxSize(FromDIP(76), FromDIP(24)) #define MSG_DIALOG_LONG_BUTTON_SIZE wxSize(FromDIP(90), FromDIP(24)) namespace Slic3r { namespace GUI { struct ButtonData { ButtonSizeType type; Button * button; }; class MsgButton { public: wxString id; ButtonData *buttondata; }; WX_DECLARE_HASH_MAP(wxString, MsgButton *, wxStringHash, wxStringEqual, MsgButtonsHash); // A message / query dialog with a bitmap on the left and any content on the right // with buttons underneath. struct MsgDialog : DPIDialog { MsgDialog(MsgDialog &&) = delete; MsgDialog(const MsgDialog &) = delete; MsgDialog &operator=(MsgDialog &&) = delete; MsgDialog &operator=(const MsgDialog &) = delete; virtual ~MsgDialog(); void show_dsa_button(wxString const & title = {}); bool get_checkbox_state(); virtual void on_dpi_changed(const wxRect& suggested_rect); void SetButtonLabel(wxWindowID btn_id, const wxString& label, bool set_focus = false); protected: enum { BORDER = 20, LOGO_SPACING = 35, LOGO_GAP = 20, CONTENT_WIDTH = 242, CONTENT_MAX_HEIGHT = 60,//TO BTN_SPACING = 20, VERT_SPACING = 15,//TO }; MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, long style = wxOK, wxBitmap bitmap = wxNullBitmap); // returns pointer to created button Button* add_button(wxWindowID btn_id, bool set_focus = false, const wxString& label = wxString()); // returns pointer to found button or NULL Button* get_button(wxWindowID btn_id); void apply_style(long style); void finalize(); wxFont boldfont; wxBoxSizer *content_sizer; wxBoxSizer *btn_sizer; wxBoxSizer *m_dsa_sizer; wxStaticBitmap *logo; MsgButtonsHash m_buttons; CheckBox* m_checkbox_dsa{nullptr}; }; // Generic error dialog, used for displaying exceptions class ErrorDialog : public MsgDialog { public: // If monospaced_font is true, the error message is displayed using html
tags, // so that the code formatting will be preserved. This is useful for reporting errors from the placeholder parser. ErrorDialog(wxWindow *parent, const wxString &msg, bool courier_font); ErrorDialog(ErrorDialog &&) = delete; ErrorDialog(const ErrorDialog &) = delete; ErrorDialog &operator=(ErrorDialog &&) = delete; ErrorDialog &operator=(const ErrorDialog &) = delete; virtual ~ErrorDialog() = default; private: wxString msg; }; // Generic warning dialog, used for displaying exceptions class WarningDialog : public MsgDialog { public: WarningDialog( wxWindow *parent, const wxString& message, const wxString& caption = wxEmptyString, long style = wxOK); WarningDialog(WarningDialog&&) = delete; WarningDialog(const WarningDialog&) = delete; WarningDialog &operator=(WarningDialog&&) = delete; WarningDialog &operator=(const WarningDialog&) = delete; virtual ~WarningDialog() = default; }; #if 1 // Generic static line, used intead of wxStaticLine //class StaticLine: public wxTextCtrl //{ //public: // StaticLine( wxWindow* parent, // wxWindowID id = wxID_ANY, // const wxPoint& pos = wxDefaultPosition, // const wxSize& size = wxDefaultSize, // long style = wxLI_HORIZONTAL, // const wxString& name = wxString::FromAscii(wxTextCtrlNameStr)) // : wxTextCtrl(parent, id, wxEmptyString, pos, size!=wxDefaultSize ? size : (style == wxLI_HORIZONTAL ? wxSize(10, 1) : wxSize(1, 10)), wxSIMPLE_BORDER, wxDefaultValidator, name) // { // this->Enable(false); // } // ~StaticLine() {} //}; // Generic message dialog, used intead of wxMessageDialog class MessageDialog : public MsgDialog { public: // NOTE! Don't change a signature of contsrucor. It have to be tha same as for wxMessageDialog MessageDialog( wxWindow *parent, const wxString& message, const wxString& caption = wxEmptyString, long style = wxOK); MessageDialog(MessageDialog&&) = delete; MessageDialog(const MessageDialog&) = delete; MessageDialog &operator=(MessageDialog&&) = delete; MessageDialog &operator=(const MessageDialog&) = delete; virtual ~MessageDialog() = default; }; // Generic rich message dialog, used intead of wxRichMessageDialog class RichMessageDialog : public MsgDialog { wxCheckBox* m_checkBox{ nullptr }; wxString m_checkBoxText; bool m_checkBoxValue{ false }; public: // NOTE! Don't change a signature of contsrucor. It have to be tha same as for wxRichMessageDialog RichMessageDialog( wxWindow *parent, const wxString& message, const wxString& caption = wxEmptyString, long style = wxOK); RichMessageDialog(RichMessageDialog&&) = delete; RichMessageDialog(const RichMessageDialog&) = delete; RichMessageDialog &operator=(RichMessageDialog&&) = delete; RichMessageDialog &operator=(const RichMessageDialog&) = delete; virtual ~RichMessageDialog() = default; int ShowModal() override; void ShowCheckBox(const wxString& checkBoxText, bool checked = false) { m_checkBoxText = checkBoxText; m_checkBoxValue = checked; } wxString GetCheckBoxText() const { return m_checkBoxText; } bool IsCheckBoxChecked() const { return m_checkBoxValue; } // This part o fcode isported from the "wx\msgdlg.h" using wxMD = wxMessageDialogBase; // customization of the message box buttons virtual bool SetYesNoLabels(const wxMD::ButtonLabel& yes, const wxMD::ButtonLabel& no) { DoSetCustomLabel(m_yes, yes); DoSetCustomLabel(m_no, no); return true; } virtual bool SetYesNoCancelLabels(const wxMD::ButtonLabel& yes, const wxMD::ButtonLabel& no, const wxMD::ButtonLabel& cancel) { DoSetCustomLabel(m_yes, yes); DoSetCustomLabel(m_no, no); DoSetCustomLabel(m_cancel, cancel); return true; } virtual bool SetOKLabel(const wxMD::ButtonLabel& ok) { DoSetCustomLabel(m_ok, ok); return true; } virtual bool SetOKCancelLabels(const wxMD::ButtonLabel& ok, const wxMD::ButtonLabel& cancel) { DoSetCustomLabel(m_ok, ok); DoSetCustomLabel(m_cancel, cancel); return true; } virtual bool SetHelpLabel(const wxMD::ButtonLabel& help) { DoSetCustomLabel(m_help, help); return true; } // test if any custom labels were set bool HasCustomLabels() const { return !(m_ok.empty() && m_cancel.empty() && m_help.empty() && m_yes.empty() && m_no.empty()); } // these functions return the label to be used for the button which is // either a custom label explicitly set by the user or the default label, // i.e. they always return a valid string wxString GetYesLabel() const { return m_yes.empty() ? GetDefaultYesLabel() : m_yes; } wxString GetNoLabel() const { return m_no.empty() ? GetDefaultNoLabel() : m_no; } wxString GetOKLabel() const { return m_ok.empty() ? GetDefaultOKLabel() : m_ok; } wxString GetCancelLabel() const { return m_cancel.empty() ? GetDefaultCancelLabel() : m_cancel; } wxString GetHelpLabel() const { return m_help.empty() ? GetDefaultHelpLabel() : m_help; } protected: // this function is called by our public SetXXXLabels() and should assign // the value to var with possibly some transformation (e.g. Cocoa version // currently uses this to remove any accelerators from the button strings // while GTK+ one handles stock items specifically here) void DoSetCustomLabel(wxString& var, const wxMD::ButtonLabel& label) { var = label.GetAsString(); } // these functions return the custom label or empty string and should be // used only in specific circumstances such as creating the buttons with // these labels (in which case it makes sense to only use a custom label if // it was really given and fall back on stock label otherwise), use the // Get{Yes,No,OK,Cancel}Label() methods above otherwise const wxString& GetCustomYesLabel() const { return m_yes; } const wxString& GetCustomNoLabel() const { return m_no; } const wxString& GetCustomOKLabel() const { return m_ok; } const wxString& GetCustomHelpLabel() const { return m_help; } const wxString& GetCustomCancelLabel() const { return m_cancel; } private: // these functions may be overridden to provide different defaults for the // default button labels (this is used by wxGTK) virtual wxString GetDefaultYesLabel() const { return wxGetTranslation("Yes"); } virtual wxString GetDefaultNoLabel() const { return wxGetTranslation("No"); } virtual wxString GetDefaultOKLabel() const { return wxGetTranslation("OK"); } virtual wxString GetDefaultCancelLabel() const { return wxGetTranslation("Cancel"); } virtual wxString GetDefaultHelpLabel() const { return wxGetTranslation("Help"); } // labels for the buttons, initially empty meaning that the defaults should // be used, use GetYes/No/OK/CancelLabel() to access them wxString m_yes, m_no, m_ok, m_cancel, m_help; }; #else // just a wrapper for wxStaticLine to use the same code on all platforms class StaticLine : public wxStaticLine { public: StaticLine(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLI_HORIZONTAL, const wxString& name = wxString::FromAscii(wxStaticLineNameStr)) : wxStaticLine(parent, id, pos, size, style, name) {} ~StaticLine() {} }; // just a wrapper to wxMessageBox to use the same code on all platforms class MessageDialog : public wxMessageDialog { public: MessageDialog(wxWindow* parent, const wxString& message, const wxString& caption = wxEmptyString, long style = wxOK) : wxMessageDialog(parent, message, caption, style) {} ~MessageDialog() {} }; // just a wrapper to wxRichMessageBox to use the same code on all platforms class RichMessageDialog : public wxRichMessageDialog { public: RichMessageDialog(wxWindow* parent, const wxString& message, const wxString& caption = wxEmptyString, long style = wxOK) : wxRichMessageDialog(parent, message, caption, style) { this->SetEscapeId(wxID_CANCEL); } ~RichMessageDialog() {} }; #endif // Generic info dialog, used for displaying exceptions class InfoDialog : public MsgDialog { public: InfoDialog(wxWindow *parent, const wxString &title, const wxString &msg, bool is_marked = false, long style = wxOK| wxICON_INFORMATION); InfoDialog(InfoDialog&&) = delete; InfoDialog(const InfoDialog&) = delete; InfoDialog&operator=(InfoDialog&&) = delete; InfoDialog&operator=(const InfoDialog&) = delete; virtual ~InfoDialog() = default; private: wxString msg; }; class DownloadDialog : public MsgDialog { public: DownloadDialog(wxWindow *parent, const wxString &title, const wxString &msg, bool is_marked = false, long style = wxOK | wxCANCEL); DownloadDialog(InfoDialog &&) = delete; DownloadDialog(const InfoDialog &) = delete; DownloadDialog &operator=(InfoDialog &&) = delete; DownloadDialog &operator=(const InfoDialog &) = delete; virtual ~DownloadDialog() = default; void SetExtendedMessage(const wxString &extendedMessage); private: wxString msg; }; class DeleteConfirmDialog : public DPIDialog { public: DeleteConfirmDialog(wxWindow *parent, const wxString &title, const wxString &msg); ~DeleteConfirmDialog(); virtual void on_dpi_changed(const wxRect &suggested_rect); private: wxString msg; Button * m_del_btn = nullptr; Button * m_cancel_btn = nullptr; wxStaticText *m_msg_text = nullptr; }; class Newer3mfVersionDialog : public DPIDialog { public: Newer3mfVersionDialog(wxWindow *parent, const Semver* file_version, const Semver* cloud_version, wxString new_keys); ~Newer3mfVersionDialog(){}; virtual void on_dpi_changed(const wxRect &suggested_rect){}; private: wxBoxSizer *get_msg_sizer(); wxBoxSizer *get_btn_sizer(); private: const Semver *m_file_version; const Semver *m_cloud_version; wxString m_new_keys; Button * m_update_btn = nullptr; Button * m_later_btn = nullptr; wxStaticText *m_msg_text = nullptr; }; } } #endif