From 5e77d65424ff7038a2dfb6b8e13bb416eb252636 Mon Sep 17 00:00:00 2001
From: Adriaan de Groot <groot@kde.org>
Date: Fri, 16 Apr 2021 14:53:13 +0200
Subject: [PATCH] [packagechooser] Add install-method to pick *packages* module

---
 src/modules/packagechooser/Config.cpp         | 69 +++++++++++++++----
 src/modules/packagechooser/Config.h           | 29 +++++++-
 .../packagechooser/PackageChooserPage.h       |  1 +
 .../packagechooser/PackageChooserViewStep.cpp |  2 +-
 src/modules/packagechooser/PackageModel.cpp   | 20 ------
 src/modules/packagechooser/PackageModel.h     |  9 ---
 6 files changed, 85 insertions(+), 45 deletions(-)

diff --git a/src/modules/packagechooser/Config.cpp b/src/modules/packagechooser/Config.cpp
index aa383d3c8..78c417908 100644
--- a/src/modules/packagechooser/Config.cpp
+++ b/src/modules/packagechooser/Config.cpp
@@ -15,11 +15,43 @@
 
 #include "GlobalStorage.h"
 #include "JobQueue.h"
+#include "packages/Globals.h"
 #include "utils/Logger.h"
 #include "utils/Variant.h"
 
+const NamedEnumTable< PackageChooserMode >&
+packageChooserModeNames()
+{
+    static const NamedEnumTable< PackageChooserMode > names {
+        { "optional", PackageChooserMode::Optional },
+        { "required", PackageChooserMode::Required },
+        { "optionalmultiple", PackageChooserMode::OptionalMultiple },
+        { "requiredmultiple", PackageChooserMode::RequiredMultiple },
+        // and a bunch of aliases
+        { "zero-or-one", PackageChooserMode::Optional },
+        { "radio", PackageChooserMode::Required },
+        { "one", PackageChooserMode::Required },
+        { "set", PackageChooserMode::OptionalMultiple },
+        { "zero-or-more", PackageChooserMode::OptionalMultiple },
+        { "multiple", PackageChooserMode::RequiredMultiple },
+        { "one-or-more", PackageChooserMode::RequiredMultiple }
+    };
+    return names;
+}
+
+const NamedEnumTable< PackageChooserMethod >&
+PackageChooserMethodNames()
+{
+    static const NamedEnumTable< PackageChooserMethod > names {
+        { "legacy", PackageChooserMethod::Legacy },
+        { "custom", PackageChooserMethod::Legacy },
+        { "contextualprocess", PackageChooserMethod::Legacy },
+        { "packages", PackageChooserMethod::Packages },
+    };
+    return names;
+}
 
-Config::Config( const QString& defaultId, QObject* parent )
+Config::Config( const Calamares::ModuleSystem::InstanceKey& defaultId, QObject* parent )
     : Calamares::ModuleSystem::Config( parent )
     , m_model( new PackageListModel( this ) )
     , m_mode( PackageChooserMode::Required )
@@ -44,14 +76,14 @@ Config::introductionPackage() const
     static PackageItem* defaultIntroduction = nullptr;
     if ( !defaultIntroduction )
     {
-        defaultIntroduction = new PackageItem(
-            QString(),
-            QT_TR_NOOP( "Package Selection" ),
-            QT_TR_NOOP( "Please pick a product from the list. The selected product will be installed." ) );
+        const auto name = QT_TR_NOOP( "Package Selection" );
+        const auto description
+            = QT_TR_NOOP( "Please pick a product from the list. The selected product will be installed." );
+        defaultIntroduction = new PackageItem( QString(), name, description );
         defaultIntroduction->screenshot = QPixmap( QStringLiteral( ":/images/no-selection.png" ) );
-        // TODO: enable better translation
-        // defaultIntroduction->name.setContext( metaObject()->className() );
-        // defaultIntroduction->description.setContext( metaObject()->className() );
+        defaultIntroduction->name = CalamaresUtils::Locale::TranslatedString( name, metaObject()->className() );
+        defaultIntroduction->description
+            = CalamaresUtils::Locale::TranslatedString( description, metaObject()->className() );
     }
     return *defaultIntroduction;
 }
@@ -60,10 +92,23 @@ void
 Config::updateGlobalStorage( const QStringList& selected ) const
 {
     QString key = QStringLiteral( "packagechooser_%1" ).arg( m_id );
-    QString value = selected.join( ',' );
-    Calamares::JobQueue::instance()->globalStorage()->insert( key, value );
 
-    cDebug() << "PackageChooser" << key << "selected" << value;
+    if ( m_method == PackageChooserMethod::Legacy )
+    {
+        QString value = selected.join( ',' );
+        Calamares::JobQueue::instance()->globalStorage()->insert( key, value );
+
+        cDebug() << "PackageChooser" << key << "selected" << value;
+    }
+    else if ( m_method == PackageChooserMethod::Packages )
+    {
+        CalamaresUtils::Packages::setGSPackageAdditions(
+            Calamares::JobQueue::instance()->globalStorage(), m_defaultId, selected );
+    }
+    else
+    {
+        cWarning() << "Unknown packagechooser method" << smash( m_method );
+    }
 }
 
 
@@ -142,7 +187,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
     m_id = CalamaresUtils::getString( configurationMap, "id" );
     if ( m_id.isEmpty() )
     {
-        m_id = m_defaultId;
+        m_id = m_defaultId.id();
     }
 
     m_defaultModelIndex = QModelIndex();
diff --git a/src/modules/packagechooser/Config.h b/src/modules/packagechooser/Config.h
index 6a65c8788..d07b4a010 100644
--- a/src/modules/packagechooser/Config.h
+++ b/src/modules/packagechooser/Config.h
@@ -13,15 +13,34 @@
 #include "PackageModel.h"
 
 #include "modulesystem/Config.h"
+#include "modulesystem/InstanceKey.h"
 
 #include <memory>
 
+enum class PackageChooserMode
+{
+    Optional,  // zero or one
+    Required,  // exactly one
+    OptionalMultiple,  // zero or more
+    RequiredMultiple  // one or more
+};
+
+const NamedEnumTable< PackageChooserMode >& packageChooserModeNames();
+
+enum class PackageChooserMethod
+{
+    Legacy,  // use contextualprocess or other custom
+    Packages,  // use the packages module
+};
+
+const NamedEnumTable< PackageChooserMethod >& PackageChooserMethodNames();
+
 class Config : public Calamares::ModuleSystem::Config
 {
     Q_OBJECT
 
 public:
-    Config( const QString& defaultId, QObject* parent = nullptr );
+    Config( const Calamares::ModuleSystem::InstanceKey& defaultId, QObject* parent = nullptr );
     ~Config() override;
 
     void setConfigurationMap( const QVariantMap& ) override;
@@ -51,10 +70,14 @@ private:
     PackageListModel* m_model = nullptr;
     QModelIndex m_defaultModelIndex;
 
-    // Configuration
+    /// Selection mode for this module
     PackageChooserMode m_mode = PackageChooserMode::Optional;
+    /// How this module stores to GS
+    PackageChooserMethod m_method = PackageChooserMethod::Legacy;
+    /// Id (used to identify settings from this module in GS)
     QString m_id;
-    QString m_defaultId;
+    /// Value to use for id if none is set in the config file
+    Calamares::ModuleSystem::InstanceKey m_defaultId;
 };
 
 
diff --git a/src/modules/packagechooser/PackageChooserPage.h b/src/modules/packagechooser/PackageChooserPage.h
index 4f485c890..90c2b28a6 100644
--- a/src/modules/packagechooser/PackageChooserPage.h
+++ b/src/modules/packagechooser/PackageChooserPage.h
@@ -10,6 +10,7 @@
 #ifndef PACKAGECHOOSERPAGE_H
 #define PACKAGECHOOSERPAGE_H
 
+#include "Config.h"
 #include "PackageModel.h"
 
 #include <QAbstractItemModel>
diff --git a/src/modules/packagechooser/PackageChooserViewStep.cpp b/src/modules/packagechooser/PackageChooserViewStep.cpp
index 05d0d3cfd..a15fd0f55 100644
--- a/src/modules/packagechooser/PackageChooserViewStep.cpp
+++ b/src/modules/packagechooser/PackageChooserViewStep.cpp
@@ -37,7 +37,7 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( PackageChooserViewStepFactory, registerPlug
 
 PackageChooserViewStep::PackageChooserViewStep( QObject* parent )
     : Calamares::ViewStep( parent )
-    , m_config( new Config( moduleInstanceKey().id(), this ) )
+    , m_config( new Config( moduleInstanceKey(), this ) )
     , m_widget( nullptr )
     , m_stepName( nullptr )
 {
diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp
index 55300f940..05a90f220 100644
--- a/src/modules/packagechooser/PackageModel.cpp
+++ b/src/modules/packagechooser/PackageModel.cpp
@@ -12,26 +12,6 @@
 #include "utils/Logger.h"
 #include "utils/Variant.h"
 
-const NamedEnumTable< PackageChooserMode >&
-packageChooserModeNames()
-{
-    static const NamedEnumTable< PackageChooserMode > names {
-        { "optional", PackageChooserMode::Optional },
-        { "required", PackageChooserMode::Required },
-        { "optionalmultiple", PackageChooserMode::OptionalMultiple },
-        { "requiredmultiple", PackageChooserMode::RequiredMultiple },
-        // and a bunch of aliases
-        { "zero-or-one", PackageChooserMode::Optional },
-        { "radio", PackageChooserMode::Required },
-        { "one", PackageChooserMode::Required },
-        { "set", PackageChooserMode::OptionalMultiple },
-        { "zero-or-more", PackageChooserMode::OptionalMultiple },
-        { "multiple", PackageChooserMode::RequiredMultiple },
-        { "one-or-more", PackageChooserMode::RequiredMultiple }
-    };
-    return names;
-}
-
 PackageItem::PackageItem() {}
 
 PackageItem::PackageItem( const QString& a_id, const QString& a_name, const QString& a_description )
diff --git a/src/modules/packagechooser/PackageModel.h b/src/modules/packagechooser/PackageModel.h
index 0da0e4a53..b27c0ed3b 100644
--- a/src/modules/packagechooser/PackageModel.h
+++ b/src/modules/packagechooser/PackageModel.h
@@ -18,15 +18,6 @@
 #include <QPixmap>
 #include <QVector>
 
-enum class PackageChooserMode
-{
-    Optional,  // zero or one
-    Required,  // exactly one
-    OptionalMultiple,  // zero or more
-    RequiredMultiple  // one or more
-};
-
-const NamedEnumTable< PackageChooserMode >& packageChooserModeNames();
 
 struct PackageItem
 {