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