From 10c152c40de198abeb5ef137f2d5ee5cc1d74689 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Tue, 2 Aug 2022 14:05:50 +0800 Subject: [PATCH] FIX: CheckBox style on MacOS Change-Id: I54f0c4188288a55d44c510c15efb894b3e9419df --- src/slic3r/GUI/Widgets/CheckBox.cpp | 64 +++++++++++++++++++++++++++++ src/slic3r/GUI/Widgets/CheckBox.hpp | 20 ++++++++- src/slic3r/Utils/MacDarkMode.mm | 5 +++ 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Widgets/CheckBox.cpp b/src/slic3r/GUI/Widgets/CheckBox.cpp index 928782099..e3858480e 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.cpp +++ b/src/slic3r/GUI/Widgets/CheckBox.cpp @@ -18,6 +18,12 @@ CheckBox::CheckBox(wxWindow* parent) if (parent) SetBackgroundColour(parent->GetBackgroundColour()); Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { m_half_checked = false; update(); e.Skip(); }); +#ifdef __WXOSX__ // State not fully implement on MacOS + Bind(wxEVT_SET_FOCUS, &CheckBox::updateBitmap, this); + Bind(wxEVT_KILL_FOCUS, &CheckBox::updateBitmap, this); + Bind(wxEVT_ENTER_WINDOW, &CheckBox::updateBitmap, this); + Bind(wxEVT_LEAVE_WINDOW, &CheckBox::updateBitmap, this); +#endif SetSize(m_on.GetBmpSize()); SetMinSize(m_on.GetBmpSize()); update(); @@ -47,8 +53,66 @@ void CheckBox::update() { SetBitmapLabel((m_half_checked ? m_half : GetValue() ? m_on : m_off).bmp()); SetBitmapDisabled((m_half_checked ? m_half_disabled : GetValue() ? m_on_disabled : m_off_disabled).bmp()); +#ifdef __WXMSW__ SetBitmapFocus((m_half_checked ? m_half_focused : GetValue() ? m_on_focused : m_off_focused).bmp()); +#endif SetBitmapCurrent((m_half_checked ? m_half_focused : GetValue() ? m_on_focused : m_off_focused).bmp()); +#ifdef __WXOSX__ + wxCommandEvent e(wxEVT_UPDATE_UI); + updateBitmap(e); +#endif } +#ifdef __WXMSW__ + CheckBox::State CheckBox::GetNormalState() const { return State_Normal; } + +#endif + + +#ifdef __WXOSX__ + +bool CheckBox::Enable(bool enable) +{ + bool result = wxBitmapToggleButton::Enable(enable); + if (result) { + m_disable = !enable; + wxCommandEvent e(wxEVT_ACTIVATE); + updateBitmap(e); + } + return result; +} + +wxBitmap CheckBox::DoGetBitmap(State which) const +{ + if (m_disable) { + return wxBitmapToggleButton::DoGetBitmap(State_Disabled); + } + if (m_focus) { + return wxBitmapToggleButton::DoGetBitmap(State_Current); + } + return wxBitmapToggleButton::DoGetBitmap(which); +} + +void CheckBox::updateBitmap(wxEvent & evt) +{ + evt.Skip(); + if (evt.GetEventType() == wxEVT_ENTER_WINDOW) { + m_hover = true; + } else if (evt.GetEventType() == wxEVT_LEAVE_WINDOW) { + m_hover = false; + } else { + if (evt.GetEventType() == wxEVT_SET_FOCUS) { + m_focus = true; + } else if (evt.GetEventType() == wxEVT_KILL_FOCUS) { + m_focus = false; + } + wxMouseEvent e; + if (m_hover) + OnEnterWindow(e); + else + OnLeaveWindow(e); + } +} + +#endif diff --git a/src/slic3r/GUI/Widgets/CheckBox.hpp b/src/slic3r/GUI/Widgets/CheckBox.hpp index 6d6451a71..53c41b647 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.hpp +++ b/src/slic3r/GUI/Widgets/CheckBox.hpp @@ -17,9 +17,25 @@ public: void Rescale(); -protected: - virtual State GetNormalState() const wxOVERRIDE; +#ifdef __WXOSX__ + virtual bool Enable(bool enable = true) wxOVERRIDE; +#endif +protected: +#ifdef __WXMSW__ + virtual State GetNormalState() const wxOVERRIDE; +#endif + +#ifdef __WXOSX__ + virtual wxBitmap DoGetBitmap(State which) const wxOVERRIDE; + + void updateBitmap(wxEvent & evt); + + bool m_disable = false; + bool m_hover = false; + bool m_focus = false; +#endif + private: void update(); diff --git a/src/slic3r/Utils/MacDarkMode.mm b/src/slic3r/Utils/MacDarkMode.mm index ec349ec65..24a551882 100644 --- a/src/slic3r/Utils/MacDarkMode.mm +++ b/src/slic3r/Utils/MacDarkMode.mm @@ -140,6 +140,11 @@ void WKWebView_evaluateJavaScript(void * web, wxString const & script, void (*ca method_exchangeImplementations(setBezelStyle, setBezelStyle2); } +- (NSFocusRingType) focusRingType +{ + return NSFocusRingTypeNone; +} + @end /* edit column for wxTableView */