1
mirror of https://invent.kde.org/network/falkon.git synced 2024-11-13 10:32:11 +01:00
falkonOfficial/src/plugins/speeddial.cpp
nowrep b1083226b8 Added Speed Dial. Closes #36
- first version of speed dial
- showing pages in maximum 4 columns (unlimited rows)
- option in preferences to open speed dial on new tab
- almost all implemented in js and jQuery, hope it won't be slow.
  It loads in about 240ms on my machine and in 2s on my Toshiba
  netbook (very very old Intel Atom)
- currently, there is no possibility to change backgroung and
  keyboard shortcuts (need to figure out problems with laptop
  keyboards (no numerical block => Ctrl + 1 fires Ctrl + + and so on)
2011-12-02 23:25:27 +01:00

152 lines
4.1 KiB
C++

#include "speeddial.h"
#include "mainapplication.h"
#include "pagethumbnailer.h"
SpeedDial::SpeedDial(QObject* parent)
: QObject(parent)
, m_loaded(false)
, m_regenerateScript(true)
{
m_thumbnailsDir = mApp->getActiveProfilPath() + "thumbnails/";
}
void SpeedDial::loadSettings()
{
m_loaded = true;
QSettings settings(mApp->getActiveProfilPath() + "settings.ini", QSettings::IniFormat);
settings.beginGroup("SpeedDial");
m_allPages = settings.value("pages", "url:\"http://www.google.com\"|title:\"Google\";"
"url:\"http://qupzilla.co.cc\"|title:\"QupZilla\";"
"url:\"http://qupzilla.blogspot.com\"|title:\"QupZilla Blog\";"
"url:\"https://github.com/nowrep/QupZilla\"|title:\"QupZilla GitHub\";"
"url:\"http://facebook.com\"|title:\"Facebook\";"
).toString();
settings.endGroup();
m_loadingImagePath = "qrc:html/loading.gif";
// If needed, create thumbnails directory
if (!QDir(m_thumbnailsDir).exists()) {
QDir(mApp->getActiveProfilPath()).mkdir("thumbnails");
}
}
void SpeedDial::saveSettings()
{
QSettings settings(mApp->getActiveProfilPath() + "settings.ini", QSettings::IniFormat);
settings.beginGroup("SpeedDial");
settings.setValue("pages", m_allPages);
settings.endGroup();
}
void SpeedDial::addWebFrame(QWebFrame* frame)
{
if (!m_webFrames.contains(frame)) {
m_webFrames.append(frame);
}
}
QString SpeedDial::initialScript()
{
if (!m_loaded) {
loadSettings();
}
if (!m_regenerateScript) {
return m_initialScript;
}
m_regenerateScript = false;
m_initialScript.clear();
QStringList entries = m_allPages.split("\";");
foreach(QString entry, entries) {
if (entry.isEmpty()) {
continue;
}
QStringList tmp = entry.split("\"|");
if (tmp.count() != 2) {
continue;
}
QString url = tmp.at(0).mid(5);
QString title = tmp.at(1).mid(7);
QString imgSource = m_thumbnailsDir + QCryptographicHash::hash(url.toAscii(), QCryptographicHash::Md4).toHex() + ".png";
if (!QFile(imgSource).exists()) {
loadThumbnail(url);
imgSource = m_loadingImagePath;
if (url.isEmpty()) {
imgSource = "";
}
}
else {
imgSource.prepend("file://");
}
m_initialScript.append(QString("addBox('%1', '%2', '%3');\n").arg(url, title, imgSource));
}
return m_initialScript;
}
void SpeedDial::changed(const QString &allPages)
{
m_allPages = allPages;
m_regenerateScript = true;
}
void SpeedDial::loadThumbnail(const QString &url)
{
if (url.isEmpty()) {
return;
}
PageThumbnailer* thumbnailer = new PageThumbnailer(this);
thumbnailer->setUrl(QUrl(url));
connect(thumbnailer, SIGNAL(thumbnailCreated(QPixmap)), this, SLOT(thumbnailCreated(QPixmap)));
thumbnailer->start();
}
void SpeedDial::removeImageForUrl(const QString &url)
{
QString fileName = m_thumbnailsDir + QCryptographicHash::hash(url.toAscii(), QCryptographicHash::Md4).toHex() + ".png";
if (QFile(fileName).exists()) {
QFile(fileName).remove();
}
}
void SpeedDial::thumbnailCreated(const QPixmap &image)
{
PageThumbnailer* thumbnailer = qobject_cast<PageThumbnailer*>(sender());
if (!thumbnailer) {
return;
}
QString url = thumbnailer->url().toString();
QString fileName = m_thumbnailsDir + QCryptographicHash::hash(url.toAscii(), QCryptographicHash::Md4).toHex() + ".png";
if (!image.save(fileName)) {
qWarning() << "SpeedDial::thumbnailCreated Cannot save thumbnail to " << fileName;
}
m_regenerateScript = true;
delete thumbnailer;
foreach(QWebFrame * frame, m_webFrames) {
if (!frame) {
m_webFrames.removeOne(frame);
continue;
}
frame->evaluateJavaScript(QString("setImageToUrl('%1', '%2');").arg(url, "file://" + fileName));
}
}