From 76f6550ae559fe8595fc10699dc5411b92d4d967 Mon Sep 17 00:00:00 2001 From: Kostas Date: Tue, 29 Jul 2014 11:59:44 +0000 Subject: [PATCH] Initial support for abortable refreshes FossilOrigin-Name: ac8a195f2fcfaa16e849461ae63aa01f88d1794d --- manifest | 14 +++--- manifest.uuid | 2 +- src/MainWindow.cpp | 105 ++++++++++++++++++++++++++++++++------------- src/MainWindow.h | 11 +++-- 4 files changed, 91 insertions(+), 41 deletions(-) diff --git a/manifest b/manifest index 8210f8f..703634a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refreshed\slocalizations\nChanged\sversion\sto\s0.9.8 -D 2014-07-29T08:30:53.427 +C Initial\ssupport\sfor\sabortable\srefreshes\n +D 2014-07-29T11:59:44.606 F dist/arch/PKGBUILD 1d72dad77767f94a6b1a018067188e61927fa564 F dist/win/fuel.iss ef3558dbba409eb194938b930377fc9ee27d319e F doc/Building.txt 7c0f1060d4a08ed330058d4a3a68905c05228381 @@ -187,8 +187,8 @@ F src/FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F src/FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 6e217d10880fc3d544d4a0de384684feb1152647 -F src/MainWindow.h 631af46749d69c3be1b5c1427c7ff6bd43855ad5 +F src/MainWindow.cpp ec7c571b7664e537998ae8930e5e9d6cb1994fb3 +F src/MainWindow.h 6ee1c046c176782130a064a9feed35def4d93af6 F src/SettingsDialog.cpp effff92f746a71b07f0e6a72a21caac5a9085123 F src/SettingsDialog.h 01c1f876c64f750ba8820a0d745e377acabe4921 F src/Utils.cpp 9aff456712e4276b49083426301b3b96d3819c77 @@ -201,7 +201,7 @@ F ui/CommitDialog.ui 6200f6cabdcf40a20812e811be28e0793f82516f F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/MainWindow.ui 7ede8bbb54513e0771fdf5d5a2566d88c81b73ad F ui/SettingsDialog.ui 55aefad7145c40d936c43759789d1b50e361b020 -P 9d073dbbd5ca3382a184e8693107a01d1c72a754 -R 67239183343409750edd50bfaecdfddc +P 30ee66fdd239b24a6450dbb8b2dee4b904813a55 +R 7a758f7890147cf5446303afc8b7b101 U Kostas -Z 00d2fb0baf1c9e413735cf3928ad8ed0 +Z edd995531a4645688e87cfd0c0dd161e diff --git a/manifest.uuid b/manifest.uuid index e750eab..0714c6f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30ee66fdd239b24a6450dbb8b2dee4b904813a55 \ No newline at end of file +ac8a195f2fcfaa16e849461ae63aa01f88d1794d \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 2811d7d..e4da794 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1,23 +1,24 @@ #include "MainWindow.h" #include "ui_MainWindow.h" -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include "CommitDialog.h" #include "FileActionDialog.h" #include "CloneDialog.h" @@ -220,21 +221,23 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP a->setIconVisibleInMenu(false); #endif + abortShortcut = new QShortcut(QKeySequence("Escape"), this); + abortShortcut->setContext(Qt::ApplicationShortcut); + abortShortcut->setEnabled(false); + connect(abortShortcut, SIGNAL(activated()), this, SLOT(onAbort())); + viewMode = VIEWMODE_TREE; applySettings(); + refreshOnShow = true; // Apply any explicit workspace path if available if(workspacePath && !workspacePath->isEmpty()) openWorkspace(*workspacePath); - refresh(); - rebuildRecent(); + abortCurrentAction = false; - // Select the Root of the tree to update the file view - selectRootDir(); - - fossilAbort = false; + connect(this, SIGNAL(show), SLOT(onShow()), Qt::DirectConnection); } //------------------------------------------------------------------------------ @@ -543,7 +546,7 @@ void MainWindow::onOpenRecent() } //------------------------------------------------------------------------------ -bool MainWindow::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec) +bool MainWindow::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec, const bool &abort) { QDir dir(dirPath); @@ -553,6 +556,9 @@ bool MainWindow::scanDirectory(QFileInfoList &entries, const QString& dirPath, c QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot); for (int i=0; iactionViewUnknown->isChecked(); setStatus(tr("Scanning Workspace...")); - setEnabled(false); + setBusy(true); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); // Dispose RepoFiles @@ -663,6 +669,8 @@ void MainWindow::scanWorkspace() workspaceFiles.clear(); pathSet.clear(); + abortCurrentAction = false; + if(scan_files) { QCoreApplication::processEvents(); @@ -675,7 +683,13 @@ void MainWindow::scanWorkspace() ignore = settings.GetFossilValue(FOSSIL_SETTING_IGNORE_GLOB).toString().replace(',',';'); } - scanDirectory(all_files, wkdir, wkdir, ignore); + if(!scanDirectory(all_files, wkdir, wkdir, ignore, abortCurrentAction)) + { + setBusy(false); + setStatus(""); + QApplication::restoreOverrideCursor(); + return; + } for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it) { @@ -769,7 +783,12 @@ void MainWindow::scanWorkspace() stashMap.clear(); res.clear(); if(!runFossil(QStringList() << "stash" << "ls", &res, RUNFLAGS_SILENT_ALL)) + { + setBusy(false); + setStatus(""); + QApplication::restoreOverrideCursor(); return; + } // 19: [5c46757d4b9765] on 2012-04-22 04:41:15 QRegExp stash_rx("\\s*(\\d+):\\s+\\[(.*)\\] on (\\d+)-(\\d+)-(\\d+) (\\d+):(\\d+):(\\d+)", Qt::CaseInsensitive); @@ -806,7 +825,7 @@ void MainWindow::scanWorkspace() updateFileView(); updateStashView(); - setEnabled(true); + setBusy(false); setStatus(""); QApplication::restoreOverrideCursor(); } @@ -1110,7 +1129,7 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int QString ans_always = 'a' + EOL_MARK; QString ans_convert = 'c' + EOL_MARK; - fossilAbort = false; + abortCurrentAction = false; QString buffer; #ifdef Q_OS_WIN @@ -1131,9 +1150,8 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int if(state!=QProcess::Running && bytes_avail<1) break; - if(fossilAbort) + if(abortCurrentAction) { - log("\n* "+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 @@ -1229,7 +1247,7 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int // Map the Convert option to the Apply button if(have_acyn_query) { - query = before_last_line + query; + query = before_last_line + "\n" + query; buttons |= QMessageBox::Apply; } @@ -2635,3 +2653,32 @@ void MainWindow::dropEvent(QDropEvent *event) } } +//------------------------------------------------------------------------------ +void MainWindow::setBusy(bool busy) +{ + abortShortcut->setEnabled(busy); + bool enabled = !busy; + ui->menuBar->setEnabled(enabled); + ui->mainToolBar->setEnabled(enabled); + ui->centralWidget->setEnabled(enabled); +} + +//------------------------------------------------------------------------------ +void MainWindow::onAbort() +{ + abortCurrentAction = true; + log("\n* "+tr("Terminated")+" *\n"); +} + +//------------------------------------------------------------------------------ +void MainWindow::onShow() +{ + if(refreshOnShow) + { + refresh(); + rebuildRecent(); + // Select the Root of the tree to update the file view + selectRootDir(); + refreshOnShow = false; + } +} diff --git a/src/MainWindow.h b/src/MainWindow.h index c938f0e..bec9f0c 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -159,7 +159,7 @@ private: void loadFossilSettings(); QString getFossilPath(); QString getFossilHttpAddress(); - bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec); + bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec, const bool& abort); void updateDirView(); void updateFileView(); void updateStashView(); @@ -167,8 +167,7 @@ private: void fossilBrowse(const QString &fossilUrl); void dragEnterEvent(class QDragEnterEvent *event); void dropEvent(class QDropEvent *event); - - + void setBusy(bool busy); virtual QMenu *createPopupMenu(); enum RepoStatus @@ -192,6 +191,8 @@ private slots: void onOpenRecent(); void onTreeViewSelectionChanged(const class QItemSelection &selected, const class QItemSelection &deselected); void onFileViewDragOut(); + void onAbort(); + void onShow(); // Designer slots void on_actionRefresh_triggered(); @@ -249,7 +250,9 @@ private: QProcess fossilUI; class QAction *recentWorkspaceActs[MAX_RECENT]; class QProgressBar *progressBar; - bool fossilAbort; // FIXME: No GUI for it yet + class QShortcut *abortShortcut; + bool abortCurrentAction; + bool refreshOnShow; Settings &settings; QString projectName;