[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdevelop] /: Make SourceFormatter plugins enablable, hide actions with no plugins
From:       Friedrich W. H. Kossebau <null () kde ! org>
Date:       2017-11-30 23:51:52
Message-ID: E1eKYcS-0004ll-Eo () code ! kde ! org
[Download RAW message or body]

Git commit a6a42ec30a7c1b884de8beb0b1be8b07cb0f1f85 by Friedrich W. H. \
Kossebau. Committed on 30/11/2017 at 23:51.
Pushed by kossebau into branch 'master'.

Make SourceFormatter plugins enablable, hide actions with no plugins

Summary:
Source formatting is a feature seemingly only used by some.
So it makes sense to allow disabling this feature, for some minimal smaller
runtime footprint and less unused clutter in the UI (like menu actions or
settings).

This patch achieves this to a good degree:
* makes the plugins astyle & customscript normal global plugins which can \
be  enabled/disabled by the user
* removes the SourceFormatterController actions from the menus when there \
are  no formatters available
* shows no source formatting settings page in the project settings
  when there are no formatters available

Not yet done is to hide the source formatting settings page from the
application settings dialog in case no formatters are available. That might
need some more custom logic all over the shell code, which is not so nice.
Instead the option should be investigated to make the source formatting
controller a normal plugin with a suited interface, which then can be
queried by other code needing that service.

Test Plan:
See plugins astyle & customscript turn up in plugin selection settings.
Disable and enable both and see how actions in the main Edit menu and the
context menu on file items are present or not present, as well as the
formatting settings page in the project settings dialog being shown or not.

See also the formatting settings pages for projects and the global one only
offering the formatters of the enabled plugins.

Reviewers: #kdevelop, kfunk, mwolff

Reviewed By: #kdevelop, kfunk, mwolff

Subscribers: mwolff, kfunk, kdevelop-devel

Differential Revision: https://phabricator.kde.org/D8492

M  +5    -0    kdevplatform/interfaces/isourceformattercontroller.h
M  +5    -1    kdevplatform/shell/mainwindow.cpp
M  +12   -0    kdevplatform/shell/mainwindow_p.cpp
M  +1    -0    kdevplatform/shell/mainwindow_p.h
M  +87   -9    kdevplatform/shell/sourceformattercontroller.cpp
M  +13   -0    kdevplatform/shell/sourceformattercontroller.h
M  +92   -41   kdevplatform/shell/sourceformatterselectionedit.cpp
M  +5    -0    kdevplatform/shell/sourceformatterselectionedit.h
M  +1    -1    plugins/astyle/kdevastyle.json
M  +1    -1    plugins/customscript/kdevcustomscript.json
M  +4    -1    plugins/sourceformatter/sourceformatterplugin.cpp

https://commits.kde.org/kdevelop/a6a42ec30a7c1b884de8beb0b1be8b07cb0f1f85

diff --git a/kdevplatform/interfaces/isourceformattercontroller.h \
b/kdevplatform/interfaces/isourceformattercontroller.h index \
                1210d774c1..480ec404e1 100644
--- a/kdevplatform/interfaces/isourceformattercontroller.h
+++ b/kdevplatform/interfaces/isourceformattercontroller.h
@@ -58,6 +58,8 @@ class KDEVPLATFORMINTERFACES_EXPORT \
                ISourceFormatterController : public QObject
 		* @param mime known mimetype of the url
 		*/
 		virtual ISourceFormatter* formatterForUrl(const QUrl& url, const \
QMimeType& mime) = 0; +		///\return @c true if there are formatters at all, \
@c false otherwise +		virtual bool hasFormatters() const = 0;
 		/** \return Whether this mime type is supported by any plugin.
 		*/
 		virtual bool isMimeTypeSupported(const QMimeType &mime) = 0;
@@ -68,6 +70,9 @@ class KDEVPLATFORMINTERFACES_EXPORT \
ISourceFormatterController : public QObject  virtual void \
disableSourceFormatting(bool disable) = 0;  ///\return Whether or not \
source formatting is enabled  virtual bool sourceFormattingEnabled() = 0;
+
+	Q_SIGNALS:
+		void hasFormattersChanged(bool hasFormatters);
 };
 
 }
diff --git a/kdevplatform/shell/mainwindow.cpp \
b/kdevplatform/shell/mainwindow.cpp index 0166466ac5..23ee93abf2 100644
--- a/kdevplatform/shell/mainwindow.cpp
+++ b/kdevplatform/shell/mainwindow.cpp
@@ -345,12 +345,16 @@ void MainWindow::initialize()
         d, &MainWindowPrivate::activePartChanged);
     connect( this, &MainWindow::activeViewChanged,
         d, &MainWindowPrivate::changeActiveView);
+    connect(Core::self()->sourceFormatterControllerInternal(), \
&SourceFormatterController::hasFormattersChanged, +             d, \
&MainWindowPrivate::updateSourceFormatterGuiClient);  
     foreach(IPlugin* plugin, \
Core::self()->pluginController()->loadedPlugins())  d->addPlugin(plugin);
 
     guiFactory()->addClient(Core::self()->sessionController());
-    guiFactory()->addClient(Core::self()->sourceFormatterControllerInternal());
 +    if (Core::self()->sourceFormatterControllerInternal()->hasFormatters()) \
{ +        guiFactory()->addClient(Core::self()->sourceFormatterControllerInternal());
 +    }
 
     // Needed to re-plug the actions from the sessioncontroller as \
xmlguiclients don't  // seem to remember which actions where plugged in.
diff --git a/kdevplatform/shell/mainwindow_p.cpp \
b/kdevplatform/shell/mainwindow_p.cpp index 2506676a66..50aac80374 100644
--- a/kdevplatform/shell/mainwindow_p.cpp
+++ b/kdevplatform/shell/mainwindow_p.cpp
@@ -47,6 +47,7 @@ Boston, MA 02110-1301, USA.
 #include "mainwindow.h"
 #include "textdocument.h"
 #include "sessioncontroller.h"
+#include "sourceformattercontroller.h"
 #include "debug.h"
 #include "ktexteditorpluginintegration.h"
 #include "colorschemechooser.h"
@@ -125,6 +126,17 @@ void MainWindowPrivate::removePlugin( IPlugin *plugin \
)  m_mainWindow->guiFactory()->removeClient( plugin );
 }
 
+void MainWindowPrivate::updateSourceFormatterGuiClient(bool hasFormatters)
+{
+    auto sourceFormatterController = \
Core::self()->sourceFormatterControllerInternal(); +    auto guiFactory = \
m_mainWindow->guiFactory(); +    if (hasFormatters) {
+        guiFactory->addClient(sourceFormatterController);
+    } else {
+        guiFactory->removeClient(sourceFormatterController);
+    }
+}
+
 void MainWindowPrivate::activePartChanged(KParts::Part *part)
 {
     if ( Core::self()->uiController()->activeMainWindow() == m_mainWindow)
diff --git a/kdevplatform/shell/mainwindow_p.h \
b/kdevplatform/shell/mainwindow_p.h index 01b2b985ae..fdb975e0d6 100644
--- a/kdevplatform/shell/mainwindow_p.h
+++ b/kdevplatform/shell/mainwindow_p.h
@@ -77,6 +77,7 @@ public:
 public Q_SLOTS:
     void addPlugin( KDevelop::IPlugin *plugin );
     void removePlugin( KDevelop::IPlugin *plugin );
+    void updateSourceFormatterGuiClient(bool hasFormatters);
 
     void activePartChanged(KParts::Part *part);
     void mergeView(Sublime::View *view);
diff --git a/kdevplatform/shell/sourceformattercontroller.cpp \
b/kdevplatform/shell/sourceformattercontroller.cpp index \
                de252c94ab..13ffaad816 100644
--- a/kdevplatform/shell/sourceformattercontroller.cpp
+++ b/kdevplatform/shell/sourceformattercontroller.cpp
@@ -74,6 +74,8 @@ namespace KDevelop
 class SourceFormatterControllerPrivate
 {
 public:
+    // cache of formatter plugins, to avoid querying plugincontroller
+    QVector<ISourceFormatter*> sourceFormatters;
     // GUI actions
     QAction* formatTextAction;
     QAction* formatFilesAction;
@@ -127,20 +129,29 @@ \
SourceFormatterController::SourceFormatterController(QObject *parent)  \
                d->formatTextAction->setText(i18n("&Reformat Source"));
     d->formatTextAction->setToolTip(i18n("Reformat source using AStyle"));
     d->formatTextAction->setWhatsThis(i18n("Source reformatting \
functionality using <b>astyle</b> library.")); +    \
                d->formatTextAction->setEnabled(false);
     connect(d->formatTextAction, &QAction::triggered, this, \
&SourceFormatterController::beautifySource);  
     d->formatLine = \
actionCollection()->addAction(QStringLiteral("edit_reformat_line"));  \
                d->formatLine->setText(i18n("Reformat Line"));
     d->formatLine->setToolTip(i18n("Reformat current line using AStyle"));
     d->formatLine->setWhatsThis(i18n("Source reformatting of line under \
cursor using <b>astyle</b> library.")); +    \
                d->formatLine->setEnabled(false);
     connect(d->formatLine, &QAction::triggered, this, \
&SourceFormatterController::beautifyLine);  
     d->formatFilesAction = \
actionCollection()->addAction(QStringLiteral("tools_astyle"));  \
                d->formatFilesAction->setText(i18n("Reformat Files..."));
     d->formatFilesAction->setToolTip(i18n("Format file(s) using the \
                current theme"));
     d->formatFilesAction->setWhatsThis(i18n("Formatting functionality \
using <b>astyle</b> library.")); +    \
                d->formatFilesAction->setEnabled(false);
     connect(d->formatFilesAction, &QAction::triggered, this, \
static_cast<void(SourceFormatterController::*)()>(&SourceFormatterController::formatFiles));
  
+
+    connect(Core::self()->pluginController(), \
&IPluginController::pluginLoaded, +            this, \
&SourceFormatterController::pluginLoaded); +    \
connect(Core::self()->pluginController(), \
&IPluginController::unloadingPlugin, +            this, \
&SourceFormatterController::unloadingPlugin); +
     // connect to both documentActivated & documentClosed,
     // otherwise we miss when the last document was closed
     connect(Core::self()->documentController(), \
&IDocumentController::documentActivated, @@ -168,6 +179,46 @@ void \
                SourceFormatterController::documentLoaded( IDocument* doc )
     adaptEditorIndentationMode(doc->textDocument(), formatterForUrl(url, \
mime), url);  }
 
+void SourceFormatterController::pluginLoaded(IPlugin* plugin)
+{
+    ISourceFormatter* sourceFormatter = \
plugin->extension<ISourceFormatter>(); +
+    if (!sourceFormatter) {
+        return;
+    }
+
+    d->sourceFormatters << sourceFormatter;
+
+    resetUi();
+
+    emit formatterLoaded(sourceFormatter);
+    // with one plugin now added, hasFormatters turned to true, so report \
to listeners +    if (d->sourceFormatters.size() == 1) {
+        emit hasFormattersChanged(true);
+    }
+}
+
+void SourceFormatterController::unloadingPlugin(IPlugin* plugin)
+{
+    ISourceFormatter* sourceFormatter = \
plugin->extension<ISourceFormatter>(); +
+    if (!sourceFormatter) {
+        return;
+    }
+
+    const int idx = d->sourceFormatters.indexOf(sourceFormatter);
+    Q_ASSERT(idx != -1);
+    d->sourceFormatters.remove(idx);
+
+    resetUi();
+
+    emit formatterUnloading(sourceFormatter);
+    if (d->sourceFormatters.isEmpty()) {
+        emit hasFormattersChanged(false);
+    }
+}
+
+
 void SourceFormatterController::initialize()
 {
 }
@@ -212,9 +263,7 @@ ISourceFormatter* \
SourceFormatterController::findFirstFormatterForMimeType(const  if \
(knownFormatters.contains(mime.name()))  return \
knownFormatters[mime.name()];  
-    QList<IPlugin*> plugins = \
Core::self()->pluginController()->allPluginsForExtension( \
                QStringLiteral("org.kdevelop.ISourceFormatter") );
-    foreach( IPlugin* p, plugins) {
-        ISourceFormatter *iformatter = p->extension<ISourceFormatter>();
+    foreach (ISourceFormatter* iformatter, d->sourceFormatters) {
         QSharedPointer<SourceFormatter> \
formatter(createFormatterForPlugin(iformatter));  if( \
formatter->supportedMimeTypes().contains(mime.name()) ) {  \
knownFormatters[mime.name()] = iformatter; @@ -275,7 +324,13 @@ \
ISourceFormatter* SourceFormatterController::formatterForUrl(const QUrl& \
url, co  return nullptr;
     }
 
-    return Core::self()->pluginControllerInternal()->extensionForPlugin<ISourceFormatter>( \
QStringLiteral("org.kdevelop.ISourceFormatter"), formatterinfo.at(0) ); +   \
foreach (ISourceFormatter* iformatter, d->sourceFormatters) { +        if \
(iformatter->name() == formatterinfo.first()) { +            return \
iformatter; +        }
+    }
+
+    return nullptr;
 }
 
 bool SourceFormatterController::isMimeTypeSupported(const QMimeType& mime)
@@ -377,11 +432,13 @@ void \
SourceFormatterController::updateFormatTextAction()  {
     bool enabled = false;
 
-    IDocument* doc = \
                KDevelop::ICore::self()->documentController()->activeDocument();
                
-    if (doc) {
-        QMimeType mime = QMimeDatabase().mimeTypeForUrl(doc->url());
-        if (isMimeTypeSupported(mime))
-            enabled = true;
+    if (!d->sourceFormatters.isEmpty()) {
+        IDocument* doc = \
KDevelop::ICore::self()->documentController()->activeDocument(); +        \
if (doc) { +            QMimeType mime = \
QMimeDatabase().mimeTypeForUrl(doc->url()); +            if \
(isMimeTypeSupported(mime)) +                enabled = true;
+        }
     }
 
     d->formatLine->setEnabled(enabled);
@@ -616,6 +673,10 @@ KDevelop::ContextMenuExtension \
SourceFormatterController::contextMenuExtension(K  d->urls.clear();
     d->prjItems.clear();
 
+    if (d->sourceFormatters.isEmpty()) {
+        return ext;
+    }
+
     if (context->hasType(KDevelop::Context::EditorContext))
     {
         if (d->formatTextAction->isEnabled())
@@ -661,4 +722,21 @@ bool \
SourceFormatterController::sourceFormattingEnabled()  return d->enabled;
 }
 
+bool SourceFormatterController::hasFormatters() const
+{
+    return !d->sourceFormatters.isEmpty();
+}
+
+QVector<ISourceFormatter*> SourceFormatterController::formatters() const
+{
+    return d->sourceFormatters;
+}
+
+void SourceFormatterController::resetUi()
+{
+    d->formatFilesAction->setEnabled(!d->sourceFormatters.isEmpty());
+
+    updateFormatTextAction();
+}
+
 }
diff --git a/kdevplatform/shell/sourceformattercontroller.h \
b/kdevplatform/shell/sourceformattercontroller.h index \
                f212800b5c..5d74d0280f 100644
--- a/kdevplatform/shell/sourceformattercontroller.h
+++ b/kdevplatform/shell/sourceformattercontroller.h
@@ -25,6 +25,7 @@ Boston, MA 02110-1301, USA.
 #include <interfaces/isourceformatter.h>
 
 #include <QSet>
+#include <QVector>
 #include <QMimeType>
 
 #include <kxmlguiclient.h>
@@ -102,6 +103,7 @@ public:
     * The source formatter is then ready to use on a file.
     */
     ISourceFormatter* formatterForUrl(const QUrl& url, const QMimeType& \
mime) override; +    bool hasFormatters() const override;
     /** \return Whether this mime type is supported by any plugin.
     */
     bool isMimeTypeSupported(const QMimeType& mime) override;
@@ -132,12 +134,21 @@ public:
     void disableSourceFormatting(bool disable) override;
     bool sourceFormattingEnabled() override;
 
+    QVector<KDevelop::ISourceFormatter*> formatters() const;
+
+Q_SIGNALS:
+    void formatterLoaded(KDevelop::ISourceFormatter* ifmt);
+    void formatterUnloading(KDevelop::ISourceFormatter* ifmt);
+
 private Q_SLOTS:
     void updateFormatTextAction();
     void beautifySource();
     void beautifyLine();
     void formatFiles();
     void documentLoaded( KDevelop::IDocument* );
+    void pluginLoaded(KDevelop::IPlugin* plugin);
+    void unloadingPlugin(KDevelop::IPlugin* plugin);
+
 private:
     /** \return A modeline string (to add at the end or the beginning of a \
                file)
     * corresponding to the settings of the active language.
@@ -152,6 +163,8 @@ private:
     void adaptEditorIndentationMode(KTextEditor::Document* doc, \
                KDevelop::ISourceFormatter* formatter,
                                     const QUrl& url, bool ignoreModeline = \
false);  
+    void resetUi();
+
 private:
     const QScopedPointer<class SourceFormatterControllerPrivate> d;
 };
diff --git a/kdevplatform/shell/sourceformatterselectionedit.cpp \
b/kdevplatform/shell/sourceformatterselectionedit.cpp index \
                c4818cf04c..56f15c84b8 100644
--- a/kdevplatform/shell/sourceformatterselectionedit.cpp
+++ b/kdevplatform/shell/sourceformatterselectionedit.cpp
@@ -112,6 +112,15 @@ \
                SourceFormatterSelectionEdit::SourceFormatterSelectionEdit(QWidget* \
                parent)
         iface->setConfigValue(QStringLiteral("dynamic-word-wrap"), false);
         iface->setConfigValue(QStringLiteral("icon-bar"), false);
     }
+
+    SourceFormatterController* controller = \
Core::self()->sourceFormatterControllerInternal(); +    connect(controller, \
&SourceFormatterController::formatterLoaded, +            this, \
&SourceFormatterSelectionEdit::addSourceFormatter); +    \
connect(controller, &SourceFormatterController::formatterUnloading, +       \
this, &SourceFormatterSelectionEdit::removeSourceFormatter); +    for \
(auto* formatter : controller->formatters()) { +        \
addSourceFormatter(formatter); +    }
 }
 
 SourceFormatterSelectionEdit::~SourceFormatterSelectionEdit()
@@ -125,58 +134,76 @@ static void selectAvailableStyle(LanguageSettings& \
lang)  lang.selectedStyle = *lang.selectedFormatter->styles.begin();
 }
 
-void SourceFormatterSelectionEdit::loadSettings(const KConfigGroup& \
config) +void SourceFormatterSelectionEdit::addSourceFormatter(ISourceFormatter* \
ifmt)  {
-    SourceFormatterController* fmtctrl = \
                Core::self()->sourceFormatterControllerInternal();
-    QList<KDevelop::IPlugin*> plugins = \
KDevelop::ICore::self()->pluginController()->allPluginsForExtension( \
                QStringLiteral("org.kdevelop.ISourceFormatter") );
-    foreach( KDevelop::IPlugin* plugin, plugins )
-    {
-        KDevelop::ISourceFormatter* ifmt = \
                plugin->extension<ISourceFormatter>();
-        auto info = \
                KDevelop::Core::self()->pluginControllerInternal()->pluginInfo( \
                plugin );
-        KDevelop::SourceFormatter* formatter;
-        FormatterMap::const_iterator iter = \
                d->formatters.constFind(ifmt->name());
-        if (iter == d->formatters.constEnd()) {
-            formatter = fmtctrl->createFormatterForPlugin(ifmt);
-            d->formatters[ifmt->name()] = formatter;
-        } else {
-            formatter = iter.value();
-        }
-        foreach ( const SourceFormatterStyle* style, formatter->styles ) {
-            foreach ( const SourceFormatterStyle::MimeHighlightPair& item, \
                style->mimeTypes() ) {
-                QMimeType mime = \
                QMimeDatabase().mimeTypeForName(item.mimeType);
-                if (!mime.isValid()) {
-                    qCWarning(SHELL) << "plugin" << info.name() << \
                "supports unknown mimetype entry" << item.mimeType;
-                    continue;
-                }
-                QString languageName = item.highlightMode;
-                LanguageSettings& l = d->languages[languageName];
-                l.mimetypes.append(mime);
-                l.formatters.insert( formatter );
+    SourceFormatter* formatter;
+    FormatterMap::const_iterator iter = \
d->formatters.constFind(ifmt->name()); +    if (iter == \
d->formatters.constEnd()) { +        formatter = \
Core::self()->sourceFormatterControllerInternal()->createFormatterForPlugin(ifmt);
 +        d->formatters[ifmt->name()] = formatter;
+    } else {
+        qCWarning(SHELL) << "formatter plugin" << ifmt->name() << "loading \
which was already seen before by SourceFormatterSelectionEdit"; +        \
return; +    }
+
+    foreach ( const SourceFormatterStyle* style, formatter->styles ) {
+        foreach ( const SourceFormatterStyle::MimeHighlightPair& item, \
style->mimeTypes() ) { +            QMimeType mime = \
QMimeDatabase().mimeTypeForName(item.mimeType); +            if \
(!mime.isValid()) { +                qCWarning(SHELL) << "formatter plugin" \
<< ifmt->name() << "supports unknown mimetype entry" << item.mimeType; +    \
continue; +            }
+            QString languageName = item.highlightMode;
+            LanguageSettings& l = d->languages[languageName];
+            l.mimetypes.append(mime);
+            l.formatters.insert( formatter );
+            // init selection if needed
+            if (!l.selectedFormatter) {
+                l.selectedFormatter = formatter;
+                selectAvailableStyle(l);
             }
         }
     }
 
-    // Sort the languages, preferring firstly active, then loaded \
                languages
-    QList<QString> sortedLanguages;
+    resetUi();
+}
 
-    foreach(const auto language,
-                KDevelop::ICore::self()->languageController()->activeLanguages() \
                +
-                KDevelop::ICore::self()->languageController()->loadedLanguages())
                
-    {
-        if (d->languages.contains(language->name()) && \
                !sortedLanguages.contains(language->name())) {
-            sortedLanguages.push_back( language->name() );
-        }
+void SourceFormatterSelectionEdit::removeSourceFormatter(ISourceFormatter* \
ifmt) +{
+    auto iter = d->formatters.find(ifmt->name());
+    if (iter == d->formatters.end()) {
+        qCWarning(SHELL) << "formatter plugin" << ifmt->name() << \
"unloading which was not seen before by SourceFormatterSelectionEdit"; +    \
return;  }
+    d->formatters.erase(iter);
+    auto formatter = iter.value();
 
-    foreach (const QString& name, d->languages.keys()) {
-        if( !sortedLanguages.contains( name ) )
-            sortedLanguages.push_back( name );
+    auto languageIter = d->languages.begin();
+    while (languageIter != d->languages.end()) {
+        LanguageSettings& l = languageIter.value();
+
+        l.formatters.remove(formatter);
+        if (l.formatters.isEmpty()) {
+            languageIter = d->languages.erase(languageIter);
+        } else {
+            // reset selected formatter if needed
+            if (l.selectedFormatter == formatter) {
+                l.selectedFormatter = *l.formatters.begin();
+                selectAvailableStyle(l);
+            }
+            ++languageIter;
+        }
     }
+    delete formatter;
 
-    foreach( const QString& name, sortedLanguages )
-    {
+    resetUi();
+}
+
+void SourceFormatterSelectionEdit::loadSettings(const KConfigGroup& \
config) +{
+    for (auto languageIter = d->languages.begin(); languageIter != \
d->languages.end(); ++languageIter) {  // Pick the first appropriate \
                mimetype for this language
-        LanguageSettings& l = d->languages[name];
+        LanguageSettings& l = languageIter.value();
         const QList<QMimeType> mimetypes = l.mimetypes;
         foreach (const QMimeType& mimetype, mimetypes) {
             QStringList formatterAndStyleName = \
config.readEntry(mimetype.name(), QString()).split(QStringLiteral("||"), \
QString::KeepEmptyParts); @@ -205,6 +232,29 @@ void \
SourceFormatterSelectionEdit::loadSettings(const KConfigGroup& config)  \
selectAvailableStyle(l);  }
     }
+
+    resetUi();
+}
+
+void SourceFormatterSelectionEdit::resetUi()
+{
+    // Sort the languages, preferring firstly active, then loaded \
languages +    QList<QString> sortedLanguages;
+
+    foreach(const auto language,
+                KDevelop::ICore::self()->languageController()->activeLanguages() \
+ +                KDevelop::ICore::self()->languageController()->loadedLanguages())
 +    {
+        if (d->languages.contains(language->name()) && \
!sortedLanguages.contains(language->name())) { +            \
sortedLanguages.push_back( language->name() ); +        }
+    }
+
+    foreach (const QString& name, d->languages.keys()) {
+        if( !sortedLanguages.contains( name ) )
+            sortedLanguages.push_back( name );
+    }
+
     bool b = blockSignals( true );
     d->ui.cbLanguages->blockSignals(!b);
     d->ui.cbFormatters->blockSignals(!b);
@@ -222,6 +272,7 @@ void SourceFormatterSelectionEdit::loadSettings(const \
KConfigGroup& config)  } else
     {
         d->ui.cbLanguages->setCurrentIndex(0);
+        d->ui.cbLanguages->setEnabled(true);
         selectLanguage( 0 );
     }
     updatePreview();
diff --git a/kdevplatform/shell/sourceformatterselectionedit.h \
b/kdevplatform/shell/sourceformatterselectionedit.h index \
                7478b64e28..0fadb8ddc2 100644
--- a/kdevplatform/shell/sourceformatterselectionedit.h
+++ b/kdevplatform/shell/sourceformatterselectionedit.h
@@ -32,6 +32,7 @@ class QListWidgetItem;
 namespace KDevelop
 {
 class SourceFormatterStyle;
+class ISourceFormatter;
 
 class KDEVPLATFORMSHELL_EXPORT SourceFormatterSelectionEdit : public \
QWidget  {
@@ -49,6 +50,9 @@ Q_SIGNALS:
     void changed();
 
 private Q_SLOTS:
+    void addSourceFormatter(KDevelop::ISourceFormatter* ifmt);
+    void removeSourceFormatter(KDevelop::ISourceFormatter* ifmt);
+
     void deleteStyle();
     void editStyle();
     void newStyle();
@@ -58,6 +62,7 @@ private Q_SLOTS:
     void styleNameChanged(QListWidgetItem* );
 
 private:
+    void resetUi();
     void updatePreview();
     QListWidgetItem* addStyle(const KDevelop::SourceFormatterStyle& s);
     void enableStyleButtons();
diff --git a/plugins/astyle/kdevastyle.json \
b/plugins/astyle/kdevastyle.json index 958f4f94c0..31e107eac4 100644
--- a/plugins/astyle/kdevastyle.json
+++ b/plugins/astyle/kdevastyle.json
@@ -59,6 +59,6 @@
     "X-KDevelop-Interfaces": [
         "org.kdevelop.ISourceFormatter"
     ],
-    "X-KDevelop-LoadMode": "AlwaysOn",
+    "X-KDevelop-Category": "Global",
     "X-KDevelop-Mode": "NoGUI"
 }
diff --git a/plugins/customscript/kdevcustomscript.json \
b/plugins/customscript/kdevcustomscript.json index 8b1d21ce8c..2f5a298d70 \
                100644
--- a/plugins/customscript/kdevcustomscript.json
+++ b/plugins/customscript/kdevcustomscript.json
@@ -59,6 +59,6 @@
     "X-KDevelop-Interfaces": [
         "org.kdevelop.ISourceFormatter"
     ],
-    "X-KDevelop-LoadMode": "AlwaysOn",
+    "X-KDevelop-Category": "Global",
     "X-KDevelop-Mode": "NoGUI"
 }
diff --git a/plugins/sourceformatter/sourceformatterplugin.cpp \
b/plugins/sourceformatter/sourceformatterplugin.cpp index \
                49adf3486a..79202bbe93 100644
--- a/plugins/sourceformatter/sourceformatterplugin.cpp
+++ b/plugins/sourceformatter/sourceformatterplugin.cpp
@@ -21,6 +21,8 @@
 
 #include "config/projectconfigpage.h"
 
+#include <interfaces/icore.h>
+#include <interfaces/isourceformattercontroller.h>
 #include <project/projectconfigpage.h>
 
 #include <KPluginFactory>
@@ -38,7 +40,8 @@ SourceFormatterPlugin::~SourceFormatterPlugin() = \
default;  
 int SourceFormatterPlugin::perProjectConfigPages() const
 {
-    return 1;
+    const auto hasFormatters = \
KDevelop::ICore::self()->sourceFormatterController()->hasFormatters(); +    \
return hasFormatters ? 1 : 0;  }
 
 KDevelop::ConfigPage* SourceFormatterPlugin::perProjectConfigPage(int \
number, const KDevelop::ProjectConfigOptions& options, QWidget* parent)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic