37 QtOhos::QObjectThreadSafeRef contextWindowRef)
39 auto optContextJsWindow = jsState.tryGetJsWindowByQWindow(contextWindowRef);
41 std::vector<QNapi::ValueWrapper> constructorParams = {qAbilityPeer->qAbility().get(
"context")};
42 if (optContextJsWindow)
43 constructorParams.push_back(optContextJsWindow.value());
45 return jsState.eval<QNapi::Object>(
46 "@ohos.file.picker.DocumentViewPicker<new>(*)", constructorParams);
51 QtOhos::QObjectThreadSafeRef contextWindowRef,
52 const std::string &pickerActionName, QNapi::Object pickerActionOptions,
53 QOhosConsumer<QOhosOptional<FilePickerResult>> resultConsumer)
55 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
58 "Calling DocumentViewPicker.%s() with options: %s",
59 pickerActionName.c_str(), QNapi::toJsonString(pickerActionOptions).c_str());
60 auto documentViewPicker = QtOhos::moveToSharedPtr(
61 QNapi::Reference<>::makePersistentFrom(
62 makeDocumentViewPicker(jsState, qAbilityPeer, contextWindowRef)));
63 documentViewPicker->evalToPromiseOrRejectOnThrow(pickerActionName +
"(*)", {pickerActionOptions}).onThen(
64 [documentViewPicker, pickerActionName, sharedResultConsumer](
const QtOhos::
CallbackInfo &cbInfo) {
65 auto actionResult = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
66 auto resultOhosUris = QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(actionResult);
69 "Called DocumentViewPicker.%s() callback with result: %s",
70 pickerActionName.c_str(), QNapi::toJsonString(actionResult).c_str());
72 std::vector<std::string> resultPaths;
74 resultOhosUris.cbegin(), resultOhosUris.cend(),
std::back_inserter(resultPaths),
75 [&](
const auto &uri) {
76 return tryMapOhosFileUriToPath(uri).value_or(
"");
79 (*sharedResultConsumer)(
80 QOhosOptional<FilePickerResult>(
82 .resultPaths = std::move(resultPaths),
83 .selectedIndex = documentViewPicker->eval<QNapi::Number>(
"getSelectedIndex()"),
86 [pickerActionName, sharedResultConsumer]() {
87 qOhosPrintfError(
"DocumentViewPicker.%s() call failed", pickerActionName.c_str());
108 QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList filters, QString defaultPath,
110 QOhosConsumer<QOhosOptional<OpenResult>> resultCallback)
112 auto sharedResultCallback = QtOhos::moveToSharedPtr(std::move(resultCallback));
115 [contextWindowRef, filters, defaultPath, documentSelectMode, resultMultiplicity, sharedResultCallback](
QtOhos::
JsState &jsState) {
116 constexpr auto ohosMaxValueForMaxSelectNumber = 500;
118 auto *env = jsState.env();
120 auto documentSelectOptions = QNapi::makeObject(
123 {
"maxSelectNumber", resultMultiplicity == ResultMultiplicity::SINGLE ? 1 : ohosMaxValueForMaxSelectNumber},
124 {
"fileSuffixFilters", QNapi::makeArray(env, filters, std::mem_fn(&QString::toStdString))},
125 {
"defaultFilePathUri", tryMapPathToOhosFileUri(defaultPath.toStdString()).value_or(
"")},
126 {
"selectMode", jsState.mapOhosEnumToJs(documentSelectMode)},
130 jsState, getQAbilityPeerForQWindow(jsState, contextWindowRef), contextWindowRef,
131 "select", documentSelectOptions,
132 [sharedResultCallback](
auto optResult) {
133 auto optQtOpenResult = qTransform(
135 [](
const auto &result) {
137 .selectedUrls = mapFilePathsToQtUrls(result.resultPaths),
140 QtOhos::invokeInQtThread(
141 [sharedResultCallback, optQtOpenResult]() {
142 (*sharedResultCallback)(optQtOpenResult);
149 QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList newFileNames,
150 QString defaultFilePath, QStringList fileSuffixChoices,
151 QOhosConsumer<QOhosOptional<SaveResult>> resultCallback)
153 auto sharedResultCallback = QtOhos::moveToSharedPtr(std::move(resultCallback));
156 [contextWindowRef, newFileNames, defaultFilePath, fileSuffixChoices, sharedResultCallback](
QtOhos::
JsState &jsState) {
157 auto *env = jsState.env();
158 auto documentSaveOptions = QNapi::Object::New(env);
159 if (!newFileNames.isEmpty())
160 documentSaveOptions.Set(
"newFileNames", QNapi::makeArray(env, newFileNames, std::mem_fn(&QString::toStdString)));
161 if (!defaultFilePath.isEmpty())
162 documentSaveOptions.Set(
"defaultFilePathUri", tryMapPathToOhosFileUri(defaultFilePath.toStdString()).value_or(
""));
163 if (!fileSuffixChoices.isEmpty())
164 documentSaveOptions.Set(
"fileSuffixChoices", QNapi::makeArray(env, fileSuffixChoices, std::mem_fn(&QString::toStdString)));
165 documentSaveOptions.Set(
"autoCreateEmptyFile",
false);
168 jsState, getQAbilityPeerForQWindow(jsState, contextWindowRef), contextWindowRef,
169 "save", documentSaveOptions,
170 [sharedResultCallback](
auto optResult) {
171 auto optQtSaveResult = qTransform(
173 [](
const auto &result) {
175 .savedUrls = mapFilePathsToQtUrls(result.resultPaths),
176 .selectedFileSuffixChoiceIndex = result.selectedIndex,
179 QtOhos::invokeInQtThread(
180 [sharedResultCallback, optQtSaveResult]() {
181 (*sharedResultCallback)(optQtSaveResult);
void showFileDialogSave(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList newFileNames, QString defaultFilePath, QStringList fileSuffixChoices, QOhosConsumer< QOhosOptional< SaveResult > > resultCallback)
void showFileDialogOpen(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList filters, QString defaultPath, DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity, QOhosConsumer< QOhosOptional< OpenResult > > resultCallback)
void startOhosFilePicker(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > qAbilityPeer, QtOhos::QObjectThreadSafeRef contextWindowRef, const std::string &pickerActionName, QNapi::Object pickerActionOptions, QOhosConsumer< QOhosOptional< FilePickerResult > > resultConsumer)