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
qarkuiutils.h
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#ifndef QARKUTILS_H
5#define QARKUTILS_H
6
7#include <QtCore/private/qohoscommon_p.h>
8#include <QtCore/private/qohoslogger_p.h>
9#include <QtCore/qglobal.h>
10#include <QtCore/qpoint.h>
11#include <arkui/native_type.h>
12#include <array>
13#include <cstdint>
14#include <cstdio>
15#include <qohosutils.h>
16#include <string>
17#include <type_traits>
18#include <utility>
19
21
22namespace QArkUi {
23
25{
26public:
27 CZString(const char *value);
28
29 operator const char *() const;
30 operator std::string() const;
31
32 const char *value() const;
33
34private:
35 const char *m_value;
36};
37
38std::array<float, 2> toFloatArray(const QPointF &point);
39
40template<typename Func, Func f, typename... FuncArgs>
44 void>
45callArkUiOrFailOnErrorResult(QOhosNamedFunc<Func, f> func, FuncArgs &&...funcArgs);
46
47template<typename Func, Func f, typename... FuncArgs>
52
53template<typename Func, Func f, typename... FuncArgs>
54QOhosInvokeResult<Func, FuncArgs...> callArkUi(QOhosNamedFunc<Func, f> func, FuncArgs &&...funcArgs);
55
57
58constexpr bool arkUiCallsLogging = false;
59
60template<typename T>
62buildFuncArgString(const T &funcArg)
63{
64 return std::to_string(funcArg);
65}
66
67template<typename T>
69buildFuncArgString(const T &funcArg)
70{
71 return std::to_string(funcArg) + ":enum(" + typeid(T).name() + "):";
72}
73
74template<typename T>
76buildFuncArgString(const T &funcArg)
77{
78 char buffer[] = "0xFFFFFFFFFFFFFFFF";
79 std::snprintf(buffer, sizeof(buffer), "%p", funcArg);
80 return std::string(buffer);
81}
82
83template<typename T>
86{
87 return "...";
88}
89
90inline std::string buildFuncArgString(CZString funcArg)
91{
92 return '"' + std::string(funcArg) + '"';
93}
94
95template<typename... FuncArgs>
96std::string buildFuncCallString(const char *funcName, FuncArgs &&...funcArgs)
97{
98 std::string allArgsString;
99 std::string argsStrings[] = {buildFuncArgString(funcArgs)...};
100 for (const auto &argString : argsStrings) {
101 if (!allArgsString.empty())
102 allArgsString += ", ";
103 allArgsString += argString;
104 }
105
106 return std::string(funcName) + "(" + allArgsString + ")";
107}
108
109template<typename Func, typename... FuncArgs>
114{
115 auto funcResult = func(funcArgs...);
116
117 if (arkUiCallsLogging) {
119 "callArkUiFunc: %s => %s",
122 }
123
124 return funcResult;
125}
126
127template<typename Func, typename... FuncArgs>
130 void>
131callArkUiFunc(const char *funcName, Func &&func, FuncArgs &&...funcArgs)
132{
133 func(funcArgs...);
134
136 qOhosPrintfDebug("callArkUiFunc: %s", buildFuncCallString(funcName, funcArgs...).c_str());
137}
138
139}
140
141inline std::array<float, 2> toFloatArray(const QPointF &point)
142{
143 return {static_cast<float>(point.x()), static_cast<float>(point.y())};
144}
145
146inline CZString::CZString(const char *value)
147 : m_value(value)
148{
149}
150
151inline CZString::operator const char *() const
152{
153 return m_value;
154}
155
156inline CZString::operator std::string() const
157{
158 return m_value;
159}
160
161inline const char *CZString::value() const
162{
163 return m_value;
164}
165
166template<typename Func, Func f, typename... FuncArgs>
170 void>
171callArkUiOrFailOnErrorResult(QOhosNamedFunc<Func, f> func, FuncArgs &&...funcArgs)
172{
173 using namespace details_qarkuiutils_h;
174
175 std::int32_t funcResult = details_qarkuiutils_h::callArkUiFunc(func.name(), func.ptr(), funcArgs...);
176 if (funcResult != ::ARKUI_ERROR_CODE_NO_ERROR) {
177 qOhosReportFatalErrorAndAbort(
178 "ArkUi function call %s failed with error: %d",
179 buildFuncCallString(func.name(), funcArgs...).c_str(), funcResult);
180 }
181}
182
183template<typename Func, Func f, typename... FuncArgs>
188{
189 using namespace details_qarkuiutils_h;
190
192 if (funcResult == nullptr) {
194 "ArkUi function call %s failed (returned null)",
196 }
197 return funcResult;
198}
199
200template<typename Func, Func f, typename... FuncArgs>
201QOhosInvokeResult<Func, FuncArgs...> callArkUi(QOhosNamedFunc<Func, f> func, FuncArgs &&...funcArgs)
202{
203 return details_qarkuiutils_h::callArkUiFunc(func.name(), func.ptr(), funcArgs...);
204}
205
206}
207
208QT_END_NAMESPACE
209
210#endif
operator std::string() const
operator const char *() const
const char * value() const
CZString(const char *value)
QNapi::Object jsObject()
Definition window.cpp:77
JsWindowRef(JsWindowRef &&)=delete
bool isFocused() const
Definition window.cpp:65
JsWindowRef(const JsWindowRef &)=delete
JsWindowRef & operator=(JsWindowRef &&)=delete
JsWindowRef(JsWindowId windowId, QNapi::Object jsWindow)
Definition window.cpp:46
Result call(const std::string &methodName, const std::vector< QNapi::ValueWrapper > &args={}) const
Definition window.h:59
bool isWindowShown() const
Definition window.cpp:52
JsWindowId id() const
Definition window.cpp:72
JsWindowRef & operator=(const JsWindowRef &)=delete
QOhosOptional()=default
QOhosOptional(const std::optional< U > &other)
T valueOr(const T &fallback) const
QOhosOptional< T > & operator=(const std::optional< U > &other)
bool hasValue() const
QOhosOptional(const QOhosOptional< void > &empty)
QOhosOptional< T > & operator=(const T &value)
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
QOhosOptional< T > & operator=(const QOhosOptional< void > &empty)
QOhosOptional(const T &value)
const T & value() const
T & emplace(Args &&...args)
QOhosOptional< T > & operator=(const QOhosOptional< T > &other)
QOhosOptional< QOhosInvokeResult< Func, T > > transform(Func &&func) const
QOhosOptional(const QOhosOptional< T > &other)
virtual void startQAbilityInstance(QNapi::Object baseQAbility, QObjectThreadSafeRef qwindow, QNapi::Object optStartOptions, std::function< void(JsState &, std::shared_ptr< QAbilityPeer >)> startupNotifyFunc)=0
virtual void tagWidgetOrWindowAsFloatWindow(QObject *widgetOrWindow, bool floatWindowEnabled)=0
virtual void startAppProcess(QNapi::Object baseQAbility, const std::string &processId, QNapi::Object want, QNapi::Object optStartOptions)=0
virtual void startAppProcess(QNapi::Object baseQAbility, const std::string &processId, QNapi::Object want, QNapi::Object optStartOptions, std::function< void(JsState &)> continueFunc)=0
virtual void startNoUiChildProcess(JsState &jsState, const std::string &libraryName, const std::vector< std::string > &args)=0
JsState & jsState() const
JsState & operator=(const JsState &)=delete
virtual void addNewWantConsumer(QOhosConsumer< JsState &, QNapi::Object, QNapi::Object > wantConsumer)=0
virtual QtRunMode qtRunMode()=0
JsState(const JsState &)=delete
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByInstanceId(const std::string &instanceId)=0
virtual void * getAttachedObjectWithLazyCreate(const std::type_info &objectTypeInfo, QOhosSupplier< std::shared_ptr< void > > objectFactory)=0
virtual void startAppProcess(const std::string &processId, QNapi::Object requestWant, QNapi::Object optStartOptions, std::function< void(JsState &)> continueFunc)=0
virtual void startNoUiChildProcess(const std::string &libraryName, const std::vector< std::string > &args)=0
~JsState() override
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByQWindow(QObjectThreadSafeRef qwindow)=0
virtual void visitEachQAbilityPeer(const std::function< void(std::shared_ptr< QAbilityPeer >)> &visitor)=0
QNapi::Symbol getJsSymbolForType()
virtual std::shared_ptr< QAbilityPeer > defaultQAbilityPeer()=0
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByInstance(QNapi::Object qAbility)=0
virtual QOhosOptional< QNapi::Object > optAppLaunchParam()=0
virtual QNapi::Object appLaunchWant()=0
std::enable_if_t< std::is_default_constructible< T >::value, T > & getAttachedObjectWithLazyCreate()
virtual QNapi::Symbol getJsSymbolForType(const std::type_info &typeInfo)=0
virtual void startNewQAbilityInstance(std::shared_ptr< QAbilityPeer > baseQAbilityPeer, QObjectThreadSafeRef qwindow, QNapi::Object optStartOptions, std::function< void(JsState &, std::shared_ptr< QAbilityPeer >)> startupNotifyFunc)=0
virtual void startAppProcess(const std::string &processId, QNapi::Object requestWant, QNapi::Object optStartOptions={})=0
static void tagWindowAsClosing(QNapi::Object jsWindow, const char *logContext)
static bool isWindowClosing(QNapi::Object jsWindow)
virtual QAbilityInfo readAbilityInfo(const QNapi::Object &ability) const =0
virtual QOhosOptional< QNapi::Promise > qWindowDestroyPromise()=0
virtual std::string instanceId()=0
virtual QObjectThreadSafeRef qWindowRef()=0
virtual QNapi::Object launchWant()=0
virtual bool isTerminating()=0
virtual void setQWindow(Napi::Env env, QObjectThreadSafeRef qwindow)=0
virtual void * tryCastWithTypeIdObject(const void *matchTypeIdObject)=0
virtual std::shared_ptr< std::atomic_bool > destroyAllowedFlag()=0
virtual QNapi::Object qAbility()=0
virtual QNapi::Object uiContext()=0
virtual void setOnContinueRequestsHandler(std::function< void(JsState &, QNapi::Object, QOhosConsumer< JsState &, QOhosAbilityOnContinueResult >)> requestsHandler)=0
virtual QNapi::Object launchParam()=0
virtual QNapi::Object windowStage()=0
void * tryCastWithTypeIdObject(const void *matchTypeIdObject) final
static std::shared_ptr< QUiAbilityPeer > tryCastFromQAbilityPeerOrNull(std::shared_ptr< QAbilityPeer > qAbilityPeer)
~QUiAbilityPeer() override
virtual QNapi::Object window()=0
bool operator!=(const TypedId &other) const
Definition qohosutils.h:161
IdValueType value() const
Definition qohosutils.h:173
IdValueType ValueType
Definition qohosutils.h:37
bool operator==(const TypedId &other) const
Definition qohosutils.h:155
TypedId(IdValueType value)
Definition qohosutils.h:149
TypedId(const TypedId &other)
TypedId & operator=(const TypedId &other)
~TypedId()=default
TypedId & operator=(TypedId &&other)
bool operator<(const TypedId &other) const
Definition qohosutils.h:167
TypedId()=default
TypedId(TypedId &&other)
std::string buildFuncCallString(const char *funcName, FuncArgs &&...funcArgs)
Definition qarkuiutils.h:96
std::enable_if_t< std::is_arithmetic< T >::value, std::string > buildFuncArgString(const T &funcArg)
Definition qarkuiutils.h:62
constexpr bool arkUiCallsLogging
Definition qarkuiutils.h:58
std::string buildFuncArgString(CZString funcArg)
Definition qarkuiutils.h:90
std::enable_if_t< std::is_void< QOhosInvokeResult< Func, FuncArgs... > >::value, void > callArkUiFunc(const char *funcName, Func &&func, FuncArgs &&...funcArgs)
std::array< float, 2 > toFloatArray(const QPointF &point)
QOhosInvokeResult< Func, FuncArgs... > callArkUi(QOhosNamedFunc< Func, f > func, FuncArgs &&...funcArgs)
QOhosOptional< WindowProperties > tryGetWindowProperties(JsWindowId jsWindowId)
Definition window.cpp:27
std::enable_if_t< std::is_same< QOhosInvokeResult< Func, FuncArgs... >, std::int32_t >::value||std::is_enum< QOhosInvokeResult< Func, FuncArgs... > >::value, void > callArkUiOrFailOnErrorResult(QOhosNamedFunc< Func, f > func, FuncArgs &&...funcArgs)
Combined button and popup list for selecting options.
QOhosOptional< std::uintmax_t > tryParseStringAsUIntMax(const std::string &inputString)
std::string const char * mapBoolToTrueFalseStr(bool value)
void invokeInJsThread(std::function< void(JsState &)> task)
void dispatchNewWant(QNapi::Object want, QNapi::Object launchParam)
QOhosConsumer< T > makeCompressingAsyncConsumer(QOhosConsumer< T > baseConsumer, QOhosConsumer< std::function< void()> > asyncExecutor)
Definition qohosutils.h:191
void removeMatchingJsQAbilityPeer(QNapi::Object qAbility)
std::enable_if_t< std::is_integral< T >::value &&std::is_unsigned< T >::value, QOhosOptional< T > > tryParseStringAsUnsignedInteger(const std::string &inputString)
Definition qohosutils.h:239
T evalInJsThreadWithConsumer(std::function< void(QtOhos::JsState &, std::function< void(T)>)> evalFunc)
ForwardIt removeMatchingWithLookahead(ForwardIt firstIt, ForwardIt lastIt, Predicate &&predicate)
Definition qohosutils.h:101
void initJsThreadState(napi_env env, std::map< std::string, QNapi::Reference< QNapi::Function > > &&jsModulesFactories, std::shared_ptr< AppFunctions > appFunctions, QtRunMode qtRunMode)
Q_REQUIRED_RESULT bool tryInvokeInQtThreadAndTryWaitForContinue(std::function< void(std::function< void()>)> &&task, std::chrono::nanoseconds timeout)
auto evalInJsThread(Func &&func) -> decltype(func(std::declval< JsState & >()))
QOhosAbilityOnContinueResult
void tupleForEach(const std::tuple< TupleElements... > &tuple, UnaryFunc func, std::index_sequence< TupleIndices... >)
Definition qohosutils.h:131
void runInJsThreadAndWait(const std::function< void(JsState &)> &task)
std::shared_ptr< QtOhos::QAbilityPeer > tryMapOptMainWindowToAbilityPeer(QtOhos::JsState &jsState, QOhosOptional< QtOhos::QObjectThreadSafeRef > optInstanceMainWindowRef)
void tupleForEach(const std::tuple< TupleElements... > &tuple, UnaryFunc func)
Definition qohosutils.h:137
void invokeInJsThreadAndWaitForContinue(std::function< void(JsState &, std::function< void()>)> &&task)
QOhosOptional< double > tryParseStringAsFiniteDouble(const std::string &inputString)
void addJsQAbilityPeer(std::shared_ptr< QAbilityPeer > qAbilityPeer)
constexpr T makeCopyByValue(T value)
Definition qohosutils.h:143
constexpr bool isQOhosOptional
constexpr bool hasEqualityComparator
Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QOhosDisplayInfo::DisplaySourceMode))
Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QOhosDisplayInfo::JsDisplayOrientation))
QT_END_NAMESPACE Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QOhosPlatformWindow::NativeNodeRenderFitPolicy))
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const QOhosOptional< T > &lhs, const U &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const QOhosOptional< T > &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const T &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const T &lhs, const QOhosOptional< U > &rhs)
QOhosOptional< void > makeEmptyQOhosOptional()
QOhosOptional< T > makeQOhosOptional(const T &value)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const QOhosOptional< T > &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const QOhosOptional< T > &lhs, const U &rhs)
QOhosOptional< QOhosDisplayInfo::JsDisplayId > displayId
Definition window.h:28
QSizeF physicalSize() const
QOhosOptional< QPoint > topLeftOffsetPixels
QRect displayGeometryPixels() const
static QOhosDisplayInfo makeFromOhosDisplayObject(QtOhos::JsState &jsState, QNapi::Object displayObject)
QOhosOptional< JsDisplayOrientation > orientation
QOhosOptional< DisplaySourceMode > sourceMode
static constexpr std::array< std::pair< QOhosAbilityOnContinueResult, const char * >, 3 > enumeratorsNames