File indexing completed on 2024-04-28 04:37:04
0001 /* 0002 SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef KDEVPLATFORM_PROJECTCONFIGPAGE_H 0008 #define KDEVPLATFORM_PROJECTCONFIGPAGE_H 0009 0010 0011 #include <interfaces/iproject.h> 0012 #include <interfaces/configpage.h> 0013 0014 #include <util/path.h> 0015 0016 #include "projectconfigskeleton.h" 0017 0018 class KComponentData; 0019 class QWidget; 0020 0021 namespace KDevelop { 0022 0023 /** This is needed because IProject does not expose these methods */ 0024 struct ProjectConfigOptions 0025 { 0026 QString developerTempFile; 0027 Path developerFile; 0028 QString projectTempFile; 0029 KDevelop::IProject* project; 0030 }; 0031 0032 } 0033 0034 /** 0035 * @tparam T a class derived from KDevelop::ProjectConfigSkeleton. 0036 */ 0037 template<typename T> 0038 class ProjectConfigPage : public KDevelop::ConfigPage 0039 { 0040 public: 0041 ProjectConfigPage(KDevelop::IPlugin* plugin, const KDevelop::ProjectConfigOptions& options, QWidget* parent) 0042 : KDevelop::ConfigPage(plugin, initConfigSkeleton(options), parent) 0043 , m_project(options.project) 0044 { 0045 static_assert(std::is_base_of<KDevelop::ProjectConfigSkeleton, T>::value, "T must inherit from KDevelop::ProjectConfigSkeleton"); 0046 KDevelop::ProjectConfigSkeleton* conf = T::self(); 0047 conf->setDeveloperTempFile(options.developerTempFile); 0048 conf->setDeveloperFile(options.developerFile); 0049 conf->setProjectTempFile(options.projectTempFile); 0050 conf->setProjectFile(m_project->projectFile()); 0051 } 0052 0053 ~ProjectConfigPage() override 0054 { 0055 // we have to delete T::self otherwise we get the following message on the 0056 // next call to T::instance(QString): 0057 // "T::instance called after the first use - ignoring" 0058 // which means that we will continue using the old file 0059 delete T::self(); 0060 } 0061 0062 KDevelop::IProject* project() const 0063 { 0064 return m_project; 0065 } 0066 private: 0067 static inline KDevelop::ProjectConfigSkeleton* initConfigSkeleton(const KDevelop::ProjectConfigOptions& options) 0068 { 0069 T::instance(options.developerTempFile); 0070 return T::self(); 0071 } 0072 private: 0073 KDevelop::IProject* m_project; 0074 }; 0075 0076 #endif 0077