File indexing completed on 2024-04-14 04:02:22
0001 /* 0002 SPDX-FileCopyrightText: 2006 Mauricio Piacentini <mauricio@tabuleiro.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 // own 0008 #include "kmahjonggtilesetselector.h" 0009 0010 // Qt 0011 #include <QDir> 0012 #include <QPainter> 0013 #include <QStandardPaths> 0014 0015 // KF 0016 #include <KAboutLicense> 0017 #include <KLocalizedString> 0018 0019 // LibKMahjongg 0020 #include "kmahjonggtileset.h" 0021 0022 KMahjonggTilesetSelector::KMahjonggTilesetSelector(QWidget *parent, KConfigSkeleton *aconfig) 0023 : QWidget(parent) 0024 { 0025 setupUi(this); 0026 setupData(aconfig); 0027 } 0028 0029 KMahjonggTilesetSelector::~KMahjonggTilesetSelector() 0030 { 0031 qDeleteAll(tilesetMap); 0032 } 0033 0034 void KMahjonggTilesetSelector::setupData(KConfigSkeleton *aconfig) 0035 { 0036 // Get our currently configured Tileset entry 0037 KConfig *config = aconfig->config(); 0038 KConfigGroup group = config->group(QStringLiteral("General")); 0039 QString initialGroup = group.readEntry("Tileset_file"); 0040 0041 // The lineEdit widget holds our tileset path, but the user does not manipulate it directly 0042 kcfg_TileSet->hide(); 0043 0044 // This will also load our resourcedir if it is not done already 0045 KMahjonggTileset tile; 0046 0047 // Now get our tilesets into a list 0048 QStringList tilesAvailable; 0049 const QStringList dirs = 0050 QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kmahjongglib/tilesets"), QStandardPaths::LocateDirectory); 0051 for (const QString &dir : dirs) { 0052 const QStringList fileNames = QDir(dir).entryList({QStringLiteral("*.desktop")}); 0053 tilesAvailable.reserve(tilesAvailable.size() + fileNames.size()); 0054 for (const QString &file : fileNames) { 0055 tilesAvailable.append(dir + QLatin1Char('/') + file); 0056 } 0057 } 0058 0059 int numvalidentries = 0; 0060 for (const QString &atileset : std::as_const(tilesAvailable)) { 0061 auto *aset = new KMahjonggTileset(); 0062 if (aset->loadTileset(atileset)) { 0063 const QString name = aset->name(); 0064 tilesetMap.insert(name, aset); 0065 tilesetList->addItem(name); 0066 // Find if this is our currently configured Tileset 0067 if (atileset == initialGroup) { 0068 // Select current entry 0069 tilesetList->setCurrentRow(numvalidentries); 0070 tilesetChanged(); 0071 } 0072 ++numvalidentries; 0073 } else { 0074 delete aset; 0075 } 0076 } 0077 0078 connect(tilesetList, &QListWidget::currentItemChanged, this, &KMahjonggTilesetSelector::tilesetChanged); 0079 } 0080 0081 void KMahjonggTilesetSelector::tilesetChanged() 0082 { 0083 KMahjonggTileset *selTileset = tilesetMap.value(tilesetList->currentItem()->text()); 0084 // Sanity checkings. Should not happen. 0085 if (selTileset == nullptr) { 0086 return; 0087 } 0088 if (selTileset->path() == kcfg_TileSet->text()) { 0089 return; 0090 } 0091 0092 kcfg_TileSet->setText(selTileset->path()); 0093 tilesetAuthor->setText(selTileset->authorName()); 0094 tilesetContact->setText(selTileset->authorEmailAddress()); 0095 tilesetDescription->setText(selTileset->description()); 0096 tilesetVersion->setText(selTileset->version()); 0097 QString website = selTileset->website(); 0098 if (!website.isEmpty()) { 0099 website = QLatin1String("<a href=\"") + website + QLatin1String("\">") + website + QLatin1String("</a>"); 0100 } 0101 tilesetWebsite->setText(website); 0102 tilesetCopyright->setText(selTileset->copyrightText()); 0103 const QString licenseName = KAboutLicense::byKeyword(selTileset->license()).name(KAboutLicense::FullName); 0104 tilesetLicense->setText(licenseName); 0105 0106 // Make sure SVG is loaded when graphics is selected 0107 if (!selTileset->loadGraphics()) { 0108 return; 0109 } 0110 const qreal dpr = qApp->devicePixelRatio(); 0111 // Let the tileset calculate its ideal size for the preview area, but reduce the margins a bit (pass oversized drawing area) 0112 const QSize previewSize = tilesetPreview->size() * dpr; 0113 const QSize tilesize = selTileset->preferredTileSize(previewSize * 1.3, 1, 1); 0114 selTileset->reloadTileset(tilesize); 0115 // Draw the preview 0116 QPixmap qiRend(previewSize); 0117 qiRend.fill(Qt::transparent); 0118 QPainter p(&qiRend); 0119 // Calculate the margins to center the tile 0120 const QSize margin = (previewSize - tilesize) / 2; 0121 // Draw unselected tile and first tileface 0122 p.drawPixmap(margin.width(), margin.height(), selTileset->unselectedTile(1)); 0123 p.drawPixmap(margin.width(), margin.height(), selTileset->tileface(0)); 0124 p.end(); 0125 qiRend.setDevicePixelRatio(dpr); 0126 tilesetPreview->setPixmap(qiRend); 0127 } 0128 0129 #include "moc_kmahjonggtilesetselector.cpp"