diff --git a/app/task/taskmanager.cpp b/app/task/taskmanager.cpp index d293d5d65..043ed90bc 100644 --- a/app/task/taskmanager.cpp +++ b/app/task/taskmanager.cpp @@ -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(); } diff --git a/app/task/taskmanager.h b/app/task/taskmanager.h index 1a47994db..420847ba7 100644 --- a/app/task/taskmanager.h +++ b/app/task/taskmanager.h @@ -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 diff --git a/app/window/mainwindow/CMakeLists.txt b/app/window/mainwindow/CMakeLists.txt index 3c775d116..151883684 100644 --- a/app/window/mainwindow/CMakeLists.txt +++ b/app/window/mainwindow/CMakeLists.txt @@ -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 diff --git a/app/window/mainwindow/mainstatusbar.cpp b/app/window/mainwindow/mainstatusbar.cpp new file mode 100644 index 000000000..54c6453cd --- /dev/null +++ b/app/window/mainwindow/mainstatusbar.cpp @@ -0,0 +1,55 @@ +#include "mainstatusbar.h" + +#include + +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); + } +} diff --git a/app/window/mainwindow/mainstatusbar.h b/app/window/mainwindow/mainstatusbar.h new file mode 100644 index 000000000..cc22a8dae --- /dev/null +++ b/app/window/mainwindow/mainstatusbar.h @@ -0,0 +1,29 @@ +#ifndef MAINSTATUSBAR_H +#define MAINSTATUSBAR_H + +#include +#include + +#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 diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 3541dbd45..110784de1 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -25,6 +25,7 @@ #include #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(this); addDockWidget(Qt::TopDockWidgetArea, node_panel_);