]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/settings/servicessettingspage.cpp
Fix temporary regression of sorting introduced by SVN commit 1126410
[dolphin.git] / src / settings / servicessettingspage.cpp
index a58df2096afb025f9f9b3215c264377d782a685e..98b26e3581eaea1f6e8bf5c079b2c9c39b59359c 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2009-2010 by Peter Penz <peter.penz@gmx.at>             *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
 
 #include "servicessettingspage.h"
 
+#include "dolphin_versioncontrolsettings.h"
+
 #include <kconfig.h>
 #include <kconfiggroup.h>
+#include <kdesktopfile.h>
 #include <kdesktopfileactions.h>
 #include <kicon.h>
 #include <klocale.h>
+#include <kmessagebox.h>
+#include <knewstuff3/knewstuffbutton.h>
 #include <kservice.h>
 #include <kservicetypetrader.h>
 #include <kstandarddirs.h>
 
-#include <QEvent>
+#include <QCheckBox>
+#include <QGridLayout>
+#include <QGroupBox>
 #include <QLabel>
 #include <QListWidget>
-#include <QVBoxLayout>
+#include <QPushButton>
+#include <QShowEvent>
 
 ServicesSettingsPage::ServicesSettingsPage(QWidget* parent) :
     SettingsPageBase(parent),
     m_initialized(false),
-    m_servicesList(0)
+    m_servicesList(0),
+    m_vcsGroupBox(0),
+    m_vcsPluginsMap(),
+    m_enabledVcsPlugins()
 {
     QVBoxLayout* topLayout = new QVBoxLayout(this);
 
     QLabel* label = new QLabel(i18nc("@label:textbox",
                                      "Configure which services should "
                                      "be shown in the context menu."), this);
+    label->setWordWrap(true);
 
     m_servicesList = new QListWidget(this);
     m_servicesList->setSortingEnabled(true);
@@ -50,8 +62,22 @@ ServicesSettingsPage::ServicesSettingsPage(QWidget* parent) :
     connect(m_servicesList, SIGNAL(itemClicked(QListWidgetItem*)),
             this, SIGNAL(changed()));
 
+    KNS3::Button* downloadButton = new KNS3::Button(i18nc("@action:button", "Download New Services..."),
+                                                    "servicemenu.knsrc",
+                                                    this);
+    connect(downloadButton, SIGNAL(dialogFinished(KNS3::Entry::List)), this, SLOT(loadServices()));
+
+    m_vcsGroupBox = new QGroupBox(i18nc("@title:group", "Version Control Systems"), this);
+    // Only show the version control group box, if a version
+    // control system could be found (see loadVersionControlSystems())
+    m_vcsGroupBox->hide();
+
     topLayout->addWidget(label);
     topLayout->addWidget(m_servicesList);
+    topLayout->addWidget(downloadButton);
+    topLayout->addWidget(m_vcsGroupBox);
+
+    m_enabledVcsPlugins = VersionControlSettings::enabledPlugins();
 }
 
 ServicesSettingsPage::~ServicesSettingsPage()
@@ -60,6 +86,7 @@ ServicesSettingsPage::~ServicesSettingsPage()
 
 void ServicesSettingsPage::applySettings()
 {
+    // Apply service menu settings
     KConfig config("kservicemenurc", KConfig::NoGlobals);
     KConfigGroup showGroup = config.group("Show");
 
@@ -72,6 +99,27 @@ void ServicesSettingsPage::applySettings()
     }
 
     showGroup.sync();
+
+    // Apply version control settings
+    QStringList enabledPlugins;
+    QMap<QString, QCheckBox*>::const_iterator it = m_vcsPluginsMap.constBegin();
+    while (it != m_vcsPluginsMap.constEnd()) {
+        if (it.value()->isChecked()) {
+            enabledPlugins.append(it.key());
+        }
+        ++it;
+    }
+
+    if (m_enabledVcsPlugins != enabledPlugins) {
+        VersionControlSettings::setEnabledPlugins(enabledPlugins);
+        VersionControlSettings::self()->writeConfig();
+
+        KMessageBox::information(window(),
+                                 i18nc("@info", "Dolphin must be restarted to apply the "
+                                                "updated version control systems settings."),
+                                 QString(), // default title
+                                 QLatin1String("ShowVcsRestartInformation"));
+    }
 }
 
 void ServicesSettingsPage::restoreDefaults()
@@ -83,13 +131,14 @@ void ServicesSettingsPage::restoreDefaults()
     }
 }
 
-bool ServicesSettingsPage::event(QEvent* event)
+void ServicesSettingsPage::showEvent(QShowEvent* event)
 {
-    if ((event->type() == QEvent::Polish) && !m_initialized) {
+    if (!event->spontaneous() && !m_initialized) {
         QMetaObject::invokeMethod(this, "loadServices", Qt::QueuedConnection);
+        QMetaObject::invokeMethod(this, "loadVersionControlSystems", Qt::QueuedConnection);
         m_initialized = true;
     }
-    return SettingsPageBase::event(event);
+    SettingsPageBase::showEvent(event);
 }
 
 void ServicesSettingsPage::loadServices()
@@ -103,6 +152,9 @@ void ServicesSettingsPage::loadServices()
         const QList<KServiceAction> serviceActions =
                                     KDesktopFileActions::userDefinedServices(file, true);
 
+        KDesktopFile desktopFile(file);
+        const QString subMenuName = desktopFile.desktopGroup().readEntry("X-KDE-Submenu");
+
         foreach (const KServiceAction& action, serviceActions) {
             const QString service = action.name();
             const bool addService = !action.noDisplay()
@@ -110,8 +162,11 @@ void ServicesSettingsPage::loadServices()
                                     && !isInServicesList(service);
 
             if (addService) {
+                const QString itemName = subMenuName.isEmpty()
+                                         ? action.text()
+                                         : i18nc("@item:inmenu", "%1: %2", subMenuName, action.text());
                 QListWidgetItem* item = new QListWidgetItem(KIcon(action.icon()),
-                                                            action.text(),
+                                                            itemName,
                                                             m_servicesList);
                 item->setData(Qt::UserRole, service);
                 const bool show = showGroup.readEntry(service, true);
@@ -121,6 +176,37 @@ void ServicesSettingsPage::loadServices()
     }
 }
 
+void ServicesSettingsPage::loadVersionControlSystems()
+{
+    const QStringList enabledPlugins = VersionControlSettings::enabledPlugins();
+
+    // Create a checkbox for each available version control plugin
+    const KService::List pluginServices = KServiceTypeTrader::self()->query("FileViewVersionControlPlugin");
+    for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) {
+        const QString pluginName = (*it)->name();
+        QCheckBox* checkBox = new QCheckBox(pluginName, m_vcsGroupBox);
+        checkBox->setChecked(enabledPlugins.contains(pluginName));
+        connect(checkBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+        m_vcsPluginsMap.insert(pluginName, checkBox);
+    }
+
+    // Add the checkboxes into a grid layout of 2 columns
+    QGridLayout* layout = new QGridLayout(m_vcsGroupBox);
+    const int maxRows = (m_vcsPluginsMap.count() + 1) / 2;
+
+    int index = 0;
+    QMap<QString, QCheckBox*>::const_iterator it = m_vcsPluginsMap.constBegin();
+    while (it != m_vcsPluginsMap.constEnd()) {
+        const int column = index / maxRows;
+        const int row = index % maxRows;
+        layout->addWidget(it.value(), row, column);
+        ++it;
+        ++index;
+    }
+
+    m_vcsGroupBox->setVisible(!m_vcsPluginsMap.isEmpty());
+}
+
 bool ServicesSettingsPage::isInServicesList(const QString& service) const
 {
     const int count = m_servicesList->count();