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
qohosiconengine.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 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
5
6
7#include <QtCore/private/qcore_ohos_p.h>
8#include <QtGui/qfont.h>
9#include <QtGui/private/qfonticonengine_p.h>
10
11#include <QtCore/qhash.h>
12#include <QtCore/private/qnapi_p.h>
13#include <QtCore/private/qohoslogger_p.h>
14
15#include <algorithm>
16#include <optional>
17
18QT_BEGIN_NAMESPACE
19
20using namespace Qt::StringLiterals;
21
22namespace {
23
24std::optional<char32_t> tryGetOhosSymbolCodepoint(QOhosJsState &jsState, const char *ohosSymbolName)
25{
26 try {
27 return jsState.eval<QNapi::Number>(
28 "@ohos.resourceManager.getSysResourceManager().getSymbolByName(*)",
29 {ohosSymbolName}).Uint32Value();
30 } catch (const Napi::Error &error) {
31 qOhosPrintfWarning(
32 "%s: getSymbolByName('%s') failed: %s",
33 Q_FUNC_INFO, ohosSymbolName, error.what());
34 return std::nullopt;
35 }
36}
37
38const QHash<QString, char32_t> &getThemeIconCodepoints()
39{
40 // Note: Qt uses string based icon names, see QAbstractFileIconProviderPrivate::getIconThemeIcon
41 static constexpr struct {
42 QLatin1StringView qtThemeIconName;
43 const char *ohosSymbolName;
44 } themeIconToOhosSymbolMapping[] = {
45 {"computer"_L1, "computer"},
46 {"user-desktop"_L1, "desktop"},
47 {"user-trash"_L1, "trash"},
48 {"network-workgroup"_L1, "dot_radiowaves_left_and_right"},
49 {"drive-harddisk"_L1, "externaldrive"},
50 {"folder"_L1, "folder"},
51 {"text-x-generic"_L1, "doc"},
52 {"go-down"_L1, "chevron_down"},
53 {"go-up"_L1, "chevron_up"},
54 {"go-previous"_L1, "chevron_left"},
55 {"go-next"_L1, "chevron_right"},
56 };
57
58 static const QHash<QString, char32_t> codepoints = QOhosJsThreadGateway::eval(
59 [](QOhosJsState &jsState) {
60 QHash<QString, char32_t> codepoints;
61 for (const auto &entry : themeIconToOhosSymbolMapping) {
62 const auto optCodepoint = tryGetOhosSymbolCodepoint(jsState, entry.ohosSymbolName);
63 if (optCodepoint)
64 codepoints.insert(entry.qtThemeIconName, *optCodepoint);
65 }
66 return codepoints;
67 },
68 Q_FUNC_INFO);
69
70 return codepoints;
71}
72
73QFont ohosSymbolFont()
74{
75 QFont font("HM Symbol"_L1);
76 font.setStyleStrategy(QFont::NoFontMerging);
77 return font;
78}
79
80std::optional<QString> tryGetGlyphForThemeIcon(const QString &iconName)
81{
82 const QHash<QString, char32_t> &codepoints = getThemeIconCodepoints();
83 const auto codepointIt = codepoints.constFind(iconName);
84 if (codepointIt == codepoints.cend())
85 return std::nullopt;
86
87 const char32_t ucs4 = *codepointIt;
88
89 return QString::fromUcs4(&ucs4, 1);
90}
91
92class QOhosIconEngine : public QFontIconEngine
93{
94public:
95 explicit QOhosIconEngine(const QString &iconName, const QString &glyphString);
96
97 QIconEngine *clone() const override;
98 QString key() const override;
99 QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
100
101protected:
102 QString string() const override;
103 glyph_t glyph() const override;
104
105private:
106 QString m_glyphString;
107};
108
109QOhosIconEngine::QOhosIconEngine(const QString &iconName, const QString &glyphString)
110 : QFontIconEngine(iconName, ohosSymbolFont())
111 , m_glyphString(glyphString)
112{
113}
114
115QIconEngine *QOhosIconEngine::clone() const
116{
117 auto *constThis = const_cast<QOhosIconEngine *>(this);
118 return new QOhosIconEngine(constThis->iconName(), m_glyphString);
119}
120
121QString QOhosIconEngine::key() const
122{
123 return "QOhosIconEngine"_L1;
124}
125
126QSize QOhosIconEngine::actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state)
127{
128 if (isNull())
129 return QFontIconEngine::actualSize(size, mode, state);
130
131 const int squareSide = std::min(size.width(), size.height());
132 return QSize(squareSide, squareSide);
133}
134
135QString QOhosIconEngine::string() const
136{
137 return m_glyphString;
138}
139
140glyph_t QOhosIconEngine::glyph() const
141{
142 return 0;
143}
144
145}
146
147QIconEngine *tryCreateQOhosIconEngine(const QString &iconName)
148{
149 auto optGlyphString = tryGetGlyphForThemeIcon(iconName);
150 if (!optGlyphString)
151 return nullptr;
152
153 return new QOhosIconEngine(iconName, *optGlyphString);
154}
155
156QT_END_NAMESPACE
QIconEngine * tryCreateQOhosIconEngine(const QString &iconName)