1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-12 01:14:54 +00:00
transmission/qt/favicon.cc
Mike Gelfand 06fa457bd9 Improve filter bar look (Qt client)
Use normal but semi-transparent color instead of 'disabled' color for
counts drawing.
Do not leave empty space for icon when selected item doesn't have one.
Use null pixmaps/icons instead of non-null blank ones.
Implement our own sizeHint and minimumSizeHint to make sure both combos
have the same height.
Make activity combo width fixed, tracker combo width to fit its content
and line edit to occupy the rest.
Add 'Search...' placeholder to line edit.
2015-01-11 15:01:13 +00:00

159 lines
3.3 KiB
C++

/*
* This file Copyright (C) 2012-2014 Mnemosyne LLC
*
* It may be used under the GNU GPL versions 2 or 3
* or any future license endorsed by Mnemosyne LLC.
*
* $Id$
*/
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
#include <QDesktopServices>
#else
#include <QStandardPaths>
#endif
#include "favicon.h"
/***
****
***/
Favicons::Favicons ()
{
myNAM = new QNetworkAccessManager ();
connect (myNAM, SIGNAL(finished(QNetworkReply*)), this, SLOT(onRequestFinished(QNetworkReply*)));
}
Favicons::~Favicons ()
{
delete myNAM;
}
/***
****
***/
QString
Favicons::getCacheDir ()
{
const QString base =
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
QDesktopServices::storageLocation (QDesktopServices::CacheLocation);
#else
QStandardPaths::writableLocation (QStandardPaths::CacheLocation);
#endif
return QDir(base).absoluteFilePath ("favicons");
}
void
Favicons::ensureCacheDirHasBeenScanned ()
{
static bool hasBeenScanned = false;
if (!hasBeenScanned)
{
hasBeenScanned = true;
QDir cacheDir (getCacheDir ());
cacheDir.mkpath (cacheDir.absolutePath ());
QStringList files = cacheDir.entryList (QDir::Files|QDir::Readable);
foreach (QString file, files)
{
QPixmap pixmap;
pixmap.load (cacheDir.absoluteFilePath (file));
if (!pixmap.isNull ())
myPixmaps.insert (file, pixmap);
}
}
}
QString
Favicons::getHost (const QUrl& url)
{
QString host = url.host ();
const int first_dot = host.indexOf ('.');
const int last_dot = host.lastIndexOf ('.');
if ((first_dot != -1) && (last_dot != -1) && (first_dot != last_dot))
host.remove (0, first_dot + 1);
return host;
}
QPixmap
Favicons::find (const QUrl& url)
{
return findFromHost (getHost (url));
}
namespace
{
const QSize rightSize (16, 16);
};
QPixmap
Favicons::findFromHost (const QString& host)
{
ensureCacheDirHasBeenScanned ();
const QPixmap pixmap = myPixmaps[host];
return pixmap.isNull () || pixmap.size () == rightSize ? pixmap : pixmap.scaled (rightSize);
}
void
Favicons::add (const QUrl& url)
{
ensureCacheDirHasBeenScanned ();
const QString host = getHost (url);
if (!myPixmaps.contains (host))
{
// add a placholder s.t. we only ping the server once per session
myPixmaps.insert (host, QPixmap ());
// try to download the favicon
const QString path = "http://" + host + "/favicon.";
QStringList suffixes;
suffixes << "ico" << "png" << "gif" << "jpg";
foreach (QString suffix, suffixes)
myNAM->get (QNetworkRequest (path + suffix));
}
}
void
Favicons::onRequestFinished (QNetworkReply * reply)
{
const QString host = reply->url().host();
QPixmap pixmap;
const QByteArray content = reply->readAll ();
if (!reply->error ())
pixmap.loadFromData (content);
if (!pixmap.isNull ())
{
// save it in memory...
myPixmaps.insert (host, pixmap);
// save it on disk...
QDir cacheDir (getCacheDir ());
cacheDir.mkpath (cacheDir.absolutePath ());
QFile file (cacheDir.absoluteFilePath (host));
file.open (QIODevice::WriteOnly);
file.write (content);
file.close ();
// notify listeners
emit pixmapReady (host);
}
}