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;