File indexing completed on 2024-04-28 04:37:04
0001 /* 0002 SPDX-FileCopyrightText: 2006 Adam Treat <treat@kde.org> 0003 SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "projectconfigskeleton.h" 0009 #include "debug.h" 0010 0011 #include <interfaces/iproject.h> 0012 #include <util/path.h> 0013 0014 #include <KIO/CopyJob> 0015 0016 using namespace KDevelop; 0017 0018 class KDevelop::ProjectConfigSkeletonPrivate 0019 { 0020 public: 0021 QString m_developerTempFile; 0022 QString m_projectTempFile; 0023 Path m_projectFile; 0024 Path m_developerFile; 0025 bool mUseDefaults; 0026 }; 0027 0028 ProjectConfigSkeleton::ProjectConfigSkeleton( const QString & configname ) 0029 : KConfigSkeleton(configname) 0030 , d_ptr(new ProjectConfigSkeletonPrivate) 0031 { 0032 Q_D(ProjectConfigSkeleton); 0033 0034 d->m_developerTempFile = configname; 0035 } 0036 0037 ProjectConfigSkeleton::ProjectConfigSkeleton( KSharedConfigPtr config ) 0038 : KConfigSkeleton(config) 0039 , d_ptr(new ProjectConfigSkeletonPrivate) 0040 { 0041 Q_D(ProjectConfigSkeleton); 0042 0043 Q_ASSERT(config); 0044 d->m_developerTempFile = config->name(); 0045 } 0046 0047 ProjectConfigSkeleton::~ProjectConfigSkeleton() = default; 0048 0049 void ProjectConfigSkeleton::setDeveloperTempFile( const QString& cfg ) 0050 { 0051 Q_D(ProjectConfigSkeleton); 0052 0053 d->m_developerTempFile = cfg; 0054 setSharedConfig( KSharedConfig::openConfig( cfg ) ); 0055 } 0056 0057 void ProjectConfigSkeleton::setProjectTempFile( const QString& cfg ) 0058 { 0059 Q_D(ProjectConfigSkeleton); 0060 0061 d->m_projectTempFile = cfg; 0062 config()->addConfigSources( QStringList() << cfg ); 0063 load(); 0064 } 0065 0066 void ProjectConfigSkeleton::setProjectFile( const Path& cfg ) 0067 { 0068 Q_D(ProjectConfigSkeleton); 0069 0070 d->m_projectFile = cfg; 0071 } 0072 0073 void ProjectConfigSkeleton::setDeveloperFile( const Path& cfg ) 0074 { 0075 Q_D(ProjectConfigSkeleton); 0076 0077 d->m_developerFile = cfg; 0078 } 0079 0080 Path ProjectConfigSkeleton::projectFile() const 0081 { 0082 Q_D(const ProjectConfigSkeleton); 0083 0084 return d->m_projectFile; 0085 } 0086 0087 Path ProjectConfigSkeleton::developerFile() const 0088 { 0089 Q_D(const ProjectConfigSkeleton); 0090 0091 return d->m_developerFile; 0092 } 0093 0094 void ProjectConfigSkeleton::setDefaults() 0095 { 0096 Q_D(ProjectConfigSkeleton); 0097 0098 qCDebug(PROJECT) << "Setting Defaults"; 0099 KConfig cfg( d->m_projectTempFile ); 0100 const auto items = this->items(); 0101 for (KConfigSkeletonItem* item : items) { 0102 item->swapDefault(); 0103 if( cfg.hasGroup( item->group() ) ) 0104 { 0105 KConfigGroup grp = cfg.group( item->group() ); 0106 if( grp.hasKey( item->key() ) ) 0107 item->setProperty( grp.readEntry( item->key(), item->property() ) ); 0108 } 0109 } 0110 } 0111 0112 bool ProjectConfigSkeleton::useDefaults( bool b ) 0113 { 0114 Q_D(ProjectConfigSkeleton); 0115 0116 if( b == d->mUseDefaults ) 0117 return d->mUseDefaults; 0118 0119 if( b ) 0120 { 0121 KConfig cfg( d->m_projectTempFile ); 0122 const auto items = this->items(); 0123 for (KConfigSkeletonItem* item : items) { 0124 item->swapDefault(); 0125 if( cfg.hasGroup( item->group() ) ) 0126 { 0127 qCDebug(PROJECT) << "reading"; 0128 KConfigGroup grp = cfg.group( item->group() ); 0129 if( grp.hasKey( item->key() ) ) 0130 item->setProperty( grp.readEntry( item->key(), item->property() ) ); 0131 } 0132 } 0133 } else 0134 { 0135 KConfig cfg( d->m_developerTempFile ); 0136 KConfig defCfg( d->m_projectTempFile ); 0137 const auto items = this->items(); 0138 for (KConfigSkeletonItem* item : items) { 0139 if( cfg.hasGroup( item->group() ) ) 0140 { 0141 KConfigGroup grp = cfg.group( item->group() ); 0142 if( grp.hasKey( item->key() ) ) 0143 item->setProperty( grp.readEntry( item->key(), item->property() ) ); 0144 else 0145 { 0146 KConfigGroup grp = defCfg.group( item->group() ); 0147 item->setProperty( grp.readEntry( item->key(), item->property() ) ); 0148 } 0149 } else 0150 { 0151 KConfigGroup grp = defCfg.group( item->group() ); 0152 item->setProperty( grp.readEntry( item->key(), item->property() ) ); 0153 } 0154 } 0155 } 0156 d->mUseDefaults = b; 0157 return !d->mUseDefaults; 0158 } 0159 0160 bool ProjectConfigSkeleton::writeConfig() 0161 { 0162 Q_D(ProjectConfigSkeleton); 0163 0164 const KConfigSkeletonItem::List myitems = items(); 0165 for (auto* item : myitems) { 0166 item->writeConfig(config()); 0167 } 0168 0169 config()->sync(); 0170 0171 load(); 0172 0173 auto copyJob = KIO::copy(QUrl::fromLocalFile(d->m_developerTempFile), d->m_developerFile.toUrl(), KIO::HideProgressInfo); 0174 copyJob ->exec(); 0175 0176 emit configChanged(); 0177 return true; 0178 } 0179 0180 #include "moc_projectconfigskeleton.cpp"