]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/admin/workerintegration.cpp
Check if the item supports sequencing before looking for sequence pixmaps
[dolphin.git] / src / admin / workerintegration.cpp
index f9b58739196099fdb63c02fe5671d5e0f76e4fde..0bf6b2890ed4a4523fbcd742824132247caf3797 100644 (file)
@@ -7,7 +7,9 @@
 
 #include "workerintegration.h"
 
+#include "config-dolphin.h"
 #include "dolphinmainwindow.h"
+#include "dolphinpackageinstaller.h"
 #include "dolphinviewcontainer.h"
 
 #include <KActionCollection>
 
 #include <QAction>
 
+#include <iostream>
+
 using namespace Admin;
 
+/** Free file-local functions */
+namespace
+{
+/** @returns the translated name of the actAsAdminAction. */
+QString actionName()
+{
+    return i18nc("@action:inmenu", "Act as Administrator");
+};
+
+/** @returns the default keyboard shortcut of the actAsAdminAction. */
+QKeySequence actionDefaultShortcut()
+{
+    return Qt::CTRL | Qt::SHIFT | Qt::ALT | Qt::Key_A;
+};
+
+/** @returns whether any worker for the protocol "admin" is available. */
+bool isWorkerInstalled()
+{
+    return KProtocolInfo::isKnownProtocol(QStringLiteral("admin"));
+}
+}
+
+void Admin::guideUserTowardsInstallingAdminWorker()
+{
+    if (!isWorkerInstalled()) {
+        std::cout << qPrintable(
+            xi18nc("@info:shell",
+                   "<application>Dolphin</application> requires <application>%1</application> to manage system-controlled files, but it is not installed.<nl/>"
+                   "Press %2 to install <application>%1</application> or %3 to cancel.",
+                   ADMIN_WORKER_PACKAGE_NAME,
+                   QKeySequence{Qt::Key_Enter}.toString(QKeySequence::NativeText),
+                   QKeySequence{Qt::CTRL | Qt::Key_C}.toString(QKeySequence::NativeText)));
+        std::cin.ignore();
+
+        /// Installing admin worker
+        DolphinPackageInstaller adminWorkerInstaller{ADMIN_WORKER_PACKAGE_NAME, QUrl(QStringLiteral("appstream://org.kde.kio.admin")), isWorkerInstalled};
+        QObject::connect(&adminWorkerInstaller, &KJob::result, [](KJob *job) {
+            if (job->error()) {
+                std::cout << qPrintable(job->errorString()) << std::endl;
+                exit(1);
+            }
+        });
+        adminWorkerInstaller.exec();
+    }
+}
+
+void Admin::guideUserTowardsUsingAdminWorker()
+{
+    KuitSetup *kuitSetup = &Kuit::setupForDomain("dolphin");
+    kuitSetup->setTagPattern(QStringLiteral("numberedlist"), QStringList{}, Kuit::RichText, ki18nc("tag-format-pattern <numberedlist> rich", "<ol>%1</ol>"));
+    kuitSetup->setTagPattern(QStringLiteral("numbereditem"), QStringList{}, Kuit::RichText, ki18nc("tag-format-pattern <numbereditem> rich", "<li>%1</li>"));
+
+    KMessageBox::information(
+        nullptr,
+        xi18nc("@info",
+               "<para>Make use of your administrator rights in Dolphin:<numberedlist>"
+               "<numbereditem>Navigate to the file or folder you want to change.</numbereditem>"
+               "<numbereditem>Activate the \"%1\" action either under <interface>Open Menu|More|View</interface> or <interface>Menu Bar|View</interface>.<nl/>"
+               "Default shortcut: <shortcut>%2</shortcut></numbereditem>"
+               "<numbereditem>After authorization you can manage files as an administrator.</numbereditem></numberedlist></para>",
+               actionName(),
+               actionDefaultShortcut().toString(QKeySequence::NativeText)),
+        i18nc("@title:window", "How to Administrate"),
+        "",
+        KMessageBox::WindowModal);
+}
+
 QString Admin::warningMessage()
 {
     return xi18nc(
@@ -51,55 +122,60 @@ WorkerIntegration::WorkerIntegration(DolphinMainWindow *parent, QAction *actAsAd
 
 void WorkerIntegration::createActAsAdminAction(KActionCollection *actionCollection, DolphinMainWindow *dolphinMainWindow)
 {
-    Q_ASSERT(!instance);
-    if (KProtocolInfo::isKnownProtocol(QStringLiteral("admin"))) {
+    Q_ASSERT(!instance /* We never want to construct more than one instance,
+    however in automatic testing sometimes multiple DolphinMainWindows are created, so this assert is diluted to accommodate for that: */
+             || instance->parent() != dolphinMainWindow);
+    if (isWorkerInstalled()) {
         QAction *actAsAdminAction = actionCollection->addAction(QStringLiteral("act_as_admin"));
-        actAsAdminAction->setText(i18nc("@action:inmenu", "Act as Administrator"));
+        actAsAdminAction->setText(actionName());
         actAsAdminAction->setIcon(QIcon::fromTheme(QStringLiteral("system-switch-user")));
         actAsAdminAction->setCheckable(true);
-        actionCollection->setDefaultShortcut(actAsAdminAction, Qt::CTRL | Qt::SHIFT | Qt::ALT | Qt::Key_A);
+        actionCollection->setDefaultShortcut(actAsAdminAction, actionDefaultShortcut());
 
         instance = new WorkerIntegration(dolphinMainWindow, actAsAdminAction);
     }
 }
 
-void WorkerIntegration::exitAdminMode()
+QAction *WorkerIntegration::FriendAccess::actAsAdminAction()
 {
-    if (instance->m_actAsAdminAction->isChecked()) {
-        instance->m_actAsAdminAction->trigger();
-    }
+    return instance->m_actAsAdminAction;
 }
 
 void WorkerIntegration::toggleActAsAdmin()
 {
     auto dolphinMainWindow = static_cast<DolphinMainWindow *>(parent());
     QUrl url = dolphinMainWindow->activeViewContainer()->urlNavigator()->locationUrl();
-    if (url.scheme() == QStringLiteral("file")) {
-        bool risksAccepted = !KMessageBox::shouldBeShownContinue(warningDontShowAgainName);
 
-        if (!risksAccepted) {
-            KMessageDialog warningDialog{KMessageDialog::QuestionTwoActions, warningMessage(), dolphinMainWindow};
-            warningDialog.setCaption(i18nc("@title:window", "Risks of Acting as an Administrator"));
-            warningDialog.setIcon(QIcon::fromTheme(QStringLiteral("security-low")));
-            warningDialog.setButtons(KGuiItem{i18nc("@action:button", "I Understand and Accept These Risks"), QStringLiteral("data-warning")},
-                                     KStandardGuiItem::cancel());
-            warningDialog.setDontAskAgainText(i18nc("@option:check", "Do not warn me about these risks again"));
-
-            risksAccepted = warningDialog.exec() != 4 /* Cancel */;
-            if (warningDialog.isDontAskAgainChecked()) {
-                KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName);
-            }
+    if (url.scheme() == QStringLiteral("admin")) {
+        url.setScheme(QStringLiteral("file"));
+        dolphinMainWindow->changeUrl(url);
+        return;
+    } else if (url.scheme() != QStringLiteral("file")) {
+        return;
+    }
 
-            if (!risksAccepted) {
-                updateActAsAdminAction(); // Uncheck the action
-                return;
-            }
+    bool risksAccepted = !KMessageBox::shouldBeShownContinue(warningDontShowAgainName);
+
+    if (!risksAccepted) {
+        KMessageDialog warningDialog{KMessageDialog::QuestionTwoActions, warningMessage(), dolphinMainWindow};
+        warningDialog.setCaption(i18nc("@title:window", "Risks of Acting as an Administrator"));
+        warningDialog.setIcon(QIcon::fromTheme(QStringLiteral("security-low")));
+        warningDialog.setButtons(KGuiItem{i18nc("@action:button", "I Understand and Accept These Risks"), QStringLiteral("data-warning")},
+                                 KStandardGuiItem::cancel());
+        warningDialog.setDontAskAgainText(i18nc("@option:check", "Do not warn me about these risks again"));
+
+        risksAccepted = warningDialog.exec() != 4 /* Cancel */;
+        if (warningDialog.isDontAskAgainChecked()) {
+            KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName);
         }
 
-        url.setScheme(QStringLiteral("admin"));
-    } else if (url.scheme() == QStringLiteral("admin")) {
-        url.setScheme(QStringLiteral("file"));
+        if (!risksAccepted) {
+            updateActAsAdminAction(); // Uncheck the action
+            return;
+        }
     }
+
+    url.setScheme(QStringLiteral("admin"));
     dolphinMainWindow->changeUrl(url);
 }
 
@@ -118,3 +194,5 @@ void WorkerIntegration::updateActAsAdminAction()
         }
     }
 }
+
+#include "moc_workerintegration.cpp"