• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • workspace API Reference
  • KDE Home
  • Contact Us
 

liblancelot

  • sources
  • kde-4.14
  • workspace
  • kdeplasma-addons
  • libs
  • lancelot
  • models
MergedActionListModel.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2010 Ivan Cukic <ivan.cukic(at)kde.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser/Library General Public License version 2,
6  * or (at your option) any later version, as published by the Free
7  * Software Foundation
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser/Library General Public License for more details
13  *
14  * You should have received a copy of the GNU Lesser/Library General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19 
20 #include "MergedActionListModel.h"
21 
22 namespace Lancelot {
23 
24 class MergedActionListModel::Private {
25 public:
26  void toChildCoordinates(int index, int & model, int & modelIndex) const;
27  void fromChildCoordinates(int & index, int model, int modelIndex) const;
28 
29  QList < ActionListModel * > models;
30  QList < QPair < QString, QIcon > > modelsMetadata;
31 
32  bool hideEmptyModels : 1;
33  bool showModelTitles : 1;
34 };
35 
36 MergedActionListModel::MergedActionListModel()
37  : d(new Private)
38 {
39  d->hideEmptyModels = true;
40  d->showModelTitles = true;
41 }
42 
43 MergedActionListModel::~MergedActionListModel()
44 {
45  delete d;
46 }
47 
48 void MergedActionListModel::modelUpdated()
49 {
50  emit updated();
51 }
52 
53 void MergedActionListModel::modelItemInserted(int modelIndex)
54 {
55  if (!sender()) return;
56 
57  ActionListModel * m = (ActionListModel *)sender();
58  int model = d->models.indexOf(m);
59  if (model == -1) return;
60 
61  int index;
62  d->fromChildCoordinates(index, model, modelIndex);
63 
64  if (d->hideEmptyModels && m->size() == 1) {
65  modelUpdated();
66  } else {
67  emit itemInserted(index);
68  }
69 }
70 
71 void MergedActionListModel::modelItemDeleted(int modelIndex)
72 {
73  if (!sender()) return;
74 
75  ActionListModel * m = (ActionListModel *)sender();
76  int model = d->models.indexOf(m);
77  if (model == -1) return;
78 
79  int index;
80  d->fromChildCoordinates(index, model, modelIndex);
81 
82  if (d->hideEmptyModels && m->size() == 0) {
83  modelUpdated();
84  } else {
85  emit itemDeleted(index);
86  }
87 }
88 
89 void MergedActionListModel::modelItemAltered(int modelIndex)
90 {
91  if (!sender()) return;
92 
93  int model = d->models.indexOf((ActionListModel *)sender());
94  if (model == -1) return;
95 
96  int index;
97  d->fromChildCoordinates(index, model, modelIndex);
98  emit itemAltered(index);
99 }
100 
101 QString MergedActionListModel::description(int index) const
102 {
103  int model, modelIndex;
104  d->toChildCoordinates(index, model, modelIndex);
105 
106  if (model == -1 || modelIndex == -1) return "";
107  return d->models.at(model)->description(modelIndex);
108 
109 }
110 
111 QIcon MergedActionListModel::icon(int index) const
112 {
113  int model, modelIndex;
114  d->toChildCoordinates(index, model, modelIndex);
115 
116  if (model == -1) return QIcon();
117  if (modelIndex == -1) return d->modelsMetadata.at(model).second;
118  return d->models.at(model)->icon(modelIndex);
119 }
120 
121 QMimeData * MergedActionListModel::mimeData(int index) const
122 {
123  int model, modelIndex;
124  d->toChildCoordinates(index, model, modelIndex);
125 
126  if (model == -1) return NULL;
127  if (modelIndex == -1) return modelMimeData(model);
128  return d->models.at(model)->mimeData(modelIndex);
129 }
130 
131 void MergedActionListModel::dataDragFinished(int index, Qt::DropAction action)
132 {
133  int model, modelIndex;
134  d->toChildCoordinates(index, model, modelIndex);
135  d->showModelTitles = true;
136 
137  if (model == -1) return;
138  if (modelIndex == -1) return modelDataDropped(model, action);
139  return d->models.at(model)->dataDragFinished(modelIndex, action);
140 }
141 
142 void MergedActionListModel::modelDataDropped(int index, Qt::DropAction action)
143 {
144  Q_UNUSED(index);
145  Q_UNUSED(action);
146 }
147 
148 void MergedActionListModel::setDropActions(int index, Qt::DropActions & actions, Qt::DropAction & defaultAction)
149 {
150  int model, modelIndex;
151  d->toChildCoordinates(index, model, modelIndex);
152 
153  if (model == -1) return;
154  if (modelIndex == -1) return setModelDropActions(model, actions, defaultAction);
155  return d->models.at(model)->setDropActions(modelIndex, actions, defaultAction);
156 }
157 
158 void MergedActionListModel::setModelDropActions(int index,
159  Qt::DropActions & actions, Qt::DropAction & defaultAction)
160 {
161  Q_UNUSED(index);
162  actions = Qt::IgnoreAction;
163  defaultAction = Qt::IgnoreAction;
164 }
165 
166 QMimeData * MergedActionListModel::modelMimeData(int index) const
167 {
168  Q_UNUSED(index);
169  return NULL;
170 }
171 
172 bool MergedActionListModel::dataDropAvailable(int where, const QMimeData * mimeData)
173 {
174  int model, modelIndex;
175  d->toChildCoordinates(where, model, modelIndex);
176 
177  if (model == -1) return false;
178  if (modelIndex == -1) return false;
179  return d->models.at(model)->dataDropAvailable(modelIndex, mimeData);
180 }
181 
182 void MergedActionListModel::dataDropped(int where, const QMimeData * mimeData)
183 {
184  int model, modelIndex;
185  d->toChildCoordinates(where, model, modelIndex);
186 
187  if (model == -1) return;
188  if (modelIndex == -1) return;
189  return d->models.at(model)->dataDropped(modelIndex, mimeData);
190 }
191 
192 bool MergedActionListModel::hasModelContextActions(int index) const
193 {
194  Q_UNUSED(index);
195  return false;
196 }
197 
198 void MergedActionListModel::setModelContextActions(int index, Lancelot::PopupMenu * menu)
199 {
200  Q_UNUSED(index);
201  Q_UNUSED(menu);
202  // do nothing
203 }
204 
205 void MergedActionListModel::modelContextActivate(int index, QAction * context)
206 {
207  Q_UNUSED(index);
208  Q_UNUSED(context);
209  // do nothing
210 }
211 
212 bool MergedActionListModel::isCategory(int index) const
213 {
214  int model, modelIndex;
215  d->toChildCoordinates(index, model, modelIndex);
216 
217  if (model == -1) return false;
218  if (model != -1 && modelIndex == -1) return true;
219  return d->models.at(model)->isCategory(modelIndex);
220 }
221 
222 void MergedActionListModel::activate(int index)
223 {
224  int model, modelIndex;
225  d->toChildCoordinates(index, model, modelIndex);
226 
227  if (model == -1 || modelIndex == -1) return;
228 
229  d->models.at(model)->activated(modelIndex);
230 }
231 
232 QString MergedActionListModel::title(int index) const
233 {
234  int model, modelIndex;
235  d->toChildCoordinates(index, model, modelIndex);
236 
237  if (model == -1) return "Error";
238  if (modelIndex == -1) return d->modelsMetadata.at(model).first;
239  return d->models.at(model)->title(modelIndex);
240 }
241 
242 bool MergedActionListModel::hasContextActions(int index) const
243 {
244  int model, modelIndex;
245  d->toChildCoordinates(index, model, modelIndex);
246 
247  if (model == -1) return false;
248  if (modelIndex == -1) return hasModelContextActions(model);
249  return d->models.at(model)->hasContextActions(modelIndex);
250 }
251 
252 void MergedActionListModel::setContextActions(int index, Lancelot::PopupMenu * menu)
253 {
254  int model, modelIndex;
255  d->toChildCoordinates(index, model, modelIndex);
256 
257  if (model == -1) return;
258  if (modelIndex == -1) return setModelContextActions(model, menu);
259  d->models.at(model)->setContextActions(modelIndex, menu);
260 }
261 
262 void MergedActionListModel::contextActivate(int index, QAction * context)
263 {
264  int model, modelIndex;
265  d->toChildCoordinates(index, model, modelIndex);
266 
267  if (model == -1) return;
268  if (modelIndex == -1) return modelContextActivate(model, context);
269  d->models.at(model)->contextActivate(modelIndex, context);
270 }
271 
272 #define TITLE_OFFSET (showModelTitles ? 1 : 0)
273 
274 void MergedActionListModel::Private::toChildCoordinates(int index, int & model, int & modelIndex) const
275 {
276  model = 0; modelIndex = 0;
277  foreach (ActionListModel * m, models) {
278  if (!hideEmptyModels || m->size() != 0) {
279  if (index < m->size() + TITLE_OFFSET) {
280  modelIndex = index - TITLE_OFFSET;
281  return;
282  } else {
283  index -= m->size() + TITLE_OFFSET;
284  ++model;
285  }
286  } else {
287  ++model;
288  }
289  }
290  model = -1;
291  modelIndex = -1;
292 }
293 
294 void MergedActionListModel::Private::fromChildCoordinates(int & index, int model, int modelIndex) const
295 {
296  index = -1;
297  if (model >= models.size()) return;
298  if (modelIndex >= models.at(model)->size()) return;
299 
300  index = 0;
301  foreach (ActionListModel * m, models) {
302  if (!hideEmptyModels || m->size() != 0) {
303  if (model > 0) {
304  index += m->size() + 1;//TITLE_OFFSET;
305  } else {
306  index += modelIndex + 1;//TITLE_OFFSET;
307  return;
308  }
309  }
310  --model;
311  }
312  index = -1;
313 }
314 
315 #undef TITLE_OFFSET
316 
317 void MergedActionListModel::addModel(ActionListModel * model)
318 {
319  addModel(model->selfIcon(), model->selfTitle(), model);
320 }
321 
322 void MergedActionListModel::addModel(QIcon icon, const QString & title, ActionListModel * model)
323 {
324  if (!model) return;
325  d->models.append(model);
326  d->modelsMetadata.append(QPair< QString, QIcon >(title, icon));
327 
328  connect(model, SIGNAL(updated()), this, SLOT(modelUpdated()));
329  connect(model, SIGNAL(itemInserted(int)), this, SLOT(modelItemInserted(int)));
330  connect(model, SIGNAL(itemDeleted(int)), this, SLOT(modelItemDeleted(int)));
331  connect(model, SIGNAL(itemAltered(int)), this, SLOT(modelItemAltered(int)));
332 
333  if (d->hideEmptyModels && model->size() == 0) return; // We will not show empty models
334 
335  emit updated();
336 }
337 
338 ActionListModel * MergedActionListModel::modelAt(int index)
339 {
340  return d->models.at(index);
341 }
342 
343 void MergedActionListModel::removeModel(int index)
344 {
345  if (index < 0 || index >= d->models.size()) {
346  return;
347  }
348 
349  ActionListModel * model = d->models.takeAt(index);
350  d->modelsMetadata.removeAt(index);
351  model->disconnect(this);
352  emit updated();
353 }
354 
355 int MergedActionListModel::modelCount() const
356 {
357  return d->models.size();
358 }
359 
360 
361 int MergedActionListModel::size() const
362 {
363  int result = 0;
364  foreach (ActionListModel * model, d->models) {
365  if (d->hideEmptyModels && model->size() == 0) continue; // We will not show empty models
366  result += model->size() + (d->showModelTitles ? 1 : 0);
367  }
368  return result;
369 }
370 
371 bool MergedActionListModel::hideEmptyModels() const
372 {
373  return d->hideEmptyModels;
374 }
375 
376 void MergedActionListModel::setHideEmptyModels(bool hide)
377 {
378  if (d->hideEmptyModels == hide) return;
379  d->hideEmptyModels = hide;
380  emit updated();
381 }
382 
383 bool MergedActionListModel::showModelTitles() const
384 {
385  return d->showModelTitles;
386 }
387 
388 void MergedActionListModel::setShowModelTitles(bool show)
389 {
390  if (d->showModelTitles == show) return;
391  d->showModelTitles = show;
392  emit updated();
393 }
394 
395 } // namespace Lancelot
396 
397 #include "MergedActionListModel.moc"
398 
Lancelot::MergedActionListModel::modelAt
ActionListModel * modelAt(int index)
Definition: MergedActionListModel.cpp:338
Lancelot::MergedActionListModel::mimeData
L_Override QMimeData * mimeData(int index) const
Definition: MergedActionListModel.cpp:121
Lancelot::MergedActionListModel::hasModelContextActions
virtual bool hasModelContextActions(int index) const
Definition: MergedActionListModel.cpp:192
Lancelot::ActionListModel
This class represents a list data model.
Definition: ActionListModel.h:37
QObject::sender
QObject * sender() const
Lancelot::MergedActionListModel::modelDataDropped
virtual void modelDataDropped(int index, Qt::DropAction action)
This function is invoked when a model is dragged and dropped.
Definition: MergedActionListModel.cpp:142
Lancelot::MergedActionListModel::size
L_Override int size() const
Definition: MergedActionListModel.cpp:361
Lancelot::MergedActionListModel::modelContextActivate
virtual void modelContextActivate(int index, QAction *context)
Activates the context for the specified model.
Definition: MergedActionListModel.cpp:205
Lancelot::ActionListModel::updated
void updated()
This signal is emitted when the model is updated and the update is too complex to explain using itemI...
Lancelot::MergedActionListModel::contextActivate
L_Override void contextActivate(int index, QAction *context)
Method for handling context menu actions.
Definition: MergedActionListModel.cpp:262
Lancelot::MergedActionListModel::addModel
void addModel(QIcon icon, const QString &title, ActionListModel *model)
Adds a model to the list.
Definition: MergedActionListModel.cpp:322
Lancelot::ActionListModel::size
virtual int size() const =0
Lancelot::MergedActionListModel::modelCount
int modelCount() const
Definition: MergedActionListModel.cpp:355
Lancelot::MergedActionListModel::setContextActions
L_Override void setContextActions(int index, Lancelot::PopupMenu *menu)
Adds actions ofr the specifies item to menu.
Definition: MergedActionListModel.cpp:252
Lancelot::MergedActionListModel::setDropActions
L_Override void setDropActions(int index, Qt::DropActions &actions, Qt::DropAction &defaultAction)
Definition: MergedActionListModel.cpp:148
Lancelot::MergedActionListModel::activate
L_Override void activate(int index)
Models should reimplement this function.
Definition: MergedActionListModel.cpp:222
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Lancelot::MergedActionListModel::icon
L_Override QIcon icon(int index) const
Definition: MergedActionListModel.cpp:111
QMimeData
MergedActionListModel.h
Lancelot::MergedActionListModel::~MergedActionListModel
virtual ~MergedActionListModel()
Destroys this MergedActionListModel.
Definition: MergedActionListModel.cpp:43
Lancelot::ActionListModel::selfIcon
virtual QIcon selfIcon() const
Definition: ActionListModel.cpp:123
QString
QList
Lancelot::ActionListModel::selfTitle
virtual QString selfTitle() const
Definition: ActionListModel.cpp:113
Lancelot::MergedActionListModel::MergedActionListModel
MergedActionListModel()
Creates a new instance of MergedActionListModel.
Definition: MergedActionListModel.cpp:36
Lancelot::MergedActionListModel::dataDragFinished
L_Override void dataDragFinished(int index, Qt::DropAction action)
This function is invoked when a data is dropped.
Definition: MergedActionListModel.cpp:131
QPair
Lancelot::MergedActionListModel::setShowModelTitles
void setShowModelTitles(bool show)
Sets whether model titles are shown.
Definition: MergedActionListModel.cpp:388
Lancelot::MergedActionListModel::modelItemInserted
void modelItemInserted(int index)
Definition: MergedActionListModel.cpp:53
Lancelot::MergedActionListModel::modelItemDeleted
void modelItemDeleted(int index)
Definition: MergedActionListModel.cpp:71
Lancelot::MergedActionListModel::hasContextActions
L_Override bool hasContextActions(int index) const
Definition: MergedActionListModel.cpp:242
Lancelot::MergedActionListModel::description
L_Override QString description(int index) const
Definition: MergedActionListModel.cpp:101
Lancelot::MergedActionListModel::isCategory
L_Override bool isCategory(int index) const
Definition: MergedActionListModel.cpp:212
Lancelot::MergedActionListModel::dataDropped
L_Override void dataDropped(int where, const QMimeData *mimeData)
Invoked when the data is dropped into the model.
Definition: MergedActionListModel.cpp:182
Lancelot::PopupMenu
The popup menu class.
Definition: PopupMenu.h:37
Lancelot::MergedActionListModel::modelMimeData
virtual QMimeData * modelMimeData(int index) const
Definition: MergedActionListModel.cpp:166
Lancelot::MergedActionListModel::title
L_Override QString title(int index) const
Definition: MergedActionListModel.cpp:232
Qt::DropActions
typedef DropActions
Lancelot::MergedActionListModel::showModelTitles
bool showModelTitles() const
Definition: MergedActionListModel.cpp:383
QAction
Lancelot::MergedActionListModel::hideEmptyModels
bool hideEmptyModels() const
Definition: MergedActionListModel.cpp:371
Lancelot::MergedActionListModel::dataDropAvailable
L_Override bool dataDropAvailable(int where, const QMimeData *mimeData)
Definition: MergedActionListModel.cpp:172
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Lancelot::MergedActionListModel::setModelDropActions
virtual void setModelDropActions(int index, Qt::DropActions &actions, Qt::DropAction &defaultAction)
Definition: MergedActionListModel.cpp:158
Lancelot::MergedActionListModel::modelItemAltered
void modelItemAltered(int index)
Definition: MergedActionListModel.cpp:89
Lancelot::ActionListModel::itemDeleted
void itemDeleted(int index)
This signal is emitted when an item is deleted from the model.
Lancelot::MergedActionListModel::setHideEmptyModels
void setHideEmptyModels(bool hide)
Sets whether the empty models should be hidden.
Definition: MergedActionListModel.cpp:376
QIcon
Lancelot::ActionListModel::itemAltered
void itemAltered(int index)
This signal is emitted when an item is altered.
TITLE_OFFSET
#define TITLE_OFFSET
Definition: MergedActionListModel.cpp:272
Lancelot::MergedActionListModel::modelUpdated
void modelUpdated()
Definition: MergedActionListModel.cpp:48
Lancelot::MergedActionListModel::setModelContextActions
virtual void setModelContextActions(int index, Lancelot::PopupMenu *menu)
Sets the actions for the context menu.
Definition: MergedActionListModel.cpp:198
Lancelot::ActionListModel::itemInserted
void itemInserted(int index)
This signal is emitted when an item is inserted into the model.
Lancelot::MergedActionListModel::removeModel
void removeModel(int index)
Removes a model from the list.
Definition: MergedActionListModel.cpp:343
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:43:01 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

liblancelot

Skip menu "liblancelot"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

workspace API Reference

Skip menu "workspace API Reference"
  • kdeplasma-addons
  •       GroupingDesktop
  •     liblancelot

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal