1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-20 18:56:34 +01:00

[LoadingAnimation] New loading animation

Instead of using QMovie with GIF, one PNG file with all
frames is now animated.
Fixes issue with bad transparent background of previous GIF
animation.
This commit is contained in:
nowrep 2014-03-17 10:43:18 +01:00
parent ebd501c9cd
commit 5b6b6c6eaf
10 changed files with 190 additions and 80 deletions

View File

@ -25,7 +25,6 @@
<file>icons/menu/rss.png</file> <file>icons/menu/rss.png</file>
<file>icons/other/about.png</file> <file>icons/other/about.png</file>
<file>icons/other/feed.png</file> <file>icons/other/feed.png</file>
<file>icons/other/progress.gif</file>
<file>icons/other/bigstar.png</file> <file>icons/other/bigstar.png</file>
<file>icons/theme/unsortedbookmarks.png</file> <file>icons/theme/unsortedbookmarks.png</file>
<file>icons/locationbar/safe.png</file> <file>icons/locationbar/safe.png</file>
@ -81,5 +80,6 @@
<file>icons/theme/collapse.png</file> <file>icons/theme/collapse.png</file>
<file>icons/theme/speeddial.png</file> <file>icons/theme/speeddial.png</file>
<file>icons/theme/view-restore.png</file> <file>icons/theme/view-restore.png</file>
<file>icons/other/loading.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -261,7 +261,8 @@ SOURCES += \
app/profilemanager.cpp \ app/profilemanager.cpp \
app/mainmenu.cpp \ app/mainmenu.cpp \
tools/sqldatabase.cpp \ tools/sqldatabase.cpp \
navigation/completer/locationcompleterrefreshjob.cpp navigation/completer/locationcompleterrefreshjob.cpp \
webview/tabicon.cpp
HEADERS += \ HEADERS += \
@ -463,7 +464,8 @@ HEADERS += \
app/profilemanager.h \ app/profilemanager.h \
app/mainmenu.h \ app/mainmenu.h \
tools/sqldatabase.h \ tools/sqldatabase.h \
navigation/completer/locationcompleterrefreshjob.h navigation/completer/locationcompleterrefreshjob.h \
webview/tabicon.h
FORMS += \ FORMS += \
preferences/autofillmanager.ui \ preferences/autofillmanager.ui \

View File

@ -52,7 +52,6 @@ TabbedWebView::TabbedWebView(BrowserWindow* window, WebTab* webTab)
connect(this, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl))); connect(this, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl)));
connect(this, SIGNAL(titleChanged(QString)), this, SLOT(titleChanged())); 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))); connect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString)));
} }
@ -131,8 +130,6 @@ void TabbedWebView::userLoadAction(const QUrl &url)
void TabbedWebView::slotLoadStarted() void TabbedWebView::slotLoadStarted()
{ {
tabWidget()->startTabAnimation(tabIndex());
if (title().isNull()) { if (title().isNull()) {
tabWidget()->setTabText(tabIndex(), tr("Loading...")); tabWidget()->setTabText(tabIndex(), tr("Loading..."));
} }
@ -142,9 +139,6 @@ void TabbedWebView::slotLoadStarted()
void TabbedWebView::slotLoadFinished() void TabbedWebView::slotLoadFinished()
{ {
tabWidget()->stopTabAnimation(tabIndex());
showIcon();
QHostInfo::lookupHost(url().host(), this, SLOT(setIp(QHostInfo))); QHostInfo::lookupHost(url().host(), this, SLOT(setIp(QHostInfo)));
if (isCurrent()) { if (isCurrent()) {
@ -176,20 +170,6 @@ void TabbedWebView::titleChanged()
tabWidget()->setTabText(tabIndex(), t); 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) void TabbedWebView::linkHovered(const QString &link, const QString &title, const QString &content)
{ {
Q_UNUSED(title) Q_UNUSED(title)

View File

@ -60,7 +60,6 @@ public slots:
void setAsCurrentTab(); void setAsCurrentTab();
void stop(); void stop();
void showIcon();
void slotLoadStarted(); void slotLoadStarted();
void loadProgress(int prog); void loadProgress(int prog);

107
src/lib/webview/tabicon.cpp Normal file
View File

@ -0,0 +1,107 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2014 David Rosca <nowrep@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
* ============================================================ */
#include "tabicon.h"
#include "webtab.h"
#include "tabbedwebview.h"
#include <QTimer>
#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);
}
}

60
src/lib/webview/tabicon.h Normal file
View File

@ -0,0 +1,60 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2014 David Rosca <nowrep@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
* ============================================================ */
#ifndef TABICON_H
#define TABICON_H
#include <QWidget>
#include <QImage>
#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

View File

@ -33,6 +33,7 @@
#include "datapaths.h" #include "datapaths.h"
#include "qzsettings.h" #include "qzsettings.h"
#include "qtwin.h" #include "qtwin.h"
#include "tabicon.h"
#include <QTimer> #include <QTimer>
#include <QMovie> #include <QMovie>
@ -219,6 +220,19 @@ WebTab* TabWidget::weTab(int index)
return qobject_cast<WebTab*>(widget(index)); return qobject_cast<WebTab*>(widget(index));
} }
TabIcon* TabWidget::tabIcon(int index)
{
TabIcon* icon = qobject_cast<TabIcon*>(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() void TabWidget::showButtons()
{ {
m_buttonListTabs->show(); m_buttonListTabs->show();
@ -433,13 +447,6 @@ int TabWidget::addView(WebTab* tab)
int index = addTab(tab, QString()); int index = addTab(tab, QString());
setTabText(index, tab->title()); 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(wantsCloseTab(int)), this, SLOT(closeTab(int)));
connect(tab->view(), SIGNAL(changed()), this, SIGNAL(changed())); connect(tab->view(), SIGNAL(changed()), this, SIGNAL(changed()));
connect(tab->view(), SIGNAL(ipChanged(QString)), m_window->ipLabel(), SLOT(setText(QString))); 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; m_lastTabIndex = before;
} }
void TabWidget::startTabAnimation(int index)
{
if (!validIndex(index)) {
return;
}
QLabel* label = qobject_cast<QLabel*>(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<QLabel*>(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition()));
if (label && label->movie()) {
label->movie()->stop();
}
}
void TabWidget::setCurrentIndex(int index) void TabWidget::setCurrentIndex(int index)
{ {
m_lastTabIndex = currentIndex(); m_lastTabIndex = currentIndex();
@ -604,15 +574,7 @@ void TabWidget::setTabIcon(int index, const QIcon &icon)
return; return;
} }
QLabel* label = qobject_cast<QLabel*>(m_tabBar->tabButton(index, m_tabBar->iconButtonPosition())); tabIcon(index)->setIcon(icon);
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));
} }
void TabWidget::setTabText(int index, const QString &text) void TabWidget::setTabText(int index, const QString &text)

View File

@ -34,6 +34,7 @@ class QMenu;
class BrowserWindow; class BrowserWindow;
class TabbedWebView; class TabbedWebView;
class TabBar; class TabBar;
class TabIcon;
class TabWidget; class TabWidget;
class ClosedTabsManager; class ClosedTabsManager;
@ -79,9 +80,6 @@ public:
void savePinnedTabs(); void savePinnedTabs();
void restorePinnedTabs(); void restorePinnedTabs();
void startTabAnimation(int index);
void stopTabAnimation(int index);
void setCurrentIndex(int index); void setCurrentIndex(int index);
void setTabIcon(int index, const QIcon &icon); void setTabIcon(int index, const QIcon &icon);
void setTabText(int index, const QString &text); void setTabText(int index, const QString &text);
@ -145,6 +143,8 @@ private:
WebTab* weTab(); WebTab* weTab();
WebTab* weTab(int index); WebTab* weTab(int index);
TabIcon* tabIcon(int index);
inline bool validIndex(int index) const { return index >= 0 && index < count(); } inline bool validIndex(int index) const { return index >= 0 && index < count(); }
bool m_dontCloseWithOneTab; bool m_dontCloseWithOneTab;