summaryrefslogtreecommitdiffstats
diff options
authorMasoud Jami <masoud.jami@qt.io>2024-12-13 15:05:25 +0100
committerMasoud Jami <masoud.jami@qt.io>2025-05-08 15:04:11 +0000
commitf7612eaa776dcf8ae65fb7821af247d2008583c0 (patch)
tree218a12d69e26ed66bf3f2125b53727f277a22553
parent9d148b283e5ffbf19c04da8ac9a0e7d052ca9013 (diff)
linguist: use consistent icons + unicode for marking translations6.9.1
Icons used in linguist are inconsistent, i.e., some are loaded from OS icons and some from linguist resources, resulting in a mixture of minimalistic icons + old style linguist icons. Make the icons consistent in which they are all loaded from the linguist resource. Those icons can then soon be replaced by newly designed icons for linguist. Also use unicode representations to mark messages, instead of the existing pixel maps. Task-number: QTBUG-124852 Change-Id: Ia235d180a7f3743b7a55e3467df9828d21cc25f9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> (cherry picked from commit bb6aa720ea59f9896b54f3ac4c824ac40a702982)
-rw-r--r--src/linguist/linguist/CMakeLists.txt6
-rw-r--r--src/linguist/linguist/errorsview.cpp6
-rw-r--r--src/linguist/linguist/globals.cpp25
-rw-r--r--src/linguist/linguist/globals.h15
-rw-r--r--src/linguist/linguist/images/s_check_danger.pngbin304 -> 0 bytes
-rw-r--r--src/linguist/linguist/images/s_check_empty.pngbin404 -> 0 bytes
-rw-r--r--src/linguist/linguist/images/s_check_obsolete.pngbin192 -> 0 bytes
-rw-r--r--src/linguist/linguist/images/s_check_off.pngbin434 -> 0 bytes
-rw-r--r--src/linguist/linguist/images/s_check_on.pngbin192 -> 0 bytes
-rw-r--r--src/linguist/linguist/images/s_check_warning.pngbin192 -> 0 bytes
-rw-r--r--src/linguist/linguist/mainwindow.cpp36
-rw-r--r--src/linguist/linguist/messageeditor.cpp2
-rw-r--r--src/linguist/linguist/messagemodel.cpp43
13 files changed, 84 insertions, 49 deletions
diff --git a/src/linguist/linguist/CMakeLists.txt b/src/linguist/linguist/CMakeLists.txt
index 1dc7239d2..af90386ed 100644
--- a/src/linguist/linguist/CMakeLists.txt
+++ b/src/linguist/linguist/CMakeLists.txt
@@ -102,12 +102,6 @@ set(linguist_resource_files
"images/mac/whatsthis.png"
"images/minus.png"
"images/plus.png"
- "images/s_check_danger.png"
- "images/s_check_empty.png"
- "images/s_check_obsolete.png"
- "images/s_check_off.png"
- "images/s_check_on.png"
- "images/s_check_warning.png"
"images/up.png"
"images/win/accelerator.png"
"images/win/book.png"
diff --git a/src/linguist/linguist/errorsview.cpp b/src/linguist/linguist/errorsview.cpp
index 8af7fa737..451686401 100644
--- a/src/linguist/linguist/errorsview.cpp
+++ b/src/linguist/linguist/errorsview.cpp
@@ -3,6 +3,7 @@
#include "errorsview.h"
+#include "globals.h"
#include "messagemodel.h"
#include <QtCore/QList>
@@ -67,10 +68,7 @@ QString ErrorsView::firstError()
void ErrorsView::addError(int model, const QString &error)
{
- // NOTE: Three statics instead of one just for GCC 3.3.5
- static QLatin1String imageLocation(":/images/s_check_danger.png");
- static QPixmap image(imageLocation);
- static QIcon pxDanger(image);
+ static QIcon pxDanger = UnicodeIconGenerator().create(u'!', Qt::red);
QString lang;
if (m_dataModel->modelCount() > 1)
lang = m_dataModel->model(model)->localizedLanguage() + QLatin1String(": ");
diff --git a/src/linguist/linguist/globals.cpp b/src/linguist/linguist/globals.cpp
index c9fa35de0..2d3fa779c 100644
--- a/src/linguist/linguist/globals.cpp
+++ b/src/linguist/linguist/globals.cpp
@@ -2,10 +2,12 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "globals.h"
-#include <QColor>
+
#include <QApplication>
-#include <QStyleHints>
+#include <QColor>
#include <QPalette>
+#include <QPainter>
+#include <QStyleHints>
const QString &settingsPrefix()
{
@@ -33,3 +35,22 @@ bool isDarkMode()
return QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark
|| isLight(QGuiApplication::palette().color(QPalette::WindowText));
}
+
+QPixmap UnicodeIconGenerator::create(QChar unicode, Qt::GlobalColor color)
+{
+ QPixmap pixmap(16, 16);
+ pixmap.fill(Qt::transparent);
+ QPainter painter(&pixmap);
+ painter.setFont(*m_font);
+ painter.setPen(color);
+ painter.drawText(pixmap.rect(), Qt::AlignCenter, unicode);
+ painter.end();
+ return pixmap;
+}
+
+UnicodeIconGenerator::UnicodeIconGenerator()
+ : m_font(std::make_unique<QFont>())
+{
+ m_font->setBold(true);
+ m_font->setPointSize(18);
+}
diff --git a/src/linguist/linguist/globals.h b/src/linguist/linguist/globals.h
index 1ae9c64f4..499c9d53f 100644
--- a/src/linguist/linguist/globals.h
+++ b/src/linguist/linguist/globals.h
@@ -4,10 +4,25 @@
#ifndef GLOBALS_H
#define GLOBALS_H
+#include <QFont>
+#include <QPixmap>
#include <QString>
+#include <memory>
+
const QString &settingsPrefix();
QString settingPath(const char *path);
bool isDarkMode();
+class UnicodeIconGenerator
+{
+public:
+ QPixmap create(QChar unicode, Qt::GlobalColor color);
+
+ UnicodeIconGenerator();
+
+private:
+ std::unique_ptr<QFont> m_font;
+};
+
#endif // GLOBALS_H
diff --git a/src/linguist/linguist/images/s_check_danger.png b/src/linguist/linguist/images/s_check_danger.png
deleted file mode 100644
index e10157768..000000000
--- a/src/linguist/linguist/images/s_check_danger.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/images/s_check_empty.png b/src/linguist/linguist/images/s_check_empty.png
deleted file mode 100644
index 759a41b6c..000000000
--- a/src/linguist/linguist/images/s_check_empty.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/images/s_check_obsolete.png b/src/linguist/linguist/images/s_check_obsolete.png
deleted file mode 100644
index b852b639f..000000000
--- a/src/linguist/linguist/images/s_check_obsolete.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/images/s_check_off.png b/src/linguist/linguist/images/s_check_off.png
deleted file mode 100644
index 640b68972..000000000
--- a/src/linguist/linguist/images/s_check_off.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/images/s_check_on.png b/src/linguist/linguist/images/s_check_on.png
deleted file mode 100644
index afcaf634d..000000000
--- a/src/linguist/linguist/images/s_check_on.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/images/s_check_warning.png b/src/linguist/linguist/images/s_check_warning.png
deleted file mode 100644
index f689c3303..000000000
--- a/src/linguist/linguist/images/s_check_warning.png
+++ /dev/null
Binary files differ
diff --git a/src/linguist/linguist/mainwindow.cpp b/src/linguist/linguist/mainwindow.cpp
index e51b2a516..a21041700 100644
--- a/src/linguist/linguist/mainwindow.cpp
+++ b/src/linguist/linguist/mainwindow.cpp
@@ -175,8 +175,7 @@ private:
static const QVariant &pxObsolete()
{
- static const QVariant v =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_obsolete.png")));
+ static const QVariant v = UnicodeIconGenerator().create(QChar(0x2713), Qt::gray);
return v;
}
@@ -1813,28 +1812,17 @@ void MainWindow::setupMenuBar()
const QString prefix = QApplication::platformName().compare(QStringLiteral("cocoa"), Qt::CaseInsensitive) ?
QStringLiteral(":/images/win") : QStringLiteral(":/images/mac");
- m_ui.actionOpen->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen,
- QIcon(prefix + QStringLiteral("/fileopen.png"))));
- m_ui.actionOpenAux->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen,
- QIcon(prefix + QStringLiteral("/fileopen.png"))));
- m_ui.actionSave->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::DocumentSave,
- QIcon(prefix + QStringLiteral("/filesave.png"))));
- m_ui.actionSaveAll->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::DocumentSave,
- QIcon(prefix + QStringLiteral("/filesave.png"))));
- m_ui.actionPrint->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::DocumentPrint,
- QIcon(prefix + QStringLiteral("/print.png"))));
- m_ui.actionRedo->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditRedo,
- QIcon(prefix + QStringLiteral("/redo.png"))));
- m_ui.actionUndo->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditUndo,
- QIcon(prefix + QStringLiteral("/undo.png"))));
- m_ui.actionCut->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditCut,
- QIcon(prefix + QStringLiteral("/editcut.png"))));
- m_ui.actionCopy->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditCopy,
- QIcon(prefix + QStringLiteral("/editcopy.png"))));
- m_ui.actionPaste->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditPaste,
- QIcon(prefix + QStringLiteral("/editpaste.png"))));
- m_ui.actionFind->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::EditFind,
- QIcon(prefix + QStringLiteral("/searchfind.png"))));
+ m_ui.actionOpen->setIcon(QIcon(prefix + QStringLiteral("/fileopen.png")));
+ m_ui.actionOpenAux->setIcon(QIcon(prefix + QStringLiteral("/fileopen.png")));
+ m_ui.actionSave->setIcon(QIcon(prefix + QStringLiteral("/filesave.png")));
+ m_ui.actionSaveAll->setIcon(QIcon(prefix + QStringLiteral("/filesave.png")));
+ m_ui.actionPrint->setIcon(QIcon(prefix + QStringLiteral("/print.png")));
+ m_ui.actionRedo->setIcon(QIcon(prefix + QStringLiteral("/redo.png")));
+ m_ui.actionUndo->setIcon(QIcon(prefix + QStringLiteral("/undo.png")));
+ m_ui.actionCut->setIcon(QIcon(prefix + QStringLiteral("/editcut.png")));
+ m_ui.actionCopy->setIcon(QIcon(prefix + QStringLiteral("/editcopy.png")));
+ m_ui.actionPaste->setIcon(QIcon(prefix + QStringLiteral("/editpaste.png")));
+ m_ui.actionFind->setIcon(QIcon(prefix + QStringLiteral("/searchfind.png")));
// No well defined theme icons for these actions
m_ui.actionAccelerators->setIcon(QIcon(prefix + QStringLiteral("/accelerator.png")));
diff --git a/src/linguist/linguist/messageeditor.cpp b/src/linguist/linguist/messageeditor.cpp
index e7218acd9..c0fd8714a 100644
--- a/src/linguist/linguist/messageeditor.cpp
+++ b/src/linguist/linguist/messageeditor.cpp
@@ -130,7 +130,7 @@ void MessageEditor::setupEditorPage()
QBoxLayout *horizontalLayout = new QHBoxLayout;
horizontalLayout->addLayout(subLayout);
- horizontalLayout->addWidget(m_ncrModeBox);
+ horizontalLayout->addWidget(m_ncrModeBox, 0, Qt::AlignTop | Qt::AlignRight);
m_layout = new QVBoxLayout;
m_layout->setSpacing(2);
diff --git a/src/linguist/linguist/messagemodel.cpp b/src/linguist/linguist/messagemodel.cpp
index c33341c32..fa09ceb66 100644
--- a/src/linguist/linguist/messagemodel.cpp
+++ b/src/linguist/linguist/messagemodel.cpp
@@ -2,6 +2,8 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "messagemodel.h"
+
+#include "globals.h"
#include "statistics.h"
#include <QtCore/QCoreApplication>
@@ -1365,18 +1367,35 @@ int MessageModel::columnCount(const QModelIndex &parent) const
QVariant MessageModel::data(const QModelIndex &index, int role) const
{
- static QVariant pxOn =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_on.png")));
- static QVariant pxOff =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_off.png")));
- static QVariant pxObsolete =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_obsolete.png")));
- static QVariant pxDanger =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_danger.png")));
- static QVariant pxWarning =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_warning.png")));
- static QVariant pxEmpty =
- QVariant::fromValue(QPixmap(QLatin1String(":/images/s_check_empty.png")));
+ static UnicodeIconGenerator pg;
+
+ static QVariant pxOn;
+ static QVariant pxOff;
+ static QVariant pxObsolete;
+ static QVariant pxDanger;
+ static QVariant pxWarning;
+ static QVariant pxEmpty;
+
+ static Qt::ColorScheme mode = Qt::ColorScheme::Unknown; // to prevent creating new QPixmaps
+ // every time the method is called
+
+ if (bool dark = isDarkMode(); dark && mode != Qt::ColorScheme::Dark) {
+ pxOn = pg.create(QChar(0x2713), Qt::darkGreen);
+ pxOff = pg.create(u'?', Qt::yellow);
+ pxObsolete = pg.create(QChar(0x2713), Qt::gray);
+ pxDanger = pg.create(u'!', Qt::red);
+ pxWarning = pg.create(QChar(0x2713), Qt::yellow);
+ pxEmpty = pg.create(u'?', Qt::white);
+ mode = Qt::ColorScheme::Dark;
+ } else if (!dark && mode != Qt::ColorScheme::Light) {
+ pxOn = pg.create(QChar(0x2713), Qt::darkGreen);
+ pxOff = pg.create(u'?', Qt::darkYellow);
+ pxObsolete = pg.create(QChar(0x2713), Qt::gray);
+ pxDanger = pg.create(u'!', Qt::red);
+ pxWarning = pg.create(QChar(0x2713), Qt::darkYellow);
+ pxEmpty = pg.create(u'?', Qt::darkBlue);
+ mode = Qt::ColorScheme::Light;
+ }
int row = index.row();
int column = index.column() - 1;