statusbar: added basic task UI feedback without requiring the task
manager to be open
This commit is contained in:
@@ -83,6 +83,16 @@ TaskManager *TaskManager::instance()
|
||||
return instance_;
|
||||
}
|
||||
|
||||
int TaskManager::GetTaskCount() const
|
||||
{
|
||||
return tasks_.size();
|
||||
}
|
||||
|
||||
Task *TaskManager::GetFirstTask() const
|
||||
{
|
||||
return tasks_.first().task;
|
||||
}
|
||||
|
||||
void TaskManager::AddTask(Task* t)
|
||||
{
|
||||
// Connect Task's status signal to the Callback
|
||||
@@ -95,6 +105,7 @@ void TaskManager::AddTask(Task* t)
|
||||
|
||||
// Emit signal that a Task was added
|
||||
emit TaskAdded(t);
|
||||
emit TaskListChanged();
|
||||
|
||||
// Scan through queue and start any Tasks that can (including this one)
|
||||
StartNextWaiting();
|
||||
@@ -165,6 +176,7 @@ void TaskManager::DeleteTask(Task *t)
|
||||
}
|
||||
|
||||
emit t->Removed();
|
||||
emit TaskListChanged();
|
||||
|
||||
if (GetTaskStatus(t) != kWorking) {
|
||||
// If the task isn't doing anything, we can simply delete it
|
||||
@@ -205,6 +217,9 @@ void TaskManager::TaskFinished()
|
||||
// Decrement the active thread count
|
||||
active_thread_count_--;
|
||||
|
||||
// Signal that the task has finished
|
||||
emit TaskListChanged();
|
||||
|
||||
// Start any tasks that could start now
|
||||
StartNextWaiting();
|
||||
}
|
||||
|
||||
@@ -51,14 +51,16 @@ public:
|
||||
*/
|
||||
virtual ~TaskManager();
|
||||
|
||||
DISABLE_COPY_MOVE(TaskManager)
|
||||
|
||||
static void CreateInstance();
|
||||
|
||||
static void DestroyInstance();
|
||||
|
||||
static TaskManager* instance();
|
||||
|
||||
int GetTaskCount() const;
|
||||
|
||||
Task* GetFirstTask() const;
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* @brief Add a new Task
|
||||
@@ -87,6 +89,11 @@ signals:
|
||||
*/
|
||||
void TaskAdded(Task* t);
|
||||
|
||||
/**
|
||||
* @brief Signal emitted when any change to the running task list has been made
|
||||
*/
|
||||
void TaskListChanged();
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief The Status enum
|
||||
|
||||
@@ -18,6 +18,8 @@ set(OLIVE_SOURCES
|
||||
${OLIVE_SOURCES}
|
||||
window/mainwindow/mainmenu.h
|
||||
window/mainwindow/mainmenu.cpp
|
||||
window/mainwindow/mainstatusbar.h
|
||||
window/mainwindow/mainstatusbar.cpp
|
||||
window/mainwindow/mainwindow.h
|
||||
window/mainwindow/mainwindow.cpp
|
||||
PARENT_SCOPE
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "mainstatusbar.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
MainStatusBar::MainStatusBar(QWidget *parent) :
|
||||
QStatusBar(parent),
|
||||
manager_(nullptr)
|
||||
{
|
||||
setSizeGripEnabled(false);
|
||||
|
||||
bar_ = new QProgressBar();
|
||||
addPermanentWidget(bar_);
|
||||
|
||||
bar_->setMinimum(0);
|
||||
bar_->setMaximum(100);
|
||||
bar_->setVisible(false);
|
||||
|
||||
showMessage(tr("Welcome to %1 %2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()));
|
||||
}
|
||||
|
||||
void MainStatusBar::ConnectTaskManager(TaskManager *manager)
|
||||
{
|
||||
if (manager_) {
|
||||
disconnect(manager_, &TaskManager::TaskListChanged, this, &MainStatusBar::UpdateStatus);
|
||||
}
|
||||
|
||||
manager_ = manager;
|
||||
|
||||
if (manager_) {
|
||||
connect(manager_, &TaskManager::TaskListChanged, this, &MainStatusBar::UpdateStatus);
|
||||
}
|
||||
}
|
||||
|
||||
void MainStatusBar::UpdateStatus()
|
||||
{
|
||||
if (!manager_) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (manager_->GetTaskCount() == 0) {
|
||||
clearMessage();
|
||||
bar_->setVisible(false);
|
||||
} else {
|
||||
Task* t = manager_->GetFirstTask();
|
||||
|
||||
if (manager_->GetTaskCount() == 1) {
|
||||
showMessage(t->GetTitle());
|
||||
} else {
|
||||
showMessage(tr("Running %1 background tasks").arg(manager_->GetTaskCount()));
|
||||
}
|
||||
|
||||
bar_->setVisible(true);
|
||||
connect(t, &Task::ProgressChanged, bar_, &QProgressBar::setValue);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef MAINSTATUSBAR_H
|
||||
#define MAINSTATUSBAR_H
|
||||
|
||||
#include <QProgressBar>
|
||||
#include <QStatusBar>
|
||||
|
||||
#include "task/taskmanager.h"
|
||||
|
||||
/**
|
||||
* @brief Shows abbreviated information from a TaskManager object
|
||||
*/
|
||||
class MainStatusBar : public QStatusBar
|
||||
{
|
||||
public:
|
||||
MainStatusBar(QWidget* parent = nullptr);
|
||||
|
||||
void ConnectTaskManager(TaskManager* manager);
|
||||
|
||||
private slots:
|
||||
void UpdateStatus();
|
||||
|
||||
private:
|
||||
TaskManager* manager_;
|
||||
|
||||
QProgressBar* bar_;
|
||||
|
||||
};
|
||||
|
||||
#endif // MAINSTATUSBAR_H
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "mainmenu.h"
|
||||
#include "mainstatusbar.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent)
|
||||
@@ -51,6 +52,11 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
MainMenu* main_menu = new MainMenu(this);
|
||||
setMenuBar(main_menu);
|
||||
|
||||
// Create and set status bar
|
||||
MainStatusBar* status_bar = new MainStatusBar(this);
|
||||
status_bar->ConnectTaskManager(TaskManager::instance());
|
||||
setStatusBar(status_bar);
|
||||
|
||||
// Create standard panels
|
||||
node_panel_ = PanelManager::instance()->CreatePanel<NodePanel>(this);
|
||||
addDockWidget(Qt::TopDockWidgetArea, node_panel_);
|
||||
|
||||
Reference in New Issue
Block a user