1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-21 17:52:10 +02:00

Using QImage for storing icons in database.

- fixed issue on some pages when icon was shown correctly in
  locationbar, but not on tab
- using QImage for storing icons will help to have BookmarksModel
  in separate thread
- unfortunately, all currently saved icons won't be possible to load
  so I recommend erasing all icons (to not waste space in db)
This commit is contained in:
nowrep 2012-01-17 19:27:24 +01:00
parent b6ed9b83de
commit cb5242f98c
17 changed files with 91 additions and 65 deletions

View File

@ -13,3 +13,12 @@ int ProxyStyle::styleHint(StyleHint hint, const QStyleOption* option, const QWid
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
//int ProxyStyle::pixelMetric(PixelMetric metric, const QStyleOption* option, const QWidget* widget) const
//{
// if (metric == PM_TabBarTabHSpace) {
// return 8;
// }
// return QProxyStyle::pixelMetric(metric, option, widget);
//}

View File

@ -10,6 +10,7 @@ public:
explicit ProxyStyle();
int styleHint(StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const;
// int pixelMetric(PixelMetric metric, const QStyleOption* option, const QWidget* widget) const;
signals:

View File

@ -625,7 +625,7 @@ void QupZilla::aboutToShowBookmarksMenu()
while (query.next()) {
QString title = query.value(0).toString();
QUrl url = query.value(1).toUrl();
QIcon icon = IconProvider::iconFromBase64(query.value(2).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
@ -645,7 +645,7 @@ void QupZilla::aboutToShowBookmarksMenu()
while (query.next()) {
QString title = query.value(0).toString();
QUrl url = query.value(1).toUrl();
QIcon icon = IconProvider::iconFromBase64(query.value(2).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
@ -673,7 +673,7 @@ void QupZilla::aboutToShowBookmarksMenu()
while (query2.next()) {
QString title = query2.value(0).toString();
QUrl url = query2.value(1).toUrl();
QIcon icon = IconProvider::iconFromBase64(query2.value(2).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query2.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";

View File

@ -293,7 +293,7 @@ void BookmarksManager::refreshTable()
QUrl url = query.value(1).toUrl();
int id = query.value(2).toInt();
QString folder = query.value(3).toString();
QIcon icon = IconProvider::iconFromBase64(query.value(4).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(4).toByteArray()));
QTreeWidgetItem* item = new QTreeWidgetItem();
if (folder == "bookmarksMenu") {
folder = _bookmarksMenu;
@ -335,7 +335,7 @@ void BookmarksManager::refreshTable()
QString title = query2.value(0).toString();
QUrl url = query2.value(1).toUrl();
int id = query2.value(2).toInt();
QIcon icon = IconProvider::iconFromBase64(query2.value(3).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query2.value(3).toByteArray()));
QTreeWidgetItem* item = new QTreeWidgetItem(newItem);
item->setText(0, title);
@ -363,7 +363,7 @@ void BookmarksManager::addBookmark(const BookmarksModel::Bookmark &bookmark)
item->setText(0, bookmark.title);
item->setText(1, bookmark.url.toEncoded());
item->setWhatsThis(1, QString::number(bookmark.id));
item->setIcon(0, bookmark.icon);
item->setIcon(0, IconProvider::iconFromImage(bookmark.image));
item->setToolTip(0, bookmark.title);
item->setToolTip(1, bookmark.url.toEncoded());
item->setFlags(item->flags() | Qt::ItemIsEditable);

View File

@ -115,7 +115,7 @@ BookmarksModel::Bookmark BookmarksModel::getBookmark(int id)
bookmark.url = query.value(0).toUrl();
bookmark.title = query.value(1).toString();
bookmark.folder = query.value(2).toString();
bookmark.icon = IconProvider::iconFromBase64(query.value(3).toByteArray());
bookmark.image = QImage::fromData(query.value(3).toByteArray());
bookmark.inSubfolder = isSubfolder(bookmark.folder);
}
return bookmark;
@ -127,12 +127,18 @@ bool BookmarksModel::saveBookmark(const QUrl &url, const QString &title, const Q
return false;
}
QImage image = icon.pixmap(16, 16).toImage();
QSqlQuery query;
query.prepare("INSERT INTO bookmarks (url, title, folder, icon) VALUES (?,?,?,?)");
query.bindValue(0, url.toString());
query.bindValue(1, title);
query.bindValue(2, folder);
query.bindValue(3, IconProvider::iconToBase64(icon));
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");
query.bindValue(3, buffer.data());
query.exec();
Bookmark bookmark;
@ -140,7 +146,7 @@ bool BookmarksModel::saveBookmark(const QUrl &url, const QString &title, const Q
bookmark.url = url;
bookmark.title = title;
bookmark.folder = folder;
bookmark.icon = icon;
bookmark.image = image;
bookmark.inSubfolder = isSubfolder(bookmark.folder);
emit bookmarkAdded(bookmark);
@ -168,7 +174,7 @@ bool BookmarksModel::removeBookmark(int id)
bookmark.url = query.value(0).toUrl();
bookmark.title = query.value(1).toString();
bookmark.folder = query.value(2).toString();
bookmark.icon = IconProvider::iconFromBase64(query.value(3).toByteArray());
bookmark.image = QImage::fromData(query.value(3).toByteArray());
bookmark.inSubfolder = isSubfolder(bookmark.folder);
if (!query.exec("DELETE FROM bookmarks WHERE id = " + QString::number(id))) {
@ -227,7 +233,7 @@ bool BookmarksModel::editBookmark(int id, const QString &title, const QUrl &url,
before.title = query.value(0).toString();
before.url = query.value(1).toUrl();
before.folder = query.value(2).toString();
before.icon = IconProvider::iconFromBase64(query.value(3).toByteArray());
before.image = QImage::fromData(query.value(3).toByteArray());
before.inSubfolder = isSubfolder(before.folder);
Bookmark after;
@ -235,7 +241,7 @@ bool BookmarksModel::editBookmark(int id, const QString &title, const QUrl &url,
after.title = title.isEmpty() ? before.title : title;
after.url = url.isEmpty() ? before.url : url;
after.folder = folder.isEmpty() ? before.folder : folder;
after.icon = before.icon;
after.image = before.image;
after.inSubfolder = isSubfolder(after.folder);
query.prepare("UPDATE bookmarks SET title=?, url=?, folder=? WHERE id = ?");
@ -349,7 +355,7 @@ QList<Bookmark> BookmarksModel::folderBookmarks(const QString &name)
bookmark.url = query.value(1).toUrl();
bookmark.title = query.value(2).toString();
bookmark.folder = query.value(3).toString();
bookmark.icon = IconProvider::iconFromBase64(query.value(4).toByteArray());
bookmark.image = QImage::fromData(query.value(4).toByteArray());
bookmark.inSubfolder = isSubfolder(bookmark.folder);
list.append(bookmark);

View File

@ -40,7 +40,7 @@ public:
QString title;
QString folder;
QUrl url;
QIcon icon;
QImage image;
bool inSubfolder;
Bookmark() {

View File

@ -321,7 +321,7 @@ void BookmarksToolbar::addBookmark(const BookmarksModel::Bookmark &bookmark)
ToolButton* button = new ToolButton(this);
button->setText(title);
button->setData(v);
button->setIcon(bookmark.icon);
button->setIcon(IconProvider::iconFromImage(bookmark.image));
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
button->setToolTip(bookmark.url.toEncoded());
button->setAutoRaise(true);
@ -389,7 +389,7 @@ void BookmarksToolbar::bookmarkEdited(const BookmarksModel::Bookmark &before, co
button->setText(title);
button->setData(v);
button->setIcon(after.icon);
button->setIcon(IconProvider::iconFromImage(after.image));
button->setToolTip(after.url.toEncoded());
button->setWhatsThis(after.title);
return;
@ -407,7 +407,7 @@ void BookmarksToolbar::refreshBookmarks()
bookmark.id = query.value(0).toInt();
bookmark.title = query.value(1).toString();
bookmark.url = query.value(2).toUrl();
bookmark.icon = IconProvider::iconFromBase64(query.value(3).toByteArray());
bookmark.image = QImage::fromData(query.value(3).toByteArray());
bookmark.folder = "bookmarksToolbar";
QString title = bookmark.title;
if (title.length() > 15) {
@ -421,7 +421,7 @@ void BookmarksToolbar::refreshBookmarks()
ToolButton* button = new ToolButton(this);
button->setText(title);
button->setData(v);
button->setIcon(bookmark.icon);
button->setIcon(IconProvider::iconFromImage(bookmark.image));
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
button->setToolTip(bookmark.url.toEncoded());
button->setWhatsThis(bookmark.title);
@ -484,7 +484,7 @@ void BookmarksToolbar::aboutToShowFolderMenu()
b.title += "..";
}
Action* act = new Action(b.icon, b.title);
Action* act = new Action(IconProvider::iconFromImage(b.image), b.title);
act->setData(b.url);
connect(act, SIGNAL(triggered()), p_QupZilla, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), p_QupZilla, SLOT(loadActionUrlInNewNotSelectedTab()));

View File

@ -23,6 +23,7 @@
#include "htmlimporter.h"
#include "mainapplication.h"
#include "iconfetcher.h"
#include "iconprovider.h"
#include "networkmanager.h"
BookmarksImportDialog::BookmarksImportDialog(QWidget* parent)
@ -39,10 +40,6 @@ BookmarksImportDialog::BookmarksImportDialog(QWidget* parent)
connect(ui->chooseFile, SIGNAL(clicked()), this, SLOT(setFile()));
connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(close()));
connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(stopDownloading()));
HtmlImporter html(this);
html.setFile("/home/david/bookmarks.html");
html.exportBookmarks();
}
void BookmarksImportDialog::nextPage()
@ -169,7 +166,7 @@ void BookmarksImportDialog::iconFetched(const QIcon &icon)
foreach(BookmarksModel::Bookmark b, m_exportedBookmarks) {
if (b.url == url) {
m_exportedBookmarks.removeOne(b);
b.icon = icon;
b.image = icon.pixmap(16, 16).toImage();
m_exportedBookmarks.append(b);
break;
}
@ -266,8 +263,9 @@ void BookmarksImportDialog::addExportedBookmarks()
model->createFolder(m_exportedBookmarks.at(0).folder);
}
foreach(BookmarksModel::Bookmark b, m_exportedBookmarks)
model->saveBookmark(b.url, b.title, b.icon, b.folder);
foreach(BookmarksModel::Bookmark b, m_exportedBookmarks) {
model->saveBookmark(b.url, b.title, IconProvider::iconFromImage(b.image), b.folder);
}
qApp->restoreOverrideCursor();
}

Binary file not shown.

View File

@ -28,7 +28,7 @@
QIcon SearchEnginesManager::iconForSearchEngine(const QUrl &url)
{
QIcon ic = mApp->iconProvider()->iconForDomain(url);
QIcon ic = IconProvider::iconFromImage(mApp->iconProvider()->iconForDomain(url));
if (ic.isNull()) {
ic = QIcon(":icons/menu/search-icon.png");
}

View File

@ -77,7 +77,7 @@ void RSSManager::refreshTable()
while (query.next()) {
QUrl address = query.value(0).toUrl();
QString title = query.value(1).toString();
QIcon icon = IconProvider::iconFromBase64(query.value(2).toByteArray());
QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(2).toByteArray()));
TreeWidget* tree = new TreeWidget();
tree->setHeaderLabel(tr("News"));
tree->setContextMenuPolicy(Qt::CustomContextMenu);
@ -373,18 +373,20 @@ bool RSSManager::addRssFeed(const QString &address, const QString &title, const
QSqlQuery query;
query.exec("SELECT id FROM rss WHERE address='" + address + "'");
if (!query.next()) {
QImage image = icon.pixmap(16, 16).toImage();
QByteArray iconData;
if (icon.pixmap(16, 16).toImage() == QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic).toImage()) {
iconData = IconProvider::iconToBase64(QIcon(":icons/other/feed.png"));
}
else {
iconData = IconProvider::iconToBase64(icon);
if (image == QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic).toImage()) {
image.load(":icons/other/feed.png");
}
query.prepare("INSERT INTO rss (address, title, icon) VALUES(?,?,?)");
query.bindValue(0, address);
query.bindValue(1, title);
query.bindValue(2, iconData);
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");
query.bindValue(2, buffer.data());
mApp->dbWriter()->executeQuery(query);
return true;
}

View File

@ -126,7 +126,7 @@ void BookmarksSideBar::addBookmark(const BookmarksModel::Bookmark &bookmark)
item->setText(0, bookmark.title);
item->setText(1, bookmark.url.toEncoded());
item->setWhatsThis(0, QString::number(bookmark.id));
item->setIcon(0, bookmark.icon);
item->setIcon(0, IconProvider::iconFromImage(bookmark.image));
item->setToolTip(0, bookmark.url.toEncoded());
if (bookmark.folder != "unsorted") {

View File

@ -33,29 +33,27 @@ IconProvider::IconProvider(QObject* parent)
void IconProvider::saveIcon(WebView* view)
{
Icon item;
item.icon = view->icon();
item.image = view->icon().pixmap(16, 16).toImage();
item.url = view->url();
if (item.icon.isNull()) {
if (item.image.isNull()) {
return;
}
QPixmap iconPixmap = item.icon.pixmap(16, 16);
foreach(Icon ic, m_iconBuffer) {
if (ic.url == item.url && ic.icon.pixmap(16, 16).toImage() == iconPixmap.toImage()) {
if (ic.url == item.url && ic.image == item.image) {
return;
}
}
item.icon = QIcon(iconPixmap);
m_iconBuffer.append(item);
}
QIcon IconProvider::iconForUrl(const QUrl &url)
QImage IconProvider::iconForUrl(const QUrl &url)
{
foreach(Icon ic, m_iconBuffer) {
if (ic.url == url) {
return ic.icon;
return ic.image;
}
}
@ -64,27 +62,27 @@ QIcon IconProvider::iconForUrl(const QUrl &url)
query.bindValue(0, url.toEncoded(QUrl::RemoveFragment));
query.exec();
if (query.next()) {
return iconFromBase64(query.value(0).toByteArray());
return QImage::fromData(query.value(0).toByteArray());
}
return QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic);
return QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic).toImage();
}
QIcon IconProvider::iconForDomain(const QUrl &url)
QImage IconProvider::iconForDomain(const QUrl &url)
{
foreach(Icon ic, m_iconBuffer) {
if (ic.url.host() == url.host()) {
return ic.icon;
return ic.image;
}
}
QSqlQuery query;
query.exec("SELECT icon FROM icons WHERE url LIKE '%" + url.host() + "%'");
if (query.next()) {
return iconFromBase64(query.value(0).toByteArray());
return QImage::fromData(query.value(0).toByteArray());
}
return QIcon();
return QImage();
}
void IconProvider::saveIconsToDatabase()
@ -102,7 +100,11 @@ void IconProvider::saveIconsToDatabase()
query.prepare("INSERT INTO icons (icon, url) VALUES (?,?)");
}
query.bindValue(0, iconToBase64(ic.icon));
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
ic.image.save(&buffer, "PNG");
query.bindValue(0, buffer.data());
query.bindValue(1, ic.url.toEncoded(QUrl::RemoveFragment));
mApp->dbWriter()->executeQuery(query);
}
@ -200,6 +202,11 @@ QIcon IconProvider::fromTheme(const QString &icon)
}
}
QIcon IconProvider::iconFromImage(const QImage &image)
{
return QIcon(QPixmap::fromImage(image));
}
QIcon IconProvider::iconFromBase64(const QByteArray &data)
{
QIcon image;

View File

@ -18,7 +18,7 @@
#ifndef ICONPROVIDER_H
#define ICONPROVIDER_H
#define _iconForUrl(url) mApp->iconProvider()->iconForUrl(url)
#define _iconForUrl(url) IconProvider::iconFromImage(mApp->iconProvider()->iconForUrl(url))
#include <QObject>
#include <QIcon>
@ -36,12 +36,14 @@ public:
explicit IconProvider(QObject* parent = 0);
~IconProvider();
void saveIcon(WebView* view);
QIcon iconForUrl(const QUrl &url);
QIcon iconForDomain(const QUrl &url);
void clearIconDatabase();
void saveIcon(WebView* view);
QImage iconForUrl(const QUrl &url);
QImage iconForDomain(const QUrl &url);
static QIcon iconFromImage(const QImage &image);
static QIcon iconFromBase64(const QByteArray &data);
static QByteArray iconToBase64(const QIcon &icon);
@ -59,7 +61,7 @@ private:
struct Icon {
QUrl url;
QIcon icon;
QImage image;
};
QList<Icon> m_iconBuffer;

View File

@ -210,6 +210,10 @@ bool WebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest &r
}
}
if (!frame && type != QWebPage::NavigationTypeOther) {
qDebug() << "coming from javascript";
}
// TabWidget::OpenUrlIn openIn= frame ? TabWidget::CurrentTab: TabWidget::NewTab;
bool accept = QWebPage::acceptNavigationRequest(frame, request, type);
@ -242,6 +246,8 @@ QWebPage* WebPage::createWindow(QWebPage::WebWindowType type)
// QWebView* view = new QWebView();
// view->show();
// return view->page();
qDebug() << "createWindow";
Q_UNUSED(type);
int index = p_QupZilla->tabWidget()->addView(QUrl(), tr("New tab"), TabWidget::CleanSelectedPage);
return p_QupZilla->weView(index)->page();

View File

@ -101,11 +101,15 @@ void WebView::slotIconChanged()
{
m_siteIcon = icon();
if (url().scheme() == "file" || title().contains(tr("Failed loading page"))) {
if (url().scheme() == "file" || url().scheme() == "qupzilla" || title().contains(tr("Failed loading page"))) {
return;
}
mApp->iconProvider()->saveIcon(this);
if (!m_isLoading) {
iconChanged();
}
}
void WebView::copyText()
@ -234,11 +238,6 @@ void WebView::loadFinished(bool state)
iconChanged();
m_lastUrl = url();
//Icon is sometimes not available at the moment of finished loading
if (icon().isNull()) {
QTimer::singleShot(1000, this, SLOT(iconChanged()));
}
titleChanged();
mApp->autoFill()->completePage(this);
QHostInfo::lookupHost(url().host(), this, SLOT(setIp(QHostInfo)));
@ -259,7 +258,6 @@ QLabel* WebView::animationLoading(int index, bool addMovie)
QLabel* loadingAnimation = qobject_cast<QLabel*>(tabWidget()->getTabBar()->tabButton(index, QTabBar::LeftSide));
if (!loadingAnimation) {
loadingAnimation = new QLabel();
// loadingAnimation->setStyleSheet("margin: 0px; padding: 0px; width: 16px; height: 16px;");
}
if (addMovie && !loadingAnimation->movie()) {
QMovie* movie = new QMovie(":icons/other/progress.gif", QByteArray(), loadingAnimation);
@ -315,8 +313,6 @@ void WebView::titleChanged()
void WebView::iconChanged()
{
emit siteIconChanged();
if (m_isLoading) {
return;
}

View File

@ -72,7 +72,6 @@ public:
signals:
void showUrl(QUrl url);
void siteIconChanged();
void wantsCloseTab(int index);
void changed();
void ipChanged(QString ip);