Fixed #1459 (GUI: Allow re-checking selected files/folders)

This commit is contained in:
Akhilesh Nema 2015-12-23 10:28:07 +01:00 committed by Daniel Marjamäki
parent 3f386af21c
commit bedd85fa50
8 changed files with 166 additions and 28 deletions

View File

@ -62,9 +62,8 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) :
mExiting(false) mExiting(false)
{ {
mUI.setupUi(this); mUI.setupUi(this);
mUI.mResults->Initialize(mSettings, mApplications);
mThread = new ThreadHandler(this); mThread = new ThreadHandler(this);
mUI.mResults->Initialize(mSettings, mApplications, mThread);
// Filter timer to delay filtering results slightly while typing // Filter timer to delay filtering results slightly while typing
mFilterTimer = new QTimer(this); mFilterTimer = new QTimer(this);
@ -122,6 +121,7 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) :
connect(mThread, SIGNAL(Done()), this, SLOT(CheckDone())); connect(mThread, SIGNAL(Done()), this, SLOT(CheckDone()));
connect(mUI.mResults, SIGNAL(GotResults()), this, SLOT(ResultsAdded())); connect(mUI.mResults, SIGNAL(GotResults()), this, SLOT(ResultsAdded()));
connect(mUI.mResults, SIGNAL(ResultsHidden(bool)), mUI.mActionShowHidden, SLOT(setEnabled(bool))); connect(mUI.mResults, SIGNAL(ResultsHidden(bool)), mUI.mActionShowHidden, SLOT(setEnabled(bool)));
connect(mUI.mResults, SIGNAL(CheckSelected(QStringList)), this, SLOT(PerformSelectedFilesCheck(QStringList)));
connect(mUI.mMenuView, SIGNAL(aboutToShow()), this, SLOT(AboutToShowViewMenu())); connect(mUI.mMenuView, SIGNAL(aboutToShow()), this, SLOT(AboutToShowViewMenu()));
// File menu // File menu
@ -388,7 +388,8 @@ void MainWindow::DoCheckFiles(const QStringList &files)
if (mProject) if (mProject)
qDebug() << "Checking project file" << mProject->GetProjectFile()->GetFilename(); qDebug() << "Checking project file" << mProject->GetProjectFile()->GetFilename();
mThread->Check(checkSettings, false); mThread->SetCheckFiles(true);
mThread->Check(checkSettings, true);
} }
void MainWindow::CheckCode(const QString& code, const QString& filename) void MainWindow::CheckCode(const QString& code, const QString& filename)
@ -797,6 +798,29 @@ void MainWindow::ReCheckAll()
ReCheck(true); ReCheck(true);
} }
void MainWindow::ReCheckSelected(QStringList files, bool all)
{
if (files.empty())
return;
if(mThread->IsChecking())
return;
// Clear details, statistics and progress
mUI.mResults->Clear(false);
for (int i = 0; i < files.size(); ++i)
mUI.mResults->Clear(files[i]);
CheckLockDownUI(); // lock UI while checking
mUI.mResults->CheckingStarted(files.size());
mThread->SetCheckFiles(files);
// Saving last check start time, otherwise unchecked modified files will not be
// considered in "Modified Files Check" performed after "Selected Files Check"
// TODO: Should we store per file CheckStartTime?
QDateTime saveCheckStartTime = mThread->GetCheckStartTime();
mThread->Check(GetCppcheckSettings(), all);
mThread->SetCheckStartTime(saveCheckStartTime);
}
void MainWindow::ReCheck(bool all) void MainWindow::ReCheck(bool all)
{ {
const QStringList files = mThread->GetReCheckFiles(all); const QStringList files = mThread->GetReCheckFiles(all);
@ -816,7 +840,8 @@ void MainWindow::ReCheck(bool all)
if (mProject) if (mProject)
qDebug() << "Rechecking project file" << mProject->GetProjectFile()->GetFilename(); qDebug() << "Rechecking project file" << mProject->GetProjectFile()->GetFilename();
mThread->Check(GetCppcheckSettings(), !all); mThread->SetCheckFiles(all);
mThread->Check(GetCppcheckSettings(), all);
} }
void MainWindow::ClearResults() void MainWindow::ClearResults()
@ -993,6 +1018,11 @@ void MainWindow::ShowAuthors()
dlg->exec(); dlg->exec();
} }
void MainWindow::PerformSelectedFilesCheck(QStringList selectedFilesList)
{
ReCheckSelected(selectedFilesList, true);
}
void MainWindow::Save() void MainWindow::Save()
{ {
QString selectedFilter; QString selectedFilter;

View File

@ -84,6 +84,12 @@ public slots:
*/ */
void ReCheckAll(); void ReCheckAll();
/**
* @brief Slot to recheck selected files
* @param selectedFilesList list of selected files
*/
void PerformSelectedFilesCheck(QStringList selectedFilesList);
/** /**
* @brief Slot to recheck modified files * @brief Slot to recheck modified files
* *
@ -319,6 +325,13 @@ private:
*/ */
void ReCheck(bool all); void ReCheck(bool all);
/**
* @brief Recheck selected files
* @param files list of selected files
* @param all true if all files of list, false if modified files of list
*/
void ReCheckSelected(QStringList files, bool all);
/** /**
* @brief Check the project. * @brief Check the project.
* @param project Pointer to the project to check. * @param project Pointer to the project to check.

View File

@ -45,6 +45,7 @@
#include "report.h" #include "report.h"
#include "application.h" #include "application.h"
#include "showtypes.h" #include "showtypes.h"
#include "threadhandler.h"
ResultsTree::ResultsTree(QWidget * parent) : ResultsTree::ResultsTree(QWidget * parent) :
QTreeView(parent), QTreeView(parent),
@ -74,10 +75,11 @@ void ResultsTree::keyPressEvent(QKeyEvent *event)
QTreeView::keyPressEvent(event); QTreeView::keyPressEvent(event);
} }
void ResultsTree::Initialize(QSettings *settings, ApplicationList *list) void ResultsTree::Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler)
{ {
mSettings = settings; mSettings = settings;
mApplications = list; mApplications = list;
mThread = checkThreadHandler;
LoadSettings(); LoadSettings();
} }
@ -552,6 +554,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
} }
//Create an action for the application //Create an action for the application
QAction *recheckSelectedFiles = new QAction(tr("Recheck"), &menu);
QAction *copyfilename = new QAction(tr("Copy filename"), &menu); QAction *copyfilename = new QAction(tr("Copy filename"), &menu);
QAction *copypath = new QAction(tr("Copy full path"), &menu); QAction *copypath = new QAction(tr("Copy full path"), &menu);
QAction *copymessage = new QAction(tr("Copy message"), &menu); QAction *copymessage = new QAction(tr("Copy message"), &menu);
@ -568,7 +571,12 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
hideallid->setDisabled(true); hideallid->setDisabled(true);
opencontainingfolder->setDisabled(true); opencontainingfolder->setDisabled(true);
} }
if(mThread->IsChecking())
recheckSelectedFiles->setDisabled(true);
else
recheckSelectedFiles->setDisabled(false);
menu.addAction(recheckSelectedFiles);
menu.addAction(copyfilename); menu.addAction(copyfilename);
menu.addAction(copypath); menu.addAction(copypath);
menu.addAction(copymessage); menu.addAction(copymessage);
@ -577,6 +585,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
menu.addAction(hideallid); menu.addAction(hideallid);
menu.addAction(opencontainingfolder); menu.addAction(opencontainingfolder);
connect(recheckSelectedFiles, SIGNAL(triggered()), this, SLOT(RecheckSelectedFiles()));
connect(copyfilename, SIGNAL(triggered()), this, SLOT(CopyFilename())); connect(copyfilename, SIGNAL(triggered()), this, SLOT(CopyFilename()));
connect(copypath, SIGNAL(triggered()), this, SLOT(CopyFullPath())); connect(copypath, SIGNAL(triggered()), this, SLOT(CopyFullPath()));
connect(copymessage, SIGNAL(triggered()), this, SLOT(CopyMessage())); connect(copymessage, SIGNAL(triggered()), this, SLOT(CopyMessage()));
@ -588,20 +597,22 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
//Start the menu //Start the menu
menu.exec(e->globalPos()); menu.exec(e->globalPos());
index = indexAt(e->pos());
if (index.isValid()) {
mContextItem = mModel.itemFromIndex(index);
if (mContextItem && mApplications->GetApplicationCount() > 0 && mContextItem->parent()) {
//Disconnect all signals
for (int i = 0; i < actions.size(); i++) {
if (mContextItem && mApplications->GetApplicationCount() > 0 && mContextItem->parent()) { disconnect(actions[i], SIGNAL(triggered()), signalMapper, SLOT(map()));
//Disconnect all signals }
for (int i = 0; i < actions.size(); i++) {
disconnect(actions[i], SIGNAL(triggered()), signalMapper, SLOT(map())); disconnect(signalMapper, SIGNAL(mapped(int)),
this, SLOT(Context(int)));
//And remove the signal mapper
delete signalMapper;
} }
disconnect(signalMapper, SIGNAL(mapped(int)),
this, SLOT(Context(int)));
//And remove the signal mapper
delete signalMapper;
} }
} }
} }
@ -781,8 +792,7 @@ void ResultsTree::HideResult()
return; return;
QModelIndexList selectedRows = mSelectionModel->selectedRows(); QModelIndexList selectedRows = mSelectionModel->selectedRows();
QModelIndex index; foreach (QModelIndex index, selectedRows) {
foreach (index, selectedRows) {
QStandardItem *item = mModel.itemFromIndex(index); QStandardItem *item = mModel.itemFromIndex(index);
//Set the "hide" flag for this item //Set the "hide" flag for this item
QVariantMap data = item->data().toMap(); QVariantMap data = item->data().toMap();
@ -794,6 +804,21 @@ void ResultsTree::HideResult()
} }
} }
void ResultsTree::RecheckSelectedFiles()
{
if (!mSelectionModel)
return;
QModelIndexList selectedRows = mSelectionModel->selectedRows();
QStringList selectedItems;
foreach (QModelIndex index, selectedRows) {
QStandardItem *item = mModel.itemFromIndex(index);
QVariantMap data = item->data().toMap();
selectedItems<<data["file"].toString();
}
emit CheckSelected(selectedItems);
}
void ResultsTree::HideAllIdResult() void ResultsTree::HideAllIdResult()
{ {
if (mContextItem && mContextItem->parent()) { if (mContextItem && mContextItem->parent()) {

View File

@ -35,6 +35,7 @@ class ErrorLine;
class QModelIndex; class QModelIndex;
class QWidget; class QWidget;
class QItemSelectionModel; class QItemSelectionModel;
class ThreadHandler;
/// @addtogroup GUI /// @addtogroup GUI
/// @{ /// @{
@ -49,7 +50,7 @@ class ResultsTree : public QTreeView {
public: public:
explicit ResultsTree(QWidget * parent = 0); explicit ResultsTree(QWidget * parent = 0);
virtual ~ResultsTree(); virtual ~ResultsTree();
void Initialize(QSettings *settings, ApplicationList *list); void Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler);
/** /**
* @brief Add a new item to the tree * @brief Add a new item to the tree
@ -172,6 +173,13 @@ signals:
*/ */
void ResultsHidden(bool hidden); void ResultsHidden(bool hidden);
/**
* @brief Signal to perform selected files recheck
*
* @param selectedItems list of selected files
*/
void CheckSelected(QStringList selectedItems);
/** /**
* @brief Signal for selection change in result tree. * @brief Signal for selection change in result tree.
* *
@ -224,6 +232,12 @@ protected slots:
*/ */
void HideResult(); void HideResult();
/**
* @brief Slot for rechecking selected files
*
*/
void RecheckSelectedFiles();
/** /**
* @brief Slot for context menu item to hide all messages with the current message Id * @brief Slot for context menu item to hide all messages with the current message Id
* *
@ -472,6 +486,7 @@ protected:
private: private:
QItemSelectionModel *mSelectionModel; QItemSelectionModel *mSelectionModel;
ThreadHandler *mThread;
}; };
/// @} /// @}
#endif // RESULTSTREE_H #endif // RESULTSTREE_H

View File

@ -49,10 +49,11 @@ ResultsView::ResultsView(QWidget * parent) :
mUI.setupUi(this); mUI.setupUi(this);
connect(mUI.mTree, SIGNAL(ResultsHidden(bool)), this, SIGNAL(ResultsHidden(bool))); connect(mUI.mTree, SIGNAL(ResultsHidden(bool)), this, SIGNAL(ResultsHidden(bool)));
connect(mUI.mTree, SIGNAL(CheckSelected(QStringList)), this, SIGNAL(CheckSelected(QStringList)));
connect(mUI.mTree, SIGNAL(SelectionChanged(const QModelIndex &)), this, SLOT(UpdateDetails(const QModelIndex &))); connect(mUI.mTree, SIGNAL(SelectionChanged(const QModelIndex &)), this, SLOT(UpdateDetails(const QModelIndex &)));
} }
void ResultsView::Initialize(QSettings *settings, ApplicationList *list) void ResultsView::Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler)
{ {
mUI.mProgress->setMinimum(0); mUI.mProgress->setMinimum(0);
mUI.mProgress->setVisible(false); mUI.mProgress->setVisible(false);
@ -61,7 +62,7 @@ void ResultsView::Initialize(QSettings *settings, ApplicationList *list)
mUI.mVerticalSplitter->restoreState(state); mUI.mVerticalSplitter->restoreState(state);
mShowNoErrorsMessage = settings->value(SETTINGS_SHOW_NO_ERRORS, true).toBool(); mShowNoErrorsMessage = settings->value(SETTINGS_SHOW_NO_ERRORS, true).toBool();
mUI.mTree->Initialize(settings, list); mUI.mTree->Initialize(settings, list, checkThreadHandler);
} }
ResultsView::~ResultsView() ResultsView::~ResultsView()

View File

@ -45,7 +45,7 @@ class ResultsView : public QWidget {
public: public:
explicit ResultsView(QWidget * parent = 0); explicit ResultsView(QWidget * parent = 0);
void Initialize(QSettings *settings, ApplicationList *list); void Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler);
virtual ~ResultsView(); virtual ~ResultsView();
/** /**
@ -181,6 +181,13 @@ signals:
*/ */
void ResultsHidden(bool hidden); void ResultsHidden(bool hidden);
/**
* @brief Signal to perform recheck of selected files
*
* @param selectedFilesList list of selected files
*/
void CheckSelected(QStringList selectedFilesList);
public slots: public slots:
/** /**

View File

@ -51,13 +51,22 @@ void ThreadHandler::SetFiles(const QStringList &files)
mLastFiles = files; mLastFiles = files;
} }
void ThreadHandler::Check(const Settings &settings, bool recheck) void ThreadHandler::SetCheckFiles(bool all)
{ {
if (recheck && mRunningThreadCount == 0) { if (mRunningThreadCount == 0) {
// only recheck changed files mResults.SetFiles(GetReCheckFiles(all));
mResults.SetFiles(GetReCheckFiles(false));
} }
}
void ThreadHandler::SetCheckFiles(QStringList files)
{
if (mRunningThreadCount == 0) {
mResults.SetFiles(files);
}
}
void ThreadHandler::Check(const Settings &settings, bool all)
{
if (mResults.GetFileCount() == 0 || mRunningThreadCount > 0 || settings._jobs == 0) { if (mResults.GetFileCount() == 0 || mRunningThreadCount > 0 || settings._jobs == 0) {
qDebug() << "Can't start checking if there's no files to check or if check is in progress."; qDebug() << "Can't start checking if there's no files to check or if check is in progress.";
emit Done(); emit Done();
@ -190,7 +199,7 @@ int ThreadHandler::GetPreviousScanDuration() const
QStringList ThreadHandler::GetReCheckFiles(bool all) const QStringList ThreadHandler::GetReCheckFiles(bool all) const
{ {
if (mLastCheckTime.isNull()) if (mLastCheckTime.isNull() || all)
return mLastFiles; return mLastFiles;
std::set<QString> modified; std::set<QString> modified;
@ -243,3 +252,13 @@ bool ThreadHandler::NeedsReCheck(const QString &filename, std::set<QString> &mod
return false; return false;
} }
QDateTime ThreadHandler::GetCheckStartTime() const
{
return mCheckStartTime;
}
void ThreadHandler::SetCheckStartTime(QDateTime checkStartTime)
{
mCheckStartTime = checkStartTime;
}

View File

@ -87,9 +87,23 @@ public:
* @brief Start the threads to check the files * @brief Start the threads to check the files
* *
* @param settings Settings for checking * @param settings Settings for checking
* @param recheck Should we reuse the files we checked earlier * @param all true if all files, false if modified files
*/ */
void Check(const Settings &settings, bool recheck); void Check(const Settings &settings, bool all);
/**
* @brief Set files to check
*
* @param all true if all files, false if modified files
*/
void SetCheckFiles(bool all);
/**
* @brief Set selected files to check
*
* @param files list of files to be checked
*/
void SetCheckFiles(QStringList files);
/** /**
* @brief Is checking running? * @brief Is checking running?
@ -125,6 +139,20 @@ public:
*/ */
QStringList GetReCheckFiles(bool all) const; QStringList GetReCheckFiles(bool all) const;
/**
* @brief Get start time of last check
*
* @return start time of last check
*/
QDateTime GetCheckStartTime() const;
/**
* @brief Set start time of check
*
* @param checkStartTime saved start time of the last check
*/
void SetCheckStartTime(QDateTime checkStartTime);
signals: signals:
/** /**
* @brief Signal that all threads are done * @brief Signal that all threads are done