Skip to content

Commit 83f4cf0

Browse files
committed
Add Dark Mode support for Windows
1 parent f0199f3 commit 83f4cf0

File tree

9 files changed

+113
-59
lines changed

9 files changed

+113
-59
lines changed

clientgui/BOINCGUIApp.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ bool CBOINCGUIApp::OnInit() {
108108
#if SUPPORTDARKMODE
109109
wxSystemAppearance appearance = wxSystemSettings::GetAppearance();
110110
m_isDarkMode = appearance.IsDark();
111+
#if defined(__WXMSW__)
112+
// wxWidgets' IsDark() returns false on Win 11 now even if dark mode is enabled
113+
// so we need to additionally check AreAppsDark()
114+
m_isDarkMode = m_isDarkMode || appearance.AreAppsDark();
115+
MSWEnableDarkMode(wxApp::DarkMode_Auto);
116+
#endif
111117
#endif
112118

113119
s_bSkipExitConfirmation = false;

clientgui/BOINCGUIApp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
// BOINC to adjust standard UI items for Dark Mode, be sure to guard
4242
// those changes so they do not affect the Mac implementation.
4343
//
44-
#if (defined(__WXMAC__) || defined(__WXGTK__))
44+
#if (defined(__WXMAC__) || defined(__WXGTK__) || defined(__WXMSW__))
4545
#define SUPPORTDARKMODE true
4646
#else
4747
#define SUPPORTDARKMODE false

clientgui/BOINCListCtrl.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,23 @@ void CBOINCListCtrl::DrawProgressBars()
524524
int n = (int)m_iRowsNeedingProgressBars.GetCount();
525525
if (n <= 0) return;
526526

527-
wxColour progressColor = isDarkMode ? wxColour(0, 64, 128) : wxColour(192, 217, 217);
527+
wxColour progressColor;
528+
wxColour remainderColor;
529+
wxColour textColor;
530+
531+
if (isDarkMode) {
532+
progressColor = wxColour(96, 96, 96);
533+
remainderColor = wxColour(24, 24, 24);
534+
textColor = wxColour(230, 230, 230);
535+
} else {
536+
progressColor = wxColour(192, 217, 217);
537+
remainderColor = *wxWHITE;
538+
textColor = *wxBLACK;
539+
}
540+
528541
wxBrush progressBrush(progressColor);
542+
wxBrush remainderBrush(remainderColor);
543+
wxPen remainderPen(remainderColor);
529544

530545
numItems = GetItemCount();
531546
if (numItems) {
@@ -606,12 +621,13 @@ void CBOINCListCtrl::DrawProgressBars()
606621
dc.SetPen(bkgd);
607622
dc.SetBrush(bkgd);
608623
#else
609-
dc.SetPen(isDarkMode ? *wxBLACK_PEN : *wxWHITE_PEN);
610-
dc.SetBrush(isDarkMode ? *wxBLACK_BRUSH : *wxWHITE_BRUSH);
624+
dc.SetPen(remainderPen);
625+
dc.SetBrush(remainderBrush);
611626
#endif
612627
dc.DrawRectangle( rr );
613628

614629
dc.SetPen(*wxBLACK_PEN);
630+
dc.SetTextForeground(textColor);
615631
dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
616632
if (xx > (r.width - 7)) {
617633
dc.DrawText(progressString, r.x, r.y);

clientgui/NoticeListCtrl.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,8 @@ bool CNoticeListCtrl::Create( wxWindow* parent ) {
101101
SetSizer(topsizer);
102102

103103
m_itemCount = 0;
104-
bool isWindowsDarkMode = false;
105-
#ifdef __WXMSW__
106-
const wxSystemAppearance appearance = wxSystemSettings::GetAppearance();
107-
isWindowsDarkMode = appearance.IsSystemDark();
108-
#endif
109-
if (wxGetApp().GetIsDarkMode() || isWindowsDarkMode){
104+
105+
if (wxGetApp().GetIsDarkMode()){
110106
#if wxUSE_WEBVIEW
111107
m_noticesBody = wxT("<html><style>body{background-color:black;color:white;}</style><head></head><body></body></html>");
112108
#else

clientgui/ViewResources.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,26 +40,28 @@ END_EVENT_TABLE ()
4040

4141

4242
CViewResources::CViewResources()
43+
: m_BOINCwasEmpty(false)
44+
, m_isDarkTheme(wxGetApp().GetIsDarkMode())
4345
{}
4446

4547
CViewResources::CViewResources(wxNotebook* pNotebook) :
4648
CBOINCBaseView(pNotebook)
49+
, m_BOINCwasEmpty(false)
50+
, m_isDarkTheme(wxGetApp().GetIsDarkMode())
4751
{
48-
bool isDarkMode = wxGetApp().GetIsDarkMode();
49-
m_BOINCwasEmpty=false;
50-
5152
wxGridSizer* itemGridSizer = new wxGridSizer(2, 0, 3);
5253
wxASSERT(itemGridSizer);
5354

5455
// create pie chart ctrl for total disk usage
5556
m_pieCtrlTotal = new wxPieCtrl(this, ID_PIECTRL_RESOURCEUTILIZATIONVIEWTOTAL, wxDefaultPosition, wxDefaultSize);
5657
wxASSERT(m_pieCtrlTotal);
58+
m_pieCtrlTotal->ApplyTheme(m_isDarkTheme);
5759

5860
// setup the legend
5961
m_pieCtrlTotal->SetTransparent(true);
6062
m_pieCtrlTotal->SetHorLegendBorder(10);
6163
m_pieCtrlTotal->SetLabelFont(*wxSWISS_FONT);
62-
m_pieCtrlTotal->SetLabelColour(isDarkMode ? *wxWHITE : *wxBLACK);
64+
m_pieCtrlTotal->SetLabelColour(m_isDarkTheme ? *wxWHITE : *wxBLACK);
6365
m_pieCtrlTotal->SetLabel(_("Total disk usage"));
6466

6567
// initialize pie control
@@ -75,12 +77,13 @@ CViewResources::CViewResources(wxNotebook* pNotebook) :
7577
// create pie chart ctrl for BOINC disk usage
7678
m_pieCtrlBOINC = new wxPieCtrl(this, ID_PIECTRL_RESOURCEUTILIZATIONVIEW, wxDefaultPosition, wxDefaultSize);
7779
wxASSERT(m_pieCtrlBOINC);
80+
m_pieCtrlBOINC->ApplyTheme(m_isDarkTheme);
7881

7982
//setup the legend
8083
m_pieCtrlBOINC->SetTransparent(true);
8184
m_pieCtrlBOINC->SetHorLegendBorder(10);
8285
m_pieCtrlBOINC->SetLabelFont(*wxSWISS_FONT);
83-
m_pieCtrlTotal->SetLabelColour(isDarkMode ? *wxWHITE : *wxBLACK);
86+
m_pieCtrlBOINC->SetLabelColour(m_isDarkTheme ? *wxWHITE : *wxBLACK);
8487
m_pieCtrlBOINC->SetLabel(_("Disk usage by BOINC projects"));
8588

8689
// initialize pie control
@@ -173,7 +176,6 @@ void CViewResources::OnListRender() {
173176
wxString diskspace;
174177
static double project_total=0.0;
175178
unsigned int i;
176-
bool isDarkMode = wxGetApp().GetIsDarkMode();
177179

178180
wxASSERT(pDoc);
179181
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
@@ -228,7 +230,7 @@ void CViewResources::OnListRender() {
228230
wxPiePart part;
229231
part.SetLabel(_("no projects: 0 bytes used"));
230232
part.SetValue(1);
231-
part.SetColour(isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0));
233+
part.SetColour(m_isDarkTheme ? wxColour(255, 255, 255) : wxColour(0,0,0));
232234
m_pieCtrlBOINC->m_Series.Add(part);
233235
m_pieCtrlBOINC->Refresh();
234236
m_BOINCwasEmpty=true;
@@ -263,8 +265,7 @@ void CViewResources::OnListRender() {
263265
FormatDiskSpace(boinc_total, diskspace);
264266
part.SetLabel(_("used by BOINC: ") + diskspace);
265267
part.SetValue(boinc_total);
266-
part.SetColour(isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0));
267-
part.SetColour(isDarkMode ? *wxWHITE : *wxBLACK);
268+
part.SetColour(m_isDarkTheme ? *wxWHITE : *wxBLACK);
268269
m_pieCtrlTotal->m_Series.Add(part);
269270

270271
if (pDoc->disk_usage.d_allowed > 0) {
@@ -274,15 +275,15 @@ void CViewResources::OnListRender() {
274275
FormatDiskSpace(avail, diskspace);
275276
part.SetLabel(_("free, available to BOINC: ") + diskspace);
276277
part.SetValue(avail == 0 ? 1 : avail);
277-
part.SetColour(isDarkMode ? wxColour(108, 108, 108) : wxColour(128, 128, 128));
278+
part.SetColour(m_isDarkTheme ? wxColour(108, 108, 108) : wxColour(128, 128, 128));
278279
m_pieCtrlTotal->m_Series.Add(part);
279280

280281
double not_avail = free - avail;
281282
if (not_avail > 0) {
282283
FormatDiskSpace(not_avail, diskspace);
283284
part.SetLabel(_("free, not available to BOINC: ") + diskspace);
284285
part.SetValue(not_avail);
285-
part.SetColour(isDarkMode ? wxColour(172,172,172) : wxColour(238,238,238));
286+
part.SetColour(m_isDarkTheme ? wxColour(172,172,172) : wxColour(238,238,238));
286287
m_pieCtrlTotal->m_Series.Add(part);
287288
}
288289
} else {
@@ -292,7 +293,7 @@ void CViewResources::OnListRender() {
292293
FormatDiskSpace(free, diskspace);
293294
part.SetLabel(_("free: ") + diskspace);
294295
part.SetValue(free);
295-
part.SetColour(isDarkMode ? wxColour(172,172,172) : wxColour(238,238,238));
296+
part.SetColour(m_isDarkTheme ? wxColour(172,172,172) : wxColour(238,238,238));
296297
m_pieCtrlTotal->m_Series.Add(part);
297298
}
298299

@@ -301,7 +302,7 @@ void CViewResources::OnListRender() {
301302
FormatDiskSpace(used_by_others, diskspace);
302303
part.SetLabel(_("used by other programs: ") + diskspace);
303304
part.SetValue(used_by_others);
304-
part.SetColour(isDarkMode ? wxColour(140,140,140) : wxColour(192,192,192));
305+
part.SetColour(m_isDarkTheme ? wxColour(140,140,140) : wxColour(192,192,192));
305306
m_pieCtrlTotal->m_Series.Add(part);
306307
m_pieCtrlTotal->Refresh();
307308
}

clientgui/ViewResources.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class CViewResources : public CBOINCBaseView
5252
wxPieCtrl* m_pieCtrlTotal;
5353

5454
bool m_BOINCwasEmpty;
55+
bool m_isDarkTheme;
5556

5657
virtual void UpdateSelection();
5758

clientgui/ViewStatistics.cpp

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -157,34 +157,65 @@ CPaintStatistics::CPaintStatistics(wxWindow* parent, wxWindowID id, const wxPoin
157157
m_LegendDraw = true;
158158

159159
// Default colours
160-
m_pen_MarkerLineColour = wxColour(0, 0, 0);
161-
m_pen_ZoomRectColour = wxColour (128, 64, 95);
162-
m_brush_ZoomRectColour = wxColour(24, 31, 0);
163-
m_brush_AxisColour = wxColour(192, 224, 255);
164-
m_pen_AxisColour = wxColour(64, 128, 192);
165-
m_pen_AxisColourZoom = wxColour(255, 64, 0);
166-
m_pen_AxisColourAutoZoom = wxColour(64, 128, 192);
167-
m_pen_AxisXColour = wxColour(64, 128, 192);
168-
m_pen_AxisYColour = wxColour(64, 128, 192);
169-
m_pen_AxisXTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
170-
m_pen_AxisYTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
171-
172-
m_brush_LegendColour = isDarkMode ? wxColour(0, 64, 128) : wxColour(235, 255, 255);
173-
m_brush_LegendSelectColour = wxColour(192, 224, 255);
174-
m_pen_LegendSelectColour = wxColour(64, 128, 192);
175-
m_pen_LegendSelectTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
176-
m_pen_LegendColour = wxColour(64, 128, 192);
177-
m_pen_LegendTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
178-
m_brush_MainColour = isDarkMode ? wxColour(0,0,0) : wxColour(255, 255, 255);
179-
m_pen_MainColour = wxColour(64, 128, 192);
180-
181-
m_pen_HeadTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
182-
m_pen_ProjectHeadTextColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0,0,0);
183-
184-
m_pen_GraphTotalColour = wxColour(255, 0, 0);
185-
m_pen_GraphRACColour = wxColour(0, 160, 0);
186-
m_pen_GraphTotalHostColour = wxColour(0, 0, 255);
187-
m_pen_GraphRACHostColour = wxColour(0, 0, 0);
160+
if (isDarkMode) {
161+
m_pen_MarkerLineColour = wxColour(220, 220, 220);
162+
m_pen_ZoomRectColour = wxColour(180, 200, 220);
163+
m_brush_ZoomRectColour = wxColour(32, 48, 64);
164+
m_brush_AxisColour = wxColour(24, 24, 24);
165+
m_pen_AxisColour = wxColour(96, 128, 160);
166+
m_pen_AxisColourZoom = wxColour(255, 128, 64);
167+
m_pen_AxisColourAutoZoom = wxColour(96, 128, 160);
168+
m_pen_AxisXColour = wxColour(80, 80, 80);
169+
m_pen_AxisYColour = wxColour(80, 80, 80);
170+
m_pen_AxisXTextColour = wxColour(255, 255, 255);
171+
m_pen_AxisYTextColour = wxColour(255, 255, 255);
172+
173+
m_brush_LegendColour = wxColour(32, 48, 64);
174+
m_brush_LegendSelectColour = wxColour(64, 96, 128);
175+
m_pen_LegendSelectColour = wxColour(128, 170, 212);
176+
m_pen_LegendSelectTextColour = wxColour(255, 255, 255);
177+
m_pen_LegendColour = wxColour(96, 128, 160);
178+
m_pen_LegendTextColour = wxColour(255, 255, 255);
179+
m_brush_MainColour = wxColour(0, 0, 0);
180+
m_pen_MainColour = wxColour(96, 128, 160);
181+
182+
m_pen_HeadTextColour = wxColour(255, 255, 255);
183+
m_pen_ProjectHeadTextColour = wxColour(255, 255, 255);
184+
185+
m_pen_GraphTotalColour = wxColour(255, 0, 0);
186+
m_pen_GraphRACColour = wxColour(0, 200, 0);
187+
m_pen_GraphTotalHostColour = wxColour(0, 128, 255);
188+
m_pen_GraphRACHostColour = wxColour(255, 200, 0);
189+
} else {
190+
m_pen_MarkerLineColour = wxColour(0, 0, 0);
191+
m_pen_ZoomRectColour = wxColour(128, 64, 95);
192+
m_brush_ZoomRectColour = wxColour(24, 31, 0);
193+
m_brush_AxisColour = wxColour(192, 224, 255);
194+
m_pen_AxisColour = wxColour(64, 128, 192);
195+
m_pen_AxisColourZoom = wxColour(255, 64, 0);
196+
m_pen_AxisColourAutoZoom = wxColour(64, 128, 192);
197+
m_pen_AxisXColour = wxColour(64, 128, 192);
198+
m_pen_AxisYColour = wxColour(64, 128, 192);
199+
m_pen_AxisXTextColour = wxColour(0, 0, 0);
200+
m_pen_AxisYTextColour = wxColour(0, 0, 0);
201+
202+
m_brush_LegendColour = wxColour(235, 255, 255);
203+
m_brush_LegendSelectColour = wxColour(192, 224, 255);
204+
m_pen_LegendSelectColour = wxColour(64, 128, 192);
205+
m_pen_LegendSelectTextColour = wxColour(0, 0, 0);
206+
m_pen_LegendColour = wxColour(64, 128, 192);
207+
m_pen_LegendTextColour = wxColour(0, 0, 0);
208+
m_brush_MainColour = wxColour(255, 255, 255);
209+
m_pen_MainColour = wxColour(64, 128, 192);
210+
211+
m_pen_HeadTextColour = wxColour(0, 0, 0);
212+
m_pen_ProjectHeadTextColour = wxColour(0, 0, 0);
213+
214+
m_pen_GraphTotalColour = wxColour(255, 0, 0);
215+
m_pen_GraphRACColour = wxColour(0, 160, 0);
216+
m_pen_GraphTotalHostColour = wxColour(0, 0, 255);
217+
m_pen_GraphRACHostColour = wxColour(0, 0, 0);
218+
}
188219

189220
m_dc_bmp.Create(1, 1);
190221
m_full_repaint = true;

clientgui/common/wxPieCtrl.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,11 @@ wxPieCtrl::wxPieCtrl(wxWindow * parent, wxWindowID id, wxPoint pos,
5050
wxSize sz, long style, wxString name)
5151
:wxWindow(parent, id, pos, sz, style, name)
5252
{
53-
bool isDarkMode = wxGetApp().GetIsDarkMode();
54-
55-
if (isDarkMode) SetBackgroundColour(*wxBLACK);
53+
ApplyTheme(wxGetApp().GetIsDarkMode());
5654

5755
m_ShowEdges=true;
5856
m_CanRepaint=true;
59-
m_BackColour = isDarkMode ? *wxBLACK : *wxWHITE;
6057
m_padding=10;
61-
62-
m_TitleColour = isDarkMode ? wxColour(255,255,255) : wxColour(0,0,0);
63-
m_LabelColour = isDarkMode ? *wxWHITE : *wxBLACK;
64-
m_LegendBackColour = isDarkMode ? wxColour(0, 0, 255) : wxColour(255,255,0);
6558
m_TitleFont = *wxSWISS_FONT;
6659
m_TitleFont.SetWeight(wxFONTWEIGHT_BOLD);
6760
m_LabelFont = *wxSWISS_FONT;
@@ -96,6 +89,14 @@ wxPieCtrl::~wxPieCtrl() {
9689
#endif
9790
}
9891

92+
void wxPieCtrl::ApplyTheme(bool isDarkMode) {
93+
m_BackColour = isDarkMode ? *wxBLACK : *wxWHITE;
94+
SetBackgroundColour(m_BackColour);
95+
m_TitleColour = isDarkMode ? wxColour(255, 255, 255) : wxColour(0, 0, 0);
96+
m_LabelColour = isDarkMode ? *wxWHITE : *wxBLACK;
97+
m_LegendBackColour = isDarkMode ? wxColour(0, 0, 255) : wxColour(255, 255, 0);
98+
}
99+
99100
/* getter and setter */
100101

101102
void wxPieCtrl::SetPadding(int pad) {

clientgui/common/wxPieCtrl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ using wxWindow::SetTransparent;
139139
/// Sets the colour used for displaying legend box background
140140
void SetLegendBackColour(wxColour colour);
141141

142+
void ApplyTheme(bool isDarkMode);
143+
142144
void SetLabel(const wxString& label);
143145

144146

0 commit comments

Comments
 (0)