1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/*
* Copyright (C) 2016 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
* SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LOMIRI_SCREENS_H
#define LOMIRI_SCREENS_H
#include <QAbstractListModel>
#include <QSharedPointer>
#include <QPointer>
namespace qtmir
{
class Screen;
class Screens;
}
class Screen;
class ProxyScreens;
class ScreensConfiguration;
class Screens : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(QVariant activeScreen READ activeScreen WRITE activateScreen NOTIFY activeScreenChanged)
public:
enum ItemRoles {
ScreenRole = Qt::UserRole + 1
};
virtual ~Screens();
/* QAbstractItemModel */
QHash<int, QByteArray> roleNames() const override;
QVariant data(const QModelIndex &index, int role = ScreenRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
Q_INVOKABLE int indexOf(Screen*) const;
Q_INVOKABLE Screen* get(int index) const;
int count() const;
QVariant activeScreen() const;
const QVector<Screen*>& list() const { return m_screens; }
public Q_SLOTS:
void activateScreen(const QVariant& index);
Q_SIGNALS:
void countChanged();
void activeScreenChanged();
void screenAdded(Screen* screen);
void screenRemoved(Screen* screen);
protected:
Screens(const QSharedPointer<qtmir::Screens>& model);
QVector<Screen*> m_screens;
const QSharedPointer<qtmir::Screens> m_wrapped;
friend class ProxyScreens;
};
class ConcreteScreens : public Screens
{
Q_OBJECT
public:
explicit ConcreteScreens(const QSharedPointer<qtmir::Screens>& model, ScreensConfiguration* config);
~ConcreteScreens();
Q_INVOKABLE ProxyScreens *createProxy();
Q_INVOKABLE void sync(ProxyScreens *proxy);
static ConcreteScreens *self();
protected Q_SLOTS:
void onScreenAdded(qtmir::Screen *screen);
void onScreenRemoved(qtmir::Screen *screen);
private:
ScreensConfiguration* m_config;
static ConcreteScreens* m_self;
};
class ProxyScreens : public Screens
{
public:
explicit ProxyScreens(Screens*const screens);
void setSyncing(bool syncing);
bool isSyncing() const { return m_syncing; }
private:
const QPointer<Screens> m_original;
bool m_syncing;
};
#endif // SCREENS_H
|