mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.8 KiB
147 lines
3.8 KiB
/* |
|
SPDX-FileCopyrightText: 2010 Andriy Rysin <[email protected]> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "flags.h" |
|
|
|
#include <KLocalizedString> |
|
|
|
#include <QIcon> |
|
#include <QPainter> |
|
#include <QPixmap> |
|
#include <QStandardPaths> |
|
#include <QStringList> |
|
|
|
#include <math.h> |
|
|
|
#include "x11_helper.h" |
|
|
|
// for text handling |
|
#include "keyboard_config.h" |
|
#include "xkb_rules.h" |
|
|
|
static const char flagTemplate[] = "kf5/locale/countries/%1/flag.png"; |
|
|
|
int iconSize(int s) |
|
{ |
|
if (s < 16) { |
|
return 16; |
|
} else if (s < 22) { |
|
return 22; |
|
} else if (s < 32) { |
|
return 32; |
|
} else if (s < 48) { |
|
return 48; |
|
} else if (s < 64) { |
|
return 64; |
|
} else { |
|
return 128; |
|
} |
|
} |
|
|
|
const QIcon Flags::getIcon(const QString &layout) |
|
{ |
|
if (!iconMap.contains(layout)) { |
|
iconMap[layout] = createIcon(layout); |
|
} |
|
return iconMap[layout]; |
|
} |
|
|
|
QIcon Flags::createIcon(const QString &layout) |
|
{ |
|
QIcon icon; |
|
if (!layout.isEmpty()) { |
|
QString countryCode = getCountryFromLayoutName(layout); |
|
QString file; |
|
if (!countryCode.isEmpty()) { |
|
file = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString(flagTemplate).arg(countryCode)); |
|
} |
|
|
|
if (!file.isEmpty()) { |
|
QImage flagImg; |
|
flagImg.load(file); |
|
const int size = iconSize(qMax(flagImg.width(), flagImg.height())); |
|
QPixmap iconPix(size, size); |
|
iconPix.fill(Qt::transparent); |
|
QRect dest(flagImg.rect()); |
|
dest.moveCenter(iconPix.rect().center()); |
|
|
|
QPainter painter(&iconPix); |
|
painter.drawImage(dest, flagImg); |
|
painter.end(); |
|
|
|
icon.addPixmap(iconPix); |
|
} |
|
} |
|
return icon; |
|
} |
|
|
|
// static |
|
// const QStringList NON_COUNTRY_LAYOUTS = QString("ara,brai,epo,latam,mao").split(","); |
|
|
|
QString Flags::getCountryFromLayoutName(const QString &layout) const |
|
{ |
|
QString countryCode = layout; |
|
|
|
if (countryCode == QLatin1String("nec_vndr/jp")) |
|
return QStringLiteral("jp"); |
|
|
|
return countryCode; |
|
} |
|
|
|
// TODO: move this to some other class? |
|
|
|
QString Flags::getShortText(const LayoutUnit &layoutUnit, const KeyboardConfig &keyboardConfig) |
|
{ |
|
if (layoutUnit.isEmpty()) |
|
return QStringLiteral("--"); |
|
|
|
QString layoutText = layoutUnit.layout(); |
|
|
|
for (const LayoutUnit &lu : keyboardConfig.layouts) { |
|
if (layoutUnit.layout() == lu.layout() && layoutUnit.variant() == lu.variant()) { |
|
layoutText = lu.getDisplayName(); |
|
break; |
|
} |
|
} |
|
|
|
// TODO: good autolabel |
|
// if( layoutText == layoutUnit.layout && layoutUnit.getDisplayName() != layoutUnit.layout ) { |
|
// layoutText = layoutUnit.getDisplayName(); |
|
// } |
|
|
|
return layoutText; |
|
} |
|
|
|
static QString getDisplayText(const QString &layout, const QString &variant, const Rules *rules) |
|
{ |
|
if (variant.isEmpty()) |
|
return layout; |
|
if (rules == nullptr || rules->version == QLatin1String("1.0")) |
|
return i18nc("layout - variant", "%1 - %2", layout, variant); |
|
return variant; |
|
} |
|
|
|
QString Flags::getLongText(const LayoutUnit &layoutUnit, const Rules *rules) |
|
{ |
|
if (rules == nullptr) { |
|
return getDisplayText(layoutUnit.layout(), layoutUnit.variant(), rules); |
|
} |
|
|
|
QString layoutText = layoutUnit.layout(); |
|
const LayoutInfo *layoutInfo = rules->getLayoutInfo(layoutUnit.layout()); |
|
if (layoutInfo != nullptr) { |
|
layoutText = layoutInfo->description; |
|
|
|
if (!layoutUnit.variant().isEmpty()) { |
|
const VariantInfo *variantInfo = layoutInfo->getVariantInfo(layoutUnit.variant()); |
|
QString variantText = variantInfo != nullptr ? variantInfo->description : layoutUnit.variant(); |
|
|
|
layoutText = getDisplayText(layoutText, variantText, rules); |
|
} |
|
} |
|
|
|
return layoutText; |
|
}
|
|
|