Fixed #1459 (GUI: Allow re-checking selected files/folders)
This commit is contained in:
parent
3f386af21c
commit
bedd85fa50
|
@ -62,9 +62,8 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) :
|
|||
mExiting(false)
|
||||
{
|
||||
mUI.setupUi(this);
|
||||
mUI.mResults->Initialize(mSettings, mApplications);
|
||||
|
||||
mThread = new ThreadHandler(this);
|
||||
mUI.mResults->Initialize(mSettings, mApplications, mThread);
|
||||
|
||||
// Filter timer to delay filtering results slightly while typing
|
||||
mFilterTimer = new QTimer(this);
|
||||
|
@ -122,6 +121,7 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) :
|
|||
connect(mThread, SIGNAL(Done()), this, SLOT(CheckDone()));
|
||||
connect(mUI.mResults, SIGNAL(GotResults()), this, SLOT(ResultsAdded()));
|
||||
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()));
|
||||
|
||||
// File menu
|
||||
|
@ -388,7 +388,8 @@ void MainWindow::DoCheckFiles(const QStringList &files)
|
|||
if (mProject)
|
||||
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)
|
||||
|
@ -797,6 +798,29 @@ void MainWindow::ReCheckAll()
|
|||
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)
|
||||
{
|
||||
const QStringList files = mThread->GetReCheckFiles(all);
|
||||
|
@ -816,7 +840,8 @@ void MainWindow::ReCheck(bool all)
|
|||
if (mProject)
|
||||
qDebug() << "Rechecking project file" << mProject->GetProjectFile()->GetFilename();
|
||||
|
||||
mThread->Check(GetCppcheckSettings(), !all);
|
||||
mThread->SetCheckFiles(all);
|
||||
mThread->Check(GetCppcheckSettings(), all);
|
||||
}
|
||||
|
||||
void MainWindow::ClearResults()
|
||||
|
@ -993,6 +1018,11 @@ void MainWindow::ShowAuthors()
|
|||
dlg->exec();
|
||||
}
|
||||
|
||||
void MainWindow::PerformSelectedFilesCheck(QStringList selectedFilesList)
|
||||
{
|
||||
ReCheckSelected(selectedFilesList, true);
|
||||
}
|
||||
|
||||
void MainWindow::Save()
|
||||
{
|
||||
QString selectedFilter;
|
||||
|
|
|
@ -84,6 +84,12 @@ public slots:
|
|||
*/
|
||||
void ReCheckAll();
|
||||
|
||||
/**
|
||||
* @brief Slot to recheck selected files
|
||||
* @param selectedFilesList list of selected files
|
||||
*/
|
||||
void PerformSelectedFilesCheck(QStringList selectedFilesList);
|
||||
|
||||
/**
|
||||
* @brief Slot to recheck modified files
|
||||
*
|
||||
|
@ -319,6 +325,13 @@ private:
|
|||
*/
|
||||
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.
|
||||
* @param project Pointer to the project to check.
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include "report.h"
|
||||
#include "application.h"
|
||||
#include "showtypes.h"
|
||||
#include "threadhandler.h"
|
||||
|
||||
ResultsTree::ResultsTree(QWidget * parent) :
|
||||
QTreeView(parent),
|
||||
|
@ -74,10 +75,11 @@ void ResultsTree::keyPressEvent(QKeyEvent *event)
|
|||
QTreeView::keyPressEvent(event);
|
||||
}
|
||||
|
||||
void ResultsTree::Initialize(QSettings *settings, ApplicationList *list)
|
||||
void ResultsTree::Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler)
|
||||
{
|
||||
mSettings = settings;
|
||||
mApplications = list;
|
||||
mThread = checkThreadHandler;
|
||||
LoadSettings();
|
||||
}
|
||||
|
||||
|
@ -552,6 +554,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
|
|||
}
|
||||
|
||||
//Create an action for the application
|
||||
QAction *recheckSelectedFiles = new QAction(tr("Recheck"), &menu);
|
||||
QAction *copyfilename = new QAction(tr("Copy filename"), &menu);
|
||||
QAction *copypath = new QAction(tr("Copy full path"), &menu);
|
||||
QAction *copymessage = new QAction(tr("Copy message"), &menu);
|
||||
|
@ -568,7 +571,12 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
|
|||
hideallid->setDisabled(true);
|
||||
opencontainingfolder->setDisabled(true);
|
||||
}
|
||||
if(mThread->IsChecking())
|
||||
recheckSelectedFiles->setDisabled(true);
|
||||
else
|
||||
recheckSelectedFiles->setDisabled(false);
|
||||
|
||||
menu.addAction(recheckSelectedFiles);
|
||||
menu.addAction(copyfilename);
|
||||
menu.addAction(copypath);
|
||||
menu.addAction(copymessage);
|
||||
|
@ -577,6 +585,7 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
|
|||
menu.addAction(hideallid);
|
||||
menu.addAction(opencontainingfolder);
|
||||
|
||||
connect(recheckSelectedFiles, SIGNAL(triggered()), this, SLOT(RecheckSelectedFiles()));
|
||||
connect(copyfilename, SIGNAL(triggered()), this, SLOT(CopyFilename()));
|
||||
connect(copypath, SIGNAL(triggered()), this, SLOT(CopyFullPath()));
|
||||
connect(copymessage, SIGNAL(triggered()), this, SLOT(CopyMessage()));
|
||||
|
@ -588,20 +597,22 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e)
|
|||
|
||||
//Start the menu
|
||||
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 all signals
|
||||
for (int i = 0; i < actions.size(); i++) {
|
||||
disconnect(actions[i], SIGNAL(triggered()), signalMapper, SLOT(map()));
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
QModelIndexList selectedRows = mSelectionModel->selectedRows();
|
||||
QModelIndex index;
|
||||
foreach (index, selectedRows) {
|
||||
foreach (QModelIndex index, selectedRows) {
|
||||
QStandardItem *item = mModel.itemFromIndex(index);
|
||||
//Set the "hide" flag for this item
|
||||
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()
|
||||
{
|
||||
if (mContextItem && mContextItem->parent()) {
|
||||
|
|
|
@ -35,6 +35,7 @@ class ErrorLine;
|
|||
class QModelIndex;
|
||||
class QWidget;
|
||||
class QItemSelectionModel;
|
||||
class ThreadHandler;
|
||||
|
||||
/// @addtogroup GUI
|
||||
/// @{
|
||||
|
@ -49,7 +50,7 @@ class ResultsTree : public QTreeView {
|
|||
public:
|
||||
explicit ResultsTree(QWidget * parent = 0);
|
||||
virtual ~ResultsTree();
|
||||
void Initialize(QSettings *settings, ApplicationList *list);
|
||||
void Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler);
|
||||
|
||||
/**
|
||||
* @brief Add a new item to the tree
|
||||
|
@ -172,6 +173,13 @@ signals:
|
|||
*/
|
||||
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.
|
||||
*
|
||||
|
@ -224,6 +232,12 @@ protected slots:
|
|||
*/
|
||||
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
|
||||
*
|
||||
|
@ -472,6 +486,7 @@ protected:
|
|||
|
||||
private:
|
||||
QItemSelectionModel *mSelectionModel;
|
||||
ThreadHandler *mThread;
|
||||
};
|
||||
/// @}
|
||||
#endif // RESULTSTREE_H
|
||||
|
|
|
@ -49,10 +49,11 @@ ResultsView::ResultsView(QWidget * parent) :
|
|||
mUI.setupUi(this);
|
||||
|
||||
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 &)));
|
||||
}
|
||||
|
||||
void ResultsView::Initialize(QSettings *settings, ApplicationList *list)
|
||||
void ResultsView::Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler)
|
||||
{
|
||||
mUI.mProgress->setMinimum(0);
|
||||
mUI.mProgress->setVisible(false);
|
||||
|
@ -61,7 +62,7 @@ void ResultsView::Initialize(QSettings *settings, ApplicationList *list)
|
|||
mUI.mVerticalSplitter->restoreState(state);
|
||||
mShowNoErrorsMessage = settings->value(SETTINGS_SHOW_NO_ERRORS, true).toBool();
|
||||
|
||||
mUI.mTree->Initialize(settings, list);
|
||||
mUI.mTree->Initialize(settings, list, checkThreadHandler);
|
||||
}
|
||||
|
||||
ResultsView::~ResultsView()
|
||||
|
|
|
@ -45,7 +45,7 @@ class ResultsView : public QWidget {
|
|||
public:
|
||||
|
||||
explicit ResultsView(QWidget * parent = 0);
|
||||
void Initialize(QSettings *settings, ApplicationList *list);
|
||||
void Initialize(QSettings *settings, ApplicationList *list, ThreadHandler *checkThreadHandler);
|
||||
virtual ~ResultsView();
|
||||
|
||||
/**
|
||||
|
@ -181,6 +181,13 @@ signals:
|
|||
*/
|
||||
void ResultsHidden(bool hidden);
|
||||
|
||||
/**
|
||||
* @brief Signal to perform recheck of selected files
|
||||
*
|
||||
* @param selectedFilesList list of selected files
|
||||
*/
|
||||
void CheckSelected(QStringList selectedFilesList);
|
||||
|
||||
public slots:
|
||||
|
||||
/**
|
||||
|
|
|
@ -51,13 +51,22 @@ void ThreadHandler::SetFiles(const QStringList &files)
|
|||
mLastFiles = files;
|
||||
}
|
||||
|
||||
void ThreadHandler::Check(const Settings &settings, bool recheck)
|
||||
void ThreadHandler::SetCheckFiles(bool all)
|
||||
{
|
||||
if (recheck && mRunningThreadCount == 0) {
|
||||
// only recheck changed files
|
||||
mResults.SetFiles(GetReCheckFiles(false));
|
||||
if (mRunningThreadCount == 0) {
|
||||
mResults.SetFiles(GetReCheckFiles(all));
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
qDebug() << "Can't start checking if there's no files to check or if check is in progress.";
|
||||
emit Done();
|
||||
|
@ -190,7 +199,7 @@ int ThreadHandler::GetPreviousScanDuration() const
|
|||
|
||||
QStringList ThreadHandler::GetReCheckFiles(bool all) const
|
||||
{
|
||||
if (mLastCheckTime.isNull())
|
||||
if (mLastCheckTime.isNull() || all)
|
||||
return mLastFiles;
|
||||
|
||||
std::set<QString> modified;
|
||||
|
@ -243,3 +252,13 @@ bool ThreadHandler::NeedsReCheck(const QString &filename, std::set<QString> &mod
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
QDateTime ThreadHandler::GetCheckStartTime() const
|
||||
{
|
||||
return mCheckStartTime;
|
||||
}
|
||||
|
||||
void ThreadHandler::SetCheckStartTime(QDateTime checkStartTime)
|
||||
{
|
||||
mCheckStartTime = checkStartTime;
|
||||
}
|
||||
|
|
|
@ -87,9 +87,23 @@ public:
|
|||
* @brief Start the threads to check the files
|
||||
*
|
||||
* @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?
|
||||
|
@ -125,6 +139,20 @@ public:
|
|||
*/
|
||||
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:
|
||||
/**
|
||||
* @brief Signal that all threads are done
|
||||
|
|
Loading…
Reference in New Issue