client-qml: add initial commit

Change-Id: I32bfdd2a618aa7ac6181da2697e241667b010aab
diff --git a/src/mainview/components/ConversationSmartListView.qml b/src/mainview/components/ConversationSmartListView.qml
new file mode 100644
index 0000000..0513f6f
--- /dev/null
+++ b/src/mainview/components/ConversationSmartListView.qml
@@ -0,0 +1,104 @@
+
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@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 <https://www.gnu.org/licenses/>.
+ */
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+import net.jami.Models 1.0
+
+ListView {
+    id: conversationSmartListView
+
+    signal needToAccessMessageWebView(string currentUserDisplayName, string currentUserAlias, string currentUID, bool callStackViewShouldShow, bool isAudioOnly, string callStateStr)
+    signal needToSelectItems(int index)
+    signal needToDeselectItems
+    signal needToBackToWelcomePage
+    signal needToGrabFocus
+
+    signal needToShowChatView(string accountId, string convUid)
+    signal currentIndexIsChanged
+    signal forceUpdatePotentialInvalidItem
+
+
+    /*
+     * When model is sorted, we need to reset to focus (currentIndex)
+     * to the real conversation that we focused.
+     */
+    function modelSorted(contactURIToCompare) {
+        var conversationSmartListViewModel = conversationSmartListView.model
+        conversationSmartListView.currentIndex = -1
+        updateConversationSmartListView()
+        for (var i = 0; i < count; i++) {
+            if (conversationSmartListViewModel.data(
+                        conversationSmartListViewModel.index(i, 0),
+                        261) === contactURIToCompare) {
+                conversationSmartListView.currentIndex = i
+                break
+            }
+        }
+    }
+
+
+    /*
+     * Refresh all item within model.
+     */
+    function updateConversationSmartListView() {
+        var conversationSmartListViewModel = conversationSmartListView.model
+        conversationSmartListViewModel.dataChanged(
+                    conversationSmartListViewModel.index(0, 0),
+                    conversationSmartListViewModel.index(
+                        conversationSmartListViewModel.rowCount() - 1, 0))
+        conversationSmartListView.forceUpdatePotentialInvalidItem()
+    }
+
+    function setModel(model) {
+        conversationSmartListView.model = model
+    }
+
+    function backToWelcomePage() {
+        conversationSmartListView.needToBackToWelcomePage()
+    }
+
+
+    /*
+     * Update smartlist to accountId.
+     */
+    function updateSmartList(accountId) {
+        conversationSmartListView.model.setAccount(accountId)
+    }
+
+    Connections {
+        target: CallAdapter
+
+        function onUpdateConversationSmartList() {
+            updateConversationSmartListView()
+        }
+    }
+
+    onCurrentIndexChanged: {
+        conversationSmartListView.currentIndexIsChanged()
+    }
+
+    clip: true
+
+    delegate: ConversationSmartListViewItemDelegate {
+        id: smartListItemDelegate
+    }
+
+    ScrollIndicator.vertical: ScrollIndicator {}
+}