Refactored ui callback mechanism

Bridge now has access to the status bar via the new callbacks

FossilOrigin-Name: ee4cf9240e411dfdfc7a4d2b69456fb38a2300c8
This commit is contained in:
kostas
2015-04-27 18:59:09 +00:00
parent 906873e7f9
commit 5b3333836d
6 changed files with 102 additions and 20 deletions

View File

@ -19,6 +19,24 @@ static const QRegExp REGEX_STASH("\\s*(\\d+):\\s+\\[(.*)\\] on (\\d+)-(\\d+)-(
#define FOSSIL_EXT "fossil"
#define PATH_SEP "/"
///////////////////////////////////////////////////////////////////////////////
class ScopedFossilStatus
{
public:
ScopedFossilStatus(Bridge::UICallback *callback, const QString &text) : uiCallback(callback)
{
uiCallback->beginProcess(text);
}
~ScopedFossilStatus()
{
uiCallback->endProcess();
}
private:
Bridge::UICallback *uiCallback;
};
//------------------------------------------------------------------------------
Bridge::RepoStatus Bridge::getRepoStatus()
{
@ -478,6 +496,12 @@ bool Bridge::runFossilRaw(const QStringList &args, QStringList *output, int *exi
if(detached)
return QProcess::startDetached(fossil, args, wkdir);
// Make status message
QString status_msg = tr("Running Fossil");
if(args.length() > 0)
status_msg = QString("Fossil %0").arg(args[0].toCaseFolded());
ScopedFossilStatus status(uiCallback, status_msg);
// Generate args file
const QStringList *final_args = &args;
QTemporaryFile args_file;

View File

@ -21,21 +21,27 @@ enum RunFlags
class Bridge : public QObject
{
public:
class UICallback
{
public:
virtual void logText(const QString &text, bool isHTML)=0;
virtual void beginProcess(const QString &text)=0;
virtual void endProcess()=0;
};
Bridge()
: QObject(0)
, parentWidget(0)
, abortOperation(false)
, logTextBrowser(0)
, uiCallback(0)
{
}
typedef void(*log_callback_t)(QTextBrowser *textBrowser, const QString &text, bool isHTML);
void Init(QWidget *parent, log_callback_t callback, QTextBrowser *textBrowser, const QString &fossPath, const QString &workspace)
void Init(QWidget *parent, UICallback *callback, QTextBrowser *textBrowser, const QString &fossPath, const QString &workspace)
{
parentWidget = parent;
logCallback = callback;
uiCallback = callback;
logTextBrowser = textBrowser;
fossilPath = fossPath;
@ -118,8 +124,8 @@ public:
private:
void log(const QString &text, bool isHTML=false)
{
if(logCallback)
(*logCallback)(logTextBrowser, text, isHTML);
if(uiCallback)
uiCallback->logText(text, isHTML);
}
@ -128,7 +134,7 @@ private:
QWidget *parentWidget; // fixme
bool abortOperation; // FIXME: No GUI for it yet
log_callback_t logCallback;
UICallback *uiCallback;
QTextBrowser *logTextBrowser;
QString currentWorkspace;
QString fossilPath; // The value from the settings

View File

@ -80,6 +80,7 @@ static QStringMap MakeKeyValues(QStringList lines)
}
#ifndef BRIDGE_ENABLED
///////////////////////////////////////////////////////////////////////////////
class ScopedStatus
{
@ -99,6 +100,7 @@ private:
Ui::MainWindow *ui;
QProgressBar *progressBar;
};
#endif
///////////////////////////////////////////////////////////////////////////////
MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspacePath) :
@ -216,8 +218,9 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP
viewMode = VIEWMODE_TREE;
#ifdef BRIDGE_ENABLED
uiCallback.init(this);
// Need to be before applySettings which sets the last workspace
bridge.Init(this, &log, ui->textBrowser, "", "");
bridge.Init(this, &uiCallback, ui->textBrowser, "", "");
#endif
applySettings();
@ -2959,3 +2962,28 @@ void MainWindow::fullRefresh()
// Select the Root of the tree to update the file view
selectRootDir();
}
#ifdef BRIDGE_ENABLED
//------------------------------------------------------------------------------
void MainWindow::MainWinUICallback::logText(const QString& text, bool isHTML)
{
Q_ASSERT(mainWindow);
mainWindow->log(text, isHTML);
}
//------------------------------------------------------------------------------
void MainWindow::MainWinUICallback::beginProcess(const QString& text)
{
Q_ASSERT(mainWindow);
mainWindow->ui->statusBar->showMessage(text);
mainWindow->progressBar->setHidden(false);
}
//------------------------------------------------------------------------------
void MainWindow::MainWinUICallback::endProcess()
{
Q_ASSERT(mainWindow);
mainWindow->ui->statusBar->clearMessage();
mainWindow->progressBar->setHidden(true);
}
#endif

View File

@ -235,6 +235,29 @@ private slots:
void on_tableView_customContextMenuRequested(const QPoint &pos);
private:
#ifdef BRIDGE_ENABLED
class MainWinUICallback : public Bridge::UICallback
{
public:
MainWinUICallback() : mainWindow(0)
{}
void init(class MainWindow *mainWindow)
{
this->mainWindow = mainWindow;
}
virtual void logText(const QString& text, bool isHTML);
virtual void beginProcess(const QString& text);
virtual void endProcess();
private:
class MainWindow *mainWindow;
};
#endif
friend class MainWinUICallback;
enum
{
MAX_RECENT=5
@ -262,6 +285,7 @@ private:
void setRepositoryFile(const QString &filename) { repositoryFile = filename; }
const QString & getProjectName() const { return projectName; }
#else
MainWinUICallback uiCallback;
Bridge bridge;
const QString & getProjectName() const { return bridge.getProjectName(); }
const QString & getRepositoryFile() const { return bridge.getRepositoryFile(); }