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
qohoswindowmanager.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
5#include <QtCore/qcoreapplication.h>
6#include <QtCore/private/qnapi_p.h>
7#include <QtCore/private/qohoscommon_p.h>
8#include <QtCore/private/qohoslogger_p.h>
9#include <qohosjsenv_p.h>
10#include <qohosplugincore.h>
11#include <QtCore/qurl.h>
12#include <algorithm>
13#include <iterator>
14#include <render/qohosjswindowregistry.h>
15#include <render/qwindowproxyregistry.h>
16#include <vector>
19
20QT_BEGIN_NAMESPACE
21
22namespace {
23
29
30QNapi::Array mapToNapiArray(napi_env env, QStringList qstrings)
31{
32 std::vector<QNapi::ValueWrapper> stringsValueWrappers;
33 std::transform(
34 qstrings.begin(), qstrings.end(),
35 std::back_inserter(stringsValueWrappers), std::mem_fn(&QString::toStdString));
36 return QNapi::makeArray(env, stringsValueWrappers);
37}
38
40 QtOhos::JsState &jsState, QOhosOptional<std::string> optQAbilityInstanceId)
41{
42 auto optQAbilityPeer = optQAbilityInstanceId.hasValue()
43 ? jsState.tryGetQAbilityPeerByInstanceId(optQAbilityInstanceId.value())
44 : std::shared_ptr<QtOhos::QAbilityPeer>();
45
46 return optQAbilityPeer ? optQAbilityPeer : jsState.defaultQAbilityPeer();
47}
48
50 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> qAbilityPeer,
51 QOhosOptional<QArkUi::JsWindowId> optContextJsWinId)
52{
53 auto &jsWindowRegistry = jsState.getAttachedObjectWithLazyCreate<QOhosJsWindowRegistry>();
54 auto optJsWindowRef =
55 optContextJsWinId.hasValue()
56 ? jsWindowRegistry.tryFindJsWindowById(optContextJsWinId.value())
57 : nullptr;
58
59 std::vector<QNapi::ValueWrapper> constructorParams = {qAbilityPeer->qAbility().get("context")};
60 if (optJsWindowRef)
61 constructorParams.push_back(optJsWindowRef->jsObject());
62
63 return jsState.eval<QNapi::Object>(
64 "@ohos.file.picker.DocumentViewPicker<new>(*)", constructorParams);
65}
66
68 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> qAbilityPeer,
69 QOhosOptional<QArkUi::JsWindowId> optContextJsWinId,
70 const std::string &pickerActionName, QNapi::Object pickerActionOptions,
71 QOhosConsumer<QOhosOptional<FilePickerResult>> resultConsumer)
72{
73 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
74
75 qOhosPrintfDebug(
76 "Calling DocumentViewPicker.%s() with options: %s",
77 pickerActionName.c_str(), QNapi::toJsonString(pickerActionOptions).c_str());
78 auto documentViewPicker = QtOhos::moveToSharedPtr(
79 QNapi::Reference<>::makePersistentFrom(
80 makeDocumentViewPicker(jsState, qAbilityPeer, optContextJsWinId)));
81 documentViewPicker->call<QNapi::Promise>(pickerActionName, {pickerActionOptions}).onThen(
82 [documentViewPicker, pickerActionName, sharedResultConsumer](const QtOhos::CallbackInfo &cbInfo) {
83 auto actionResult = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
84 auto resultOhosUris = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(actionResult);
85
86 qOhosPrintfDebug(
87 "Called DocumentViewPicker.%s() callback with result: %s",
88 pickerActionName.c_str(), QNapi::toJsonString(actionResult).c_str());
89
90 std::vector<std::string> resultPaths;
91 std::transform(
92 resultOhosUris.cbegin(), resultOhosUris.cend(), std::back_inserter(resultPaths),
93 [&](const auto &uri) {
94 return QOhosPlatformServices::mapOhosFileUriToPathInJsThread(uri);
95 });
96
97 (*sharedResultConsumer)(
98 QOhosOptional<FilePickerResult>(
99 {
100 .resultPaths = std::move(resultPaths),
101 .selectedIndex = documentViewPicker->eval<QNapi::Number>("getSelectedIndex()"),
102 }));
103 },
104 [pickerActionName, sharedResultConsumer]() {
105 qOhosPrintfError("DocumentViewPicker.%s() call failed", pickerActionName.c_str());
106 (*sharedResultConsumer)(makeEmptyQOhosOptional());
107 });
108}
109
110QStringList mapFilePathsToQtUrls(const std::vector<std::string> &filePaths)
111{
112 QStringList qtUrls;
113 std::transform(
114 filePaths.cbegin(), filePaths.cend(), std::back_inserter(qtUrls),
115 [&](const auto &path) {
116 return QUrl::fromLocalFile(QString::fromStdString(path)).toString();
117 });
118 return qtUrls;
119}
120
121}
122
123namespace QOhosWindowManager {
124
126 QtOhos::InternalWindowId contextWinId, QStringList filters, QString defaultPath,
127 DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity,
128 QOhosConsumer<QOhosOptional<OpenResult>> resultCallback)
129{
131
132 auto qAbilityInstanceId =
135
138 constexpr auto ohosMaxValueForMaxSelectNumber = 500;
139
140 auto *env = jsState.env();
141
143 env,
144 {
146 {"fileSuffixFilters", mapToNapiArray(env, filters)},
149 });
150
153 "select", documentSelectOptions,
156 [](const auto &result) {
157 return OpenResult{
159 };
160 });
164 });
165 });
166 });
167}
168
170 QtOhos::InternalWindowId contextWinId, QStringList newFileNames,
171 QString defaultFilePath, QStringList fileSuffixChoices,
172 QOhosConsumer<QOhosOptional<SaveResult>> resultCallback)
173{
175
176 auto qAbilityInstanceId =
179
182 auto *env = jsState.env();
184 if (!newFileNames.isEmpty())
190
193 "save", documentSaveOptions,
196 [](const auto &result) {
197 return SaveResult{
200 };
201 });
205 });
206 });
207 });
208}
209
245
246}
247
248QT_END_NAMESPACE
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByInstanceId(const std::string &instanceId)=0
virtual std::shared_ptr< QAbilityPeer > defaultQAbilityPeer()=0
void showFileDialogAuthorization(QtOhos::InternalWindowId contextWinId, QString filePath, QOhosConsumer< bool > resultCallback)
void showFileDialogOpen(QtOhos::InternalWindowId contextWinId, QStringList filters, QString defaultPath, DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity, QOhosConsumer< QOhosOptional< OpenResult > > resultCallback)
void showFileDialogSave(QtOhos::InternalWindowId contextWinId, QStringList newFileNames, QString defaultFilePath, QStringList fileSuffixChoices, QOhosConsumer< QOhosOptional< SaveResult > > resultCallback)
void startOhosFilePicker(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > qAbilityPeer, QOhosOptional< QArkUi::JsWindowId > optContextJsWinId, const std::string &pickerActionName, QNapi::Object pickerActionOptions, QOhosConsumer< QOhosOptional< FilePickerResult > > resultConsumer)
QNapi::Object makeDocumentViewPicker(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > qAbilityPeer, QOhosOptional< QArkUi::JsWindowId > optContextJsWinId)
QNapi::Array mapToNapiArray(napi_env env, QStringList qstrings)
std::shared_ptr< QtOhos::QAbilityPeer > getQAbilityPeerForOptInstanceId(QtOhos::JsState &jsState, QOhosOptional< std::string > optQAbilityInstanceId)
QStringList mapFilePathsToQtUrls(const std::vector< std::string > &filePaths)