forked from Silverfish/proton-bridge
feat(GODT-2540): make icon loading failure behavior consistent.
This commit is contained in:
@ -43,24 +43,23 @@ qint64 const iconRefreshDurationSecs = 10; ///< The total number of seconds duri
|
|||||||
QIcon loadIconFromImage(QString const &path) {
|
QIcon loadIconFromImage(QString const &path) {
|
||||||
QPixmap const pixmap(path);
|
QPixmap const pixmap(path);
|
||||||
if (pixmap.isNull()) {
|
if (pixmap.isNull()) {
|
||||||
throw Exception(QString("Could create icon from image '%1'.").arg(path));
|
throw Exception(QString("Could not create an icon from an image '%1'.").arg(path));
|
||||||
}
|
}
|
||||||
return QIcon(pixmap);
|
return QIcon(pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
/// \brief Load a multi-resolution icon from a SVG file. The image is assumed to be square. SVG is rasterized in 256, 128, 64, 32 and 16px.
|
/// \brief Generate an icon from a SVG renderer (a.k.a. path).
|
||||||
///
|
///
|
||||||
/// Note: QPixmap can load SVG files directly, but our SVG file are defined in small shape size and QPixmap will rasterize them a very low resolution
|
/// \param[in] renderer The SVG renderer.
|
||||||
/// by default (eg. 16x16), which is insufficient for some uses. As a consequence, we manually generate a multi-resolution icon that render smoothly
|
/// \param[in] color The color to use in case the SVG path is to be used as a mask.
|
||||||
/// at any acceptable resolution for an icon.
|
|
||||||
///
|
|
||||||
/// \param[in] path The path of the SVG file.
|
|
||||||
/// \return The icon.
|
/// \return The icon.
|
||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
QIcon loadIconFromSVG(QString const &path, QColor const &color = QColor()) {
|
QIcon loadIconFromSVGRenderer(QSvgRenderer &renderer, QColor const &color = QColor()) {
|
||||||
QSvgRenderer renderer(path);
|
if (!renderer.isValid()) {
|
||||||
|
return QIcon();
|
||||||
|
}
|
||||||
QIcon icon;
|
QIcon icon;
|
||||||
qint32 size = 256;
|
qint32 size = 256;
|
||||||
|
|
||||||
@ -82,6 +81,26 @@ QIcon loadIconFromSVG(QString const &path, QColor const &color = QColor()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//****************************************************************************************************************************************************
|
||||||
|
/// \brief Load a multi-resolution icon from a SVG file. The image is assumed to be square. SVG is rasterized in 256, 128, 64, 32 and 16px.
|
||||||
|
///
|
||||||
|
/// Note: QPixmap can load SVG files directly, but our SVG file are defined in small shape size and QPixmap will rasterize them a very low resolution
|
||||||
|
/// by default (eg. 16x16), which is insufficient for some uses. As a consequence, we manually generate a multi-resolution icon that render smoothly
|
||||||
|
/// at any acceptable resolution for an icon.
|
||||||
|
///
|
||||||
|
/// \param[in] path The path of the SVG file.
|
||||||
|
/// \return The icon.
|
||||||
|
//****************************************************************************************************************************************************
|
||||||
|
QIcon loadIconFromSVG(QString const &path, QColor const &color = QColor()) {
|
||||||
|
QSvgRenderer renderer(path);
|
||||||
|
QIcon const icon = loadIconFromSVGRenderer(renderer, color);
|
||||||
|
if (icon.isNull()) {
|
||||||
|
Exception(QString("Could not create an icon from a vector image '%1'.").arg(path));
|
||||||
|
}
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
//
|
//
|
||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
@ -171,7 +190,6 @@ TrayIcon::TrayIcon()
|
|||||||
// some OSes/Desktop managers will automatically show main window when clicked, but not all, so we do it manually.
|
// some OSes/Desktop managers will automatically show main window when clicked, but not all, so we do it manually.
|
||||||
connect(this, &TrayIcon::messageClicked, &app().backend(), &QMLBackend::showMainWindow);
|
connect(this, &TrayIcon::messageClicked, &app().backend(), &QMLBackend::showMainWindow);
|
||||||
this->show();
|
this->show();
|
||||||
this->setState(State::Normal, QString(), QString());
|
|
||||||
|
|
||||||
// TrayIcon does not expose its screen, so we connect relevant screen events to our DPI change handler.
|
// TrayIcon does not expose its screen, so we connect relevant screen events to our DPI change handler.
|
||||||
for (QScreen *screen: QGuiApplication::screens()) {
|
for (QScreen *screen: QGuiApplication::screens()) {
|
||||||
@ -270,18 +288,17 @@ void TrayIcon::onIconRefreshTimer() {
|
|||||||
//
|
//
|
||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
void TrayIcon::generateDotIcons() {
|
void TrayIcon::generateDotIcons() {
|
||||||
QPixmap dotSVG(":/qml/icons/ic-dot.svg");
|
QSvgRenderer dotSVG(QString(":/qml/icons/ic-dot.svg"));
|
||||||
|
|
||||||
struct IconColor {
|
struct IconColor {
|
||||||
QIcon &icon;
|
QIcon &icon;
|
||||||
QColor color;
|
QColor color;
|
||||||
};
|
};
|
||||||
for (auto pair: QList<IconColor> {{ greenDot_, normalColor }, { greyDot_, greyColor }, { orangeDot_, warnColor }}) {
|
for (auto pair: QList<IconColor> {{ greenDot_, normalColor }, { greyDot_, greyColor }, { orangeDot_, warnColor }}) {
|
||||||
QPixmap p = dotSVG;
|
pair.icon = loadIconFromSVGRenderer(dotSVG, pair.color);
|
||||||
QPainter painter(&p);
|
if (pair.icon.isNull()) {
|
||||||
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
throw Exception("Could not generate dot icon from vector file.");
|
||||||
painter.fillRect(p.rect(), pair.color);
|
}
|
||||||
painter.end();
|
|
||||||
pair.icon = QIcon(p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,12 +332,7 @@ void TrayIcon::showErrorPopupNotification(QString const &title, QString const &m
|
|||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
void TrayIcon::generateStatusIcon(QString const &svgPath, QColor const &color) {
|
void TrayIcon::generateStatusIcon(QString const &svgPath, QColor const &color) {
|
||||||
// We use the SVG path as pixmap mask and fill it with the appropriate color
|
// We use the SVG path as pixmap mask and fill it with the appropriate color
|
||||||
QPixmap pixmap(qmlResourcePathToQt(svgPath));
|
statusIcon_ = loadIconFromSVG(qmlResourcePathToQt(svgPath), color);
|
||||||
QPainter painter(&pixmap);
|
|
||||||
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
|
||||||
painter.fillRect(pixmap.rect(), color);
|
|
||||||
painter.end();
|
|
||||||
statusIcon_ = QIcon(pixmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user