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