From a3615a097492f288b935e4a019011cc6b8ee2061 Mon Sep 17 00:00:00 2001 From: kelteseth Date: Fri, 28 Apr 2017 14:43:43 +0200 Subject: [PATCH] Big cleanup. Now we have a list of monitors in qml --- main.cpp | 17 +++--- qml/Components/Installed.qml | 4 +- qml/Components/Monitors.qml | 32 +++++++++- src/installedlistmodel.h | 2 +- src/monitorlistmodel.cpp | 113 +++++++++++++++++++++++++++++++++++ src/monitorlistmodel.h | 70 ++++++++++++++++++++++ src/monitors.cpp | 34 ----------- src/monitors.h | 48 --------------- 8 files changed, 226 insertions(+), 94 deletions(-) create mode 100644 src/monitorlistmodel.cpp create mode 100644 src/monitorlistmodel.h delete mode 100644 src/monitors.cpp delete mode 100644 src/monitors.h diff --git a/main.cpp b/main.cpp index 1f4b9db3..fdc72ab7 100644 --- a/main.cpp +++ b/main.cpp @@ -17,39 +17,40 @@ #include "backend.h" #include "installedlistmodel.h" -#include "monitors.h" +#include "monitorlistmodel.h" #include "screenplay.h" int main(int argc, char* argv[]) { - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QCoreApplication::setOrganizationName("Aimber"); QCoreApplication::setOrganizationDomain("aimber.net"); QCoreApplication::setApplicationName("ScreenPlay"); app.setWindowIcon(QIcon(":/assets/icons/favicon.ico")); - InstalledListModel ilm; + InstalledListModel installedListModel; + MonitorListModel monitorListModel; Backend backend; - Monitors monitors; QQmlApplicationEngine mainWindow; - mainWindow.rootContext()->setContextProperty("monitorList", &monitors); - mainWindow.rootContext()->setContextProperty("installedListModel", &ilm); + mainWindow.rootContext()->setContextProperty("monitorListModel", &monitorListModel); + mainWindow.rootContext()->setContextProperty("installedListModel", &installedListModel); mainWindow.rootContext()->setContextProperty("backend", &backend); mainWindow.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); QObject::connect(&mainWindow, SIGNAL(exitScreenPlay()), &app, SLOT(app.exit())); ScreenPlay sp(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - sp.context()->setContextProperty("installedListModel", &ilm); + sp.context()->setContextProperty("installedListModel", &installedListModel); sp.context()->setContextProperty("backend", &backend); sp.loadQQuickView(QUrl(QStringLiteral("qrc:/qml/Components/ScreenPlay.qml"))); sp.showQQuickView(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - QObject::connect(&ilm, &InstalledListModel::setScreenVisible, + QObject::connect(&installedListModel, &InstalledListModel::setScreenVisible, &sp, &ScreenPlay::setVisible); int status = app.exec(); diff --git a/qml/Components/Installed.qml b/qml/Components/Installed.qml index f21924a6..5a3e0709 100644 --- a/qml/Components/Installed.qml +++ b/qml/Components/Installed.qml @@ -24,8 +24,10 @@ Page { delegate: ScreenPlayItem { id:delegate focus: true - customTitle: title + + customTitle: screenTitle screenId: screenFolderId + Connections { target: delegate onItemClicked: { diff --git a/qml/Components/Monitors.qml b/qml/Components/Monitors.qml index 23d718d0..d7e97379 100644 --- a/qml/Components/Monitors.qml +++ b/qml/Components/Monitors.qml @@ -9,8 +9,6 @@ Item { Component.onCompleted: { - var a = monitorList.get(); - print(a[0]); } @@ -52,6 +50,36 @@ Item { anchors.leftMargin: 20 anchors.top: parent.top anchors.topMargin: 20 + + Row { + + + + Repeater { + id:rp + anchors.fill: parent + model:monitorListModel + delegate: Item { + height: 200 + width: 200 + Column { + spacing: 5 + + Text { + text: monitorNumber + anchors.horizontalCenter: parent.horizontalCenter + } + + + Text { + text: monitorAvailableGeometryRole.x + " " + monitorAvailableGeometryRole.y + anchors.horizontalCenter: parent.horizontalCenter + } + + } + } + } + } } } } diff --git a/src/installedlistmodel.h b/src/installedlistmodel.h index 2f399872..63891a6a 100644 --- a/src/installedlistmodel.h +++ b/src/installedlistmodel.h @@ -29,7 +29,7 @@ public: QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; void append(const QJsonObject, const QString); - QHash roleNames() const; + QHash roleNames() const override; Q_INVOKABLE void loadScreens(); Q_INVOKABLE QVariantMap get(QString folderId); diff --git a/src/monitorlistmodel.cpp b/src/monitorlistmodel.cpp new file mode 100644 index 00000000..fc5f4c82 --- /dev/null +++ b/src/monitorlistmodel.cpp @@ -0,0 +1,113 @@ +#include "monitorlistmodel.h" + +MonitorListModel::MonitorListModel(QObject *parent) + : QAbstractListModel(parent) +{ + for (int i = 0; i < QApplication::screens().count(); i++) { + QScreen* screen = QApplication::screens().at(i); + _monitorList.append(Monitor(screen->name(),screen->size(),screen->availableGeometry(),i)); + } +} + +QHash MonitorListModel::roleNames() const +{ + static const QHash roles{ + { NameRole, "monitorName" }, + { SizeRole, "monitorSize" }, + { AvailableGeometryRole, "monitorAvailableGeometryRole" }, + { NumberRole, "monitorNumber" }, + }; + return roles; +} + +QVariant MonitorListModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + // FIXME: Implement me! +} + +bool MonitorListModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) +{ + if (value != headerData(section, orientation, role)) { + // FIXME: Implement me! + emit headerDataChanged(orientation, section, section); + return true; + } + return false; +} + +int MonitorListModel::rowCount(const QModelIndex &parent) const +{ + // For list models only the root node (an invalid parent) should return the list's size. For all + // other (valid) parents, rowCount() should return 0 so that it does not become a tree model. + if (parent.isValid()) + return 0; + + return _monitorList.count(); +} + +QVariant MonitorListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() < rowCount()) + switch (role) { + case NameRole: + return _monitorList.at(index.row())._name; + case SizeRole: + return _monitorList.at(index.row())._size; + case AvailableGeometryRole: + return _monitorList.at(index.row())._availableGeometry; + case NumberRole: + return _monitorList.at(index.row())._number; + default: + return QVariant(); + } + + return QVariant(); +} + +bool MonitorListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (data(index, role) != value) { + // FIXME: Implement me! + emit dataChanged(index, index, QVector() << role); + return true; + } + return false; +} + +Qt::ItemFlags MonitorListModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return Qt::NoItemFlags; + + return Qt::ItemIsEditable; // FIXME: Implement me! +} + +bool MonitorListModel::insertRows(int row, int count, const QModelIndex &parent) +{ + beginInsertRows(parent, row, row + count - 1); + // FIXME: Implement me! + endInsertRows(); +} + +bool MonitorListModel::removeRows(int row, int count, const QModelIndex &parent) +{ + beginRemoveRows(parent, row, row + count - 1); + // FIXME: Implement me! + endRemoveRows(); +} + +Monitor::Monitor() +{ + +} + +Monitor::Monitor(QString name, QSize size, QRect availableGeometry, int number) +{ + _name = name; + _size = size; + _availableGeometry = availableGeometry; + _number = number; +} diff --git a/src/monitorlistmodel.h b/src/monitorlistmodel.h new file mode 100644 index 00000000..2eeb3182 --- /dev/null +++ b/src/monitorlistmodel.h @@ -0,0 +1,70 @@ +#ifndef MONITORLISTMODEL_H +#define MONITORLISTMODEL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class Monitor; + +class MonitorListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + explicit MonitorListModel(QObject *parent = nullptr); + + QHash roleNames() const override; + + enum MonitorRole { + NameRole, + SizeRole, + AvailableGeometryRole, + NumberRole, + }; + Q_ENUM(MonitorRole) + + // Header: + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; + + // Basic functionality: + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + // Editable: + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole) override; + + Qt::ItemFlags flags(const QModelIndex& index) const override; + + // Add data: + bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; + + // Remove data: + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; + +private: + QVector _monitorList; +}; + +class Monitor { + +public: + Monitor(); + Monitor(QString name, QSize size, QRect availableGeometry, int number); + + QString _name; + QSize _size; + QRect _availableGeometry; + int _number; + bool _isVirtualDesktop; +}; +#endif // MONITORLISTMODEL_H diff --git a/src/monitors.cpp b/src/monitors.cpp deleted file mode 100644 index b3db4b9b..00000000 --- a/src/monitors.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "monitors.h" - -Monitors::Monitors(QObject* parent) - : QObject(parent) -{ -loadScreens(); -} - -void Monitors::loadScreens() -{ - for (int i = 0; i < QApplication::screens().count(); i++) { - QScreen* screen = QApplication::screens().at(i); - qDebug() << screen->geometry(); - _screen.append(QApplication::screens().at(i)); - - _monitors.append(Monitor(screen->name(), screen->size(), screen->availableGeometry(), i, false)); - } -} - -QVariantList Monitors::get() -{ - QVariantList list; - - return list; -} - -Monitor::Monitor(QString name, QSize size, QRect availableGeometry, int number, bool isVirtualDesktop) -{ - _name = name; - _size = size; - _availableGeometry = availableGeometry; - _number = number; - _isVirtualDesktop = isVirtualDesktop; -} diff --git a/src/monitors.h b/src/monitors.h deleted file mode 100644 index e6dc5f3a..00000000 --- a/src/monitors.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef MONITORS_H -#define MONITORS_H - -#include -#include -#include -#include -#include -#include -#include -#include - -class Monitor; - -class Monitors : public QObject { - Q_OBJECT - - -public: - explicit Monitors(QObject* parent = nullptr); - - Q_INVOKABLE void loadScreens(); - Q_INVOKABLE QVariantList get(); - -signals: - -public slots: - -private: - QList _monitors; - QList _screen; - int primaryScreen; -}; - -class Monitor { - -public: - Monitor(QString name, QSize size, QRect availableGeometry, int number, bool isVirtualDesktop); - - QString _name; - QSize _size; - QRect _availableGeometry; - int _number; - bool _isVirtualDesktop; - QScreen* _screen = nullptr; -}; - -#endif // MONITORS_H