From: Michael Schuster Date: Sat, 18 Jan 2020 14:12:16 +0000 (+0100) Subject: Share context menu: Use directEditing capability in SocketApi X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~222^2^2~412^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c0863ede02eecaf69dbb3140343f4eb13a039ea6;p=nextcloud-desktop.git Share context menu: Use directEditing capability in SocketApi - Allow direct editing "Edit" when an editor is available for the mime type - Show "Open in browser" if editing is unavailable (as previously) (now on top of the menu list) - Rename the menu title to the app name, "Nextcloud" instead of "Share via ..." Signed-off-by: Michael Schuster --- diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index a7bc604b5..7967312b8 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -455,7 +455,42 @@ void SocketApi::command_VERSION(const QString &, SocketListener *listener) void SocketApi::command_SHARE_MENU_TITLE(const QString &, SocketListener *listener) { - listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is Nextcloud").arg(Theme::instance()->appNameGUI())); + //listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is Nextcloud").arg(Theme::instance()->appNameGUI())); + listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + Theme::instance()->appNameGUI()); +} + +void SocketApi::command_EDIT(const QString &localFile, SocketListener *listener) +{ + auto fileData = FileData::get(localFile); + if (!fileData.folder) { + qCWarning(lcSocketApi) << "Unknown path" << localFile; + return; + } + + auto record = fileData.journalRecord(); + if (!record.isValid()) + return; + + DirectEditor* editor = getDirectEditorForLocalFile(fileData.localPath); + if (!editor) + return; + + JsonApiJob *job = new JsonApiJob(fileData.folder->accountState()->account(), QLatin1String("ocs/v2.php/apps/files/api/v1/directEditing/open"), this); + + QUrlQuery params; + params.addQueryItem("path", fileData.accountRelativePath); + params.addQueryItem("editorId", editor->id()); + job->addQueryParams(params); + job->usePOST(); + + QObject::connect(job, &JsonApiJob::jsonReceived, [](const QJsonDocument &json){ + auto data = json.object().value("ocs").toObject().value("data").toObject(); + auto url = QUrl(data.value("url").toString()); + + if(!url.isEmpty()) + Utility::openBrowser(url, nullptr); + }); + job->start(); } // don't pull the share manager into socketapi unittests @@ -644,7 +679,7 @@ void SocketApi::command_GET_STRINGS(const QString &argument, SocketListener *lis { static std::array, 5> strings { { { "SHARE_MENU_TITLE", tr("Share options") }, - { "CONTEXT_MENU_TITLE", tr("Share via %1").arg(Theme::instance()->appNameGUI())}, + { "CONTEXT_MENU_TITLE", Theme::instance()->appNameGUI() }, { "COPY_PRIVATE_LINK_MENU_TITLE", tr("Copy private link to clipboard") }, { "EMAIL_PRIVATE_LINK_MENU_TITLE", tr("Send private link by email …") }, } }; @@ -738,13 +773,41 @@ void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListe FileData fileData = hasSeveralFiles ? FileData{} : FileData::get(argument); bool isOnTheServer = fileData.journalRecord().isValid(); auto flagString = isOnTheServer ? QLatin1String("::") : QLatin1String(":d:"); + auto capabilities = fileData.folder->accountState()->account()->capabilities(); + if (fileData.folder && fileData.folder->accountState()->isConnected()) { + DirectEditor* editor = getDirectEditorForLocalFile(fileData.localPath); + if (editor) { + //listener->sendMessage(QLatin1String("MENU_ITEM:EDIT") + flagString + tr("Edit via ") + editor->name()); + listener->sendMessage(QLatin1String("MENU_ITEM:EDIT") + flagString + tr("Edit")); + } else { + listener->sendMessage(QLatin1String("MENU_ITEM:OPEN_PRIVATE_LINK") + flagString + tr("Open in browser")); + } + sendSharingContextMenuOptions(fileData, listener); - listener->sendMessage(QLatin1String("MENU_ITEM:OPEN_PRIVATE_LINK") + flagString + tr("Open in browser")); } listener->sendMessage(QString("GET_MENU_ITEMS:END")); } +DirectEditor* SocketApi::getDirectEditorForLocalFile(const QString &localFile) +{ + FileData fileData = FileData::get(localFile); + auto capabilities = fileData.folder->accountState()->account()->capabilities(); + + if (fileData.folder && fileData.folder->accountState()->isConnected()) { + QMimeDatabase db; + QMimeType type = db.mimeTypeForFile(localFile); + + DirectEditor* editor = capabilities.getDirectEditorForMimetype(type); + if (!editor) { + editor = capabilities.getDirectEditorForOptionalMimetype(type); + } + return editor; + } + + return nullptr; +} + QString SocketApi::buildRegisterPathMessage(const QString &path) { QFileInfo fi(path); diff --git a/src/gui/socketapi.h b/src/gui/socketapi.h index e94ed5116..40adb5700 100644 --- a/src/gui/socketapi.h +++ b/src/gui/socketapi.h @@ -37,6 +37,7 @@ namespace OCC { class SyncFileStatus; class Folder; class SocketListener; +class DirectEditor; /** * @brief The SocketApi class @@ -123,6 +124,10 @@ private: */ Q_INVOKABLE void command_GET_MENU_ITEMS(const QString &argument, SocketListener *listener); + /// Direct Editing + Q_INVOKABLE void command_EDIT(const QString &localFile, SocketListener *listener); + DirectEditor* getDirectEditorForLocalFile(const QString &localFile); + QString buildRegisterPathMessage(const QString &path); QSet _registeredAliases;