client-qml: add initial commit

Change-Id: I32bfdd2a618aa7ac6181da2697e241667b010aab
diff --git a/src/settingsview/components/PluginListPreferencesView.qml b/src/settingsview/components/PluginListPreferencesView.qml
new file mode 100644
index 0000000..9b8c03a
--- /dev/null
+++ b/src/settingsview/components/PluginListPreferencesView.qml
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2019-2020 by Savoir-faire Linux
+ * Author: Yang Wang   <yang.wang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.15
+import QtQuick.Window 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Layouts 1.3
+import Qt.labs.platform 1.1
+import QtGraphicalEffects 1.14
+import net.jami.Models 1.0
+import "../../commoncomponents"
+
+Rectangle {
+    id: pluginListPreferencesViewRect
+
+    enum Type {
+        LIST,
+        DEFAULT
+    }
+
+    signal updatePluginList
+
+    property string pluginName: ""
+    property string pluginIcon: ""
+    property string pluginId: ""
+    property bool isLoaded: false
+    property int size: 0
+
+    visible: false
+
+    function updatePreferenceListDisplayed(show){
+        // settings
+        getSize(pluginId, show)
+        preferenceItemListModel.pluginId = pluginId
+        preferenceItemListModel.reset()
+    }
+
+    function resetPluginSlot(){
+        resetPluginMessageBox.open()
+    }
+
+    function resetPlugin(){
+        ClientWrapper.pluginModel.resetPluginPreferencesValues(pluginId, isLoaded)
+        updatePluginList()
+    }
+
+    function uninstallPluginSlot(){
+        uninstallPluginMessageBox.open()
+    }
+
+    function uninstallPlugin(){
+        ClientWrapper.pluginModel.uninstallPlugin(pluginId)
+        updatePluginList()
+    }
+
+    function getSize(pluginId, show){
+        size = 50 * ClientWrapper.pluginModel.getPluginPreferences(pluginId).length
+        if (show) {
+            height = 200 + size            
+            pluginPreferenceView.height = size
+        } else {
+            height = 25
+        }
+    }
+
+    function editPreferenceSlot(preferenceType, preferenceName, preferenceEntryValues){
+        switch (preferenceType){
+            case PluginListPreferencesView.LIST:
+                console.log("LIST")
+                editListMessageBox.preferenceName = preferenceName
+                editListMessageBox.preferenceEntryValues =  preferenceEntryValues
+                editListMessageBox.open()
+                break
+            case PluginListPreferencesView.DEFAULT:
+                console.log("Unrecognizable Type")
+                break
+            default:
+                console.log("Unrecognizable Type")
+                break
+        }
+    }
+
+    function setPreference(pluginId, preferenceKey, preferenceNewValue)
+    {
+        ClientWrapper.pluginModel.setPluginPreferences(pluginId, preferenceKey, preferenceNewValue, isLoaded)
+        preferenceItemListModel.reset()
+    }
+
+    MessageBox{
+        id: uninstallPluginMessageBox
+
+        title:qsTr("Uninstall plugin")
+        text :qsTr("Are you sure you wish to uninstall " + pluginName + " ?")
+        standardButtons: StandardButton.Ok | StandardButton.Cancel
+
+        onYes: {
+            accepted()
+        }
+
+        onNo:{
+            rejected()
+        }
+
+        onDiscard: {
+            rejected()
+        }
+
+        onAccepted: {
+            uninstallPlugin()
+            pluginListPreferencesViewRect.visible = false
+        }
+
+        onRejected: {}
+    }
+
+    MessageBox{
+        id: resetPluginMessageBox
+
+        title:qsTr("Reset preferences")
+        text :qsTr("Are you sure you wish to reset "+ pluginName + " preferences?")
+
+        standardButtons: StandardButton.Ok | StandardButton.Cancel
+
+        onYes: {
+            accepted()
+        }
+
+        onNo:{
+            rejected()
+        }
+
+        onDiscard: {
+            rejected()
+        }
+
+        onAccepted: {
+            resetPlugin()
+        }
+
+        onRejected: {}
+    }
+
+    MessageBox{
+        id: editListMessageBox
+
+        property string preferenceName: ""
+        property var preferenceEntryValues: []
+        
+        title:qsTr("Edit " + preferenceName)
+        text :qsTr(preferenceName + " options: " + preferenceEntryValues)
+
+        standardButtons: StandardButton.Ok | StandardButton.Cancel
+
+        onYes: {
+            accepted()
+        }
+
+        onNo:{
+            rejected()
+        }
+
+        onDiscard: {
+            rejected()
+        }
+
+        onAccepted: {
+            // setPreference(pluginId, preferenceItemDelegate.preferenceKey, preferenceItemDelegate.preferenceNewValue)
+        }
+
+        onRejected: {}
+    }
+
+    PreferenceItemListModel {
+        id: preferenceItemListModel
+    }
+
+    Layout.fillHeight: true
+    Layout.fillWidth: true
+
+    ColumnLayout {
+        spacing: 6
+        Layout.fillHeight: true
+        Layout.maximumWidth: 580
+        Layout.preferredWidth: 580
+        Layout.minimumWidth: 580
+
+        Label{
+            Layout.alignment: Qt.AlignHCenter
+
+            Layout.minimumWidth: 30
+            Layout.preferredWidth: 30
+            Layout.maximumWidth: 30
+            Layout.minimumHeight: 30
+            Layout.preferredHeight: 30
+            Layout.maximumHeight: 30
+
+            background: Rectangle{
+                anchors.fill: parent
+                Image {
+                    anchors.fill: parent
+                    source: "file:"+pluginIcon
+                }
+            }
+        }
+
+        Label {
+            Layout.alignment: Qt.AlignHCenter
+            Layout.topMargin: 10
+            Layout.fillWidth: true
+            Layout.minimumHeight: 25
+            Layout.preferredHeight: 25
+            Layout.maximumHeight: 25
+
+            text: qsTr(pluginName + "\npreferences")
+            font.pointSize: 13
+            font.kerning: true
+
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+        }
+
+        RowLayout {
+            spacing: 6
+            Layout.fillWidth: true
+            Layout.topMargin: 10
+            Layout.maximumHeight: 30
+            Layout.preferredHeight: 30
+            Layout.minimumHeight: 30
+
+            HoverableRadiusButton {
+                id: resetButton
+
+                Layout.maximumWidth: 157
+                Layout.preferredWidth: 157
+                Layout.minimumWidth: 157
+
+                Layout.fillHeight: true
+
+                radius: height / 2
+
+                icon.source: "qrc:/images/icons/settings_backup_restore-black-18dp.svg"
+                icon.height: 24
+                icon.width: 24
+
+                text: qsTr("Reset")
+                fontPointSize: 10
+                font.kerning: true
+
+                onClicked: {
+                    resetPluginSlot()
+                }
+            }
+
+            HoverableRadiusButton {
+                id: uninstallButton
+
+                Layout.maximumWidth: 157
+                Layout.preferredWidth: 157
+                Layout.minimumWidth: 157
+
+                Layout.fillHeight: true
+
+                radius: height / 2
+
+                icon.source: "qrc:/images/icons/ic_delete_black_18dp_2x.png"
+                icon.height: 24
+                icon.width: 24
+
+                text: qsTr("Uninstall")
+                fontPointSize: 10
+                font.kerning: true
+
+                onClicked: {
+                    uninstallPluginSlot()
+                }
+            }
+        }
+
+        ListViewJami {
+            id: pluginPreferenceView
+
+            Layout.minimumWidth: 320
+            Layout.preferredWidth: 320
+            Layout.maximumWidth: 320
+
+            Layout.minimumHeight: 0
+            Layout.preferredHeight: height
+            Layout.maximumHeight: 1000
+
+            model: preferenceItemListModel
+
+            delegate: PreferenceItemDelegate{
+                id: preferenceItemDelegate
+
+                width: pluginPreferenceView.width
+                height: 50
+
+                preferenceKey : PreferenceKey
+                preferenceName: PreferenceName
+                preferenceSummary: PreferenceSummary
+                preferenceType: PreferenceType
+                preferenceDefaultValue: PreferenceDefaultValue
+                preferenceEntries: PreferenceEntries
+                preferenceEntryValues: PreferenceEntryValues
+
+                onClicked: {
+                    pluginPreferenceView.currentIndex = index
+                }
+                onBtnPreferenceClicked: {
+                    console.log("edit preference ", preferenceName)
+                    console.log("preference type ", preferenceType)
+                    console.log("preference entry values ", preferenceEntryValues.length)
+                    editPreferenceSlot(preferenceType, preferenceName, preferenceEntryValues)
+                }
+            }
+        }
+    }
+}