summaryrefslogtreecommitdiff
path: root/src/createinstancedialog.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/createinstancedialog.h')
-rw-r--r--src/createinstancedialog.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/createinstancedialog.h b/src/createinstancedialog.h
new file mode 100644
index 00000000..25e383eb
--- /dev/null
+++ b/src/createinstancedialog.h
@@ -0,0 +1,138 @@
+#ifndef MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
+#define MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
+
+#include <QDialog>
+
+namespace MOBase { class IPluginGame; }
+namespace Ui { class CreateInstanceDialog; };
+namespace cid { class Page; }
+
+class PluginContainer;
+class Settings;
+
+class CreateInstanceDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ enum Types
+ {
+ NoType = 0,
+ Global,
+ Portable
+ };
+
+ struct Paths
+ {
+ QString base;
+ QString downloads;
+ QString mods;
+ QString profiles;
+ QString overwrite;
+ QString ini;
+
+ auto operator<=>(const Paths&) const = default;
+ };
+
+ struct CreationInfo
+ {
+ Types type;
+ MOBase::IPluginGame* game;
+ QString gameLocation;
+ QString gameVariant;
+ QString instanceName;
+ QString dataPath;
+ QString iniPath;
+ Paths paths;
+ };
+
+
+ CreateInstanceDialog(
+ const PluginContainer& pc, Settings* s, QWidget *parent = nullptr);
+
+ ~CreateInstanceDialog();
+
+ Ui::CreateInstanceDialog* getUI();
+
+ const PluginContainer& pluginContainer();
+ Settings* settings();
+
+ template <class Page>
+ void setSinglePage(const QString& instanceName)
+ {
+ for (auto&& p : m_pages) {
+ if (auto* tp=dynamic_cast<Page*>(p.get())) {
+ tp->setSkip(false);
+ } else {
+ p->setSkip(true);
+ }
+ }
+
+ setSinglePageImpl(instanceName);
+ }
+
+ template <class Page>
+ Page* getPage()
+ {
+ for (auto&& p : m_pages) {
+ if (auto* tp=dynamic_cast<Page*>(p.get())) {
+ return tp;
+ }
+ }
+
+ return nullptr;
+ }
+
+ void next();
+ void back();
+ void selectPage(std::size_t i);
+ void changePage(int d);
+ void finish();
+
+ void updateNavigation();
+ bool isOnLastPage() const;
+
+ Types instanceType() const;
+ MOBase::IPluginGame* game() const;
+ QString gameLocation() const;
+ QString gameVariant() const;
+ QString instanceName() const;
+ QString dataPath() const;
+ Paths paths() const;
+ bool switching() const;
+
+ CreationInfo creationInfo() const;
+
+private:
+ std::unique_ptr<Ui::CreateInstanceDialog> ui;
+ const PluginContainer& m_pc;
+ Settings* m_settings;
+ std::vector<std::unique_ptr<cid::Page>> m_pages;
+ QString m_originalNext;
+ bool m_switching;
+ bool m_singlePage;
+
+
+ void setSinglePageImpl(const QString& instanceName);
+
+ template <class T>
+ T getSelected(T (cid::Page::*mf)() const) const
+ {
+ for (auto&& p : m_pages) {
+ const auto t = (p.get()->*mf)();
+ if (t != T()) {
+ return t;
+ }
+ }
+
+ return T();
+ }
+
+ void logCreation(const QString& s);
+ void logCreation(const std::wstring& s);
+
+ bool canNext() const;
+ bool canBack() const;
+};
+
+#endif // MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED