From be6b875dc6c2b943ddd70dd5be4ca971a2f0e8ac Mon Sep 17 00:00:00 2001 From: Kostas Date: Thu, 27 Aug 2015 14:30:44 +0000 Subject: [PATCH] Added long operation termination button on status bar More robust process termination Folded the Abort shortcut into a QAction FossilOrigin-Name: ea4b656b8237af73b81e6b22fd4c451a51450d2d --- doc/Changes.md | 1 + manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/Fossil.cpp | 6 +++--- src/Fossil.h | 3 +-- src/MainWindow.cpp | 29 +++++++++++++++++++---------- src/MainWindow.h | 4 ++-- src/Workspace.cpp | 12 +++++------- src/Workspace.h | 4 ++-- ui/MainWindow.ui | 17 ++++++++++++++++- 10 files changed, 63 insertions(+), 41 deletions(-) diff --git a/doc/Changes.md b/doc/Changes.md index cbee1db..e2829dd 100644 --- a/doc/Changes.md +++ b/doc/Changes.md @@ -24,6 +24,7 @@ Fuel V2.0.0 (2015-XX-XX) - Feature: Support for the versionable .fossil-settings/ignore-glob - Feature: OSX: UI improvements - Feature: OSX: Improved external application selection for application bundles +- Feature: Long operations can now be aborted via a button on the status bar - Misc: Reorganised menu structure. - Misc: Separated Fuel and Fossil settings - Bug Fix: Retain the folder tree state when refreshing the workspace diff --git a/manifest b/manifest index 564d229..7d3f3d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fossil::Init\snow\srequires\sa\spath\sto\sthe\sfossil\sexecutable -D 2015-08-27T12:00:28.915 +C Added\slong\soperation\stermination\sbutton\son\sstatus\sbar\nMore\srobust\sprocess\stermination\nFolded\sthe\sAbort\sshortcut\sinto\sa\sQAction\n +D 2015-08-27T14:30:44.033 F .fossil-settings/manifest a09a968bf05a50058f3ad50132730b719bc39e76 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b @@ -14,7 +14,7 @@ F debian/watch 34f0921ff100a3e16a7ad84dcc303731de830a60 F dist/arch/PKGBUILD 26623327e467028a883cd13963daa36baf10dfa3 F dist/win/fuel.iss ef3558dbba409eb194938b930377fc9ee27d319e F doc/Building.md 149d959751ae488829e084a9f88449a08220c1d1 -F doc/Changes.md 47e0d70b5b4ce6e11688a807952d72134d4ff643 +F doc/Changes.md d45c0401b93dbeeb2dad9c5f9ef36c27d15a10c5 F doc/License.txt 4cc77b90af91e615a64ae04893fdffa7939db84c F ext/qtkeychain/CMakeLists.txt fc1afa05034f2765ba243ce758a7e9d6b6efe2d6 F ext/qtkeychain/COPYING d0f83c8198fdd5464d2373015b7b64ce7cae607e @@ -226,14 +226,14 @@ F src/FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F src/FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F src/FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F src/FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df -F src/Fossil.cpp 98a9f7032ef53eafb71fef41159ec97ca7d1008a -F src/Fossil.h 0601beebc3c8cb11abb679691b94207a9a5c2f84 +F src/Fossil.cpp a33ea0f0c6ac9af9a50bbb8eb0f00d014d742ae7 +F src/Fossil.h 7695ace9412a26c5498a4ebe69ab261f6d598d81 F src/FslSettingsDialog.cpp e00907d493fba469e48a008aecda88426350b5ac F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 37bda20f00b73a2e2f7a170e5eb29749a06c7041 -F src/MainWindow.h b358227a96adb3afdf10566367478d76283acc91 +F src/MainWindow.cpp 751deebc3a887701fb1712dfb10563537d7de14e +F src/MainWindow.h fd8bb12f0bf49a6cb5ce9b875ad5277426380e3f F src/RemoteDialog.cpp d5d39871f319bb760405736ba0caa9e83ec51ea3 F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d F src/RevisionDialog.cpp e58c4f8a704f00addebb15d521b76620fdafda79 @@ -246,8 +246,8 @@ F src/SettingsDialog.cpp fa0c70eaf0fa7edb15de302d041cdb552fe523d5 F src/SettingsDialog.h 5eb3ae2cbb00ab5544e1889860f5376f69fe47cd F src/Utils.cpp fb9fe1caeef47dca310079f8f10b41c838defaa5 F src/Utils.h c52be757cd0045e34ab14c51f35a61af8f8870a4 -F src/Workspace.cpp 0548001c0975f84151dc93989cc03e4adaab48f5 -F src/Workspace.h 50970993b6f49c0f4dc55ba5954e7e4c2a723539 +F src/Workspace.cpp aff5e81b1cf355b81a17a5e97a4b32a0f0bf9439 +F src/Workspace.h 408ae0d52d5c17420a0add9b6fd5e0a7db3dc948 F src/main.cpp d8c65ea5e54102e4989fef9fd8cfd4f13ef8a8f0 F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x F tools/pack.sh d7f38a498c4e9327fecd6a6e5ac27be270d43008 x @@ -257,11 +257,11 @@ F ui/CloneDialog.ui d02d2fc6356cb7ff88860c1a6963d882c444b030 F ui/CommitDialog.ui 1e5dafa742e9ae07ec937bcda8cda3297ddc6199 F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/FslSettingsDialog.ui eb3d4cb764cab90b01e82922237d8c42d6ce1749 -F ui/MainWindow.ui e2a18caa7482b3ee0dff477592cdc9574b35fe4f +F ui/MainWindow.ui ad04643d071fe513b46ef413749a493909a90ad1 F ui/RemoteDialog.ui 424b2d4a3d0162f84fdccf6af02c1cfce07a06f5 F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui 2e1b6ce7a49100088c5649292c1319e62e0302e1 -P eaec54a0320c199d5e1133b38acfafa3da82228e -R 8c5cc7026dce6c43c834603f6ffe3238 +P ee09b7f597c4ab4b81a24c281ab33893f3c20ed6 +R 045e3d666e9e7764e0e5696cec816ce6 U Kostas -Z 456afb0a08b1115c953be0a118b74952 +Z 446f655f3a22f719427b796cf499616e diff --git a/manifest.uuid b/manifest.uuid index d8dd3e0..2456e63 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ee09b7f597c4ab4b81a24c281ab33893f3c20ed6 \ No newline at end of file +ea4b656b8237af73b81e6b22fd4c451a51450d2d \ No newline at end of file diff --git a/src/Fossil.cpp b/src/Fossil.cpp index 140fd5c..4a27e64 100644 --- a/src/Fossil.cpp +++ b/src/Fossil.cpp @@ -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) diff --git a/src/Fossil.h b/src/Fossil.h index 065dd21..54c772e 100644 --- a/src/Fossil.h +++ b/src/Fossil.h @@ -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 diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 9499c66..a239e09 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -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(); } diff --git a/src/MainWindow.h b/src/MainWindow.h index 87d3c08..0ee16c4 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -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; diff --git a/src/Workspace.cpp b/src/Workspace.cpp index 3a33287..340a8b0 100644 --- a/src/Workspace.cpp +++ b/src/Workspace.cpp @@ -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; i0 0 865 - 23 + 21 @@ -1047,6 +1047,21 @@ Delete Remote + + + + :/icons/icon-action-stop:/icons/icon-action-stop + + + abortOperation + + + Abort the current operation + + + Esc + +