statusbar: added basic task UI feedback without requiring the task

manager to be open
This commit is contained in:
itsmattkc
2020-03-03 01:50:51 +11:00
parent d8f83f1452
commit 02909c6ba9
6 changed files with 116 additions and 2 deletions
+15
View File
@@ -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();
}
+9 -2
View File
@@ -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
+2
View File
@@ -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
+55
View File
@@ -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);
}
}
+29
View File
@@ -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
+6
View File
@@ -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_);