KWin
Loading...
Searching...
No Matches
buttonsmodel.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5*/
6#include "buttonsmodel.h"
7
8#include <KLocalizedString>
9
10#include <QFontDatabase>
11
12namespace KDecoration2
13{
14
15namespace Preview
16{
17
18ButtonsModel::ButtonsModel(const QList<DecorationButtonType> &buttons, QObject *parent)
19 : QAbstractListModel(parent)
20 , m_buttons(buttons)
21{
22}
23
25 : ButtonsModel(QList<DecorationButtonType>({
26 DecorationButtonType::Menu,
27 DecorationButtonType::ApplicationMenu,
28 DecorationButtonType::OnAllDesktops,
29 DecorationButtonType::Minimize,
30 DecorationButtonType::Maximize,
31 DecorationButtonType::Close,
32 DecorationButtonType::ContextHelp,
33 DecorationButtonType::Shade,
34 DecorationButtonType::KeepBelow,
35 DecorationButtonType::KeepAbove,
36 DecorationButtonType::Spacer,
37 }),
38 parent)
39{
40}
41
43
44int ButtonsModel::rowCount(const QModelIndex &parent) const
45{
46 if (parent.isValid()) {
47 return 0;
48 }
49 return m_buttons.count();
50}
51
52static QString buttonToName(DecorationButtonType type)
53{
54 switch (type) {
55 case DecorationButtonType::Menu:
56 return i18n("More actions for this window");
57 case DecorationButtonType::ApplicationMenu:
58 return i18n("Application menu");
59 case DecorationButtonType::OnAllDesktops:
60 return i18n("On all desktops");
61 case DecorationButtonType::Minimize:
62 return i18n("Minimize");
63 case DecorationButtonType::Maximize:
64 return i18n("Maximize");
65 case DecorationButtonType::Close:
66 return i18n("Close");
67 case DecorationButtonType::ContextHelp:
68 return i18n("Context help");
69 case DecorationButtonType::Shade:
70 return i18n("Shade");
71 case DecorationButtonType::KeepBelow:
72 return i18n("Keep below other windows");
73 case DecorationButtonType::KeepAbove:
74 return i18n("Keep above other windows");
75 case DecorationButtonType::Spacer:
76 return i18n("Spacer");
77 default:
78 return QString();
79 }
80}
81
82QVariant ButtonsModel::data(const QModelIndex &index, int role) const
83{
84 if (!index.isValid() || index.row() < 0 || index.row() >= m_buttons.count() || index.column() != 0) {
85 return QVariant();
86 }
87 switch (role) {
88 case Qt::DisplayRole:
89 return buttonToName(m_buttons.at(index.row()));
90 case Qt::UserRole:
91 return QVariant::fromValue(int(m_buttons.at(index.row())));
92 }
93 return QVariant();
94}
95
96QHash<int, QByteArray> ButtonsModel::roleNames() const
97{
98 QHash<int, QByteArray> roles;
99 roles.insert(Qt::DisplayRole, QByteArrayLiteral("display"));
100 roles.insert(Qt::UserRole, QByteArrayLiteral("button"));
101 return roles;
102}
103
105{
106 if (row < 0 || row >= m_buttons.count()) {
107 return;
108 }
109 beginRemoveRows(QModelIndex(), row, row);
110 m_buttons.removeAt(row);
111 endRemoveRows();
112}
113
114void ButtonsModel::down(int index)
115{
116 if (m_buttons.count() < 2 || index == m_buttons.count() - 1) {
117 return;
118 }
119 beginMoveRows(QModelIndex(), index, index, QModelIndex(), index + 2);
120 m_buttons.insert(index + 1, m_buttons.takeAt(index));
121 endMoveRows();
122}
123
124void ButtonsModel::up(int index)
125{
126 if (m_buttons.count() < 2 || index == 0) {
127 return;
128 }
129 beginMoveRows(QModelIndex(), index, index, QModelIndex(), index - 1);
130 m_buttons.insert(index - 1, m_buttons.takeAt(index));
131 endMoveRows();
132}
133
134void ButtonsModel::add(DecorationButtonType type)
135{
136 beginInsertRows(QModelIndex(), m_buttons.count(), m_buttons.count());
137 m_buttons.append(type);
138 endInsertRows();
139}
140
141void ButtonsModel::add(int index, int type)
142{
143 beginInsertRows(QModelIndex(), index, index);
144 m_buttons.insert(index, KDecoration2::DecorationButtonType(type));
145 endInsertRows();
146}
147
148void ButtonsModel::move(int sourceIndex, int targetIndex)
149{
150 if (sourceIndex == std::max(0, targetIndex)) {
151 return;
152 }
153
154 /* When moving an item down, the destination index needs to be incremented
155 by one, as explained in the documentation:
156 https://doc.qt.io/qt-5/qabstractitemmodel.html#beginMoveRows */
157 if (targetIndex > sourceIndex) {
158 // Row will be moved down
159 beginMoveRows(QModelIndex(), sourceIndex, sourceIndex, QModelIndex(), targetIndex + 1);
160 } else {
161 beginMoveRows(QModelIndex(), sourceIndex, sourceIndex, QModelIndex(), std::max(0, targetIndex));
162 }
163
164 m_buttons.move(sourceIndex, std::max(0, targetIndex));
165 endMoveRows();
166}
167
169{
170 beginResetModel();
171 m_buttons.clear();
172 endResetModel();
173}
174
175void ButtonsModel::replace(const QList<DecorationButtonType> &buttons)
176{
177 if (buttons.isEmpty()) {
178 return;
179 }
180
181 beginResetModel();
182 m_buttons = buttons;
183 endResetModel();
184}
185
186}
187}
188
189#include "moc_buttonsmodel.cpp"
void replace(const QList< DecorationButtonType > &buttons)
ButtonsModel(const QList< DecorationButtonType > &buttons, QObject *parent=nullptr)
void add(DecorationButtonType type)
QHash< int, QByteArray > roleNames() const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Q_INVOKABLE void down(int index)
Q_INVOKABLE void move(int sourceIndex, int targetIndex)
QList< DecorationButtonType > buttons() const
Q_INVOKABLE void up(int index)
Q_INVOKABLE void remove(int index)
int rowCount(const QModelIndex &parent=QModelIndex()) const override