diff --git a/src/lib/data/icons.qrc b/src/lib/data/icons.qrc
index 7c3243a4b..274220c12 100644
--- a/src/lib/data/icons.qrc
+++ b/src/lib/data/icons.qrc
@@ -25,7 +25,6 @@
icons/menu/rss.png
icons/other/about.png
icons/other/feed.png
- icons/other/progress.gif
icons/other/bigstar.png
icons/theme/unsortedbookmarks.png
icons/locationbar/safe.png
@@ -81,5 +80,6 @@
icons/theme/collapse.png
icons/theme/speeddial.png
icons/theme/view-restore.png
+ icons/other/loading.png
diff --git a/src/lib/data/icons/other/loading.png b/src/lib/data/icons/other/loading.png
new file mode 100644
index 000000000..fa7f059fa
Binary files /dev/null and b/src/lib/data/icons/other/loading.png differ
diff --git a/src/lib/data/icons/other/progress.gif b/src/lib/data/icons/other/progress.gif
deleted file mode 100644
index 4e2de7743..000000000
Binary files a/src/lib/data/icons/other/progress.gif and /dev/null differ
diff --git a/src/lib/lib.pro b/src/lib/lib.pro
index 607c835ba..9a6a1978b 100644
--- a/src/lib/lib.pro
+++ b/src/lib/lib.pro
@@ -261,7 +261,8 @@ SOURCES += \
app/profilemanager.cpp \
app/mainmenu.cpp \
tools/sqldatabase.cpp \
- navigation/completer/locationcompleterrefreshjob.cpp
+ navigation/completer/locationcompleterrefreshjob.cpp \
+ webview/tabicon.cpp
HEADERS += \
@@ -463,7 +464,8 @@ HEADERS += \
app/profilemanager.h \
app/mainmenu.h \
tools/sqldatabase.h \
- navigation/completer/locationcompleterrefreshjob.h
+ navigation/completer/locationcompleterrefreshjob.h \
+ webview/tabicon.h
FORMS += \
preferences/autofillmanager.ui \
diff --git a/src/lib/webview/tabbedwebview.cpp b/src/lib/webview/tabbedwebview.cpp
index e9f1dbe32..43c281437 100644
--- a/src/lib/webview/tabbedwebview.cpp
+++ b/src/lib/webview/tabbedwebview.cpp
@@ -52,7 +52,6 @@ TabbedWebView::TabbedWebView(BrowserWindow* window, WebTab* webTab)
connect(this, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl)));
connect(this, SIGNAL(titleChanged(QString)), this, SLOT(titleChanged()));
- connect(this, SIGNAL(iconChanged()), this, SLOT(showIcon()));
connect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString)));
}
@@ -131,8 +130,6 @@ void TabbedWebView::userLoadAction(const QUrl &url)
void TabbedWebView::slotLoadStarted()
{
- tabWidget()->startTabAnimation(tabIndex());
-
if (title().isNull()) {
tabWidget()->setTabText(tabIndex(), tr("Loading..."));
}
@@ -142,9 +139,6 @@ void TabbedWebView::slotLoadStarted()
void TabbedWebView::slotLoadFinished()
{
- tabWidget()->stopTabAnimation(tabIndex());
-
- showIcon();
QHostInfo::lookupHost(url().host(), this, SLOT(setIp(QHostInfo)));
if (isCurrent()) {
@@ -176,20 +170,6 @@ void TabbedWebView::titleChanged()
tabWidget()->setTabText(tabIndex(), t);
}
-void TabbedWebView::showIcon()
-{
- if (isLoading()) {
- return;
- }
-
- QIcon icon_ = icon();
- if (icon_.isNull()) {
- icon_ = IconProvider::emptyWebIcon();
- }
-
- tabWidget()->setTabIcon(tabIndex(), icon_);
-}
-
void TabbedWebView::linkHovered(const QString &link, const QString &title, const QString &content)
{
Q_UNUSED(title)
diff --git a/src/lib/webview/tabbedwebview.h b/src/lib/webview/tabbedwebview.h
index 218c8cfc3..ad8a9c975 100644
--- a/src/lib/webview/tabbedwebview.h
+++ b/src/lib/webview/tabbedwebview.h
@@ -60,7 +60,6 @@ public slots:
void setAsCurrentTab();
void stop();
- void showIcon();
void slotLoadStarted();
void loadProgress(int prog);
diff --git a/src/lib/webview/tabicon.cpp b/src/lib/webview/tabicon.cpp
new file mode 100644
index 000000000..fc56cb45a
--- /dev/null
+++ b/src/lib/webview/tabicon.cpp
@@ -0,0 +1,107 @@
+/* ============================================================
+* QupZilla - WebKit based browser
+* Copyright (C) 2014 David Rosca
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+* ============================================================ */
+#include "tabicon.h"
+#include "webtab.h"
+#include "tabbedwebview.h"
+
+#include
+
+#define ANIMATION_INTERVAL 70
+
+TabIcon::TabIcon(QWidget* parent)
+ : QWidget(parent)
+ , m_tab(0)
+ , m_currentFrame(0)
+ , m_animationRunning(false)
+{
+ setObjectName(QSL("tab-icon"));
+
+ m_animationImage = QImage(QSL(":icons/other/loading.png"));
+ m_framesCount = m_animationImage.width() / 16;
+
+ m_updateTimer = new QTimer(this);
+ m_updateTimer->setInterval(ANIMATION_INTERVAL);
+ connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateAnimationFrame()));
+
+ resize(16, 16);
+}
+
+void TabIcon::setWebTab(WebTab* tab)
+{
+ m_tab = tab;
+
+ connect(m_tab->view(), SIGNAL(loadStarted()), this, SLOT(showLoadingAnimation()));
+ connect(m_tab->view(), SIGNAL(loadFinished(bool)), this, SLOT(hideLoadingAnimation()));
+ connect(m_tab->view(), SIGNAL(iconChanged()), this, SLOT(showIcon()));
+
+ showIcon();
+}
+
+void TabIcon::setIcon(const QIcon &icon)
+{
+ m_siteImage = icon.pixmap(16).toImage();
+ update();
+}
+
+void TabIcon::showLoadingAnimation()
+{
+ m_currentFrame = 0;
+
+ // Start animation delayed with 100 ms
+ m_updateTimer->setInterval(100);
+ m_updateTimer->start();
+}
+
+void TabIcon::hideLoadingAnimation()
+{
+ m_animationRunning = false;
+
+ m_updateTimer->stop();
+ showIcon();
+}
+
+void TabIcon::showIcon()
+{
+ m_siteImage = m_tab->icon().pixmap(16).toImage();
+ update();
+}
+
+void TabIcon::updateAnimationFrame()
+{
+ if (!m_animationRunning) {
+ m_animationRunning = true;
+ m_updateTimer->setInterval(ANIMATION_INTERVAL);
+ }
+
+ update();
+ m_currentFrame = (m_currentFrame + 1) % m_framesCount;
+}
+
+void TabIcon::paintEvent(QPaintEvent* event)
+{
+ Q_UNUSED(event);
+
+ QPainter p(this);
+
+ if (m_animationRunning) {
+ p.drawImage(0, 0, m_animationImage, m_currentFrame * 16, 0, 16, 16);
+ }
+ else {
+ p.drawImage(0, 0, m_siteImage);
+ }
+}
diff --git a/src/lib/webview/tabicon.h b/src/lib/webview/tabicon.h
new file mode 100644
index 000000000..b3eb8c745
--- /dev/null
+++ b/src/lib/webview/tabicon.h
@@ -0,0 +1,60 @@
+/* ============================================================
+* QupZilla - WebKit based browser
+* Copyright (C) 2014 David Rosca
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+* ============================================================ */
+#ifndef TABICON_H
+#define TABICON_H
+
+#include
+#include
+
+#include "qzcommon.h"
+
+class QTimer;
+
+class WebTab;
+
+class QUPZILLA_EXPORT TabIcon : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit TabIcon(QWidget* parent = 0);
+
+ void setWebTab(WebTab* tab);
+ void setIcon(const QIcon &icon);
+
+private slots:
+ void showIcon();
+ void showLoadingAnimation();
+ void hideLoadingAnimation();
+
+ void updateAnimationFrame();
+
+private:
+ void paintEvent(QPaintEvent* event);
+
+ WebTab* m_tab;
+ QTimer* m_updateTimer;
+
+ QImage m_siteImage;
+ QImage m_animationImage;
+ int m_currentFrame;
+ int m_framesCount;
+ bool m_animationRunning;
+};
+
+#endif // TABICON_H
diff --git a/src/lib/webview/tabwidget.cpp b/src/lib/webview/tabwidget.cpp
index 4670449f6..f6d1c0f73 100644
--- a/src/lib/webview/tabwidget.cpp
+++ b/src/lib/webview/tabwidget.cpp
@@ -33,6 +33,7 @@
#include "datapaths.h"
#include "qzsettings.h"
#include "qtwin.h"
+#include "tabicon.h"
#include
#include
@@ -219,6 +220,19 @@ WebTab* TabWidget::weTab(int index)
return qobject_cast(widget(index));
}
+TabIcon* TabWidget::tabIcon(int index)
+{
+ TabIcon* icon = qobject_cast(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition()));
+
+ if (!icon) {
+ icon = new TabIcon(this);
+ icon->setWebTab(weTab(index));
+ m_tabBar->setTabButton(index, m_tabBar->iconButtonPosition(), icon);
+ }
+
+ return icon;
+}
+
void TabWidget::showButtons()
{
m_buttonListTabs->show();
@@ -433,13 +447,6 @@ int TabWidget::addView(WebTab* tab)
int index = addTab(tab, QString());
setTabText(index, tab->title());
- if (!tab->isLoading()) {
- setTabIcon(index, tab->icon());
- }
- else {
- startTabAnimation(index);
- }
-
connect(tab->view(), SIGNAL(wantsCloseTab(int)), this, SLOT(closeTab(int)));
connect(tab->view(), SIGNAL(changed()), this, SIGNAL(changed()));
connect(tab->view(), SIGNAL(ipChanged(QString)), m_window->ipLabel(), SLOT(setText(QString)));
@@ -554,43 +561,6 @@ void TabWidget::tabMoved(int before, int after)
m_lastTabIndex = before;
}
-void TabWidget::startTabAnimation(int index)
-{
- if (!validIndex(index)) {
- return;
- }
-
- QLabel* label = qobject_cast(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition()));
- if (!label) {
- label = new QLabel();
- label->setObjectName("tab-icon");
- m_tabBar->setTabButton(index, m_tabBar->iconButtonPosition(), label);
- }
-
- if (label->movie()) {
- label->movie()->start();
- return;
- }
-
- QMovie* movie = new QMovie(":icons/other/progress.gif", QByteArray(), label);
- movie->start();
-
- label->setMovie(movie);
-}
-
-void TabWidget::stopTabAnimation(int index)
-{
- if (!validIndex(index)) {
- return;
- }
-
- QLabel* label = qobject_cast(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition()));
-
- if (label && label->movie()) {
- label->movie()->stop();
- }
-}
-
void TabWidget::setCurrentIndex(int index)
{
m_lastTabIndex = currentIndex();
@@ -604,15 +574,7 @@ void TabWidget::setTabIcon(int index, const QIcon &icon)
return;
}
- QLabel* label = qobject_cast(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition()));
- if (!label) {
- label = new QLabel();
- label->setObjectName("tab-icon");
- label->resize(16, 16);
- m_tabBar->setTabButton(index, m_tabBar->iconButtonPosition(), label);
- }
-
- label->setPixmap(icon.pixmap(16, 16));
+ tabIcon(index)->setIcon(icon);
}
void TabWidget::setTabText(int index, const QString &text)
diff --git a/src/lib/webview/tabwidget.h b/src/lib/webview/tabwidget.h
index 30ab412fb..c7d815b25 100644
--- a/src/lib/webview/tabwidget.h
+++ b/src/lib/webview/tabwidget.h
@@ -34,6 +34,7 @@ class QMenu;
class BrowserWindow;
class TabbedWebView;
class TabBar;
+class TabIcon;
class TabWidget;
class ClosedTabsManager;
@@ -79,9 +80,6 @@ public:
void savePinnedTabs();
void restorePinnedTabs();
- void startTabAnimation(int index);
- void stopTabAnimation(int index);
-
void setCurrentIndex(int index);
void setTabIcon(int index, const QIcon &icon);
void setTabText(int index, const QString &text);
@@ -145,6 +143,8 @@ private:
WebTab* weTab();
WebTab* weTab(int index);
+ TabIcon* tabIcon(int index);
+
inline bool validIndex(int index) const { return index >= 0 && index < count(); }
bool m_dontCloseWithOneTab;