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"