Added long operation termination button on status bar
More robust process termination Folded the Abort shortcut into a QAction FossilOrigin-Name: ea4b656b8237af73b81e6b22fd4c451a51450d2d
This commit is contained in:
@@ -846,7 +846,6 @@ bool Fossil::runFossilRaw(const QStringList &args, QStringList *output, int *exi
|
||||
|
||||
if(uiCallback->processAborted())
|
||||
{
|
||||
log("\n* "+QObject::tr("Terminated")+" *\n");
|
||||
#ifdef Q_OS_WIN // Verify this is still true on Qt5
|
||||
process.kill(); // QT on windows cannot terminate console processes with QProcess::terminate
|
||||
#else
|
||||
@@ -891,7 +890,7 @@ bool Fossil::runFossilRaw(const QStringList &args, QStringList *output, int *exi
|
||||
// qDebug() << "Breakpoint\n";
|
||||
#endif
|
||||
|
||||
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||
QCoreApplication::processEvents(QEventLoop::AllEvents, 500); // 500 ms
|
||||
|
||||
if(buffer.isEmpty())
|
||||
continue;
|
||||
@@ -1048,11 +1047,12 @@ bool Fossil::runFossilRaw(const QStringList &args, QStringList *output, int *exi
|
||||
delete decoder;
|
||||
|
||||
// Must be finished by now
|
||||
process.waitForFinished(5000); // Wait for termination 5 secs maximum
|
||||
Q_ASSERT(process.state()==QProcess::NotRunning);
|
||||
|
||||
QProcess::ExitStatus es = process.exitStatus();
|
||||
|
||||
if(es!=QProcess::NormalExit)
|
||||
if(es!=QProcess::NormalExit || uiCallback->processAborted())
|
||||
return false;
|
||||
|
||||
if(exitCode)
|
||||
|
@@ -106,6 +106,7 @@ private:
|
||||
void setRepositoryFile(const QString &filename) { repositoryFile = filename; }
|
||||
bool runFossil(const QStringList &args, QStringList *output=0, int runFlags=RUNFLAGS_NONE);
|
||||
bool runFossilRaw(const QStringList &args, QStringList *output, int *exitCode, int runFlags);
|
||||
QString getFossilPath();
|
||||
|
||||
void log(const QString &text, bool isHTML=false)
|
||||
{
|
||||
@@ -113,8 +114,6 @@ private:
|
||||
uiCallback->logText(text, isHTML);
|
||||
}
|
||||
|
||||
QString getFossilPath();
|
||||
|
||||
UICallback *uiCallback;
|
||||
QString workspacePath;
|
||||
QString fossilPath; // The value from the settings
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#include <QInputDialog>
|
||||
#include <QMimeData>
|
||||
#include <QProgressBar>
|
||||
#include <QToolButton>
|
||||
#include <QLabel>
|
||||
#include <QSettings>
|
||||
#include <QShortcut>
|
||||
@@ -246,7 +247,7 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP
|
||||
ui->statusBar->insertPermanentWidget(0, lblTags);
|
||||
lblTags->setVisible(true);
|
||||
|
||||
// Construct ProgressBar
|
||||
// Create Progress Bar
|
||||
progressBar = new QProgressBar();
|
||||
progressBar->setMinimum(0);
|
||||
progressBar->setMaximum(0);
|
||||
@@ -256,6 +257,16 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP
|
||||
ui->statusBar->insertPermanentWidget(1, progressBar);
|
||||
progressBar->setVisible(false);
|
||||
|
||||
// Create Abort Button
|
||||
abortButton = new QToolButton(ui->statusBar);
|
||||
abortButton->setAutoRaise(true);
|
||||
abortButton->setIcon(getCachedIcon(":/icons/icon-action-stop"));
|
||||
abortButton->setVisible(false);
|
||||
abortButton->setArrowType(Qt::NoArrow);
|
||||
abortButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
|
||||
abortButton->setDefaultAction(ui->actionAbortOperation);
|
||||
ui->statusBar->insertPermanentWidget(2, abortButton);
|
||||
ui->actionAbortOperation->setEnabled(false);
|
||||
|
||||
#ifdef Q_OS_MACX
|
||||
// Native applications on OSX don't have menu icons
|
||||
@@ -278,11 +289,6 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP
|
||||
ui->tabWidget->setDocumentMode(true);
|
||||
#endif
|
||||
|
||||
abortShortcut = new QShortcut(QKeySequence("Escape"), this);
|
||||
abortShortcut->setContext(Qt::ApplicationShortcut);
|
||||
abortShortcut->setEnabled(false);
|
||||
connect(abortShortcut, SIGNAL(activated()), this, SLOT(onAbort()));
|
||||
|
||||
// Searchbox
|
||||
// Add spacer to pad to right
|
||||
QWidget* spacer = new QWidget();
|
||||
@@ -736,8 +742,7 @@ bool MainWindow::scanWorkspace()
|
||||
ui->actionViewModified->isChecked(),
|
||||
ui->actionViewUnchanged->isChecked(),
|
||||
ignore_patterns,
|
||||
uiCallback,
|
||||
operationAborted
|
||||
uiCallback
|
||||
);
|
||||
|
||||
// Build default versions list
|
||||
@@ -2460,7 +2465,7 @@ void MainWindow::setBusy(bool busy)
|
||||
else
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
abortShortcut->setEnabled(busy);
|
||||
ui->actionAbortOperation->setEnabled(busy);
|
||||
bool enabled = !busy;
|
||||
ui->menuBar->setEnabled(enabled);
|
||||
ui->mainToolBar->setEnabled(enabled);
|
||||
@@ -2468,7 +2473,7 @@ void MainWindow::setBusy(bool busy)
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void MainWindow::onAbort()
|
||||
void MainWindow::on_actionAbortOperation_triggered()
|
||||
{
|
||||
operationAborted = true;
|
||||
uiCallback.abortProcess();
|
||||
@@ -2498,6 +2503,8 @@ void MainWindow::MainWinUICallback::beginProcess(const QString& text)
|
||||
mainWindow->ui->statusBar->showMessage(text);
|
||||
mainWindow->lblTags->setHidden(true);
|
||||
mainWindow->progressBar->setHidden(false);
|
||||
mainWindow->abortButton->setHidden(false);
|
||||
mainWindow->ui->actionAbortOperation->setEnabled(true);
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
|
||||
@@ -2516,6 +2523,8 @@ void MainWindow::MainWinUICallback::endProcess()
|
||||
mainWindow->ui->statusBar->clearMessage();
|
||||
mainWindow->lblTags->setHidden(false);
|
||||
mainWindow->progressBar->setHidden(true);
|
||||
mainWindow->abortButton->setHidden(true);
|
||||
mainWindow->ui->actionAbortOperation->setEnabled(false);
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
|
||||
|
@@ -75,7 +75,6 @@ private slots:
|
||||
void onOpenRecent();
|
||||
void onWorkspaceTreeViewSelectionChanged(const class QItemSelection &selected, const class QItemSelection &deselected);
|
||||
void onFileViewDragOut();
|
||||
void onAbort();
|
||||
void onSearchBoxTextChanged(const QString &text);
|
||||
void onSearch();
|
||||
void onCustomActionTriggered();
|
||||
@@ -135,6 +134,7 @@ private slots:
|
||||
void on_actionSetDefaultRemote_triggered();
|
||||
void on_actionAddRemote_triggered();
|
||||
void on_actionDeleteRemote_triggered();
|
||||
void on_actionAbortOperation_triggered();
|
||||
|
||||
private:
|
||||
class MainWinUICallback : public UICallback
|
||||
@@ -178,8 +178,8 @@ private:
|
||||
class QAction *fileActionSeparator;
|
||||
class QAction *workspaceActionSeparator;
|
||||
class QProgressBar *progressBar;
|
||||
class QToolButton *abortButton;
|
||||
class QLabel *lblTags;
|
||||
class QShortcut *abortShortcut;
|
||||
class SearchBox *searchBox;
|
||||
class QShortcut *searchShortcut;
|
||||
QMenu *menuWorkspace;
|
||||
|
@@ -120,7 +120,7 @@ bool Workspace::switchWorkspace(const QString& workspace, QSettings &store)
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
bool Workspace::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QStringList &ignorePatterns, const bool &abort, UICallback &uiCallback)
|
||||
bool Workspace::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QStringList &ignorePatterns, UICallback &uiCallback)
|
||||
{
|
||||
QDir dir(dirPath);
|
||||
|
||||
@@ -129,7 +129,7 @@ bool Workspace::scanDirectory(QFileInfoList &entries, const QString& dirPath, co
|
||||
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
|
||||
for (int i=0; i<list.count(); ++i)
|
||||
{
|
||||
if(abort)
|
||||
if(uiCallback.processAborted())
|
||||
return false;
|
||||
|
||||
QFileInfo info = list[i];
|
||||
@@ -143,7 +143,7 @@ bool Workspace::scanDirectory(QFileInfoList &entries, const QString& dirPath, co
|
||||
|
||||
if (info.isDir())
|
||||
{
|
||||
if(!scanDirectory(entries, filepath, baseDir, ignorePatterns, abort, uiCallback))
|
||||
if(!scanDirectory(entries, filepath, baseDir, ignorePatterns, uiCallback))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
@@ -159,7 +159,7 @@ static bool StringLengthDescending(const QString &l, const QString &r)
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QStringList &ignorePatterns, UICallback &uiCallback, bool &operationAborted)
|
||||
void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QStringList &ignorePatterns, UICallback &uiCallback)
|
||||
{
|
||||
// Scan all workspace files
|
||||
QFileInfoList all_files;
|
||||
@@ -179,8 +179,6 @@ void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModifie
|
||||
|
||||
QStringList paths;
|
||||
|
||||
operationAborted = false;
|
||||
|
||||
uiCallback.beginProcess("");
|
||||
if(scan_files)
|
||||
{
|
||||
@@ -190,7 +188,7 @@ void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModifie
|
||||
if(!scanIgnored)
|
||||
ignore = ignorePatterns;
|
||||
|
||||
if(!scanDirectory(all_files, wkdir, wkdir, ignore, operationAborted, uiCallback))
|
||||
if(!scanDirectory(all_files, wkdir, wkdir, ignore, uiCallback))
|
||||
goto _done;
|
||||
|
||||
for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it)
|
||||
|
@@ -134,7 +134,7 @@ public:
|
||||
|
||||
const QString & getPath() const { return fossil().getWorkspacePath(); }
|
||||
bool switchWorkspace(const QString &workspace, QSettings &store);
|
||||
void scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QStringList& ignorePatterns, UICallback &uiCallback, bool &operationAborted);
|
||||
void scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QStringList& ignorePatterns, UICallback &uiCallback);
|
||||
|
||||
QStandardItemModel &getFileModel() { return repoFileModel; }
|
||||
QStandardItemModel &getTreeModel() { return repoTreeModel; }
|
||||
@@ -160,7 +160,7 @@ public:
|
||||
|
||||
void storeWorkspace(QSettings &store);
|
||||
private:
|
||||
static bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QStringList& ignorePatterns, const bool& abort, UICallback &uiCallback);
|
||||
static bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QStringList& ignorePatterns, UICallback &uiCallback);
|
||||
|
||||
private:
|
||||
Fossil bridge;
|
||||
|
Reference in New Issue
Block a user