diff --git a/addons/project/kateprojectcodeanalysistool.h b/addons/project/kateprojectcodeanalysistool.h --- a/addons/project/kateprojectcodeanalysistool.h +++ b/addons/project/kateprojectcodeanalysistool.h @@ -54,6 +54,15 @@ */ virtual QString name() = 0; + /** + * @returns a string containing the file extensions this + * tool should be run, separated by '|', + * e.g. "cpp|cxx" + * NOTE that this is used directly as part of a regular expression. + * If more flexibility is required this method probably will change + */ + virtual QString fileExtensions() = 0; + /** * filter relevant files * @param files set of files in project diff --git a/addons/project/kateprojectinfoviewcodeanalysis.h b/addons/project/kateprojectinfoviewcodeanalysis.h --- a/addons/project/kateprojectinfoviewcodeanalysis.h +++ b/addons/project/kateprojectinfoviewcodeanalysis.h @@ -23,10 +23,11 @@ #include "kateproject.h" -#include +#include +#include #include +#include #include -#include class KateProjectPluginView; class KateProjectCodeAnalysisTool; @@ -62,6 +63,11 @@ } private Q_SLOTS: + /** + * Called if the tool is changed (currently via Combobox) + */ + void slotToolSelectionChanged(int); + /** * Called if start/stop button is clicked. */ @@ -121,10 +127,20 @@ */ QProcess *m_analyzer; + /** + * currently selected tool + */ KateProjectCodeAnalysisTool *m_analysisTool; + /** + * UI element to select the tool + */ QComboBox *m_toolSelector; + /** + * contains a rich text to explain what the current tool does + */ + QString m_toolInfoText; }; #endif diff --git a/addons/project/kateprojectinfoviewcodeanalysis.cpp b/addons/project/kateprojectinfoviewcodeanalysis.cpp --- a/addons/project/kateprojectinfoviewcodeanalysis.cpp +++ b/addons/project/kateprojectinfoviewcodeanalysis.cpp @@ -23,9 +23,10 @@ #include "kateprojectcodeanalysistool.h" #include "tools/kateprojectcodeanalysisselector.h" -#include -#include #include +#include +#include +#include #include #include @@ -63,22 +64,34 @@ m_treeView->sortByColumn(2, Qt::AscendingOrder); /** - * attach model to code analysis selector + * Connect selection change callback + * and attach model to code analysis selector */ + connect(m_toolSelector, static_cast(&QComboBox::currentIndexChanged), + this, &KateProjectInfoViewCodeAnalysis::slotToolSelectionChanged); m_toolSelector->setModel(KateProjectCodeAnalysisSelector::model(this)); /** * layout widget */ QVBoxLayout *layout = new QVBoxLayout; layout->setSpacing(0); - layout->addWidget(m_treeView); + // top: selector and buttons... QHBoxLayout *hlayout = new QHBoxLayout; layout->addLayout(hlayout); hlayout->setSpacing(0); - hlayout->addStretch(); hlayout->addWidget(m_toolSelector); + auto infoButton = new QPushButton(QIcon::fromTheme(QStringLiteral("documentinfo")), QString(), this); + infoButton->setFocusPolicy(Qt::FocusPolicy::TabFocus); + connect(infoButton, &QPushButton::clicked, this, + [this]() { + QToolTip::showText(QCursor::pos(), m_toolInfoText); + }); + hlayout->addWidget(infoButton); hlayout->addWidget(m_startStopAnalysis); + hlayout->addStretch(); + // below: result list... + layout->addWidget(m_treeView); setLayout(layout); /** @@ -92,6 +105,13 @@ { } +void KateProjectInfoViewCodeAnalysis::slotToolSelectionChanged(int) +{ + m_analysisTool = m_toolSelector->currentData(Qt::UserRole + 1).value(); + m_toolInfoText = i18n("The selected tool will be run on all project files which match this list of file extensions:
%1", + m_analysisTool->fileExtensions()); +} + void KateProjectInfoViewCodeAnalysis::slotStartStopClicked() { /** @@ -128,7 +148,7 @@ m_messageWidget->setMessageType(KMessageWidget::Warning); m_messageWidget->setWordWrap(false); m_messageWidget->setText(m_analysisTool->notInstalledMessage()); - static_cast(layout())->insertWidget(0, m_messageWidget); + static_cast(layout())->addWidget(m_messageWidget); m_messageWidget->animatedShow(); return; } @@ -223,6 +243,6 @@ m_messageWidget->setMessageType(KMessageWidget::Warning); m_messageWidget->setText(i18n("Analysis failed!")); } - static_cast(layout ())->insertWidget(0, m_messageWidget); + static_cast(layout ())->addWidget(m_messageWidget); m_messageWidget->animatedShow (); } diff --git a/addons/project/tools/kateprojectcodeanalysistoolcppcheck.h b/addons/project/tools/kateprojectcodeanalysistoolcppcheck.h --- a/addons/project/tools/kateprojectcodeanalysistoolcppcheck.h +++ b/addons/project/tools/kateprojectcodeanalysistoolcppcheck.h @@ -35,6 +35,8 @@ virtual QString name() override; + virtual QString fileExtensions() override; + virtual QStringList filter(const QStringList &files) override; virtual QString path() override; diff --git a/addons/project/tools/kateprojectcodeanalysistoolcppcheck.cpp b/addons/project/tools/kateprojectcodeanalysistoolcppcheck.cpp --- a/addons/project/tools/kateprojectcodeanalysistoolcppcheck.cpp +++ b/addons/project/tools/kateprojectcodeanalysistoolcppcheck.cpp @@ -39,10 +39,17 @@ return i18n("cppcheck"); } +QString KateProjectCodeAnalysisToolCppcheck::fileExtensions() +{ + return QStringLiteral("cpp|cxx|cc|c++|c|tpp|txx"); +} + QStringList KateProjectCodeAnalysisToolCppcheck::filter(const QStringList &files) { // c++ files - return files.filter(QRegularExpression(QStringLiteral("\\.(cpp|cxx|cc|c\\+\\+|c|tpp|txx)$"))); + return files.filter(QRegularExpression(QStringLiteral("\\.(") + + fileExtensions().replace(QStringLiteral("+"), QStringLiteral("\\+")) + + QStringLiteral(")$"))); } QString KateProjectCodeAnalysisToolCppcheck::path() diff --git a/addons/project/tools/kateprojectcodeanalysistoolflake8.h b/addons/project/tools/kateprojectcodeanalysistoolflake8.h --- a/addons/project/tools/kateprojectcodeanalysistoolflake8.h +++ b/addons/project/tools/kateprojectcodeanalysistoolflake8.h @@ -35,6 +35,8 @@ virtual QString name() override; + virtual QString fileExtensions() override; + virtual QStringList filter(const QStringList &files) override; virtual QString path() override; diff --git a/addons/project/tools/kateprojectcodeanalysistoolflake8.cpp b/addons/project/tools/kateprojectcodeanalysistoolflake8.cpp --- a/addons/project/tools/kateprojectcodeanalysistoolflake8.cpp +++ b/addons/project/tools/kateprojectcodeanalysistoolflake8.cpp @@ -39,10 +39,15 @@ return i18n("flake8"); } +QString KateProjectCodeAnalysisToolFlake8::fileExtensions() +{ + return QStringLiteral("py"); +} + QStringList KateProjectCodeAnalysisToolFlake8::filter(const QStringList &files) { // for now we expect files with extension - return files.filter(QRegularExpression(QStringLiteral("\\.py$"))); + return files.filter(QRegularExpression(QStringLiteral("\\.(") + fileExtensions() + QStringLiteral(")$"))); } QString KateProjectCodeAnalysisToolFlake8::path()