Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosplatformtheme.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "private/qohosplatformtheme_p.h"
10#include <QtCore/private/qcore_ohos_p.h>
11#include <QtCore/private/qohoscommon_p.h>
12#include <QtCore/private/qohoslogger_p.h>
13#include <QtGui/private/qguiapplication_p.h>
14#include <QtGui/private/qhighdpiscaling_p.h>
15#include <QtGui/private/qabstractfileiconengine_p.h>
16#include <initializer_list>
17#include <qohosenums.h>
18#include <qohosjsmain.h>
19#include <qohosjsutils.h>
20#include <qohosutils.h>
21#include <qpa/qplatformfontdatabase.h>
22#include <qpa/qplatformintegration.h>
23#include <string>
24#include <tuple>
25
27
28namespace {
29
31{
32 auto disabledColor = color;
33 disabledColor.setAlphaF(qBound(0.0, color.alphaF() * 0.4, 1.0));
34
35 return disabledColor;
36}
37
63
65{
66 const auto activeWindow = QColor("#FFFFFFFF");
67 const auto activeButtonText = QColor("#0A59F7");
68 const auto activeHighlight = QColor("#FF007DFF");
69 const auto highlighted = QColor("#FF0A59F7");
70 const auto textPrimary = QColor("#FF182431");
71
72 return {
73 .activeWindow = activeWindow,
74 .inactiveWindow = makeInactiveOrDisabledFromColor(activeWindow),
75 .activeButtonText = activeButtonText,
76 .inactiveButtonText = makeInactiveOrDisabledFromColor(activeButtonText),
77 .activeHighlight = activeHighlight,
78 .inactiveHighlight = makeInactiveOrDisabledFromColor(activeHighlight),
79 .clickEffect = QColor("#1A000000"),
80 .hover = QColor("#0D000000"),
81 .foregroundContrary = QColor("#FFFFFF"),
82 .highlighted = highlighted,
83 .inactiveHighlighted = makeInactiveOrDisabledFromColor(highlighted),
84 .textPrimary = textPrimary,
85 .inactiveTextPrimary = textPrimary,
86 .disabledTextPrimary = makeInactiveOrDisabledFromColor(textPrimary),
87 .inactiveText = makeInactiveOrDisabledFromColor(textPrimary),
88 .componentNormal = QColor("#19182431"),
89 .componentActivated = QColor("#007DFF"),
90 .indicatorArrow = QColor("#E5182431"),
91 .scrollBarSlider = QColor("#182431"),
92 .switchBgOff = QColor("#33FFFFFF"),
93 .switchOutlineOff = QColor("#66182431"),
94 .window = QColor("#FFF1F3F5"),
95 };
96};
97
99{
100 const auto activeWindow = QColor("#18181A");
101 const auto activeButtonText = QColor("#3F97E9");
102 const auto activeHighlight = QColor("#006CDE");
103 const auto highlighted = QColor("#3F97E9");
104 const auto textPrimary = QColor("#DBFFFFFF");
105
106 return {
107 .activeWindow = activeWindow,
108 .inactiveWindow = makeInactiveOrDisabledFromColor(activeWindow),
109 .activeButtonText = activeButtonText,
110 .inactiveButtonText = makeInactiveOrDisabledFromColor(activeButtonText),
111 .activeHighlight = activeHighlight,
112 .inactiveHighlight = makeInactiveOrDisabledFromColor(activeHighlight),
113 .clickEffect = QColor("#26FFFFFF"),
114 .hover = QColor("#19FFFFFF"),
115 .foregroundContrary = QColor("#E5E5E5"),
116 .highlighted = highlighted,
117 .inactiveHighlighted = makeInactiveOrDisabledFromColor(highlighted),
118 .textPrimary = textPrimary,
119 .inactiveTextPrimary = textPrimary,
120 .disabledTextPrimary = makeInactiveOrDisabledFromColor(textPrimary),
121 .inactiveText = makeInactiveOrDisabledFromColor(textPrimary),
122 .componentNormal = QColor("#19FFFFFF"),
123 .componentActivated = QColor("#3F97E9"),
124 .indicatorArrow = QColor("#DBFFFFFF"),
125 .scrollBarSlider = QColor("#FFFFFF"),
126 .switchBgOff = QColor("#33000000"),
127 .switchOutlineOff = QColor("#66FFFFFF"),
128 .window = QColor("#FF000000"),
129 };
130}
131
139
141{
142 const auto activeButton = QColor("#0C182431");
143
144 return {
145 .activeButton = activeButton,
146 .inactiveButton = makeInactiveOrDisabledFromColor(activeButton),
147 .focusedOutline = QColor("#007DFF"),
148 .enabledDefaultButtonText = QColor("#FFFFFFFF"),
149 };
150};
151
153{
154 const auto activeButton = QColor("#19FFFFFF");
155
156 return {
157 .activeButton = activeButton,
158 .inactiveButton = makeInactiveOrDisabledFromColor(activeButton),
159 .focusedOutline = QColor("#3F97E9"),
160 .enabledDefaultButtonText = QColor("#E5E5E5"),
161 };
162}
163
168
170{
171 return {
172 .windowButtonBackground = QColor("#FFD0CFD5"),
173 };
174};
175
177{
178 return {
179 .windowButtonBackground = QColor("#FFD0CFD5"),
180 };
181};
182
190
192{
193 return {
194 .activeWindowFrame = QColor("#FFE4E4E4"),
195 .inactiveWindowFrame = QColor("#FFF2F3F5"),
196 .textHint = QColor("#99182431"),
197 .textTertiary = QColor("#66182431"),
198 };
199};
200
202{
203 return {
204 .activeWindowFrame = QColor("#FF000000"),
205 .inactiveWindowFrame = QColor("#FF18181A"),
206 .textHint = QColor("#99FFFFFF"),
207 .textTertiary = QColor("#66FFFFFF"),
208 };
209}
210
216
218{
219 return {
220 .listSeparator = QColor("#1A000000"),
221 .inactiveText = makeInactiveOrDisabledFromColor(palettes.textPrimary),
222 };
223};
224
226{
227 return {
228 .listSeparator = QColor("#33FFFFFF"),
229 .inactiveText = makeInactiveOrDisabledFromColor(palettes.textPrimary),
230 };
231}
232
239
241{
242 const auto inactiveWindowText = QColor("#99182431");
243
244 return {
245 .activeWindowText = QColor("#FF007DFF"),
246 .inactiveWindowText = inactiveWindowText,
247 .disabledWindowText = makeInactiveOrDisabledFromColor(inactiveWindowText),
248 };
249};
250
252{
253 const auto inactiveWindowText = QColor("#99FFFFFF");
254
255 return {
256 .activeWindowText = QColor("#FF3F97E9"),
257 .inactiveWindowText = inactiveWindowText,
258 .disabledWindowText = makeInactiveOrDisabledFromColor(inactiveWindowText),
259 };
260}
261
267
269{
270 const auto textEditBackground = QColor("#0C182431");
271 return {
272 .textEditBackground = textEditBackground,
273 .inactiveTextEditBackground = makeInactiveOrDisabledFromColor(textEditBackground),
274 };
275};
276
278{
279 const auto textEditBackground = QColor("#19FFFFFF");
280 return {
281 .textEditBackground = textEditBackground,
282 .inactiveTextEditBackground = makeInactiveOrDisabledFromColor(textEditBackground),
283 };
284}
285
292
294{
295 return {
296 .background = QColor("#00000000"),
297 .groupBoxFrame = QColor("#66000000"),
298 .shadowXS = QColor("#19000000"),
299 };
300};
301
303{
304 return {
305 .background = QColor("#00000000"),
306 .groupBoxFrame = QColor("#66FFFFFF"),
307 .shadowXS = QColor("#19FFFFFF"),
308 };
309}
310
315
317{
318 return {
319 .activeButton = QColor("#FFFFFFFF"),
320 };
321};
322
324{
325 return {
326 .activeButton = QColor("#FF18181A"),
327 };
328}
329
335
337{
338 return {
339 .toolTipBorder = QColor("#1A000000"),
340 .toolTipBase = QColor("#FFFFFFFF"),
341 };
342};
343
345{
346 return {
347 .toolTipBorder = QColor("#1AFFFFFF"),
348 .toolTipBase = QColor("#404040"),
349 };
350}
351
365
367{
368 const auto palettes = makePalettesColorsLight();
369
370 return {
371 .palettes = palettes,
375 .menu = makeMenuPaletteColorsLight(palettes),
381 };
382}
383
385{
386 const auto palettes = makePalettesColorsDark();
387
388 return {
389 .palettes = palettes,
393 .menu = makeMenuPaletteColorsDark(palettes),
399 };
400}
401
403{
404 switch (scheme) {
405 case Qt::ColorScheme::Light: return makeAllPalettesColorsLight();
406 case Qt::ColorScheme::Dark: return makeAllPalettesColorsDark();
407 default:
408 break;
409 }
410
411 qOhosReportFatalErrorAndAbort(
412 "%s: got unsupported ColorScheme: %d", Q_FUNC_INFO, static_cast<int>(scheme));
413}
414
415constexpr int mouseDoubleClickDistance = 60;
416constexpr int mouseDoubleClickInterval = 300;
417
419 const QPalette &basePalette, std::initializer_list<std::tuple<QPalette::ColorGroup, QPalette::ColorRole, const QColor &>> brushEntries)
420{
421 auto palette = basePalette;
422
423 for (const auto &brushEntry : brushEntries) {
424 palette.setBrush(
425 std::get<QPalette::ColorGroup>(brushEntry),
426 std::get<QPalette::ColorRole>(brushEntry),
427 std::get<const QColor &>(brushEntry));
428 }
429
430 return palette;
431}
432
433QPalette makePalette(std::initializer_list<std::tuple<QPalette::ColorGroup, QPalette::ColorRole, const QColor &>> brushEntries)
434{
435 return makePalette(QPalette(), brushEntries);
436}
437
439{
440 return makePalette(
441 {
442 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
443
444 {QPalette::Active, QPalette::Button, palettesColors.button.activeButton},
445 {QPalette::Disabled, QPalette::Button, palettesColors.button.inactiveButton},
446 {QPalette::Inactive, QPalette::Button, palettesColors.button.inactiveButton},
447
448 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
449 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
450 {QPalette::Inactive, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
451
452 {QPalette::All, QPalette::BrightText, palettesColors.button.enabledDefaultButtonText},
453
454 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
455 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
456
457 {QPalette::Active, QPalette::Highlight, palettesColors.button.focusedOutline},
458 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.indicatorArrow}
459 });
460}
461
463{
464 return makePalette(
465 makeButtonPalette(palettesColors),
466 {
467 {QPalette::Active, QPalette::AlternateBase, palettesColors.toolButton.windowButtonBackground},
468 });
469}
470
472{
473 return makePalette(
474 {
475 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
476 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
477 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.inactiveWindow},
478
479 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.textPrimary},
480 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.disabledTextPrimary},
481 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveTextPrimary},
482
483 {QPalette::Active, QPalette::Text, palettesColors.palettes.textPrimary},
484 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.disabledTextPrimary},
485 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveTextPrimary},
486
487 {QPalette::Active, QPalette::Base, palettesColors.system.activeWindowFrame},
488 {QPalette::Disabled, QPalette::Base, palettesColors.system.inactiveWindowFrame},
489 {QPalette::Inactive, QPalette::Base, palettesColors.system.inactiveWindowFrame},
490
491 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.textPrimary},
492
493 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.highlighted},
494
495 {QPalette::All, QPalette::PlaceholderText, palettesColors.system.textHint},
496 {QPalette::Disabled, QPalette::PlaceholderText, palettesColors.system.textTertiary},
497
498 {QPalette::Active, QPalette::Midlight, palettesColors.palettes.scrollBarSlider},
499
500 {QPalette::Active, QPalette::Mid, palettesColors.palettes.componentNormal}
501 });
502}
503
505{
506 return makePalette(
507 {
508 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
509 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
510 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
511 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.highlighted},
512 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveText},
513 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
514 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
515 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
516 });
517}
518
520{
521 return makePalette(
522 {
523 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
524 {QPalette::All, QPalette::Base, palettesColors.palettes.window},
525 {QPalette::All, QPalette::Window, palettesColors.palettes.window},
526 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
527 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveText},
528 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
529 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
530 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
531 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.indicatorArrow}
532 });
533}
534
536{
537 return makePalette(
538 {
539 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
540 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
541 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
542 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
543
544 {QPalette::Active, QPalette::Text, palettesColors.palettes.textPrimary},
545 {QPalette::Disabled, QPalette::Text, palettesColors.menu.inactiveText},
546 {QPalette::Inactive, QPalette::Text, palettesColors.menu.inactiveText},
547
548 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
549 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
550
551 {QPalette::Active, QPalette::Mid, palettesColors.menu.listSeparator}
552 });
553}
554
556{
557 return makePalette(
558 {
559 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.textPrimary},
560 {QPalette::Disabled, QPalette::ButtonText, palettesColors.menu.inactiveText},
561 {QPalette::Inactive, QPalette::ButtonText, palettesColors.menu.inactiveText},
562 });
563}
564
566{
567 return makePalette(
568 {
569 {QPalette::Active, QPalette::WindowText, palettesColors.tabBar.activeWindowText},
570 {QPalette::Inactive, QPalette::WindowText, palettesColors.tabBar.inactiveWindowText},
571 {QPalette::Disabled, QPalette::WindowText, palettesColors.tabBar.disabledWindowText},
572
573 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
574 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.inactiveWindow},
575 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
576
577 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.activeHighlight},
578 {QPalette::Inactive, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
579 {QPalette::Disabled, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
580 });
581}
582
584{
585 return makePalette(
586 makeSystemPalette(palettesColors),
587 {
588 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
589 {QPalette::All, QPalette::Base, palettesColors.textLineEdit.textEditBackground},
590 {QPalette::Disabled, QPalette::Base, palettesColors.textLineEdit.inactiveTextEditBackground},
591 {QPalette::All, QPalette::Text, palettesColors.palettes.textPrimary},
592 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.disabledTextPrimary},
593 });
594}
595
597{
598 return makePalette(
599 makeTextLineEditPalette(palettesColors),
600 {
601 {QPalette::All, QPalette::Base, palettesColors.palettes.activeWindow},
602 });
603}
604
606{
607 return makePalette(
608 {
609 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
610 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
611 {QPalette::Active, QPalette::Base, palettesColors.system.activeWindowFrame},
612 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
613 {QPalette::Active, QPalette::AlternateBase, palettesColors.groupBox.groupBoxFrame},
614 {QPalette::Active, QPalette::Window, palettesColors.groupBox.background},
615 {QPalette::Inactive, QPalette::Window, palettesColors.groupBox.background},
616 {QPalette::Active, QPalette::Window, palettesColors.palettes.window},
617 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.window},
618 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
619 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.highlighted},
620 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
621 {QPalette::Current, QPalette::Text, palettesColors.palettes.highlighted},
622 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
623 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.textPrimary},
624 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveHighlighted},
625 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
626 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
627 {QPalette::Active, QPalette::Shadow, palettesColors.groupBox.shadowXS},
628 {QPalette::Active, QPalette::Midlight, palettesColors.palettes.scrollBarSlider},
629 {QPalette::Active, QPalette::Mid, palettesColors.palettes.componentNormal}
630 });
631}
632
634{
635 return makePalette(
636 {
637 {QPalette::Active, QPalette::Button, palettesColors.header.activeButton},
638 {QPalette::Inactive, QPalette::Button, palettesColors.header.activeButton},
639 {QPalette::Disabled, QPalette::Button, palettesColors.palettes.inactiveWindow},
640
641 {QPalette::Current, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
642 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
643 {QPalette::Inactive, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
644 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
645 });
646}
647
649{
650 return makePalette(
651 {
652 {QPalette::Active, QPalette::Base, palettesColors.palettes.window},
653 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.window},
654 {QPalette::Disabled, QPalette::Base, palettesColors.palettes.window},
655
656 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
657 {QPalette::Inactive, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
658 {QPalette::Disabled, QPalette::AlternateBase, palettesColors.palettes.inactiveWindow},
659 {QPalette::Current, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
660
661 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.activeHighlight},
662 {QPalette::Inactive, QPalette::Highlight, palettesColors.palettes.activeHighlight},
663 {QPalette::Disabled, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
664
665 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
666 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.activeWindow},
667 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
668
669 {QPalette::Active, QPalette::Text, palettesColors.palettes.activeHighlight},
670 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.activeHighlight},
671 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveHighlight},
672
673 {QPalette::Active, QPalette::HighlightedText, palettesColors.palettes.activeWindow},
674 {QPalette::Inactive, QPalette::HighlightedText, palettesColors.palettes.activeWindow},
675 {QPalette::Disabled, QPalette::HighlightedText, palettesColors.palettes.inactiveWindow},
676
677 {QPalette::Active, QPalette::Dark, palettesColors.palettes.activeWindow},
678 {QPalette::Inactive, QPalette::Dark, palettesColors.palettes.activeWindow},
679 {QPalette::Disabled, QPalette::Dark, palettesColors.palettes.inactiveWindow},
680 {QPalette::Current, QPalette::Dark, palettesColors.palettes.activeWindow},
681 {QPalette::All, QPalette::Dark, palettesColors.palettes.activeWindow},
682
683 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
684 {QPalette::Inactive, QPalette::Light, palettesColors.palettes.activeWindow},
685 {QPalette::Disabled, QPalette::Light, palettesColors.palettes.inactiveWindow},
686
687 {QPalette::Active, QPalette::Mid, palettesColors.palettes.activeWindow},
688 {QPalette::Inactive, QPalette::Mid, palettesColors.palettes.activeWindow},
689 {QPalette::Disabled, QPalette::Mid, palettesColors.palettes.inactiveWindow},
690 {QPalette::Current, QPalette::Mid, palettesColors.palettes.activeWindow},
691 {QPalette::All, QPalette::Mid, palettesColors.palettes.activeWindow},
692 });
693}
694
696{
697 return makePalette(
698 {
699 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.highlighted},
700 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveText},
701 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
702
703 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
704 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveText},
705 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
706 });
707}
708
710{
711 return makePalette(
712 {
713 {QPalette::All, QPalette::Base, palettesColors.toolTip.toolTipBorder},
714 {QPalette::All, QPalette::ToolTipBase, palettesColors.toolTip.toolTipBase},
715 {QPalette::All, QPalette::ToolTipText, palettesColors.palettes.highlighted},
716 });
717}
718
720{
721 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
722 font.setPointSize(12);
723 font.setBold(false);
724
725 return font;
726}
727
729{
730 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
731 font.setPointSize(16);
732
733 return font;
734}
735
737{
738 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
739 font.setPointSize(16);
740
741 return font;
742}
743
745{
746 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
747 font.setPointSize(16);
748
749 return font;
750}
751
753{
754 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
755 font.setPointSize(14);
756
757 return font;
758}
759
761{
762 const AllPalletesColors palettesColors = makeAllPalettesColors(scheme);
763 return {
764 {QPlatformTheme::ButtonPalette, makeButtonPalette(palettesColors)},
765 {QPlatformTheme::CheckBoxPalette, makeCheckBoxOrRadioButtonPalette(palettesColors)},
766 {QPlatformTheme::ComboBoxPalette, makeComboBoxPalette(palettesColors)},
767 {QPlatformTheme::GroupBoxPalette, makeGroupBoxPalette(palettesColors)},
768 {QPlatformTheme::HeaderPalette, makeHeaderPalette(palettesColors)},
769 {QPlatformTheme::ItemViewPalette, makeItemViewPalette(palettesColors)},
770 {QPlatformTheme::LabelPalette, makeLabelPalette(palettesColors)},
771 {QPlatformTheme::MenuPalette, makeMenuPalette(palettesColors)},
772 {QPlatformTheme::MenuBarPalette, makeMenuBarPalette(palettesColors)},
773 {QPlatformTheme::RadioButtonPalette, makeCheckBoxOrRadioButtonPalette(palettesColors)},
774 {QPlatformTheme::SystemPalette, makeSystemPalette(palettesColors)},
775 {QPlatformTheme::TabBarPalette, makeTabBarPalette(palettesColors)},
776 {QPlatformTheme::TextEditPalette, makeTextEditPalette(palettesColors)},
777 {QPlatformTheme::TextLineEditPalette, makeTextLineEditPalette(palettesColors)},
778 {QPlatformTheme::ToolButtonPalette, makeToolButtonPalette(palettesColors)},
779 {QPlatformTheme::ToolTipPalette, makeToolTipPalette(palettesColors)},
780 };
781}
782
784 Qt::ColorScheme scheme)
785{
786 switch (scheme) {
787 case Qt::ColorScheme::Unknown:
789 case Qt::ColorScheme::Light:
790 return makeQOhosOptional(false);
791 case Qt::ColorScheme::Dark:
792 return makeQOhosOptional(true);
793 };
795}
796
798 QOhosOptional<bool> darkModeFlag)
799{
800 if (darkModeFlag.has_value()) {
801 if (!darkModeFlag.value_or(false))
802 return Qt::ColorScheme::Light;
803 else
804 return Qt::ColorScheme::Dark;
805 } else {
806 return Qt::ColorScheme::Unknown;
807 }
808}
809
811
813{
814 constexpr auto fallbackColorMode = OhosConfigurationColorMode::COLOR_MODE_NOT_SET;
815 auto optColorMode = jsState.tryMapOhosEnumFromJs<OhosConfigurationColorMode>(colorModeJsEnum);
816 return optColorMode.value_or(fallbackColorMode);
817};
818
820{
822 qCWarning(QtForOhos, "%s: cannot set a color mode in 'no UI child mode'", Q_FUNC_INFO);
823 return;
824 }
825
827 [&](QtOhos::JsState &jsState) {
828 auto qAbility = jsState.defaultQAbilityPeer()->qAbility();
829 const auto jsColorMode = jsState.mapOhosEnumToJs(colorMode);
830 qAbility.eval("context.getApplicationContext().setColorMode(*)", {jsColorMode});
831 },
832 Q_FUNC_INFO);
833}
834
836 QOhosConsumer<OhosConfigurationColorMode> valueChangedHandler)
837{
838 return QtOhos::makeOhosConfigValueDataSource<OhosConfigurationColorMode>(
839 [](QtOhos::JsState &jsState) {
840 return mapOhosConfigurationColorModeFromJs(
841 jsState, jsState.defaultQAbilityPeer()->qAbility().eval<QNapi::Number>("context.config.colorMode"));
842 },
843 [](QtOhos::JsState &jsState, const QNapi::Object &config) {
844 return mapOhosConfigurationColorModeFromJs(jsState, config.get<QNapi::Number>("colorMode"));
845 },
846 std::move(valueChangedHandler));
847}
848
850{
851 switch (colorMode) {
853 return {};
855 return false;
857 return true;
858 }
859
860 return {};
861}
862
864{
865 std::string undocumentedParamsPropertyName("params");
866 auto optParams = QNapi::getOptionalPropOrEmpty<QNapi::Value>(resource, undocumentedParamsPropertyName);
867 if (optParams.IsEmpty()) {
868 qOhosPrintfWarning(
869 "%s: expected '%s' property not found in resource object, ignore getting pixmap",
870 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
872 }
873 if (!optParams.IsArray()) {
874 qOhosPrintfWarning(
875 "%s: '%s' property is not an array, ignore getting pixmap",
876 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
878 }
879
880 auto params = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(
881 QNapi::checkedCast<QNapi::Array>(optParams));
882 if (params.empty()) {
883 qOhosPrintfWarning(
884 "%s: '%s' property is empty, ignore getting pixmap",
885 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
887 }
888
889 const auto resourceIdentifier = params.front();
890 const auto lastSeparatorPosition = resourceIdentifier.rfind('.');
891 if (lastSeparatorPosition == std::string::npos) {
892 qOhosPrintfWarning(
893 "%s: '%s' property has unknown resource name, ignore getting pixmap",
894 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
896 }
897
898 const auto simpleName = resourceIdentifier.substr(lastSeparatorPosition + 1);
899 auto resourceContentBuffer = jsState.eval<QNapi::TypedArrayOf<std::uint8_t>>(
900 "@ohos.resourceManager.getSysResourceManager().getMediaByNameSync(*)", {simpleName});
901
902 QPixmap pixmap;
903 bool pixmapLoadResult = pixmap.loadFromData(
904 static_cast<const uchar *>(resourceContentBuffer.Data()), resourceContentBuffer.ByteLength());
905
906 if (pixmapLoadResult) {
907 return makeQOhosOptional(pixmap);
908 } else {
909 qOhosPrintfWarning("%s: cannot load pixmap", Q_FUNC_INFO);
911 }
912}
913
915 QtOhos::JsState &jsState, const std::string &filenameExtension)
916{
917 std::string ohosDotFilenameExtension = "." + filenameExtension;
918 auto uniformDataType = jsState.eval<QNapi::String>(
919 "@ohos.data.uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(*)",
920 {ohosDotFilenameExtension});
921
922 auto resourceValue = jsState.eval(
923 "@kit.FileManagerServiceKit.fileManagerService.getFileIconSync(*)", {uniformDataType});
924 if (resourceValue.IsObject()) {
925 return tryGetFilePixmapByResourceObject(jsState, QNapi::checkedCast<QNapi::Object>(resourceValue));
926 } else {
927 qOhosPrintfWarning("%s: got unhandled resource result type, ignore it", Q_FUNC_INFO);
929 }
930}
931
933{
934public:
935 explicit QOhosFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts);
936
937protected:
938 QPixmap filePixmap(const QSize &size, QIcon::Mode mode, QIcon::State) override;
939};
940
941QOhosFileIconEngine::QOhosFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts)
943{
944}
945
947{
948 auto fileNameSuffix = fileInfo().suffix();
949 auto optPixmap = QtOhos::evalInJsThread(
950 [&](QtOhos::JsState &jsState) {
951 return tryGetFilePixmapByFilenameExtension(jsState, fileNameSuffix.toStdString());
952 },
953 Q_FUNC_INFO);
954
955 return optPixmap.has_value()
956 ? optPixmap.value().scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation)
957 : QPixmap();
958}
959
960}
961
964 {
967 })
968 , m_fonts(
969 {
978 })
979 , m_wheelScrollLines(defaultWheelScrollLines)
980{
981 auto colorModeDataSource = makeOhosConfigColorModeDataSource(
982 [](auto) {
983 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
984 });
985 m_ohosConfigDarkModeFlagSupplier = [colorModeDataSource = std::move(colorModeDataSource)]() {
986 return mapOhosConfigurationColorModeToDarkModeFlag(colorModeDataSource());
987 };
988}
989
990void QOhosPlatformTheme::requestColorScheme(Qt::ColorScheme scheme)
991{
992 QOhosOptional<bool> isDarkMode = mapOhosThemeFromColorScheme(scheme);
993 setOhosConfigColorMode(
994 isDarkMode.has_value()
995 ? isDarkMode.value()
999}
1000
1002{
1003 return mapOhosThemeToColorScheme(m_ohosConfigDarkModeFlagSupplier());
1004}
1005
1007{
1008 auto _dbg = make_QCScopedDebug("QOhosPlatformTheme::createPlatformDialogHelper");
1009 return QOhosDialogs::createHelper(type);
1010}
1011
1012bool QOhosPlatformTheme::usePlatformNativeDialog(QPlatformTheme::DialogType type) const
1013{
1014 auto _dbg = make_QCScopedDebug("QOhosPlatformTheme::usePlatformNativeDialog");
1015 return (type == QOhosPlatformTheme::FileDialog);
1016}
1017
1019{
1020 switch (hint) {
1021 case StyleNames:
1022 return QStringList(QString::fromUtf8(ohosThemeName));
1023 case MouseDoubleClickDistance:
1024 case TouchDoubleTapDistance:
1025 {
1026 auto *primaryScreen = qGuiApp->primaryScreen();
1027 auto *platformScreen = primaryScreen != nullptr
1028 ? static_cast<QOhosPlatformScreen *>(primaryScreen->handle())
1029 : nullptr;
1030 return platformScreen != nullptr
1031 ? QHighDpi::fromNativePixels(
1032 QHighDpi::toNative(
1033 mouseDoubleClickDistance, platformScreen->pixelScalingCoefficient()),
1034 platformScreen)
1035 : mouseDoubleClickDistance;
1036 }
1037 case MouseDoubleClickInterval:
1039 case WheelScrollLines:
1040 return m_wheelScrollLines;
1041 case MenuBarFocusOnAltPressRelease:
1042 return true;
1043 default:
1044 return QPlatformTheme::themeHint(hint);
1045 }
1046}
1047
1048const QPalette *QOhosPlatformTheme::palette(Palette type) const
1049{
1050 const auto &palettes = m_themesPalettes[colorScheme()];
1051 const auto it = palettes.find(type);
1052 if (it != palettes.end())
1053 return &it.value();
1054 else
1055 return QPlatformTheme::palette(type);
1056}
1057
1058const QFont *QOhosPlatformTheme::font(Font type) const
1059{
1060 const auto fontIter = m_fonts.find(type);
1061 return fontIter != m_fonts.end()
1062 ? &fontIter.value()
1063 : QPlatformTheme::font(type);
1064}
1065
1066void QOhosPlatformTheme::setWheelScrollLines(int wheelScrollLines)
1067{
1068 m_wheelScrollLines = wheelScrollLines;
1069}
1070
1072{
1073 return makeQOhosSystemTrayIcon().release();
1074}
1075
1076QIcon QOhosPlatformTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions) const
1077{
1078 return !fileInfo.suffix().isEmpty()
1079 ? QIcon(new QOhosFileIconEngine(fileInfo, iconOptions))
1080 : QPlatformTheme::fileIcon(fileInfo, iconOptions);
1081}
1082
1083QT_END_NAMESPACE
void requestColorScheme(Qt::ColorScheme scheme) override
QIcon fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions) const override
Return an icon for fileInfo, observing iconOptions.
Qt::ColorScheme colorScheme() const override
void setWheelScrollLines(int wheelScrollLines)
QPlatformDialogHelper * createPlatformDialogHelper(DialogType type) const override
const QFont * font(Font type) const override
const QPalette * palette(Palette type) const override
Return a color palette for type type.
QPlatformSystemTrayIcon * createPlatformSystemTrayIcon() const override
Factory function for QSystemTrayIcon.
static constexpr int defaultWheelScrollLines
QVariant themeHint(ThemeHint hint) const override
QPixmap filePixmap(const QSize &size, QIcon::Mode mode, QIcon::State) override
QOhosFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts)
Combined button and popup list for selecting options.
SystemPaletteColors makeSystemButtonPaletteColorsDark()
AllPalletesColors makeAllPalettesColorsLight()
QOhosOptional< bool > mapOhosThemeFromColorScheme(Qt::ColorScheme scheme)
QPalette makeLabelPalette(const AllPalletesColors &palettesColors)
QPalette makeCheckBoxOrRadioButtonPalette(const AllPalletesColors &palettesColors)
TabBarPaletteColors makeTabBarPaletteColorsDark()
QPalette makeSystemPalette(const AllPalletesColors &palettesColors)
SystemPaletteColors makeSystemButtonPaletteColorsLight()
QColor makeInactiveOrDisabledFromColor(const QColor &color)
AllPalletesColors makeAllPalettesColors(Qt::ColorScheme scheme)
QHash< QPlatformTheme::Palette, QPalette > makePalettesMap(Qt::ColorScheme scheme)
QPalette makeTextEditPalette(const AllPalletesColors &palettesColors)
TooltipPaletteColors makeTooltipPaletteColorsDark()
QPalette makePalette(const QPalette &basePalette, std::initializer_list< std::tuple< QPalette::ColorGroup, QPalette::ColorRole, const QColor & > > brushEntries)
QOhosSupplier< OhosConfigurationColorMode > makeOhosConfigColorModeDataSource(QOhosConsumer< OhosConfigurationColorMode > valueChangedHandler)
void setOhosConfigColorMode(OhosConfigurationColorMode colorMode)
Qt::ColorScheme mapOhosThemeToColorScheme(QOhosOptional< bool > darkModeFlag)
std::optional< bool > mapOhosConfigurationColorModeToDarkModeFlag(OhosConfigurationColorMode colorMode)
QPalette makePalette(std::initializer_list< std::tuple< QPalette::ColorGroup, QPalette::ColorRole, const QColor & > > brushEntries)
ButtonPaletteColors makeButtonPaletteColorsLight()
AllPalletesColors makeAllPalettesColorsDark()
MenuPaletteColors makeMenuPaletteColorsDark(const PalettesColors &palettes)
TooltipPaletteColors makeTooltipPaletteColorsLight()
PalettesColors makePalettesColorsDark()
ToolButtonPaletteColors makeToolButtonPaletteColorsDark()
GroupboxPaletteColors makeGroupboxPaletteColorsDark()
QPalette makeHeaderPalette(const AllPalletesColors &palettesColors)
ButtonPaletteColors makeButtonPaletteColorsDark()
MenuPaletteColors makeMenuPaletteColorsLight(const PalettesColors &palettes)
QPalette makeItemViewPalette(const AllPalletesColors &palettesColors)
constexpr int mouseDoubleClickInterval
constexpr int mouseDoubleClickDistance
QPalette makeTabBarPalette(const AllPalletesColors &palettesColors)
ToolButtonPaletteColors makeToolButtonPaletteColorsLight()
TextLineEditPaletteColors makeTextLineEditPaletteColorsLight()
TabBarPaletteColors makeTabBarPaletteColorsLight()
QOhosOptional< QPixmap > tryGetFilePixmapByResourceObject(QtOhos::JsState &jsState, QNapi::Object resource)
QPalette makeMenuBarPalette(const AllPalletesColors &palettesColors)
PalettesColors makePalettesColorsLight()
HeaderPaletteColors makeHeaderPaletteColorsDark()
QPalette makeComboBoxPalette(const AllPalletesColors &palettesColors)
TextLineEditPaletteColors makeTextLineEditPaletteColorsDark()
QOhosOptional< QPixmap > tryGetFilePixmapByFilenameExtension(QtOhos::JsState &jsState, const std::string &filenameExtension)
QPalette makeMenuPalette(const AllPalletesColors &palettesColors)
HeaderPaletteColors makeHeaderPaletteColorsLight()
QPalette makeGroupBoxPalette(const AllPalletesColors &palettesColors)
QPalette makeButtonPalette(const AllPalletesColors &palettesColors)
QPalette makeTextLineEditPalette(const AllPalletesColors &palettesColors)
QPalette makeToolTipPalette(const AllPalletesColors &palettesColors)
GroupboxPaletteColors makeGroupboxPaletteColorsLight()
QPalette makeToolButtonPalette(const AllPalletesColors &palettesColors)
OhosConfigurationColorMode mapOhosConfigurationColorModeFromJs(QtOhos::JsState &jsState, QNapi::Number colorModeJsEnum)
QtOhos::enums::ohos::app::ability::ConfigurationConstant::ColorMode OhosConfigurationColorMode
void runInJsThreadAndWait(const std::function< void(JsState &)> &task, std::string callerContextName={})
bool isOhosNoUiChildMode()
std::nullopt_t makeEmptyQOhosOptional()