Add animated icons to LogsWindow tab

This commit is contained in:
Srivats P 2019-02-10 18:15:35 +05:30
parent 10dddf410a
commit 95578e5094
5 changed files with 83 additions and 7 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

BIN
client/icons/anime_warn.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -24,6 +24,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include <QDockWidget>
#include <QHeaderView>
#include <QMainWindow>
#include <QMovie>
extern QMainWindow *mainWindow;
LogsWindow::LogsWindow(LogsModel *model, QWidget *parent)
: QWidget(parent)
@ -42,6 +46,9 @@ LogsWindow::LogsWindow(LogsModel *model, QWidget *parent)
parentDock_ = qobject_cast<QDockWidget*>(parent);
windowTitle_ = parentDock_->windowTitle();
warnAnime_ = new QMovie(":/icons/anime_warn.gif", QByteArray(), this);
errorAnime_ = new QMovie(":/icons/anime_error.gif", QByteArray(), this);
connect(level, SIGNAL(currentIndexChanged(int)),
model, SLOT(setLogLevel(int)));
connect(clear, SIGNAL(clicked()), model, SLOT(clear()));
@ -60,14 +67,16 @@ LogsWindow::LogsWindow(LogsModel *model, QWidget *parent)
LogsWindow::~LogsWindow()
{
delete warnAnime_;
delete errorAnime_;
delete logsModelTest_;
}
void LogsWindow::when_visibilityChanged(bool visible)
{
if (visible) {
parentDock_->setWindowTitle(windowTitle_);
annotation_.clear();
state_ = kInfo;
notify();
}
isVisible_ = visible;
@ -80,7 +89,7 @@ void LogsWindow::when_rowsInserted(const QModelIndex &parent,
if (isVisible_)
return;
if (annotation_.contains("Error"))
if (state_ == kError)
return;
for (int i = first; i <= last; i++) {
@ -89,14 +98,14 @@ void LogsWindow::when_rowsInserted(const QModelIndex &parent,
QString level = logs->model()->data(logs->model()->index(i, 1, parent))
.toString();
if (level == "Error") {
annotation_ = QString(" - Error(s)");
state_ = kError;
break; // Highest level - no need to look further
}
else if (level == "Warning") {
annotation_ = QString(" - Warning(s)");
state_ = kWarning;
}
}
parentDock_->setWindowTitle(windowTitle_+annotation_);
notify();
}
void LogsWindow::on_autoScroll_toggled(bool checked)
@ -112,3 +121,60 @@ void LogsWindow::on_autoScroll_toggled(bool checked)
logs, SLOT(scrollToBottom()));
}
}
QLabel* LogsWindow::tabIcon()
{
QList<QTabBar*> tabBars = mainWindow->findChildren<QTabBar*>();
foreach(QTabBar* tabBar, tabBars) {
for (int i = 0; i < tabBar->count(); i++) {
if (tabBar->tabText(i).startsWith(windowTitle_)) {
QLabel *icon = qobject_cast<QLabel*>(
tabBar->tabButton(i, QTabBar::LeftSide));
if (!icon) { // Lazy create
icon = new QLabel();
tabBar->setTabButton(i, QTabBar::LeftSide, icon);
}
return icon;
}
}
}
return nullptr;
}
void LogsWindow::notify()
{
QString annotation;
QMovie *anime = nullptr;
// Stop all animations before we start a new one
warnAnime_->stop();
errorAnime_->stop();
switch (state_) {
case kError:
anime = errorAnime_;
annotation = " - Error(s)";
break;
case kWarning:
anime = warnAnime_;
annotation = " - Warning(s)";
break;
case kInfo:
default:
break;
}
QLabel *icon = tabIcon(); // NOTE: we may not have a icon if not tabified
if (icon) {
if (anime) {
icon->setMovie(anime);
anime->start();
}
else
icon->clear();
icon->adjustSize();
}
parentDock_->setWindowTitle(windowTitle_ + annotation);
}

View File

@ -25,6 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
class LogsModel;
class QDockWidget;
class QShowEvent;
class QMovie;
class LogsWindow: public QWidget, private Ui::LogsWindow
{
@ -39,9 +40,16 @@ private slots:
void on_autoScroll_toggled(bool checked);
private:
enum State {kInfo, kWarning, kError};
QLabel* tabIcon();
void notify();
State state_{kInfo};
QDockWidget *parentDock_;
QMovie *warnAnime_{nullptr};
QMovie *errorAnime_{nullptr};
QString windowTitle_;
QString annotation_;
bool isVisible_{false};
QObject *logsModelTest_;
};

View File

@ -2,6 +2,8 @@
<qresource prefix="/">
<file>icons/about.png</file>
<file>icons/add.png</file>
<file>icons/anime_error.gif</file>
<file>icons/anime_warn.gif</file>
<file>icons/arrow_down.png</file>
<file>icons/arrow_left.png</file>
<file>icons/arrow_right.png</file>