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 <qohosqpafunctions_p.h>
18#include <qohosutils.h>
19#include <qpa/qplatformfontdatabase.h>
20#include <qpa/qplatformintegration.h>
21#include <string>
22#include <tuple>
23
24QT_BEGIN_NAMESPACE
25
26namespace {
27
29{
30 auto disabledColor = color;
31 disabledColor.setAlphaF(qBound(0.0, color.alphaF() * 0.4, 1.0));
32
33 return disabledColor;
34}
35
61
63{
64 const auto activeWindow = QColor("#FFFFFFFF");
65 const auto activeButtonText = QColor("#0A59F7");
66 const auto activeHighlight = QColor("#FF007DFF");
67 const auto highlighted = QColor("#FF0A59F7");
68 const auto textPrimary = QColor("#FF182431");
69
70 return {
71 .activeWindow = activeWindow,
72 .inactiveWindow = makeInactiveOrDisabledFromColor(activeWindow),
73 .activeButtonText = activeButtonText,
74 .inactiveButtonText = makeInactiveOrDisabledFromColor(activeButtonText),
75 .activeHighlight = activeHighlight,
76 .inactiveHighlight = makeInactiveOrDisabledFromColor(activeHighlight),
77 .clickEffect = QColor("#1A000000"),
78 .hover = QColor("#0D000000"),
79 .foregroundContrary = QColor("#FFFFFF"),
80 .highlighted = highlighted,
81 .inactiveHighlighted = makeInactiveOrDisabledFromColor(highlighted),
82 .textPrimary = textPrimary,
83 .inactiveTextPrimary = textPrimary,
84 .disabledTextPrimary = makeInactiveOrDisabledFromColor(textPrimary),
85 .inactiveText = makeInactiveOrDisabledFromColor(textPrimary),
86 .componentNormal = QColor("#19182431"),
87 .componentActivated = QColor("#007DFF"),
88 .indicatorArrow = QColor("#E5182431"),
89 .scrollBarSlider = QColor("#182431"),
90 .switchBgOff = QColor("#33FFFFFF"),
91 .switchOutlineOff = QColor("#66182431"),
92 .window = QColor("#FFF1F3F5"),
93 };
94};
95
97{
98 const auto activeWindow = QColor("#18181A");
99 const auto activeButtonText = QColor("#3F97E9");
100 const auto activeHighlight = QColor("#006CDE");
101 const auto highlighted = QColor("#3F97E9");
102 const auto textPrimary = QColor("#DBFFFFFF");
103
104 return {
105 .activeWindow = activeWindow,
106 .inactiveWindow = makeInactiveOrDisabledFromColor(activeWindow),
107 .activeButtonText = activeButtonText,
108 .inactiveButtonText = makeInactiveOrDisabledFromColor(activeButtonText),
109 .activeHighlight = activeHighlight,
110 .inactiveHighlight = makeInactiveOrDisabledFromColor(activeHighlight),
111 .clickEffect = QColor("#26FFFFFF"),
112 .hover = QColor("#19FFFFFF"),
113 .foregroundContrary = QColor("#E5E5E5"),
114 .highlighted = highlighted,
115 .inactiveHighlighted = makeInactiveOrDisabledFromColor(highlighted),
116 .textPrimary = textPrimary,
117 .inactiveTextPrimary = textPrimary,
118 .disabledTextPrimary = makeInactiveOrDisabledFromColor(textPrimary),
119 .inactiveText = makeInactiveOrDisabledFromColor(textPrimary),
120 .componentNormal = QColor("#19FFFFFF"),
121 .componentActivated = QColor("#3F97E9"),
122 .indicatorArrow = QColor("#DBFFFFFF"),
123 .scrollBarSlider = QColor("#FFFFFF"),
124 .switchBgOff = QColor("#33000000"),
125 .switchOutlineOff = QColor("#66FFFFFF"),
126 .window = QColor("#FF000000"),
127 };
128}
129
137
139{
140 const auto activeButton = QColor("#0C182431");
141
142 return {
143 .activeButton = activeButton,
144 .inactiveButton = makeInactiveOrDisabledFromColor(activeButton),
145 .focusedOutline = QColor("#007DFF"),
146 .enabledDefaultButtonText = QColor("#FFFFFFFF"),
147 };
148};
149
151{
152 const auto activeButton = QColor("#19FFFFFF");
153
154 return {
155 .activeButton = activeButton,
156 .inactiveButton = makeInactiveOrDisabledFromColor(activeButton),
157 .focusedOutline = QColor("#3F97E9"),
158 .enabledDefaultButtonText = QColor("#E5E5E5"),
159 };
160}
161
166
168{
169 return {
170 .windowButtonBackground = QColor("#FFD0CFD5"),
171 };
172};
173
175{
176 return {
177 .windowButtonBackground = QColor("#FFD0CFD5"),
178 };
179};
180
188
190{
191 return {
192 .activeWindowFrame = QColor("#FFE4E4E4"),
193 .inactiveWindowFrame = QColor("#FFF2F3F5"),
194 .textHint = QColor("#99182431"),
195 .textTertiary = QColor("#66182431"),
196 };
197};
198
200{
201 return {
202 .activeWindowFrame = QColor("#FF000000"),
203 .inactiveWindowFrame = QColor("#FF18181A"),
204 .textHint = QColor("#99FFFFFF"),
205 .textTertiary = QColor("#66FFFFFF"),
206 };
207}
208
214
216{
217 return {
218 .listSeparator = QColor("#1A000000"),
219 .inactiveText = makeInactiveOrDisabledFromColor(palettes.textPrimary),
220 };
221};
222
224{
225 return {
226 .listSeparator = QColor("#33FFFFFF"),
227 .inactiveText = makeInactiveOrDisabledFromColor(palettes.textPrimary),
228 };
229}
230
237
239{
240 const auto inactiveWindowText = QColor("#99182431");
241
242 return {
243 .activeWindowText = QColor("#FF007DFF"),
244 .inactiveWindowText = inactiveWindowText,
245 .disabledWindowText = makeInactiveOrDisabledFromColor(inactiveWindowText),
246 };
247};
248
250{
251 const auto inactiveWindowText = QColor("#99FFFFFF");
252
253 return {
254 .activeWindowText = QColor("#FF3F97E9"),
255 .inactiveWindowText = inactiveWindowText,
256 .disabledWindowText = makeInactiveOrDisabledFromColor(inactiveWindowText),
257 };
258}
259
265
267{
268 const auto textEditBackground = QColor("#0C182431");
269 return {
270 .textEditBackground = textEditBackground,
271 .inactiveTextEditBackground = makeInactiveOrDisabledFromColor(textEditBackground),
272 };
273};
274
276{
277 const auto textEditBackground = QColor("#19FFFFFF");
278 return {
279 .textEditBackground = textEditBackground,
280 .inactiveTextEditBackground = makeInactiveOrDisabledFromColor(textEditBackground),
281 };
282}
283
290
292{
293 return {
294 .background = QColor("#00000000"),
295 .groupBoxFrame = QColor("#66000000"),
296 .shadowXS = QColor("#19000000"),
297 };
298};
299
301{
302 return {
303 .background = QColor("#00000000"),
304 .groupBoxFrame = QColor("#66FFFFFF"),
305 .shadowXS = QColor("#19FFFFFF"),
306 };
307}
308
313
315{
316 return {
317 .activeButton = QColor("#FFFFFFFF"),
318 };
319};
320
322{
323 return {
324 .activeButton = QColor("#FF18181A"),
325 };
326}
327
333
335{
336 return {
337 .toolTipBorder = QColor("#1A000000"),
338 .toolTipBase = QColor("#FFFFFFFF"),
339 };
340};
341
343{
344 return {
345 .toolTipBorder = QColor("#1AFFFFFF"),
346 .toolTipBase = QColor("#404040"),
347 };
348}
349
363
365{
366 const auto palettes = makePalettesColorsLight();
367
368 return {
369 .palettes = palettes,
373 .menu = makeMenuPaletteColorsLight(palettes),
379 };
380}
381
383{
384 const auto palettes = makePalettesColorsDark();
385
386 return {
387 .palettes = palettes,
391 .menu = makeMenuPaletteColorsDark(palettes),
397 };
398}
399
401{
402 switch (scheme) {
403 case Qt::ColorScheme::Light: return makeAllPalettesColorsLight();
404 case Qt::ColorScheme::Dark: return makeAllPalettesColorsDark();
405 default:
406 break;
407 }
408
409 qOhosReportFatalErrorAndAbort(
410 "%s: got unsupported ColorScheme: %d", Q_FUNC_INFO, static_cast<int>(scheme));
411}
412
413constexpr int mouseDoubleClickDistance = 60;
414constexpr int mouseDoubleClickInterval = 300;
415
417 const QPalette &basePalette, std::initializer_list<std::tuple<QPalette::ColorGroup, QPalette::ColorRole, const QColor &>> brushEntries)
418{
419 auto palette = basePalette;
420
421 for (const auto &brushEntry : brushEntries) {
422 palette.setBrush(
423 std::get<QPalette::ColorGroup>(brushEntry),
424 std::get<QPalette::ColorRole>(brushEntry),
425 std::get<const QColor &>(brushEntry));
426 }
427
428 return palette;
429}
430
431QPalette makePalette(std::initializer_list<std::tuple<QPalette::ColorGroup, QPalette::ColorRole, const QColor &>> brushEntries)
432{
433 return makePalette(QPalette(), brushEntries);
434}
435
437{
438 return makePalette(
439 {
440 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
441
442 {QPalette::Active, QPalette::Button, palettesColors.button.activeButton},
443 {QPalette::Disabled, QPalette::Button, palettesColors.button.inactiveButton},
444 {QPalette::Inactive, QPalette::Button, palettesColors.button.inactiveButton},
445
446 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
447 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
448 {QPalette::Inactive, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
449
450 {QPalette::All, QPalette::BrightText, palettesColors.button.enabledDefaultButtonText},
451
452 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
453 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
454
455 {QPalette::Active, QPalette::Highlight, palettesColors.button.focusedOutline},
456 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.indicatorArrow}
457 });
458}
459
461{
462 return makePalette(
463 makeButtonPalette(palettesColors),
464 {
465 {QPalette::Active, QPalette::AlternateBase, palettesColors.toolButton.windowButtonBackground},
466 });
467}
468
470{
471 return makePalette(
472 {
473 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
474 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
475 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.inactiveWindow},
476
477 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.textPrimary},
478 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.disabledTextPrimary},
479 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveTextPrimary},
480
481 {QPalette::Active, QPalette::Text, palettesColors.palettes.textPrimary},
482 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.disabledTextPrimary},
483 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveTextPrimary},
484
485 {QPalette::Active, QPalette::Base, palettesColors.system.activeWindowFrame},
486 {QPalette::Disabled, QPalette::Base, palettesColors.system.inactiveWindowFrame},
487 {QPalette::Inactive, QPalette::Base, palettesColors.system.inactiveWindowFrame},
488
489 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.textPrimary},
490
491 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.highlighted},
492
493 {QPalette::All, QPalette::PlaceholderText, palettesColors.system.textHint},
494 {QPalette::Disabled, QPalette::PlaceholderText, palettesColors.system.textTertiary},
495
496 {QPalette::Active, QPalette::Midlight, palettesColors.palettes.scrollBarSlider},
497
498 {QPalette::Active, QPalette::Mid, palettesColors.palettes.componentNormal}
499 });
500}
501
503{
504 return makePalette(
505 {
506 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
507 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
508 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
509 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.highlighted},
510 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveText},
511 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
512 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
513 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
514 });
515}
516
518{
519 return makePalette(
520 {
521 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
522 {QPalette::All, QPalette::Base, palettesColors.palettes.window},
523 {QPalette::All, QPalette::Window, palettesColors.palettes.window},
524 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
525 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveText},
526 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
527 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
528 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
529 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.indicatorArrow}
530 });
531}
532
534{
535 return makePalette(
536 {
537 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
538 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
539 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
540 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
541
542 {QPalette::Active, QPalette::Text, palettesColors.palettes.textPrimary},
543 {QPalette::Disabled, QPalette::Text, palettesColors.menu.inactiveText},
544 {QPalette::Inactive, QPalette::Text, palettesColors.menu.inactiveText},
545
546 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
547 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
548
549 {QPalette::Active, QPalette::Mid, palettesColors.menu.listSeparator}
550 });
551}
552
554{
555 return makePalette(
556 {
557 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.textPrimary},
558 {QPalette::Disabled, QPalette::ButtonText, palettesColors.menu.inactiveText},
559 {QPalette::Inactive, QPalette::ButtonText, palettesColors.menu.inactiveText},
560 });
561}
562
564{
565 return makePalette(
566 {
567 {QPalette::Active, QPalette::WindowText, palettesColors.tabBar.activeWindowText},
568 {QPalette::Inactive, QPalette::WindowText, palettesColors.tabBar.inactiveWindowText},
569 {QPalette::Disabled, QPalette::WindowText, palettesColors.tabBar.disabledWindowText},
570
571 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
572 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.inactiveWindow},
573 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
574
575 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.activeHighlight},
576 {QPalette::Inactive, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
577 {QPalette::Disabled, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
578 });
579}
580
582{
583 return makePalette(
584 makeSystemPalette(palettesColors),
585 {
586 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.componentActivated},
587 {QPalette::All, QPalette::Base, palettesColors.textLineEdit.textEditBackground},
588 {QPalette::Disabled, QPalette::Base, palettesColors.textLineEdit.inactiveTextEditBackground},
589 {QPalette::All, QPalette::Text, palettesColors.palettes.textPrimary},
590 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.disabledTextPrimary},
591 });
592}
593
595{
596 return makePalette(
597 makeTextLineEditPalette(palettesColors),
598 {
599 {QPalette::All, QPalette::Base, palettesColors.palettes.activeWindow},
600 });
601}
602
604{
605 return makePalette(
606 {
607 {QPalette::Active, QPalette::Button, palettesColors.palettes.highlighted},
608 {QPalette::Inactive, QPalette::Button, palettesColors.palettes.switchOutlineOff},
609 {QPalette::Active, QPalette::Base, palettesColors.system.activeWindowFrame},
610 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.switchBgOff},
611 {QPalette::Active, QPalette::AlternateBase, palettesColors.groupBox.groupBoxFrame},
612 {QPalette::Active, QPalette::Window, palettesColors.groupBox.background},
613 {QPalette::Inactive, QPalette::Window, palettesColors.groupBox.background},
614 {QPalette::Active, QPalette::Window, palettesColors.palettes.window},
615 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.window},
616 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
617 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.highlighted},
618 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
619 {QPalette::Current, QPalette::Text, palettesColors.palettes.highlighted},
620 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
621 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.textPrimary},
622 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveHighlighted},
623 {QPalette::Active, QPalette::Dark, palettesColors.palettes.clickEffect},
624 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
625 {QPalette::Active, QPalette::Shadow, palettesColors.groupBox.shadowXS},
626 {QPalette::Active, QPalette::Midlight, palettesColors.palettes.scrollBarSlider},
627 {QPalette::Active, QPalette::Mid, palettesColors.palettes.componentNormal}
628 });
629}
630
632{
633 return makePalette(
634 {
635 {QPalette::Active, QPalette::Button, palettesColors.header.activeButton},
636 {QPalette::Inactive, QPalette::Button, palettesColors.header.activeButton},
637 {QPalette::Disabled, QPalette::Button, palettesColors.palettes.inactiveWindow},
638
639 {QPalette::Current, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
640 {QPalette::Active, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
641 {QPalette::Inactive, QPalette::ButtonText, palettesColors.palettes.activeButtonText},
642 {QPalette::Disabled, QPalette::ButtonText, palettesColors.palettes.inactiveButtonText},
643 });
644}
645
647{
648 return makePalette(
649 {
650 {QPalette::Active, QPalette::Base, palettesColors.palettes.window},
651 {QPalette::Inactive, QPalette::Base, palettesColors.palettes.window},
652 {QPalette::Disabled, QPalette::Base, palettesColors.palettes.window},
653
654 {QPalette::Active, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
655 {QPalette::Inactive, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
656 {QPalette::Disabled, QPalette::AlternateBase, palettesColors.palettes.inactiveWindow},
657 {QPalette::Current, QPalette::AlternateBase, palettesColors.palettes.activeWindow},
658
659 {QPalette::Active, QPalette::Highlight, palettesColors.palettes.activeHighlight},
660 {QPalette::Inactive, QPalette::Highlight, palettesColors.palettes.activeHighlight},
661 {QPalette::Disabled, QPalette::Highlight, palettesColors.palettes.inactiveHighlight},
662
663 {QPalette::Active, QPalette::Window, palettesColors.palettes.activeWindow},
664 {QPalette::Inactive, QPalette::Window, palettesColors.palettes.activeWindow},
665 {QPalette::Disabled, QPalette::Window, palettesColors.palettes.inactiveWindow},
666
667 {QPalette::Active, QPalette::Text, palettesColors.palettes.activeHighlight},
668 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.activeHighlight},
669 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveHighlight},
670
671 {QPalette::Active, QPalette::HighlightedText, palettesColors.palettes.activeWindow},
672 {QPalette::Inactive, QPalette::HighlightedText, palettesColors.palettes.activeWindow},
673 {QPalette::Disabled, QPalette::HighlightedText, palettesColors.palettes.inactiveWindow},
674
675 {QPalette::Active, QPalette::Dark, palettesColors.palettes.activeWindow},
676 {QPalette::Inactive, QPalette::Dark, palettesColors.palettes.activeWindow},
677 {QPalette::Disabled, QPalette::Dark, palettesColors.palettes.inactiveWindow},
678 {QPalette::Current, QPalette::Dark, palettesColors.palettes.activeWindow},
679 {QPalette::All, QPalette::Dark, palettesColors.palettes.activeWindow},
680
681 {QPalette::Active, QPalette::Light, palettesColors.palettes.hover},
682 {QPalette::Inactive, QPalette::Light, palettesColors.palettes.activeWindow},
683 {QPalette::Disabled, QPalette::Light, palettesColors.palettes.inactiveWindow},
684
685 {QPalette::Active, QPalette::Mid, palettesColors.palettes.activeWindow},
686 {QPalette::Inactive, QPalette::Mid, palettesColors.palettes.activeWindow},
687 {QPalette::Disabled, QPalette::Mid, palettesColors.palettes.inactiveWindow},
688 {QPalette::Current, QPalette::Mid, palettesColors.palettes.activeWindow},
689 {QPalette::All, QPalette::Mid, palettesColors.palettes.activeWindow},
690 });
691}
692
694{
695 return makePalette(
696 {
697 {QPalette::Active, QPalette::WindowText, palettesColors.palettes.highlighted},
698 {QPalette::Inactive, QPalette::WindowText, palettesColors.palettes.inactiveText},
699 {QPalette::Disabled, QPalette::WindowText, palettesColors.palettes.inactiveHighlighted},
700
701 {QPalette::Active, QPalette::Text, palettesColors.palettes.highlighted},
702 {QPalette::Disabled, QPalette::Text, palettesColors.palettes.inactiveText},
703 {QPalette::Inactive, QPalette::Text, palettesColors.palettes.inactiveHighlighted},
704 });
705}
706
708{
709 return makePalette(
710 {
711 {QPalette::All, QPalette::Base, palettesColors.toolTip.toolTipBorder},
712 {QPalette::All, QPalette::ToolTipBase, palettesColors.toolTip.toolTipBase},
713 {QPalette::All, QPalette::ToolTipText, palettesColors.palettes.highlighted},
714 });
715}
716
718{
719 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
720 font.setPointSize(12);
721 font.setBold(false);
722
723 return font;
724}
725
727{
728 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
729 font.setPointSize(16);
730
731 return font;
732}
733
735{
736 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
737 font.setPointSize(16);
738
739 return font;
740}
741
743{
744 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
745 font.setPointSize(16);
746
747 return font;
748}
749
751{
752 auto font = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont();
753 font.setPointSize(14);
754
755 return font;
756}
757
759{
760 const AllPalletesColors palettesColors = makeAllPalettesColors(scheme);
761 return {
762 {QPlatformTheme::ButtonPalette, makeButtonPalette(palettesColors)},
763 {QPlatformTheme::CheckBoxPalette, makeCheckBoxOrRadioButtonPalette(palettesColors)},
764 {QPlatformTheme::ComboBoxPalette, makeComboBoxPalette(palettesColors)},
765 {QPlatformTheme::GroupBoxPalette, makeGroupBoxPalette(palettesColors)},
766 {QPlatformTheme::HeaderPalette, makeHeaderPalette(palettesColors)},
767 {QPlatformTheme::ItemViewPalette, makeItemViewPalette(palettesColors)},
768 {QPlatformTheme::LabelPalette, makeLabelPalette(palettesColors)},
769 {QPlatformTheme::MenuPalette, makeMenuPalette(palettesColors)},
770 {QPlatformTheme::MenuBarPalette, makeMenuBarPalette(palettesColors)},
771 {QPlatformTheme::RadioButtonPalette, makeCheckBoxOrRadioButtonPalette(palettesColors)},
772 {QPlatformTheme::SystemPalette, makeSystemPalette(palettesColors)},
773 {QPlatformTheme::TabBarPalette, makeTabBarPalette(palettesColors)},
774 {QPlatformTheme::TextEditPalette, makeTextEditPalette(palettesColors)},
775 {QPlatformTheme::TextLineEditPalette, makeTextLineEditPalette(palettesColors)},
776 {QPlatformTheme::ToolButtonPalette, makeToolButtonPalette(palettesColors)},
777 {QPlatformTheme::ToolTipPalette, makeToolTipPalette(palettesColors)},
778 };
779}
780
782 Qt::ColorScheme scheme)
783{
784 switch (scheme) {
785 case Qt::ColorScheme::Unknown:
787 case Qt::ColorScheme::Light:
788 return makeQOhosOptional(false);
789 case Qt::ColorScheme::Dark:
790 return makeQOhosOptional(true);
791 };
793}
794
796 QOhosOptional<bool> darkModeFlag)
797{
798 if (darkModeFlag.has_value()) {
799 if (!darkModeFlag.value_or(false))
800 return Qt::ColorScheme::Light;
801 else
802 return Qt::ColorScheme::Dark;
803 } else {
804 return Qt::ColorScheme::Unknown;
805 }
806}
807
809{
810 std::string undocumentedParamsPropertyName("params");
811 auto optParams = QNapi::getOptionalPropOrEmpty<QNapi::Value>(resource, undocumentedParamsPropertyName);
812 if (optParams.IsEmpty()) {
813 qOhosPrintfWarning(
814 "%s: expected '%s' property not found in resource object, ignore getting pixmap",
815 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
817 }
818 if (!optParams.IsArray()) {
819 qOhosPrintfWarning(
820 "%s: '%s' property is not an array, ignore getting pixmap",
821 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
823 }
824
825 auto params = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(
826 QNapi::checkedCast<QNapi::Array>(optParams));
827 if (params.empty()) {
828 qOhosPrintfWarning(
829 "%s: '%s' property is empty, ignore getting pixmap",
830 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
832 }
833
834 const auto resourceIdentifier = params.front();
835 const auto lastSeparatorPosition = resourceIdentifier.rfind('.');
836 if (lastSeparatorPosition == std::string::npos) {
837 qOhosPrintfWarning(
838 "%s: '%s' property has unknown resource name, ignore getting pixmap",
839 Q_FUNC_INFO, undocumentedParamsPropertyName.c_str());
841 }
842
843 const auto simpleName = resourceIdentifier.substr(lastSeparatorPosition + 1);
844 auto resourceContentBuffer = jsState.eval<QNapi::TypedArrayOf<std::uint8_t>>(
845 "@ohos.resourceManager.getSysResourceManager().getMediaByNameSync(*)", {simpleName});
846
847 QPixmap pixmap;
848 bool pixmapLoadResult = pixmap.loadFromData(
849 static_cast<const uchar *>(resourceContentBuffer.Data()), resourceContentBuffer.ByteLength());
850
851 if (pixmapLoadResult) {
852 return makeQOhosOptional(pixmap);
853 } else {
854 qOhosPrintfWarning("%s: cannot load pixmap", Q_FUNC_INFO);
856 }
857}
858
860 QtOhos::JsState &jsState, const std::string &filenameExtension)
861{
862 std::string ohosDotFilenameExtension = "." + filenameExtension;
863 auto uniformDataType = jsState.eval<QNapi::String>(
864 "@ohos.data.uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(*)",
865 {ohosDotFilenameExtension});
866
867 auto resourceValue = jsState.eval(
868 "@kit.FileManagerServiceKit.fileManagerService.getFileIconSync(*)", {uniformDataType});
869 if (resourceValue.IsObject()) {
870 return tryGetFilePixmapByResourceObject(jsState, QNapi::checkedCast<QNapi::Object>(resourceValue));
871 } else {
872 qOhosPrintfWarning("%s: got unhandled resource result type, ignore it", Q_FUNC_INFO);
874 }
875}
876
878{
879public:
880 explicit QOhosFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts);
881
882protected:
883 QPixmap filePixmap(const QSize &size, QIcon::Mode mode, QIcon::State) override;
884};
885
886QOhosFileIconEngine::QOhosFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts)
888{
889}
890
892{
893 auto fileNameSuffix = fileInfo().suffix();
894 auto optPixmap = QtOhos::evalInJsThread(
895 [&](QtOhos::JsState &jsState) {
896 return tryGetFilePixmapByFilenameExtension(jsState, fileNameSuffix.toStdString());
897 },
898 Q_FUNC_INFO);
899
900 return optPixmap.has_value()
901 ? optPixmap.value().scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation)
902 : QPixmap();
903}
904
905}
906
909 {
912 })
913 , m_fonts(
914 {
923 })
924 , m_wheelScrollLines(defaultWheelScrollLines)
925{
926 m_ohosConfigDarkModeFlagSupplier = QtOhos::getQOhosQpaFunctions().makeOhosConfigDarkModeFlagDataSource(
927 [](auto) {
928 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
929 });
930}
931
932void QOhosPlatformTheme::requestColorScheme(Qt::ColorScheme scheme)
933{
934 QOhosOptional<bool> isDarkMode = mapOhosThemeFromColorScheme(scheme);
935 QtOhos::getQOhosQpaFunctions().setOhosConfigDarkModeFlag(isDarkMode);
936}
937
939{
940 return mapOhosThemeToColorScheme(m_ohosConfigDarkModeFlagSupplier());
941}
942
944{
945 auto _dbg = make_QCScopedDebug("QOhosPlatformTheme::createPlatformDialogHelper");
946 return QOhosDialogs::createHelper(type);
947}
948
949bool QOhosPlatformTheme::usePlatformNativeDialog(QPlatformTheme::DialogType type) const
950{
951 auto _dbg = make_QCScopedDebug("QOhosPlatformTheme::usePlatformNativeDialog");
952 return (type == QOhosPlatformTheme::FileDialog);
953}
954
956{
957 switch (hint) {
958 case StyleNames:
959 return QStringList(QString::fromUtf8(ohosThemeName));
960 case MouseDoubleClickDistance:
961 case TouchDoubleTapDistance:
962 {
963 auto *primaryScreen = qGuiApp->primaryScreen();
964 auto *platformScreen = primaryScreen != nullptr
965 ? static_cast<QOhosPlatformScreen *>(primaryScreen->handle())
966 : nullptr;
967 return platformScreen != nullptr
968 ? QHighDpi::fromNativePixels(
969 QHighDpi::toNative(
970 mouseDoubleClickDistance, platformScreen->pixelScalingCoefficient()),
971 platformScreen)
972 : mouseDoubleClickDistance;
973 }
974 case MouseDoubleClickInterval:
976 case WheelScrollLines:
977 return m_wheelScrollLines;
978 case MenuBarFocusOnAltPressRelease:
979 return true;
980 default:
981 return QPlatformTheme::themeHint(hint);
982 }
983}
984
985const QPalette *QOhosPlatformTheme::palette(Palette type) const
986{
987 const auto &palettes = m_themesPalettes[colorScheme()];
988 const auto it = palettes.find(type);
989 if (it != palettes.end())
990 return &it.value();
991 else
992 return QPlatformTheme::palette(type);
993}
994
995const QFont *QOhosPlatformTheme::font(Font type) const
996{
997 const auto fontIter = m_fonts.find(type);
998 return fontIter != m_fonts.end()
999 ? &fontIter.value()
1000 : QPlatformTheme::font(type);
1001}
1002
1003void QOhosPlatformTheme::setWheelScrollLines(int wheelScrollLines)
1004{
1005 m_wheelScrollLines = wheelScrollLines;
1006}
1007
1009{
1010 return makeQOhosSystemTrayIcon().release();
1011}
1012
1013QIcon QOhosPlatformTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions) const
1014{
1015 return !fileInfo.suffix().isEmpty()
1016 ? QIcon(new QOhosFileIconEngine(fileInfo, iconOptions))
1017 : QPlatformTheme::fileIcon(fileInfo, iconOptions);
1018}
1019
1020QT_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)
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)
Qt::ColorScheme mapOhosThemeToColorScheme(QOhosOptional< bool > darkModeFlag)
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)
QOhosQpaFunctions & getQOhosQpaFunctions()
std::nullopt_t makeEmptyQOhosOptional()