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:
parent
ebd501c9cd
commit
5b6b6c6eaf
@ -25,7 +25,6 @@
|
||||
<file>icons/menu/rss.png</file>
|
||||
<file>icons/other/about.png</file>
|
||||
<file>icons/other/feed.png</file>
|
||||
<file>icons/other/progress.gif</file>
|
||||
<file>icons/other/bigstar.png</file>
|
||||
<file>icons/theme/unsortedbookmarks.png</file>
|
||||
<file>icons/locationbar/safe.png</file>
|
||||
@ -81,5 +80,6 @@
|
||||
<file>icons/theme/collapse.png</file>
|
||||
<file>icons/theme/speeddial.png</file>
|
||||
<file>icons/theme/view-restore.png</file>
|
||||
<file>icons/other/loading.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
BIN
src/lib/data/icons/other/loading.png
Normal file
BIN
src/lib/data/icons/other/loading.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.0 KiB |
@ -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 \
|
||||
|
@ -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)
|
||||
|
@ -60,7 +60,6 @@ public slots:
|
||||
void setAsCurrentTab();
|
||||
|
||||
void stop();
|
||||
void showIcon();
|
||||
|
||||
void slotLoadStarted();
|
||||
void loadProgress(int prog);
|
||||
|
107
src/lib/webview/tabicon.cpp
Normal file
107
src/lib/webview/tabicon.cpp
Normal 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
60
src/lib/webview/tabicon.h
Normal 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
|
@ -33,6 +33,7 @@
|
||||
#include "datapaths.h"
|
||||
#include "qzsettings.h"
|
||||
#include "qtwin.h"
|
||||
#include "tabicon.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QMovie>
|
||||
@ -219,6 +220,19 @@ WebTab* TabWidget::weTab(int 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()
|
||||
{
|
||||
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<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)
|
||||
{
|
||||
m_lastTabIndex = currentIndex();
|
||||
@ -604,15 +574,7 @@ void TabWidget::setTabIcon(int index, const QIcon &icon)
|
||||
return;
|
||||
}
|
||||
|
||||
QLabel* label = qobject_cast<QLabel*>(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)
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user