26#include <QCryptographicHash>
29#include <QJsonDocument>
31#define ENSURE_LOADED if (!m_loaded) loadSettings();
36 , m_sizeOfSpeedDials(231)
39 , m_regenerateScript(true)
57 QString allPages = settings.
value(
QSL(
"pages"), QString()).toString();
59 m_backgroundImageSize = settings.
value(
QSL(
"backsize"),
QSL(
"auto")).toString();
60 m_maxPagesInRow = settings.
value(
QSL(
"pagesrow"), 4).toInt();
61 m_sizeOfSpeedDials = settings.
value(
QSL(
"sdsize"), 231).toInt();
62 m_sdcentered = settings.
value(
QSL(
"sdcenter"),
false).toBool();
63 m_lockDials = settings.
value(
QSL(
"lock-dials"),
false).toBool();
66 if (allPages.isEmpty()) {
67 allPages =
QL1S(
"url:\"https://www.falkon.org\"|title:\"Falkon\";"
68 "url:\"https://store.falkon.org\"|title:\"Falkon Store\";"
69 "url:\"https://www.kde.org\"|title:\"KDE Planet\";"
70 "url:\"https://planet.kde.org\"|title:\"KDE Community\";");
77 if (!QDir(m_thumbnailsDir).exists()) {
82void SpeedDial::saveSettings()
88 settings.
setValue(
QSL(
"pages"), generateAllPages());
89 settings.
setValue(
QSL(
"background"), m_backgroundImageUrl);
90 settings.
setValue(
QSL(
"backsize"), m_backgroundImageSize);
91 settings.
setValue(
QSL(
"pagesrow"), m_maxPagesInRow);
92 settings.
setValue(
QSL(
"sdsize"), m_sizeOfSpeedDials);
102 QString urlString = url.toString();
103 if (urlString.endsWith(
QL1C(
'/')))
104 urlString = urlString.left(urlString.size() - 1);
106 for (
const Page &page : std::as_const(m_pages)) {
107 if (page.url == urlString) {
119 if (key < 0 || m_pages.count() <= key) {
123 return QUrl::fromEncoded(m_pages.at(key).url.toUtf8());
135 page.
title = escapeTitle(title);
136 page.
url = escapeUrl(url.toString());
138 m_pages.append(page);
139 m_regenerateScript =
true;
153 m_pages.removeAll(page);
154 m_regenerateScript =
true;
163 return m_maxPagesInRow;
170 return m_sizeOfSpeedDials;
191 return m_backgroundImage;
196 return m_backgroundImageUrl;
203 return m_backgroundImageSize;
210 if (!m_regenerateScript) {
211 return m_initialScript;
214 m_regenerateScript =
false;
215 m_initialScript.clear();
219 for (
const Page &page : std::as_const(m_pages)) {
220 QString imgSource = m_thumbnailsDir + QString::fromLatin1(QCryptographicHash::hash(page.url.toUtf8(), QCryptographicHash::Md4).toHex()) +
QSL(
".png");
222 if (!QFile(imgSource).exists()) {
223 imgSource =
QSL(
"qrc:html/loading.gif");
225 if (!page.isValid()) {
234 map[
QSL(
"url")] = page.url;
235 map[
QSL(
"title")] = page.title;
236 map[
QSL(
"img")] = imgSource;
240 m_initialScript = QString::fromUtf8(QJsonDocument::fromVariant(
pages).toJson(QJsonDocument::Compact));
241 return m_initialScript;
246 const QStringList entries = allPages.split(QLatin1String(
"\";"), Qt::SkipEmptyParts);
249 for (
const QString &entry : entries) {
250 if (entry.isEmpty()) {
254 const QStringList tmp = entry.split(QLatin1String(
"\"|"), Qt::SkipEmptyParts);
255 if (tmp.count() != 2) {
260 page.
url = tmp.at(0).mid(5);
261 page.
title = tmp.at(1).mid(7);
263 if (page.
url.endsWith(
QL1C(
'/')))
264 page.
url = page.
url.left(page.
url.size() - 1);
266 m_pages.append(page);
269 m_regenerateScript =
true;
276 thumbnailer->setUrl(QUrl::fromEncoded(url.toUtf8()));
285 QString fileName = m_thumbnailsDir + QString::fromLatin1(QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md4).toHex()) +
QSL(
".png");
287 if (QFile(fileName).exists()) {
288 QFile(fileName).remove();
294 const QString fileTypes =
QSL(
"%3(*.png *.jpg *.jpeg *.bmp *.gif *.svg *.tiff)").arg(tr(
"Image files"));
295 const QString image =
QzTools::getOpenFileName(
QSL(
"SpeedDial-GetOpenFileName"),
nullptr, tr(
"Click to select image..."), QDir::homePath(), fileTypes);
300 return {
QzTools::pixmapToDataUrl(QPixmap(image)).toString(), QString::fromUtf8(QUrl::fromLocalFile(image).toEncoded())};
305 return QUrl::fromUserInput(url).toString();
311 m_backgroundImageUrl = image;
316 m_backgroundImageSize = size;
321 m_maxPagesInRow = count;
326 m_sizeOfSpeedDials = count;
331 m_sdcentered = centered;
341void SpeedDial::thumbnailCreated(
const QPixmap &pixmap)
343 auto*
thumbnailer = qobject_cast<PageThumbnailer*>(sender());
351 QString fileName = m_thumbnailsDir + QString::fromLatin1(QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md4).toHex()) +
QSL(
".png");
353 if (pixmap.isNull()) {
354 fileName =
QSL(
":/html/broken-page.svg");
355 title = tr(
"Unable to load");
358 if (!pixmap.save(fileName,
"PNG")) {
359 qWarning() <<
"SpeedDial::thumbnailCreated Cannot save thumbnail to " << fileName;
364 m_regenerateScript =
true;
373QString SpeedDial::escapeTitle(QString title)
const
375 title.replace(QLatin1Char(
'"'), QLatin1String(
"""));
376 title.replace(QLatin1Char(
'\''), QLatin1String(
"'"));
380QString SpeedDial::escapeUrl(QString url)
const
382 url.remove(QLatin1Char(
'"'));
383 url.remove(QLatin1Char(
'\''));
387QString SpeedDial::generateAllPages()
391 for (
const Page &page : std::as_const(m_pages)) {
392 const QString
string =
QSL(R
"(url:"%1"|title:"%2";)").arg(page.url, page.title);
393 allPages.append(string);
static QString currentProfilePath()
void thumbnailCreated(const QPixmap &)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
void pageTitleLoaded(const QString &url, const QString &title)
void thumbnailLoaded(const QString &url, const QString &src)
void setBackgroundImageSize(const QString &size)
QStringList getOpenFileName()
void removeImageForUrl(const QString &url)
QUrl urlForShortcut(int key)
QString backgroundImageSize()
void removePage(const Page &page)
QString urlFromUserInput(const QString &url)
SpeedDial(QObject *parent=nullptr)
QString backgroundImageUrl()
Page pageForUrl(const QUrl &url)
QString backgroundImage()
void setSdSize(int count)
void setBackgroundImage(const QString &image)
void setSdCentered(bool centered)
void changed(const QString &allPages)
void setPagesInRow(int count)
void addPage(const QUrl &url, const QString &title)
void setLockDials(bool lockDials)
void loadThumbnail(const QString &url, bool loadTitle)