File indexing completed on 2024-05-12 15:58:10

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_bookmarked_configuration_manager.h"
0008 #include <QDomDocument>
0009 #include <QDomElement>
0010 #include <QString>
0011 
0012 #include <kconfig.h>
0013 #include <ksharedconfig.h>
0014 #include <klocalizedstring.h>
0015 #include <kconfiggroup.h>
0016 
0017 
0018 #include <KoID.h>
0019 
0020 #include "kis_debug.h"
0021 #include "kis_serializable_configuration.h"
0022 
0023 
0024 const char KisBookmarkedConfigurationManager::ConfigDefault[] = "Default";
0025 const char KisBookmarkedConfigurationManager::ConfigLastUsed[] = "Last Used";
0026 
0027 struct Q_DECL_HIDDEN KisBookmarkedConfigurationManager::Private {
0028 
0029     QString configEntryGroup;
0030     KisSerializableConfigurationFactory* configFactory;
0031 
0032 };
0033 
0034 KisBookmarkedConfigurationManager::KisBookmarkedConfigurationManager(const QString & configEntryGroup, KisSerializableConfigurationFactory* configFactory)
0035     : d(new Private)
0036 {
0037     d->configEntryGroup = configEntryGroup;
0038     d->configFactory = configFactory;
0039 }
0040 
0041 KisBookmarkedConfigurationManager::~KisBookmarkedConfigurationManager()
0042 {
0043     delete d->configFactory;
0044     delete d;
0045 }
0046 
0047 KisSerializableConfigurationSP KisBookmarkedConfigurationManager::load(const QString & configname) const
0048 {
0049     if (!exists(configname)) {
0050         if (configname == KisBookmarkedConfigurationManager::ConfigDefault)
0051             return d->configFactory->createDefault();
0052         else
0053             return 0;
0054     }
0055     KConfigGroup cfg =  KSharedConfig::openConfig()->group(configEntryGroup());
0056 
0057     QDomDocument doc;
0058     doc.setContent(cfg.readEntry<QString>(configname, ""));
0059     QDomElement e = doc.documentElement();
0060     KisSerializableConfigurationSP config = d->configFactory->create(e);
0061     dbgImage << config << endl;
0062     return config;
0063 }
0064 
0065 void KisBookmarkedConfigurationManager::save(const QString & configname, const KisSerializableConfigurationSP config)
0066 {
0067     dbgImage << "Saving configuration " << config << " to " << configname;
0068     if (!config) return;
0069     KConfigGroup cfg =  KSharedConfig::openConfig()->group(configEntryGroup());
0070     cfg.writeEntry(configname, config->toXML());
0071 }
0072 
0073 bool KisBookmarkedConfigurationManager::exists(const QString & configname) const
0074 {
0075     KSharedConfig::Ptr cfg =  KSharedConfig::openConfig();
0076     QMap< QString, QString > m = cfg->entryMap(configEntryGroup());
0077     return (m.find(configname) != m.end());
0078 }
0079 
0080 QList<QString> KisBookmarkedConfigurationManager::configurations() const
0081 {
0082     KSharedConfig::Ptr cfg =  KSharedConfig::openConfig();
0083     QMap< QString, QString > m = cfg->entryMap(configEntryGroup());
0084     QList<QString> keys = m.keys();
0085     QList<QString> configsKey;
0086     Q_FOREACH (const QString & key, keys) {
0087         if (key != KisBookmarkedConfigurationManager::ConfigDefault && key != KisBookmarkedConfigurationManager::ConfigLastUsed) {
0088             configsKey << key;
0089         }
0090     }
0091     return configsKey;
0092 }
0093 
0094 KisSerializableConfigurationSP KisBookmarkedConfigurationManager::defaultConfiguration() const
0095 {
0096     if (exists(KisBookmarkedConfigurationManager::ConfigDefault)) {
0097         return load(KisBookmarkedConfigurationManager::ConfigDefault);
0098     }
0099     if (exists(KisBookmarkedConfigurationManager::ConfigLastUsed)) {
0100         return load(KisBookmarkedConfigurationManager::ConfigLastUsed);
0101     }
0102     return 0;
0103 }
0104 
0105 QString KisBookmarkedConfigurationManager::configEntryGroup() const
0106 {
0107     return d->configEntryGroup;
0108 }
0109 
0110 void KisBookmarkedConfigurationManager::remove(const QString & name)
0111 {
0112     KSharedConfig::Ptr cfg =  KSharedConfig::openConfig();
0113     KConfigGroup group = cfg->group(configEntryGroup());
0114     group.deleteEntry(name);
0115 }
0116 
0117 QString KisBookmarkedConfigurationManager::uniqueName(const KLocalizedString & base)
0118 {
0119 #ifndef QT_NO_DEBUG
0120     QString prev;
0121 #endif
0122     int nb = 1;
0123     while (true) {
0124         QString cur = base.subs(nb++).toString();
0125         if (!exists(cur)) return cur;
0126 #ifndef QT_NO_DEBUG
0127         Q_ASSERT(prev != cur);
0128         prev = cur;
0129 #endif
0130     }
0131 }