show rotating spinner when block download out of date, tick otherwise
authorWladimir J. van der Laan <laanwj@gmail.com>
Sun, 17 Jul 2011 15:30:58 +0000 (17:30 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Sun, 17 Jul 2011 15:31:37 +0000 (17:31 +0200)
doc/assets-attribution.txt
scripts/img/reload.xcf [new file with mode: 0644]
scripts/img/reload_scaled.png [new file with mode: 0644]
scripts/make_spinner.py [new file with mode: 0755]
src/qt/bitcoin.qrc
src/qt/bitcoingui.cpp
src/qt/bitcoingui.h
src/qt/res/icons/synced.png
src/qt/res/movies/update_spinner.mng [new file with mode: 0644]

index f3900fe..2ab8f56 100644 (file)
@@ -14,7 +14,7 @@ Designer: FatCow Web Hosting
 License: Creative Commons Attribution (by)
 Site: http://findicons.com/icon/163938/book_open
 
-Icon: src/qt/res/icons/connect*.png
+Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png
 Icon Pack: Human-O2
 Designer: schollidesign
 License: GNU/GPL
@@ -52,9 +52,8 @@ Designer: Jack Cai
 License: Creative Commons Attribution No Derivatives (by-nd)
 Site: http://findicons.com/icon/175944/home?id=176221#
 
-Icon: src/qt/res/icons/synced.png, 
-      src/qt/res/icons/notsynced.png
-Icon Pack: Gloss: Basic
-Designer: Momenticons
-License: Creative Commons Attribution (by) 
-Site: http://www.momenticons.com/
+Icon:  scripts/img/reload.xcf (modified),src/qt/res/movies/update_spinner.mng
+Icon Pack: Kids
+Designer: Everaldo (Everaldo Coelho)
+License: GNU/GPL 
+Site: http://findicons.com/icon/17102/reload?id=17102
diff --git a/scripts/img/reload.xcf b/scripts/img/reload.xcf
new file mode 100644 (file)
index 0000000..c3ce165
Binary files /dev/null and b/scripts/img/reload.xcf differ
diff --git a/scripts/img/reload_scaled.png b/scripts/img/reload_scaled.png
new file mode 100644 (file)
index 0000000..9a45b1b
Binary files /dev/null and b/scripts/img/reload_scaled.png differ
diff --git a/scripts/make_spinner.py b/scripts/make_spinner.py
new file mode 100755 (executable)
index 0000000..c1f94c1
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+# W.J. van der Laan, 2011
+# Make spinning .mng animation from a .png
+# Requires imagemagick 6.7+
+from __future__ import division
+from os import path
+from PIL import Image
+from subprocess import Popen
+
+SRC='img/reload_scaled.png'
+DST='../src/qt/res/movies/update_spinner.mng'
+TMPDIR='/tmp'
+TMPNAME='tmp-%03i.png'
+NUMFRAMES=35
+FRAMERATE=10.0
+CONVERT='convert'
+CLOCKWISE=True
+
+im_src = Image.open(SRC)
+
+if CLOCKWISE:
+    im_src = im_src.transpose(Image.FLIP_LEFT_RIGHT)
+
+def frame_to_filename(frame):
+    return path.join(TMPDIR, TMPNAME % frame)
+
+frame_files = []
+for frame in xrange(NUMFRAMES):
+    rotation = (frame + 0.5) / NUMFRAMES * 360.0
+    if CLOCKWISE:
+        rotation = -rotation
+    im_new = im_src.rotate(rotation, Image.BICUBIC)
+    outfile = frame_to_filename(frame)
+    im_new.save(outfile, 'png')
+    frame_files.append(outfile)
+
+p = Popen([CONVERT, "-delay", str(FRAMERATE), "-dispose", "2"] + frame_files + [DST])
+p.communicate()
+
+
+
index 9ef8b2a..f6b22f4 100644 (file)
         <file alias="overview">res/icons/overview.png</file>
         <file alias="export">res/icons/export.png</file>
         <file alias="synced">res/icons/synced.png</file>
-        <file alias="notsynced">res/icons/notsynced.png</file>
-        <file>res/icons/remove.png</file>
+        <file alias="remove">res/icons/remove.png</file>
     </qresource>
     <qresource prefix="/images">
         <file alias="about">res/images/about.png</file>
     </qresource>
+    <qresource prefix="/movies">
+        <file alias="update_spinner">res/movies/update_spinner.mng</file>
+    </qresource>
 </RCC>
index 6a6f3f3..ed687c4 100644 (file)
@@ -36,6 +36,7 @@
 #include <QProgressBar>
 #include <QStackedWidget>
 #include <QDateTime>
+#include <QMovie>
 
 #include <QDebug>
 
@@ -107,17 +108,35 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
     // Create status bar
     statusBar();
 
+    // Status bar "Connections" notification
+    QFrame *frameConnections = new QFrame();
+    frameConnections->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    frameConnections->setMinimumWidth(150);
+    frameConnections->setMaximumWidth(150);
+    QHBoxLayout *frameConnectionsLayout = new QHBoxLayout(frameConnections);
+    frameConnectionsLayout->setContentsMargins(3,0,3,0);
+    frameConnectionsLayout->setSpacing(3);
+    labelConnectionsIcon = new QLabel();
+    labelConnectionsIcon->setToolTip(tr("Number of connections to other clients"));
+    frameConnectionsLayout->addWidget(labelConnectionsIcon);
     labelConnections = new QLabel();
-    labelConnections->setFrameStyle(QFrame::Panel | QFrame::Sunken);
-    labelConnections->setMinimumWidth(150);
-    labelConnections->setMaximumWidth(150);
     labelConnections->setToolTip(tr("Number of connections to other clients"));
-
+    frameConnectionsLayout->addWidget(labelConnections);
+    frameConnectionsLayout->addStretch();
+
+    // Status bar "Blocks" notification
+    QFrame *frameBlocks = new QFrame();
+    frameBlocks->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    frameBlocks->setMinimumWidth(150);
+    frameBlocks->setMaximumWidth(150);
+    QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks);
+    frameBlocksLayout->setContentsMargins(3,0,3,0);
+    frameBlocksLayout->setSpacing(3);
+    labelBlocksIcon = new QLabel();
+    frameBlocksLayout->addWidget(labelBlocksIcon);
     labelBlocks = new QLabel();
-    labelBlocks->setFrameStyle(QFrame::Panel | QFrame::Sunken);
-    labelBlocks->setMinimumWidth(150);
-    labelBlocks->setMaximumWidth(150);
-    labelBlocks->setToolTip(tr("Number of blocks in the block chain"));
+    frameBlocksLayout->addWidget(labelBlocks);
+    frameBlocksLayout->addStretch();
 
     // Progress bar for blocks download
     progressBarLabel = new QLabel(tr("Synchronizing with network..."));
@@ -128,11 +147,13 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
 
     statusBar()->addWidget(progressBarLabel);
     statusBar()->addWidget(progressBar);
-    statusBar()->addPermanentWidget(labelConnections);
-    statusBar()->addPermanentWidget(labelBlocks);
+    statusBar()->addPermanentWidget(frameConnections);
+    statusBar()->addPermanentWidget(frameBlocks);
 
     createTrayIcon();
 
+    syncIconMovie = new QMovie(":/movies/update_spinner", "mng", this);
+
     gotoOverviewPage();
 }
 
@@ -285,8 +306,8 @@ void BitcoinGUI::setNumConnections(int count)
     case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
     default: icon = ":/icons/connect_4"; break;
     }
-    labelConnections->setTextFormat(Qt::RichText);
-    labelConnections->setText("<img src=\""+icon+"\"> " + tr("%n connection(s)", "", count));
+    labelConnectionsIcon->setPixmap(QIcon(icon).pixmap(16,16));
+    labelConnections->setText(tr("%n connection(s)", "", count));
 }
 
 void BitcoinGUI::setNumBlocks(int count)
@@ -313,13 +334,13 @@ void BitcoinGUI::setNumBlocks(int count)
     QDateTime lastBlockDate = clientModel->getLastBlockDate();
     int secs = lastBlockDate.secsTo(now);
     QString text;
-    QString icon = ":/icons/notsynced";
+    bool spinning = true;
 
     // "Up to date" icon, and outdated icon
     if(secs < 30*60)
     {
         text = "Up to date";
-        icon = ":/icons/synced";
+        spinning = false;
     }
     else if(secs < 60*60)
     {
@@ -334,9 +355,20 @@ void BitcoinGUI::setNumBlocks(int count)
         text = tr("%n day(s) ago","",secs/(60*60*24));
     }
     tooltip += QString("\n");
-    tooltip += tr("Last block was generated %1.").arg(QLocale::system().toString(lastBlockDate));
+    tooltip += tr("Last received block was generated %1.").arg(text);
+
+    if(spinning)
+    {
+        labelBlocksIcon->setMovie(syncIconMovie);
+        syncIconMovie->start();
+    }
+    else
+    {
+        labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(16,16));
+    }
+    labelBlocks->setText(text);
 
-    labelBlocks->setText("<img src=\""+icon+"\"> " + text);
+    labelBlocksIcon->setToolTip(tooltip);
     labelBlocks->setToolTip(tooltip);
     progressBarLabel->setToolTip(tooltip);
     progressBar->setToolTip(tooltip);
index 95e0eb7..4fc17dd 100644 (file)
@@ -57,6 +57,7 @@ private:
     QLabel *labelConnections;
     QLabel *labelConnectionsIcon;
     QLabel *labelBlocks;
+    QLabel *labelBlocksIcon;
     QLabel *progressBarLabel;
     QProgressBar *progressBar;
 
@@ -74,6 +75,8 @@ private:
     QSystemTrayIcon *trayIcon;
     TransactionView *transactionView;
 
+    QMovie *syncIconMovie;
+
     void createActions();
     QWidget *createTabs();
     void createTrayIcon();
index 910fc39..8e428b6 100644 (file)
Binary files a/src/qt/res/icons/synced.png and b/src/qt/res/icons/synced.png differ
diff --git a/src/qt/res/movies/update_spinner.mng b/src/qt/res/movies/update_spinner.mng
new file mode 100644 (file)
index 0000000..99b1b14
Binary files /dev/null and b/src/qt/res/movies/update_spinner.mng differ