From a32dcdad869d1544e46d6e7651d2768967e2983d Mon Sep 17 00:00:00 2001
From: Adriaan de Groot <groot@kde.org>
Date: Fri, 2 Aug 2019 16:25:26 +0200
Subject: [PATCH] [packagechooser] Support multiple selection modes

---
 .../packagechooser/PackageChooserPage.cpp     | 12 ++++++-
 .../packagechooser/PackageChooserPage.h       |  2 +-
 .../packagechooser/PackageChooserViewStep.cpp | 32 +++++++++++++++++--
 .../packagechooser/PackageChooserViewStep.h   |  3 ++
 src/modules/packagechooser/PackageModel.h     |  8 +++++
 5 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/src/modules/packagechooser/PackageChooserPage.cpp b/src/modules/packagechooser/PackageChooserPage.cpp
index a474e7536..307b1b861 100644
--- a/src/modules/packagechooser/PackageChooserPage.cpp
+++ b/src/modules/packagechooser/PackageChooserPage.cpp
@@ -25,7 +25,7 @@
 
 #include <QLabel>
 
-PackageChooserPage::PackageChooserPage( QWidget* parent )
+PackageChooserPage::PackageChooserPage( PackageChooserMode mode, QWidget* parent )
     : QWidget( parent )
     , ui( new Ui::PackageChooserPage )
     , m_introduction( QString(),
@@ -35,6 +35,16 @@ PackageChooserPage::PackageChooserPage( QWidget* parent )
 {
     ui->setupUi( this );
     CALAMARES_RETRANSLATE( updateLabels(); )
+
+    switch( mode )
+    {
+        case PackageChooserMode::Optional:
+        case PackageChooserMode::Exclusive:
+            ui->products->setSelectionMode( QAbstractItemView::SingleSelection );
+        case PackageChooserMode::Multiple:
+        case PackageChooserMode::RequiredMultiple:
+            ui->products->setSelectionMode( QAbstractItemView::ExtendedSelection );
+    }
 }
 
 void
diff --git a/src/modules/packagechooser/PackageChooserPage.h b/src/modules/packagechooser/PackageChooserPage.h
index 031abad69..483fd5d0a 100644
--- a/src/modules/packagechooser/PackageChooserPage.h
+++ b/src/modules/packagechooser/PackageChooserPage.h
@@ -33,7 +33,7 @@ class PackageChooserPage : public QWidget
 {
     Q_OBJECT
 public:
-    explicit PackageChooserPage( QWidget* parent = nullptr );
+    explicit PackageChooserPage( PackageChooserMode mode, QWidget* parent = nullptr );
 
     void setModel( QAbstractItemModel* model );
 
diff --git a/src/modules/packagechooser/PackageChooserViewStep.cpp b/src/modules/packagechooser/PackageChooserViewStep.cpp
index 3ff2ac636..2a5cc8073 100644
--- a/src/modules/packagechooser/PackageChooserViewStep.cpp
+++ b/src/modules/packagechooser/PackageChooserViewStep.cpp
@@ -37,6 +37,7 @@ PackageChooserViewStep::PackageChooserViewStep( QObject* parent )
     : Calamares::ViewStep( parent )
     , m_widget( nullptr )
     , m_model( nullptr )
+    , m_mode( PackageChooserMode::Optional )
 {
     emit nextStatusChanged( false );
 }
@@ -64,7 +65,7 @@ PackageChooserViewStep::widget()
 {
     if ( !m_widget )
     {
-        m_widget = new PackageChooserPage( nullptr );
+        m_widget = new PackageChooserPage( m_mode, nullptr );
         if ( m_model )
         {
             hookupModel();
@@ -77,7 +78,34 @@ PackageChooserViewStep::widget()
 bool
 PackageChooserViewStep::isNextEnabled() const
 {
-    return true;
+    if ( !m_model )
+    {
+        return false;
+    }
+
+    if ( !m_widget )
+    {
+        // No way to have changed anything
+        return true;
+    }
+
+    switch( m_mode )
+    {
+        case PackageChooserMode::Optional:
+            // zero or one
+            return false;
+        case PackageChooserMode::Exclusive:
+            // exactly one
+            return false;
+        case PackageChooserMode::Multiple:
+            // zero or more
+            return true;
+        case PackageChooserMode::RequiredMultiple:
+            // one or more
+            return false;
+    }
+
+    NOTREACHED return true;
 }
 
 
diff --git a/src/modules/packagechooser/PackageChooserViewStep.h b/src/modules/packagechooser/PackageChooserViewStep.h
index 56fbf5d3a..ed33c3e46 100644
--- a/src/modules/packagechooser/PackageChooserViewStep.h
+++ b/src/modules/packagechooser/PackageChooserViewStep.h
@@ -23,6 +23,8 @@
 #include "utils/PluginFactory.h"
 #include "viewpages/ViewStep.h"
 
+#include "PackageModel.h"
+
 #include <QObject>
 #include <QUrl>
 #include <QVariantMap>
@@ -59,6 +61,7 @@ private:
 
     PackageChooserPage* m_widget;
     PackageListModel* m_model;
+    PackageChooserMode m_mode;
 };
 
 CALAMARES_PLUGIN_FACTORY_DECLARATION( PackageChooserViewStepFactory )
diff --git a/src/modules/packagechooser/PackageModel.h b/src/modules/packagechooser/PackageModel.h
index 67715e197..6d150802f 100644
--- a/src/modules/packagechooser/PackageModel.h
+++ b/src/modules/packagechooser/PackageModel.h
@@ -24,6 +24,14 @@
 #include <QPixmap>
 #include <QVector>
 
+enum class PackageChooserMode
+{
+    Optional,  // zero or one
+    Exclusive, // exactly one
+    Multiple,  // zero or more
+    RequiredMultiple  // one or more
+};
+
 struct PackageItem
 {
     QString id;