mirror of
https://git.outfoxxed.me/quickshell/quickshell.git
synced 2026-02-23 03:33:57 +11:00
Some checks failed
Build / Nix (push) Has been cancelled
Build / Nix-1 (push) Has been cancelled
Build / Nix-2 (push) Has been cancelled
Build / Nix-3 (push) Has been cancelled
Build / Nix-4 (push) Has been cancelled
Build / Nix-5 (push) Has been cancelled
Build / Nix-6 (push) Has been cancelled
Build / Nix-7 (push) Has been cancelled
Build / Nix-8 (push) Has been cancelled
Build / Nix-9 (push) Has been cancelled
Build / Nix-10 (push) Has been cancelled
Build / Nix-11 (push) Has been cancelled
Build / Nix-12 (push) Has been cancelled
Build / Nix-13 (push) Has been cancelled
Build / Nix-14 (push) Has been cancelled
Build / Nix-15 (push) Has been cancelled
Build / Nix-16 (push) Has been cancelled
Build / Nix-17 (push) Has been cancelled
Build / Nix-18 (push) Has been cancelled
Build / Nix-19 (push) Has been cancelled
Build / Nix-20 (push) Has been cancelled
Build / Nix-21 (push) Has been cancelled
Build / Nix-22 (push) Has been cancelled
Build / Nix-23 (push) Has been cancelled
Build / Nix-24 (push) Has been cancelled
Build / Nix-25 (push) Has been cancelled
Build / Nix-26 (push) Has been cancelled
Build / Nix-27 (push) Has been cancelled
Build / Nix-28 (push) Has been cancelled
Build / Nix-29 (push) Has been cancelled
Build / Nix-30 (push) Has been cancelled
Build / Nix-31 (push) Has been cancelled
Build / Archlinux (push) Has been cancelled
Lint / Lint (push) Has been cancelled
84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
#include "iconimageprovider.hpp"
|
|
#include <algorithm>
|
|
|
|
#include <qcolor.h>
|
|
#include <qicon.h>
|
|
#include <qlogging.h>
|
|
#include <qpainter.h>
|
|
#include <qpixmap.h>
|
|
#include <qsize.h>
|
|
#include <qstring.h>
|
|
|
|
QPixmap
|
|
IconImageProvider::requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) {
|
|
QString iconName;
|
|
QString fallbackName;
|
|
QString path;
|
|
|
|
auto splitIdx = id.indexOf("?path=");
|
|
if (splitIdx != -1) {
|
|
iconName = id.sliced(0, splitIdx);
|
|
path = id.sliced(splitIdx + 6);
|
|
path = QString("/%1/%2").arg(path, iconName.sliced(iconName.lastIndexOf('/') + 1));
|
|
} else {
|
|
splitIdx = id.indexOf("?fallback=");
|
|
if (splitIdx != -1) {
|
|
iconName = id.sliced(0, splitIdx);
|
|
fallbackName = id.sliced(splitIdx + 10);
|
|
} else {
|
|
iconName = id;
|
|
}
|
|
}
|
|
|
|
auto icon = QIcon::fromTheme(iconName);
|
|
if (icon.isNull() && !fallbackName.isEmpty()) icon = QIcon::fromTheme(fallbackName);
|
|
if (icon.isNull() && !path.isEmpty()) icon = QPixmap(path);
|
|
|
|
auto targetSize = requestedSize.isValid() ? requestedSize : QSize(100, 100);
|
|
if (targetSize.width() == 0 || targetSize.height() == 0) targetSize = QSize(2, 2);
|
|
auto pixmap = icon.pixmap(targetSize.width(), targetSize.height());
|
|
|
|
if (pixmap.isNull()) {
|
|
qWarning() << "Could not load icon" << id << "at size" << targetSize << "from request";
|
|
pixmap = IconImageProvider::missingPixmap(targetSize);
|
|
}
|
|
|
|
if (size != nullptr) *size = pixmap.size();
|
|
return pixmap;
|
|
}
|
|
|
|
QPixmap IconImageProvider::missingPixmap(const QSize& size) {
|
|
auto width = size.width() % 2 == 0 ? size.width() : size.width() + 1;
|
|
auto height = size.height() % 2 == 0 ? size.height() : size.height() + 1;
|
|
width = std::max(width, 2);
|
|
height = std::max(height, 2);
|
|
|
|
auto pixmap = QPixmap(width, height);
|
|
pixmap.fill(QColorConstants::Black);
|
|
auto painter = QPainter(&pixmap);
|
|
|
|
auto halfWidth = width / 2;
|
|
auto halfHeight = height / 2;
|
|
auto purple = QColor(0xd900d8);
|
|
painter.fillRect(halfWidth, 0, halfWidth, halfHeight, purple);
|
|
painter.fillRect(0, halfHeight, halfWidth, halfHeight, purple);
|
|
return pixmap;
|
|
}
|
|
|
|
QString IconImageProvider::requestString(
|
|
const QString& icon,
|
|
const QString& path,
|
|
const QString& fallback
|
|
) {
|
|
auto req = "image://icon/" + icon;
|
|
|
|
if (!path.isEmpty()) {
|
|
req += "?path=" + path;
|
|
}
|
|
|
|
if (!fallback.isEmpty()) {
|
|
req += "?fallback=" + fallback;
|
|
}
|
|
|
|
return req;
|
|
}
|