Add system color change responsiveness to ribbon

Add new wxRibbonArtProvider::UpdateColoursFromSystem() and implement it
in wxRibbonMSWArtProvider.

Closes #26644.
This commit is contained in:
Blake-Madden
2026-07-01 03:19:51 +02:00
committed by Vadim Zeitlin
parent 6c3b09b8d3
commit 8b080b8cb0
15 changed files with 82 additions and 16 deletions
+6
View File
@@ -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,
+1
View File
@@ -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);
+1
View File
@@ -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;
+1
View File
@@ -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;
+1
View File
@@ -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);
+1
View File
@@ -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);
+1
View File
@@ -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;
+9
View File
@@ -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.
+19 -16
View File
@@ -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,
+7
View File
@@ -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;
+7
View File
@@ -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
+7
View File
@@ -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());
+7
View File
@@ -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
+7
View File
@@ -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
+7
View File
@@ -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
{