35 QOhosJsState &jsState, QNapi::Object qAbility,
36 QtOhos::QObjectThreadSafeRef contextWindowRef)
38 auto optContextJsWindow = jsState.tryGetJsWindowByQWindow(contextWindowRef);
40 std::vector<QNapi::ValueWrapper> constructorParams = {qAbility.get(
"context")};
41 if (optContextJsWindow)
42 constructorParams.push_back(optContextJsWindow.value());
44 return jsState.eval<QNapi::Object>(
45 "@ohos.file.picker.DocumentViewPicker<new>(*)", constructorParams);
49 QOhosJsState &jsState, QtOhos::QObjectThreadSafeRef contextWindowRef,
50 const std::string &pickerActionName, QNapi::Object pickerActionOptions,
51 QOhosConsumer<std::optional<FilePickerResult>> resultConsumer)
53 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
55 auto optQAbility = tryGetQAbilityForQWindow(jsState, contextWindowRef);
58 "Cannot call DocumentViewPicker.%s(): no UIAbility to use", pickerActionName.c_str());
59 (*sharedResultConsumer)(
std::nullopt);
64 "Calling DocumentViewPicker.%s() with options: %s",
65 pickerActionName.c_str(), QNapi::toJsonString(pickerActionOptions).c_str());
66 auto documentViewPicker = QtOhos::moveToSharedPtr(
67 QNapi::Reference<>::makePersistentFrom(
68 makeDocumentViewPicker(jsState, optQAbility.value(), contextWindowRef)));
69 documentViewPicker->evalToPromiseOrRejectOnThrow(pickerActionName +
"(*)", {pickerActionOptions}).onThen(
70 [documentViewPicker, pickerActionName, sharedResultConsumer](
const QOhosCallbackInfo &cbInfo) {
71 auto actionResult = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
72 auto resultOhosUris = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(actionResult);
75 "Called DocumentViewPicker.%s() callback with result: %s",
76 pickerActionName.c_str(), QNapi::toJsonString(actionResult).c_str());
78 std::vector<std::string> resultPaths;
80 resultOhosUris.cbegin(), resultOhosUris.cend(),
std::back_inserter(resultPaths),
81 [&](
const auto &uri) {
82 return tryMapOhosFileUriToPath(uri).value_or(
"");
85 (*sharedResultConsumer)(
86 std::optional<FilePickerResult>(
88 .resultPaths = std::move(resultPaths),
89 .selectedIndex = documentViewPicker->eval<QNapi::Number>(
"getSelectedIndex()"),
92 [pickerActionName, sharedResultConsumer]() {
93 qOhosPrintfError(
"DocumentViewPicker.%s() call failed", pickerActionName.c_str());
94 (*sharedResultConsumer)({});
114 QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList filters, QString defaultPath,
116 QOhosConsumer<std::optional<OpenResult>> resultCallback)
118 auto sharedResultCallback = QtOhos::moveToSharedPtr(std::move(resultCallback));
120 QOhosJsThreadGateway::invoke(
121 [contextWindowRef, filters, defaultPath, documentSelectMode, resultMultiplicity, sharedResultCallback](QOhosJsState &jsState) {
122 constexpr auto ohosMaxValueForMaxSelectNumber = 500;
124 auto *env = jsState.env();
126 auto documentSelectOptions = QNapi::makeObject(
129 {
"maxSelectNumber", resultMultiplicity == ResultMultiplicity::SINGLE ? 1 : ohosMaxValueForMaxSelectNumber},
130 {
"fileSuffixFilters", QNapi::makeArray(env, filters, std::mem_fn(&QString::toStdString))},
131 {
"defaultFilePathUri", tryMapPathToOhosFileUri(defaultPath.toStdString()).value_or(
"")},
132 {
"selectMode", jsState.mapOhosEnumToJs(documentSelectMode)},
136 jsState, contextWindowRef,
"select", documentSelectOptions,
137 [sharedResultCallback](
auto optResult) {
138 auto optQtOpenResult = qTransform(
140 [](
const auto &result) {
142 .selectedUrls = mapFilePathsToQtUrls(result.resultPaths),
145 QtOhos::invokeInQtThread(
146 [sharedResultCallback, optQtOpenResult]() {
147 (*sharedResultCallback)(optQtOpenResult);
154 QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList newFileNames,
155 QString defaultFilePath, QStringList fileSuffixChoices,
156 QOhosConsumer<std::optional<SaveResult>> resultCallback)
158 auto sharedResultCallback = QtOhos::moveToSharedPtr(std::move(resultCallback));
160 QOhosJsThreadGateway::invoke(
161 [contextWindowRef, newFileNames, defaultFilePath, fileSuffixChoices, sharedResultCallback](QOhosJsState &jsState) {
162 auto *env = jsState.env();
163 auto documentSaveOptions = QNapi::Object::New(env);
164 if (!newFileNames.isEmpty())
165 documentSaveOptions.Set(
"newFileNames", QNapi::makeArray(env, newFileNames, std::mem_fn(&QString::toStdString)));
166 if (!defaultFilePath.isEmpty())
167 documentSaveOptions.Set(
"defaultFilePathUri", tryMapPathToOhosFileUri(defaultFilePath.toStdString()).value_or(
""));
168 if (!fileSuffixChoices.isEmpty())
169 documentSaveOptions.Set(
"fileSuffixChoices", QNapi::makeArray(env, fileSuffixChoices, std::mem_fn(&QString::toStdString)));
170 documentSaveOptions.Set(
"autoCreateEmptyFile",
false);
173 jsState, contextWindowRef,
"save", documentSaveOptions,
174 [sharedResultCallback](
auto optResult) {
175 auto optQtSaveResult = qTransform(
177 [](
const auto &result) {
179 .savedUrls = mapFilePathsToQtUrls(result.resultPaths),
180 .selectedFileSuffixChoiceIndex = result.selectedIndex,
183 QtOhos::invokeInQtThread(
184 [sharedResultCallback, optQtSaveResult]() {
185 (*sharedResultCallback)(optQtSaveResult);
void showFileDialogOpen(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList filters, QString defaultPath, DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity, QOhosConsumer< std::optional< OpenResult > > resultCallback)
void showFileDialogSave(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList newFileNames, QString defaultFilePath, QStringList fileSuffixChoices, QOhosConsumer< std::optional< SaveResult > > resultCallback)
void startOhosFilePicker(QOhosJsState &jsState, QtOhos::QObjectThreadSafeRef contextWindowRef, const std::string &pickerActionName, QNapi::Object pickerActionOptions, QOhosConsumer< std::optional< FilePickerResult > > resultConsumer)