diff options
Diffstat (limited to 'src/gui/Icons.cpp')
-rw-r--r-- | src/gui/Icons.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/gui/Icons.cpp b/src/gui/Icons.cpp index cdebdcc75..95e6aadc4 100644 --- a/src/gui/Icons.cpp +++ b/src/gui/Icons.cpp @@ -19,11 +19,20 @@ #include "Icons.h" #include <QIconEngine> +#include <QImageReader> +#include <QPaintDevice> #include <QPainter> +#include "config-keepassx.h" +#include "core/Config.h" +#include "gui/DatabaseIcons.h" #include "gui/MainWindow.h" #include "gui/osutils/OSUtils.h" +#ifdef WITH_XC_KEESHARE +#include "keeshare/KeeShare.h" +#endif + class AdaptiveIconEngine : public QIconEngine { public: @@ -206,3 +215,97 @@ Icons* Icons::instance() return m_instance; } + +QPixmap Icons::customIconPixmap(const Database* db, const QUuid& uuid, IconSize size) +{ + if (!db->metadata()->hasCustomIcon(uuid)) { + return {}; + } + // Generate QIcon with pre-baked resolutions + auto icon = QImage::fromData(db->metadata()->customIcon(uuid)); + auto basePixmap = QPixmap::fromImage(icon.scaled(64, 64, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + return QIcon(basePixmap).pixmap(databaseIcons()->iconSize(size)); +} + +QHash<QUuid, QPixmap> Icons::customIconsPixmaps(const Database* db, IconSize size) +{ + QHash<QUuid, QPixmap> result; + + for (const QUuid& uuid : db->metadata()->customIconsOrder()) { + result.insert(uuid, Icons::customIconPixmap(db, uuid, size)); + } + + return result; +} + +QPixmap Icons::entryIconPixmap(const Entry* entry, IconSize size) +{ + QPixmap icon(size, size); + if (entry->iconUuid().isNull()) { + icon = databaseIcons()->icon(entry->iconNumber(), size); + } else { + Q_ASSERT(entry->database()); + if (entry->database()) { + icon = Icons::customIconPixmap(entry->database(), entry->iconUuid(), size); + } + } + + if (entry->isExpired()) { + icon = databaseIcons()->applyBadge(icon, DatabaseIcons::Badges::Expired); + } + + return icon; +} + +QPixmap Icons::groupIconPixmap(const Group* group, IconSize size) +{ + QPixmap icon(size, size); + if (group->iconUuid().isNull()) { + icon = databaseIcons()->icon(group->iconNumber(), size); + } else { + Q_ASSERT(group->database()); + if (group->database()) { + icon = Icons::customIconPixmap(group->database(), group->iconUuid(), size); + } + } + + if (group->isExpired()) { + icon = databaseIcons()->applyBadge(icon, DatabaseIcons::Badges::Expired); + } +#ifdef WITH_XC_KEESHARE + else if (KeeShare::isShared(group)) { + icon = KeeShare::indicatorBadge(group, icon); + } +#endif + + return icon; +} + +QString Icons::imageFormatsFilter() +{ + const QList<QByteArray> formats = QImageReader::supportedImageFormats(); + QStringList formatsStringList; + + for (const QByteArray& format : formats) { + for (char codePoint : format) { + if (!QChar(codePoint).isLetterOrNumber()) { + continue; + } + } + + formatsStringList.append("*." + QString::fromLatin1(format).toLower()); + } + + return formatsStringList.join(" "); +} + +QByteArray Icons::saveToBytes(const QImage& image) +{ + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + // TODO: check !icon.save() + image.save(&buffer, "PNG"); + buffer.close(); + return ba; +} |