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
31 QtOhos::JsState &jsState, QOhosOptional<std::string> optQAbilityInstanceId)
32{
33 auto optQAbilityPeer = optQAbilityInstanceId.has_value()
34 ? jsState.tryGetQAbilityPeerByInstanceId(optQAbilityInstanceId.value())
35 : std::shared_ptr<QtOhos::QAbilityPeer>();
36
37 return optQAbilityPeer ? optQAbilityPeer : jsState.defaultQAbilityPeer();
38}
39
41 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> qAbilityPeer,
42 QOhosOptional<QArkUi::JsWindowId> optContextJsWinId)
43{
44 auto &jsWindowRegistry = jsState.getAttachedObjectWithLazyCreate<QOhosJsWindowRegistry>();
45 auto optJsWindowRef =
46 optContextJsWinId.has_value()
47 ? jsWindowRegistry.tryFindJsWindowById(optContextJsWinId.value())
48 : nullptr;
49
50 std::vector<QNapi::ValueWrapper> constructorParams = {qAbilityPeer->qAbility().get("context")};
51 if (optJsWindowRef)
52 constructorParams.push_back(optJsWindowRef->jsObject());
53
54 return jsState.eval<QNapi::Object>(
55 "@ohos.file.picker.DocumentViewPicker<new>(*)", constructorParams);
56}
57
59 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> qAbilityPeer,
60 QOhosOptional<QArkUi::JsWindowId> optContextJsWinId,
61 const std::string &pickerActionName, QNapi::Object pickerActionOptions,
62 QOhosConsumer<QOhosOptional<FilePickerResult>> resultConsumer)
63{
64 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
65
66 qOhosPrintfDebug(
67 "Calling DocumentViewPicker.%s() with options: %s",
68 pickerActionName.c_str(), QNapi::toJsonString(pickerActionOptions).c_str());
69 auto documentViewPicker = QtOhos::moveToSharedPtr(
70 QNapi::Reference<>::makePersistentFrom(
71 makeDocumentViewPicker(jsState, qAbilityPeer, optContextJsWinId)));
72 documentViewPicker->evalToPromiseOrRejectOnThrow(pickerActionName + "(*)", {pickerActionOptions}).onThen(
73 [documentViewPicker, pickerActionName, sharedResultConsumer](const QtOhos::CallbackInfo &cbInfo) {
74 auto actionResult = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
75 auto resultOhosUris = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(actionResult);
76
77 qOhosPrintfDebug(
78 "Called DocumentViewPicker.%s() callback with result: %s",
79 pickerActionName.c_str(), QNapi::toJsonString(actionResult).c_str());
80
81 std::vector<std::string> resultPaths;
82 std::transform(
83 resultOhosUris.cbegin(), resultOhosUris.cend(), std::back_inserter(resultPaths),
84 [&](const auto &uri) {
86 });
87
88 (*sharedResultConsumer)(
89 QOhosOptional<FilePickerResult>(
90 {
91 .resultPaths = std::move(resultPaths),
92 .selectedIndex = documentViewPicker->eval<QNapi::Number>("getSelectedIndex()"),
93 }));
94 },
95 [pickerActionName, sharedResultConsumer]() {
96 qOhosPrintfError("DocumentViewPicker.%s() call failed", pickerActionName.c_str());
97 (*sharedResultConsumer)(makeEmptyQOhosOptional());
98 });
99}
100
101QStringList mapFilePathsToQtUrls(const std::vector<std::string> &filePaths)
102{
103 QStringList qtUrls;
104 std::transform(
105 filePaths.cbegin(), filePaths.cend(), std::back_inserter(qtUrls),
106 [&](const auto &path) {
107 return QUrl::fromLocalFile(QString::fromStdString(path)).toString();
108 });
109 return qtUrls;
110}
111
112}
113
114namespace QOhosWindowManager {
115
117 QtOhos::InternalWindowId contextWinId, QStringList filters, QString defaultPath,
118 DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity,
119 QOhosConsumer<QOhosOptional<OpenResult>> resultCallback)
120{
122
123 auto qAbilityInstanceId =
126
129 constexpr auto ohosMaxValueForMaxSelectNumber = 500;
130
131 auto *env = jsState.env();
132
134 env,
135 {
137 {"fileSuffixFilters", QNapi::makeArray(env, filters, std::mem_fn(&QString::toStdString))},
140 });
141
144 "select", documentSelectOptions,
147 optResult,
148 [](const auto &result) {
149 return OpenResult{
151 };
152 });
156 });
157 });
158 });
159}
160
162 QtOhos::InternalWindowId contextWinId, QStringList newFileNames,
163 QString defaultFilePath, QStringList fileSuffixChoices,
164 QOhosConsumer<QOhosOptional<SaveResult>> resultCallback)
165{
167
168 auto qAbilityInstanceId =
171
174 auto *env = jsState.env();
176 if (!newFileNames.isEmpty())
182 documentSaveOptions.Set("autoCreateEmptyFile", false);
183
186 "save", documentSaveOptions,
189 optResult,
190 [](const auto &result) {
191 return SaveResult{
194 };
195 });
199 });
200 });
201 });
202}
203
240
241}
242
243QT_END_NAMESPACE
static std::string mapOhosFileUriToPathInJsThread(const std::string &ohosFileUri)
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)
std::shared_ptr< QtOhos::QAbilityPeer > getQAbilityPeerForOptInstanceId(QtOhos::JsState &jsState, QOhosOptional< std::string > optQAbilityInstanceId)
QStringList mapFilePathsToQtUrls(const std::vector< std::string > &filePaths)
std::nullopt_t makeEmptyQOhosOptional()