on 669c2af help sign in
unity8/tests/mocks/Unity/Application/MirSurfaceListModel.cpp
136 lines 4.0 kB history raw
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
17#include "MirSurfaceListModel.h"
18#include "ApplicationInfo.h"
20#include "MirSurface.h"
22#define MIRSURFACELISTMODEL_DEBUG 0
24#if MIRSURFACELISTMODEL_DEBUG
25#include <QDebug>
26#define DEBUG_MSG(params) qDebug().nospace() << "MirSurfaceListModel::" << __func__ << params
27#else
28#define DEBUG_MSG(params) ((void)0)
29#endif
31using namespace unity::shell::application;
33MirSurfaceListModel::MirSurfaceListModel(QObject *parent) :
34 MirSurfaceListInterface(parent)
38int MirSurfaceListModel::rowCount(const QModelIndex &parent) const
40 return !parent.isValid() ? m_surfaceList.size() : 0;
43QVariant MirSurfaceListModel::data(const QModelIndex& index, int role) const
45 if (index.row() < 0 || index.row() >= m_surfaceList.size())
46 return QVariant();
48 if (role == SurfaceRole) {
49 MirSurface *surface = m_surfaceList.at(index.row());
50 return QVariant::fromValue(static_cast<unity::shell::application::MirSurfaceInterface*>(surface));
51 } else {
52 return QVariant();
53 }
56void MirSurfaceListModel::raise(MirSurface *surface)
58 DEBUG_MSG("(" << surface << ")");
59 int i = m_surfaceList.indexOf(surface);
60 if (i != -1) {
61 moveSurface(i, 0);
62 }
65void MirSurfaceListModel::addSurface(MirSurface *surface)
67 DEBUG_MSG("(" << surface << ")");
68 beginInsertRows(QModelIndex(), 0, 0);
69 m_surfaceList.prepend(surface);
70 connectSurface(surface);
71 endInsertRows();
72 Q_EMIT countChanged(m_surfaceList.count());
73 Q_EMIT firstChanged();
76void MirSurfaceListModel::connectSurface(MirSurface *surface)
78 connect(surface, &QObject::destroyed, this, [this, surface](){ this->removeSurface(surface); });
79 connect(surface, &MirSurfaceInterface::focusedChanged, this, [this, surface](bool surfaceFocused){
80 if (surfaceFocused) {
81 raise(surface);
82 }
83 });
86void MirSurfaceListModel::removeSurface(MirSurface *surface)
88 int i = m_surfaceList.indexOf(surface);
89 if (i != -1) {
90 beginRemoveRows(QModelIndex(), i, i);
91 m_surfaceList.removeAt(i);
92 endRemoveRows();
93 Q_EMIT countChanged(m_surfaceList.count());
94 if (m_surfaceList.count() == 0 || i == 0) {
95 Q_EMIT firstChanged();
96 }
97 }
100void MirSurfaceListModel::moveSurface(int from, int to)
102 if (from == to) return;
104 if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
105 QModelIndex parent;
106 /* When moving an item down, the destination index needs to be incremented
107 by one, as explained in the documentation:
108 http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
110 beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
111 m_surfaceList.move(from, to);
112 endMoveRows();
113 }
115 if ((from == 0 || to == 0) && m_surfaceList.count() > 1) {
116 Q_EMIT firstChanged();
117 }
120MirSurfaceInterface *MirSurfaceListModel::get(int index)
122 if (index >=0 && index < m_surfaceList.count()) {
123 return m_surfaceList[index];
124 } else {
125 return nullptr;
126 }
129const MirSurfaceInterface *MirSurfaceListModel::get(int index) const
131 if (index >=0 && index < m_surfaceList.count()) {
132 return m_surfaceList.at(index);
133 } else {
134 return nullptr;
135 }