diff --git a/include/wx/ribbon/art.h b/include/wx/ribbon/art.h index 63785ce85a..6c4e610466 100644 --- a/include/wx/ribbon/art.h +++ b/include/wx/ribbon/art.h @@ -232,6 +232,10 @@ public: const wxColour& secondary, const wxColour& tertiary) = 0; + // Called when the system colours change; override to recalculate colours + // from system settings. + virtual void UpdateColoursFromSystem() {} + virtual void DrawTabCtrlBackground( wxDC& dc, wxWindow* wnd, @@ -441,6 +445,8 @@ public: const wxColour& secondary, const wxColour& tertiary) override; + void UpdateColoursFromSystem() override; + int GetTabCtrlHeight( wxReadOnlyDC& dc, wxWindow* wnd, diff --git a/include/wx/ribbon/bar.h b/include/wx/ribbon/bar.h index 65fad267bf..20a7805623 100644 --- a/include/wx/ribbon/bar.h +++ b/include/wx/ribbon/bar.h @@ -188,6 +188,7 @@ protected: void DoEraseBackground(wxDC& dc); void OnSize(wxSizeEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); void OnMouseLeftDown(wxMouseEvent& evt); void OnMouseLeftUp(wxMouseEvent& evt); void OnMouseMiddleDown(wxMouseEvent& evt); diff --git a/include/wx/ribbon/buttonbar.h b/include/wx/ribbon/buttonbar.h index 64dc942111..18070ac261 100644 --- a/include/wx/ribbon/buttonbar.h +++ b/include/wx/ribbon/buttonbar.h @@ -185,6 +185,7 @@ protected: void OnMouseDown(wxMouseEvent& evt); void OnMouseUp(wxMouseEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); virtual wxSize DoGetNextSmallerSize(wxOrientation direction, wxSize relative_to) const override; diff --git a/include/wx/ribbon/gallery.h b/include/wx/ribbon/gallery.h index 443c8722bd..5eb63ba388 100644 --- a/include/wx/ribbon/gallery.h +++ b/include/wx/ribbon/gallery.h @@ -88,6 +88,7 @@ protected: void OnPaint(wxPaintEvent& evt); void OnSize(wxSizeEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); int GetScrollLineSize() const; virtual wxSize DoGetBestSize() const override; diff --git a/include/wx/ribbon/page.h b/include/wx/ribbon/page.h index baa734e53d..fb4e009f7d 100644 --- a/include/wx/ribbon/page.h +++ b/include/wx/ribbon/page.h @@ -77,6 +77,7 @@ protected: void OnPaint(wxPaintEvent& evt); void OnSize(wxSizeEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); bool ExpandPanels(wxOrientation direction, int maximum_amount); bool CollapsePanels(wxOrientation direction, int minimum_amount); diff --git a/include/wx/ribbon/panel.h b/include/wx/ribbon/panel.h index 25780c7f6a..0b0f7319ec 100644 --- a/include/wx/ribbon/panel.h +++ b/include/wx/ribbon/panel.h @@ -109,6 +109,7 @@ protected: void OnKillFocus(wxFocusEvent& evt); void OnChildKillFocus(wxFocusEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); void TestPositionForHover(const wxPoint& pos); bool ShouldSendEventToDummy(wxEvent& evt); diff --git a/include/wx/ribbon/toolbar.h b/include/wx/ribbon/toolbar.h index f24ab73082..c162e6bf55 100644 --- a/include/wx/ribbon/toolbar.h +++ b/include/wx/ribbon/toolbar.h @@ -175,6 +175,7 @@ protected: void OnPaint(wxPaintEvent& evt); void OnSize(wxSizeEvent& evt); void OnDPIChanged(wxDPIChangedEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); virtual wxSize DoGetNextSmallerSize(wxOrientation direction, wxSize relative_to) const override; diff --git a/interface/wx/ribbon/art.h b/interface/wx/ribbon/art.h index d99dbb6ea0..b38ee52c75 100644 --- a/interface/wx/ribbon/art.h +++ b/interface/wx/ribbon/art.h @@ -344,6 +344,15 @@ public: const wxColour& secondary, const wxColour& tertiary) = 0; + /** + Called when the system colours change to allow the art provider to + update its colours. Override to recalculate colours from the current + system settings. + + @since 3.3.3 + */ + virtual void UpdateColoursFromSystem() {} + /** Draw the background of the tab region of a ribbon bar. diff --git a/src/ribbon/art_msw.cpp b/src/ribbon/art_msw.cpp index c23a6f353c..442a1f4832 100644 --- a/src/ribbon/art_msw.cpp +++ b/src/ribbon/art_msw.cpp @@ -273,22 +273,7 @@ wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme) m_panel_label_font = m_tab_label_font; if(set_colour_scheme) - { - if (wxSystemSettings::GetAppearance().IsDark()) - { - SetColourScheme( - wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), - wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT), - wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); - } - else - { - SetColourScheme( - wxColour(194, 216, 241), - wxColour(255, 223, 114), - wxColour(0, 0, 0)); - } - } + UpdateColoursFromSystem(); m_cached_tab_separator_visibility = -10.0; // valid visibilities are in range [0, 1] m_tab_separation_size = 3; @@ -311,6 +296,24 @@ wxRibbonMSWArtProvider::~wxRibbonMSWArtProvider() { } +void wxRibbonMSWArtProvider::UpdateColoursFromSystem() +{ + if (wxSystemSettings::GetAppearance().IsDark()) + { + SetColourScheme( + wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), + wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT), + wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } + else + { + SetColourScheme( + wxColour(194, 216, 241), + wxColour(255, 223, 114), + wxColour(0, 0, 0)); + } +} + void wxRibbonMSWArtProvider::GetColourScheme( wxColour* primary, wxColour* secondary, diff --git a/src/ribbon/bar.cpp b/src/ribbon/bar.cpp index f25eb55fdd..a6a8c1848b 100644 --- a/src/ribbon/bar.cpp +++ b/src/ribbon/bar.cpp @@ -55,6 +55,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonBar, wxRibbonControl) EVT_SIZE(wxRibbonBar::OnSize) EVT_KILL_FOCUS(wxRibbonBar::OnKillFocus) EVT_DPI_CHANGED(wxRibbonBar::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonBar::OnSysColourChanged) wxEND_EVENT_TABLE() void wxRibbonBar::AddPage(wxRibbonPage *page) @@ -956,6 +957,12 @@ void wxRibbonBar::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonBar::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + void wxRibbonBar::RepositionPage(wxRibbonPage *page) { int w, h; diff --git a/src/ribbon/buttonbar.cpp b/src/ribbon/buttonbar.cpp index d417106763..5a01aebc41 100644 --- a/src/ribbon/buttonbar.cpp +++ b/src/ribbon/buttonbar.cpp @@ -42,6 +42,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonButtonBar, wxRibbonControl) EVT_LEFT_DCLICK(wxRibbonButtonBar::OnMouseDown) EVT_LEFT_UP(wxRibbonButtonBar::OnMouseUp) EVT_DPI_CHANGED(wxRibbonButtonBar::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonButtonBar::OnSysColourChanged) wxEND_EVENT_TABLE() class wxRibbonButtonBarButtonSizeInfo @@ -1603,4 +1604,10 @@ void wxRibbonButtonBar::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonButtonBar::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + #endif // wxUSE_RIBBON diff --git a/src/ribbon/gallery.cpp b/src/ribbon/gallery.cpp index 63a766cec3..ffe8084bbd 100644 --- a/src/ribbon/gallery.cpp +++ b/src/ribbon/gallery.cpp @@ -73,6 +73,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonGallery, wxRibbonControl) EVT_PAINT(wxRibbonGallery::OnPaint) EVT_SIZE(wxRibbonGallery::OnSize) EVT_DPI_CHANGED(wxRibbonGallery::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonGallery::OnSysColourChanged) wxEND_EVENT_TABLE() wxRibbonGallery::wxRibbonGallery() @@ -539,6 +540,12 @@ void wxRibbonGallery::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonGallery::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + wxRibbonGalleryItem* wxRibbonGallery::Append(const wxBitmapBundle& bitmap, int id) { wxASSERT(bitmap.IsOk()); diff --git a/src/ribbon/page.cpp b/src/ribbon/page.cpp index a3e4756d7e..62adae3eef 100644 --- a/src/ribbon/page.cpp +++ b/src/ribbon/page.cpp @@ -149,6 +149,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonPage, wxRibbonControl) EVT_PAINT(wxRibbonPage::OnPaint) EVT_SIZE(wxRibbonPage::OnSize) EVT_DPI_CHANGED(wxRibbonPage::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonPage::OnSysColourChanged) wxEND_EVENT_TABLE() wxRibbonPage::wxRibbonPage() @@ -570,6 +571,12 @@ void wxRibbonPage::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonPage::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + void wxRibbonPage::RemoveChild(wxWindowBase *child) { // Remove all references to the child from the collapse stack diff --git a/src/ribbon/panel.cpp b/src/ribbon/panel.cpp index 8fc2c1d899..c41a144f32 100644 --- a/src/ribbon/panel.cpp +++ b/src/ribbon/panel.cpp @@ -43,6 +43,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonPanel, wxRibbonControl) EVT_PAINT(wxRibbonPanel::OnPaint) EVT_SIZE(wxRibbonPanel::OnSize) EVT_DPI_CHANGED(wxRibbonPanel::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonPanel::OnSysColourChanged) wxEND_EVENT_TABLE() wxRibbonPanel::wxRibbonPanel() : m_expanded_dummy(nullptr), m_expanded_panel(nullptr) @@ -259,6 +260,12 @@ void wxRibbonPanel::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonPanel::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + void wxRibbonPanel::DoSetSize(int x, int y, int width, int height, int sizeFlags) { // At least on MSW, changing the size of a window will cause GetSize() to diff --git a/src/ribbon/toolbar.cpp b/src/ribbon/toolbar.cpp index 3d0b883749..b04bafc42c 100644 --- a/src/ribbon/toolbar.cpp +++ b/src/ribbon/toolbar.cpp @@ -71,6 +71,7 @@ wxBEGIN_EVENT_TABLE(wxRibbonToolBar, wxRibbonControl) EVT_PAINT(wxRibbonToolBar::OnPaint) EVT_SIZE(wxRibbonToolBar::OnSize) EVT_DPI_CHANGED(wxRibbonToolBar::OnDPIChanged) + EVT_SYS_COLOUR_CHANGED(wxRibbonToolBar::OnSysColourChanged) wxEND_EVENT_TABLE() wxRibbonToolBar::wxRibbonToolBar() @@ -986,6 +987,12 @@ void wxRibbonToolBar::OnDPIChanged(wxDPIChangedEvent& event) event.Skip(); } +void wxRibbonToolBar::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + event.Skip(); + m_art->UpdateColoursFromSystem(); +} + // Finds the best width and height given the parents' width and height wxSize wxRibbonToolBar::GetBestSizeForParentSize(const wxSize& parentSize) const {