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;
+}