2011-12-04 16:54:57 +01:00
|
|
|
/* ============================================================
|
|
|
|
* QupZilla - WebKit based browser
|
2012-01-01 15:29:55 +01:00
|
|
|
* Copyright (C) 2010-2012 David Rosca <nowrep@gmail.com>
|
2011-12-04 16:54:57 +01:00
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
* ============================================================ */
|
2011-12-02 23:25:27 +01:00
|
|
|
#include "speeddial.h"
|
|
|
|
#include "mainapplication.h"
|
|
|
|
#include "pagethumbnailer.h"
|
2012-01-11 21:58:25 +01:00
|
|
|
#include "settings.h"
|
2011-12-02 23:25:27 +01:00
|
|
|
|
2012-02-29 18:33:50 +01:00
|
|
|
#include <QDir>
|
|
|
|
#include <QCryptographicHash>
|
|
|
|
#include <QFileDialog>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QWebFrame>
|
|
|
|
#include <QWebPage>
|
2012-04-12 15:24:57 +02:00
|
|
|
#include <QImage>
|
2012-02-29 18:33:50 +01:00
|
|
|
|
2012-02-05 17:13:08 +01:00
|
|
|
#define ENSURE_LOADED if (!m_loaded) loadSettings();
|
|
|
|
|
2011-12-02 23:25:27 +01:00
|
|
|
SpeedDial::SpeedDial(QObject* parent)
|
|
|
|
: QObject(parent)
|
2012-01-21 20:27:45 +01:00
|
|
|
, m_maxPagesInRow(4)
|
|
|
|
, m_sizeOfSpeedDials(231)
|
2011-12-02 23:25:27 +01:00
|
|
|
, m_loaded(false)
|
|
|
|
, m_regenerateScript(true)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::loadSettings()
|
|
|
|
{
|
|
|
|
m_loaded = true;
|
|
|
|
|
2012-01-11 21:58:25 +01:00
|
|
|
Settings settings;
|
2011-12-02 23:25:27 +01:00
|
|
|
settings.beginGroup("SpeedDial");
|
2012-02-05 16:00:23 +01:00
|
|
|
QString allPages = settings.value("pages", "").toString();
|
2012-01-18 21:09:27 +01:00
|
|
|
m_backgroundImage = settings.value("background", "").toString();
|
|
|
|
m_backgroundImageSize = settings.value("backsize", "auto").toString();
|
2012-01-18 20:10:04 +01:00
|
|
|
m_maxPagesInRow = settings.value("pagesrow", 4).toInt();
|
2012-01-19 18:05:21 +01:00
|
|
|
m_sizeOfSpeedDials = settings.value("sdsize", 231).toInt();
|
2011-12-02 23:25:27 +01:00
|
|
|
settings.endGroup();
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
if (allPages.isEmpty()) {
|
|
|
|
allPages = "url:\"http://www.google.com\"|title:\"Google\";"
|
|
|
|
"url:\"http://www.qupzilla.com\"|title:\"QupZilla\";"
|
|
|
|
"url:\"http://blog.qupzilla.com\"|title:\"QupZilla Blog\";"
|
|
|
|
"url:\"https://github.com/nowrep/QupZilla\"|title:\"QupZilla GitHub\";"
|
2012-03-05 11:30:18 +01:00
|
|
|
"url:\"https://facebook.com\"|title:\"Facebook\";";
|
2011-12-04 20:35:49 +01:00
|
|
|
}
|
2012-02-05 16:00:23 +01:00
|
|
|
changed(allPages);
|
2011-12-04 20:35:49 +01:00
|
|
|
|
2012-04-04 18:48:54 +02:00
|
|
|
m_thumbnailsDir = mApp->currentProfilePath() + "thumbnails/";
|
2011-12-02 23:25:27 +01:00
|
|
|
|
|
|
|
// If needed, create thumbnails directory
|
|
|
|
if (!QDir(m_thumbnailsDir).exists()) {
|
2012-04-04 18:48:54 +02:00
|
|
|
QDir(mApp->currentProfilePath()).mkdir("thumbnails");
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::saveSettings()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
if (m_webPages.isEmpty()) {
|
2012-01-08 10:56:50 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-01-11 21:58:25 +01:00
|
|
|
Settings settings;
|
2011-12-02 23:25:27 +01:00
|
|
|
settings.beginGroup("SpeedDial");
|
2012-02-05 16:00:23 +01:00
|
|
|
settings.setValue("pages", generateAllPages());
|
2012-01-18 21:09:27 +01:00
|
|
|
settings.setValue("background", m_backgroundImage);
|
|
|
|
settings.setValue("backsize", m_backgroundImageSize);
|
2012-01-18 20:10:04 +01:00
|
|
|
settings.setValue("pagesrow", m_maxPagesInRow);
|
2012-01-19 18:05:21 +01:00
|
|
|
settings.setValue("sdsize", m_sizeOfSpeedDials);
|
2011-12-02 23:25:27 +01:00
|
|
|
settings.endGroup();
|
|
|
|
}
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
SpeedDial::Page SpeedDial::pageForUrl(const QUrl &url)
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
const QString &urlString = url.toString();
|
|
|
|
|
|
|
|
foreach(const Page & page, m_webPages) {
|
|
|
|
if (page.url == urlString) {
|
|
|
|
return page;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Page();
|
|
|
|
}
|
|
|
|
|
|
|
|
QUrl SpeedDial::urlForShortcut(int key)
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
if (key < 0 || m_webPages.count() <= key) {
|
|
|
|
return QUrl();
|
|
|
|
}
|
|
|
|
|
|
|
|
return QUrl::fromEncoded(m_webPages.at(key).url.toUtf8());
|
|
|
|
}
|
|
|
|
|
2011-12-02 23:25:27 +01:00
|
|
|
void SpeedDial::addWebFrame(QWebFrame* frame)
|
|
|
|
{
|
|
|
|
if (!m_webFrames.contains(frame)) {
|
|
|
|
m_webFrames.append(frame);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-24 13:31:32 +01:00
|
|
|
void SpeedDial::addPage(const QUrl &url, const QString &title)
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
|
|
|
|
2011-12-24 13:31:32 +01:00
|
|
|
if (url.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
Page page;
|
|
|
|
page.title = title;
|
|
|
|
page.url = url.toString();
|
2011-12-24 13:31:32 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
m_webPages.append(page);
|
|
|
|
m_regenerateScript = true;
|
2011-12-24 13:31:32 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
foreach(QWebFrame * frame, cleanFrames()) {
|
|
|
|
frame->page()->triggerAction(QWebPage::Reload);
|
|
|
|
}
|
|
|
|
|
|
|
|
emit pagesChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::removePage(const Page &page)
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
if (page.url.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
removeImageForUrl(page.url);
|
|
|
|
m_webPages.removeAll(page);
|
|
|
|
m_regenerateScript = true;
|
2011-12-24 13:31:32 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
foreach(QWebFrame * frame, cleanFrames()) {
|
2011-12-24 13:31:32 +01:00
|
|
|
frame->page()->triggerAction(QWebPage::Reload);
|
|
|
|
}
|
2012-02-05 16:00:23 +01:00
|
|
|
|
|
|
|
emit pagesChanged();
|
2011-12-24 13:31:32 +01:00
|
|
|
}
|
|
|
|
|
2012-01-18 20:10:04 +01:00
|
|
|
int SpeedDial::pagesInRow()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
2012-01-18 20:10:04 +01:00
|
|
|
|
|
|
|
return m_maxPagesInRow;
|
|
|
|
}
|
|
|
|
|
2012-01-19 18:05:21 +01:00
|
|
|
int SpeedDial::sdSize()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
2012-01-19 18:05:21 +01:00
|
|
|
|
|
|
|
return m_sizeOfSpeedDials;
|
|
|
|
}
|
|
|
|
|
2012-01-09 16:23:03 +01:00
|
|
|
QString SpeedDial::backgroundImage()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
2012-01-09 16:23:03 +01:00
|
|
|
|
2012-01-18 21:09:27 +01:00
|
|
|
return m_backgroundImage;
|
2012-01-09 16:23:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QString SpeedDial::backgroundImageSize()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
2012-01-09 16:23:03 +01:00
|
|
|
|
2012-01-18 21:09:27 +01:00
|
|
|
return m_backgroundImageSize;
|
2012-01-09 16:23:03 +01:00
|
|
|
}
|
|
|
|
|
2011-12-02 23:25:27 +01:00
|
|
|
QString SpeedDial::initialScript()
|
|
|
|
{
|
2012-02-05 17:13:08 +01:00
|
|
|
ENSURE_LOADED;
|
2011-12-02 23:25:27 +01:00
|
|
|
|
|
|
|
if (!m_regenerateScript) {
|
|
|
|
return m_initialScript;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_regenerateScript = false;
|
|
|
|
m_initialScript.clear();
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
foreach(const Page & page, m_webPages) {
|
|
|
|
QString imgSource = m_thumbnailsDir + QCryptographicHash::hash(page.url.toUtf8(), QCryptographicHash::Md4).toHex() + ".png";
|
2011-12-02 23:25:27 +01:00
|
|
|
|
|
|
|
if (!QFile(imgSource).exists()) {
|
2012-02-05 16:00:23 +01:00
|
|
|
loadThumbnail(page.url);
|
2011-12-24 12:21:23 +01:00
|
|
|
imgSource = "qrc:html/loading.gif";
|
2011-12-02 23:25:27 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
if (page.url.isEmpty()) {
|
2011-12-02 23:25:27 +01:00
|
|
|
imgSource = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2011-12-03 15:51:08 +01:00
|
|
|
imgSource = QUrl::fromLocalFile(imgSource).toString();
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
m_initialScript.append(QString("addBox('%1', '%2', '%3');\n").arg(page.url, page.title, imgSource));
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return m_initialScript;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::changed(const QString &allPages)
|
|
|
|
{
|
2011-12-04 20:35:49 +01:00
|
|
|
if (allPages.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
const QStringList &entries = allPages.split("\";");
|
|
|
|
m_webPages.clear();
|
|
|
|
|
|
|
|
foreach(const QString & entry, entries) {
|
|
|
|
if (entry.isEmpty()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
const QStringList &tmp = entry.split("\"|");
|
|
|
|
if (tmp.count() != 2) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
Page page;
|
|
|
|
page.url = tmp.at(0).mid(5);
|
|
|
|
page.title = tmp.at(1).mid(7);
|
|
|
|
|
|
|
|
m_webPages.append(page);
|
|
|
|
}
|
|
|
|
|
2011-12-02 23:25:27 +01:00
|
|
|
m_regenerateScript = true;
|
2012-02-05 16:00:23 +01:00
|
|
|
emit pagesChanged();
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
|
|
|
|
2011-12-23 13:47:38 +01:00
|
|
|
void SpeedDial::loadThumbnail(const QString &url, bool loadTitle)
|
2011-12-02 23:25:27 +01:00
|
|
|
{
|
|
|
|
if (url.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PageThumbnailer* thumbnailer = new PageThumbnailer(this);
|
2012-01-31 21:10:22 +01:00
|
|
|
thumbnailer->setUrl(QUrl::fromEncoded(url.toUtf8()));
|
2011-12-23 13:47:38 +01:00
|
|
|
thumbnailer->setLoadTitle(loadTitle);
|
2012-04-15 15:41:48 +02:00
|
|
|
connect(thumbnailer, SIGNAL(thumbnailCreated(const QPixmap &)), this, SLOT(thumbnailCreated(const QPixmap &)));
|
2011-12-02 23:25:27 +01:00
|
|
|
|
|
|
|
thumbnailer->start();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::removeImageForUrl(const QString &url)
|
|
|
|
{
|
2011-12-04 16:54:57 +01:00
|
|
|
QString fileName = m_thumbnailsDir + QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md4).toHex() + ".png";
|
2011-12-02 23:25:27 +01:00
|
|
|
|
|
|
|
if (QFile(fileName).exists()) {
|
|
|
|
QFile(fileName).remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-18 15:05:50 +01:00
|
|
|
QString SpeedDial::getOpenFileName()
|
|
|
|
{
|
2012-03-10 23:24:54 +01:00
|
|
|
const QString &fileTypes = QString("%3(*.png *.jpg *.jpeg *.bmp *.gif *.svg *.tiff)").arg(tr("Image files"));
|
2012-04-07 18:41:16 +02:00
|
|
|
const QString &image = QFileDialog::getOpenFileName(0, tr("Select image..."), QDir::homePath(), fileTypes);
|
2012-03-10 23:24:54 +01:00
|
|
|
|
2012-04-07 18:41:16 +02:00
|
|
|
if (image.isEmpty()) {
|
2012-04-08 21:45:40 +02:00
|
|
|
return image;
|
2012-04-07 18:41:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return QUrl::fromLocalFile(image).toString();
|
2012-01-18 20:10:04 +01:00
|
|
|
}
|
|
|
|
|
2012-01-29 14:38:59 +01:00
|
|
|
QString SpeedDial::urlFromUserInput(const QString &url)
|
|
|
|
{
|
2012-02-23 20:24:44 +01:00
|
|
|
return QUrl::fromUserInput(url).toString().remove("'");
|
2012-01-29 14:38:59 +01:00
|
|
|
}
|
|
|
|
|
2012-01-18 20:10:04 +01:00
|
|
|
void SpeedDial::setBackgroundImage(const QString &image)
|
|
|
|
{
|
2012-03-09 18:49:26 +01:00
|
|
|
m_backgroundImage = QUrl(image).toEncoded();
|
2012-01-18 20:10:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::setBackgroundImageSize(const QString &size)
|
|
|
|
{
|
2012-01-18 21:09:27 +01:00
|
|
|
m_backgroundImageSize = size;
|
2012-01-18 20:10:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void SpeedDial::setPagesInRow(int count)
|
|
|
|
{
|
|
|
|
m_maxPagesInRow = count;
|
2012-01-18 15:05:50 +01:00
|
|
|
}
|
|
|
|
|
2012-01-19 18:05:21 +01:00
|
|
|
void SpeedDial::setSdSize(int count)
|
|
|
|
{
|
|
|
|
m_sizeOfSpeedDials = count;
|
|
|
|
}
|
|
|
|
|
2012-04-12 15:24:57 +02:00
|
|
|
void SpeedDial::thumbnailCreated(const QPixmap &pixmap)
|
2011-12-02 23:25:27 +01:00
|
|
|
{
|
|
|
|
PageThumbnailer* thumbnailer = qobject_cast<PageThumbnailer*>(sender());
|
|
|
|
if (!thumbnailer) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-12-23 13:47:38 +01:00
|
|
|
bool loadTitle = thumbnailer->loadTitle();
|
|
|
|
QString title = thumbnailer->title();
|
2011-12-02 23:25:27 +01:00
|
|
|
QString url = thumbnailer->url().toString();
|
2011-12-04 16:54:57 +01:00
|
|
|
QString fileName = m_thumbnailsDir + QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md4).toHex() + ".png";
|
2011-12-02 23:25:27 +01:00
|
|
|
|
2012-04-12 15:24:57 +02:00
|
|
|
if (pixmap.isNull()) {
|
2011-12-11 12:34:51 +01:00
|
|
|
fileName = "qrc:/html/broken-page.png";
|
2011-12-23 13:47:38 +01:00
|
|
|
title = tr("Unable to load");
|
|
|
|
loadTitle = true;
|
2011-12-11 12:34:51 +01:00
|
|
|
}
|
|
|
|
else {
|
2012-04-12 15:24:57 +02:00
|
|
|
if (!pixmap.save(fileName, "PNG")) {
|
2011-12-11 12:34:51 +01:00
|
|
|
qWarning() << "SpeedDial::thumbnailCreated Cannot save thumbnail to " << fileName;
|
|
|
|
}
|
|
|
|
|
|
|
|
fileName = QUrl::fromLocalFile(fileName).toString();
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
m_regenerateScript = true;
|
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
cleanFrames();
|
|
|
|
foreach(QWebFrame * frame, cleanFrames()) {
|
|
|
|
frame->evaluateJavaScript(QString("setImageToUrl('%1', '%2');").arg(url, fileName));
|
|
|
|
if (loadTitle) {
|
|
|
|
frame->evaluateJavaScript(QString("setTitleToUrl('%1', '%2');").arg(url, title));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
thumbnailer->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<QWebFrame*> SpeedDial::cleanFrames()
|
|
|
|
{
|
|
|
|
QList<QWebFrame*> list;
|
|
|
|
|
2011-12-09 21:56:01 +01:00
|
|
|
for (int i = 0; i < m_webFrames.count(); i++) {
|
|
|
|
QWebFrame* frame = m_webFrames.at(i).data();
|
2012-02-05 16:00:23 +01:00
|
|
|
if (!frame || frame->url().toString() != "qupzilla:speeddial") {
|
2011-12-09 21:56:01 +01:00
|
|
|
m_webFrames.removeAt(i);
|
|
|
|
i--;
|
2011-12-02 23:25:27 +01:00
|
|
|
continue;
|
|
|
|
}
|
2012-02-05 16:00:23 +01:00
|
|
|
list.append(frame);
|
|
|
|
}
|
2011-12-02 23:25:27 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString SpeedDial::generateAllPages()
|
|
|
|
{
|
|
|
|
QString allPages;
|
|
|
|
|
|
|
|
foreach(const Page & page, m_webPages) {
|
|
|
|
const QString &string = QString("url:\"%1\"|title:\"%2\";").arg(page.url, page.title);
|
|
|
|
allPages.append(string);
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|
2011-12-04 19:15:44 +01:00
|
|
|
|
2012-02-05 16:00:23 +01:00
|
|
|
return allPages;
|
2011-12-02 23:25:27 +01:00
|
|
|
}
|