7#include <QtCore/private/qcore_ohos_p.h>
8#include <QtGui/qfont.h>
9#include <QtGui/private/qfonticonengine_p.h>
11#include <QtCore/qhash.h>
12#include <QtCore/private/qnapi_p.h>
13#include <QtCore/private/qohoslogger_p.h>
20using namespace Qt::StringLiterals;
24std::optional<
char32_t> tryGetOhosSymbolCodepoint(QOhosJsState &jsState,
const char *ohosSymbolName)
27 return jsState.eval<QNapi::Number>(
28 "@ohos.resourceManager.getSysResourceManager().getSymbolByName(*)",
29 {ohosSymbolName}).Uint32Value();
30 }
catch (
const Napi::Error &error) {
32 "%s: getSymbolByName('%s') failed: %s",
33 Q_FUNC_INFO, ohosSymbolName, error.what());
38const QHash<QString,
char32_t> &getThemeIconCodepoints()
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"},
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);
64 codepoints.insert(entry.qtThemeIconName, *optCodepoint);
75 QFont font(
"HM Symbol"_L1);
76 font.setStyleStrategy(QFont::NoFontMerging);
80std::optional<QString> tryGetGlyphForThemeIcon(
const QString &iconName)
82 const QHash<QString,
char32_t> &codepoints = getThemeIconCodepoints();
83 const auto codepointIt = codepoints.constFind(iconName);
84 if (codepointIt == codepoints.cend())
87 const char32_t ucs4 = *codepointIt;
89 return QString::fromUcs4(&ucs4, 1);
92class QOhosIconEngine :
public QFontIconEngine
95 explicit QOhosIconEngine(
const QString &iconName,
const QString &glyphString);
97 QIconEngine *clone()
const override;
98 QString key()
const override;
99 QSize actualSize(
const QSize &size, QIcon::Mode mode, QIcon::State state)
override;
102 QString string()
const override;
103 glyph_t glyph()
const override;
106 QString m_glyphString;
109QOhosIconEngine::QOhosIconEngine(
const QString &iconName,
const QString &glyphString)
110 : QFontIconEngine(iconName, ohosSymbolFont())
111 , m_glyphString(glyphString)
115QIconEngine *QOhosIconEngine::clone()
const
117 auto *constThis =
const_cast<QOhosIconEngine *>(
this);
118 return new QOhosIconEngine(constThis->iconName(), m_glyphString);
121QString QOhosIconEngine::key()
const
123 return "QOhosIconEngine"_L1;
126QSize QOhosIconEngine::actualSize(
const QSize &size, QIcon::Mode mode, QIcon::State state)
129 return QFontIconEngine::actualSize(size, mode, state);
131 const int squareSide =
std::min(size.width(), size.height());
132 return QSize(squareSide, squareSide);
135QString QOhosIconEngine::string()
const
137 return m_glyphString;
140glyph_t QOhosIconEngine::glyph()
const
149 auto optGlyphString = tryGetGlyphForThemeIcon(iconName);
153 return new QOhosIconEngine(iconName, *optGlyphString);
QIconEngine * tryCreateQOhosIconEngine(const QString &iconName)