client-qml: add initial commit

Change-Id: I32bfdd2a618aa7ac6181da2697e241667b010aab
diff --git a/src/videoformatresolutionmodel.cpp b/src/videoformatresolutionmodel.cpp
new file mode 100644
index 0000000..dea9635
--- /dev/null
+++ b/src/videoformatresolutionmodel.cpp
@@ -0,0 +1,164 @@
+/*
+ * 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/>.
+ */
+
+#include "videoformatresolutionmodel.h"
+
+VideoFormatResolutionModel::VideoFormatResolutionModel(QObject *parent)
+    : QAbstractListModel(parent)
+{}
+
+VideoFormatResolutionModel::~VideoFormatResolutionModel() {}
+
+int
+VideoFormatResolutionModel::rowCount(const QModelIndex &parent) const
+{
+    if (!parent.isValid()) {
+        /*
+         * Count.
+         */
+        QString currentDeviceId = LRCInstance::avModel().getCurrentVideoCaptureDevice();
+        auto deviceCapabilities = LRCInstance::avModel().getDeviceCapabilities(currentDeviceId);
+        if (deviceCapabilities.size() == 0) {
+            return 0;
+        }
+        try {
+            auto currentSettings = LRCInstance::avModel().getDeviceSettings(currentDeviceId);
+            auto currentChannel = currentSettings.channel;
+            currentChannel = currentChannel.isEmpty() ? "default" : currentChannel;
+            auto channelCaps = deviceCapabilities[currentChannel];
+
+            return channelCaps.size();
+        } catch (const std::exception &e) {
+            qWarning() << e.what();
+            return 0;
+        }
+    }
+    /*
+     * A valid QModelIndex returns 0 as no entry has sub-elements.
+     */
+    return 0;
+}
+
+int
+VideoFormatResolutionModel::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    /*
+     * Only need one column.
+     */
+    return 1;
+}
+
+QVariant
+VideoFormatResolutionModel::data(const QModelIndex &index, int role) const
+{
+    try {
+        QString currentDeviceId = LRCInstance::avModel().getCurrentVideoCaptureDevice();
+        auto deviceCapabilities = LRCInstance::avModel().getDeviceCapabilities(currentDeviceId);
+
+        auto currentSettings = LRCInstance::avModel().getDeviceSettings(currentDeviceId);
+        auto currentChannel = currentSettings.channel;
+        currentChannel = currentChannel.isEmpty() ? "default" : currentChannel;
+        auto channelCaps = deviceCapabilities[currentChannel];
+
+        if (!index.isValid() || channelCaps.size() <= index.row()
+            || deviceCapabilities.size() == 0) {
+            return QVariant();
+        }
+
+        switch (role) {
+        case Role::Resolution:
+            return QVariant(channelCaps.at(index.row()).first);
+        case Role::Resolution_UTF8:
+            return QVariant(channelCaps.at(index.row()).first.toUtf8());
+        }
+
+    } catch (const std::exception &e) {
+        qWarning() << e.what();
+    }
+
+    return QVariant();
+}
+
+QHash<int, QByteArray>
+VideoFormatResolutionModel::roleNames() const
+{
+    QHash<int, QByteArray> roles;
+    roles[Resolution] = "Resolution";
+    roles[Resolution_UTF8] = "Resolution_UTF8";
+    return roles;
+}
+
+QModelIndex
+VideoFormatResolutionModel::index(int row, int column, const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    if (column != 0) {
+        return QModelIndex();
+    }
+
+    if (row >= 0 && row < rowCount()) {
+        return createIndex(row, column);
+    }
+    return QModelIndex();
+}
+
+QModelIndex
+VideoFormatResolutionModel::parent(const QModelIndex &child) const
+{
+    Q_UNUSED(child);
+    return QModelIndex();
+}
+
+Qt::ItemFlags
+VideoFormatResolutionModel::flags(const QModelIndex &index) const
+{
+    auto flags = QAbstractItemModel::flags(index) | Qt::ItemNeverHasChildren | Qt::ItemIsSelectable;
+    if (!index.isValid()) {
+        return QAbstractItemModel::flags(index);
+    }
+    return flags;
+}
+
+void
+VideoFormatResolutionModel::reset()
+{
+    beginResetModel();
+    endResetModel();
+}
+
+int
+VideoFormatResolutionModel::getCurrentSettingIndex()
+{
+    int resultRowIndex = 0;
+    try {
+        QString currentDeviceId = LRCInstance::avModel().getCurrentVideoCaptureDevice();
+        auto currentSettings = LRCInstance::avModel().getDeviceSettings(currentDeviceId);
+        QString currentResolution = currentSettings.size;
+        auto resultList = match(index(0, 0), Resolution, QVariant(currentResolution));
+
+        if (resultList.size() > 0) {
+            resultRowIndex = resultList[0].row();
+        }
+
+    } catch (const std::exception &e) {
+        qWarning() << e.what();
+    }
+
+    return resultRowIndex;
+}