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

parley

  • sources
  • kde-4.14
  • kdeedu
  • parley
  • src
  • collection
containermodel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  Copyright 2007-2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
4 
5  ***************************************************************************/
6 
7 /***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "containermodel.h"
17 
18 #include "containermimedata.h"
19 #include "vocabularymimedata.h"
20 
21 #include <keduvocdocument.h>
22 #include <keduvoclesson.h>
23 #include <keduvocwordtype.h>
24 #include <keduvocexpression.h>
25 
26 #include <KDebug>
27 #include <KLocalizedString>
28 
34 ContainerModel::ContainerModel(KEduVocContainer::EnumContainerType type, QObject * parent)
35  : ReadonlyContainerModel(type, parent)
36 {
37  m_type = type;
38  m_doc = 0;
39 
40  setSupportedDragActions(Qt::CopyAction | Qt::MoveAction);
41 }
42 
43 QModelIndex ContainerModel::appendContainer(const QModelIndex& parent, const QString & containerName)
44 {
45  KEduVocContainer* parentContainer;
46  if (parent.isValid()) {
47  parentContainer = static_cast<KEduVocContainer*>(parent.internalPointer());
48  } else {
49  return QModelIndex();
50  }
51 
52  beginInsertRows(parent, parentContainer->childContainerCount(),
53  parentContainer->childContainerCount());
54  switch (m_type) {
55  case (KEduVocContainer::Lesson):
56  parentContainer->appendChildContainer(new KEduVocLesson(containerName, static_cast<KEduVocLesson*>(parentContainer)));
57  break;
58  case (KEduVocContainer::WordType): {
59  KEduVocWordType* parentWordType = static_cast<KEduVocWordType*>(parentContainer);
60  KEduVocWordType* wordTypeContainer = new KEduVocWordType(containerName, parentWordType);
61  wordTypeContainer->setWordType(parentWordType->wordType());
62  parentContainer->appendChildContainer(wordTypeContainer);
63  break;
64  }
65  default:
66  break;
67  }
68  endInsertRows();
69 
70  return index(parentContainer->childContainerCount() - 1, 0, parent);
71 }
72 
73 
74 QVariant ContainerModel::data(const QModelIndex & index, int role) const
75 {
76  if (!index.isValid()) {
77  return QVariant();
78  }
79 
80  KEduVocContainer *container = static_cast<KEduVocContainer*>(index.internalPointer());
81 
82  switch (index.column()) {
83  case ContainerNameColumn:
84  if (role == Qt::DisplayRole || role == Qt::EditRole) {
85  return container->name();
86  }
87 
88 // if (role == Qt::DecorationRole) {
89 // return KIcon("favorites");
90 // }
91  if (role == Qt::TextAlignmentRole) {
92  return Qt::AlignLeft;
93  }
94  break;
95  case TotalCountColumn:
96  if (role == Qt::DisplayRole) {
97  return container->entryCount(KEduVocContainer::Recursive);
98  }
99  if (role == Qt::TextAlignmentRole) {
100  return Qt::AlignRight;
101  }
102  break;
103  default:
104  if (role == Qt::TextAlignmentRole) {
105  return Qt::AlignRight;
106  }
107  }
108 
109  return QVariant();
110 }
111 
112 bool ContainerModel::setData(const QModelIndex &index, const QVariant &value, int role)
113 {
114  if (!index.isValid()) {
115  return false;
116  }
117 
118  if (index.column() == ContainerNameColumn) {
119  KEduVocContainer *container = static_cast<KEduVocContainer*>(index.internalPointer());
120  // rename a lesson
121  if (role == Qt::EditRole) {
122  container->setName(value.toString());
123  emit dataChanged(index, index);
124  emit documentModified();
125  return true;
126  }
127 
128  // checkboxes
129  if (role == Qt::CheckStateRole) {
130  bool newState = value.toBool();
131  for (int i = 0; i < rowCount(index); i++) {
132  setData(index.child(i, 0), newState, Qt::CheckStateRole);
133  }
134  container->setInPractice(newState);
135  emit dataChanged(index, index);
136  emit documentModified();
137  return true;
138  }
139  }
140  return false;
141 }
142 
143 
144 Qt::ItemFlags ContainerModel::flags(const QModelIndex &index) const
145 {
146  if (index.isValid()) {
147  // the root element, not editable for now
148  if (index.parent() == QModelIndex()) {
149  return (Qt::ItemIsEnabled | Qt::ItemIsSelectable);
150  }
151  // the name column
152  if (index.column() == ContainerNameColumn) {
153  return (Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable
154  | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
155  } else { // every other element
156  return (Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
157  }
158  }
159  return Qt::ItemIsDropEnabled;
160 }
161 
162 
163 QVariant ContainerModel::headerData(int section, Qt::Orientation orientation, int role) const
164 {
165  // statically two columns for now
166  if (orientation == Qt::Horizontal) {
167  switch (section) {
168  case ContainerNameColumn:
169  if (role == Qt::DisplayRole) {
170  return i18n("Unit");
171  }
172  break;
173  case TotalCountColumn:
174  if (role == Qt::DisplayRole) {
175  return QVariant();
176  }
177  if (role == Qt::ToolTipRole) {
178  return i18n("Number of entries in this lesson.");
179  }
180  break;
181  }
182  }
183  return QVariant();
184 }
185 
186 
187 int ContainerModel::columnCount(const QModelIndex & parent) const
188 {
189  Q_UNUSED(parent);
190  if (!m_doc) {
191  return FirstDataColumn;
192  }
193 
194  // for now one grade per language
195  return FirstDataColumn; // + m_doc->identifierCount();
196 }
197 
198 
199 void ContainerModel::deleteContainer(const QModelIndex & containerIndex)
200 {
201  KEduVocContainer* container = static_cast<KEduVocContainer*>(containerIndex.internalPointer());
202  KEduVocContainer* parent = container->parent();
203 
204  if (!parent) {
205  // never delete the root container
206  return;
207  }
208 
209  beginRemoveRows(containerIndex.parent(), containerIndex.row(), containerIndex.row());
210  parent->deleteChildContainer(container->row());
211  endRemoveRows();
212 }
213 
214 Qt::DropActions ContainerModel::supportedDropActions() const
215 {
216  return Qt::MoveAction | Qt::CopyAction;
217 }
218 
219 QStringList ContainerModel::mimeTypes() const
220 {
221  return QStringList() << "text/plain";
222 }
223 
224 
225 QMimeData * ContainerModel::mimeData(const QModelIndexList &indexes) const
226 {
227  ContainerMimeData *mimeData = new ContainerMimeData();
228 // QByteArray encodedData;
229 
230  foreach(const QModelIndex & index, indexes) {
231  mimeData->addContainer(static_cast<KEduVocContainer*>(index.internalPointer()));
232  }
233  mimeData->setText("Parley lesson");
234 
235 // QDataStream stream(&encodedData, QIODevice::WriteOnly);
236 // stream << "Parley lesson";
237 // foreach (const QModelIndex &index, indexes) {
238 // if (index.isValid()) {
239 // QString text = data(index, Qt::DisplayRole).toString();
240 // stream << text;
241 // }
242 // }
243 // // kDebug() << "mimeData:" << encodedData;
244 // mimeData->setData("text/plain", encodedData);
245  return mimeData;
246 }
247 
248 
249 bool ContainerModel::dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent)
250 {
251  Q_UNUSED(column)
252 
253  if (action == Qt::IgnoreAction) {
254  return true;
255  }
256 
257  // if it's internal, get the pointers
258  const ContainerMimeData * containerData =
259  qobject_cast<const ContainerMimeData *>(data);
260 
261  if (containerData) {
262  foreach(KEduVocContainer * container, containerData->containerList()) {
263  // no way to move a word type to a lesson for now
264  if (container->containerType() != m_type) {
265  return false;
266  }
267 
268  if (action == Qt::MoveAction || action == Qt::CopyAction) {
269  kDebug() << "Move container: " << container->name();
270  KEduVocContainer* parentContainer = 0;
271 
272  if (parent.isValid()) {
273  parentContainer = static_cast<KEduVocContainer*>(parent.internalPointer());
274  }
275  if (!parentContainer) {
276  // drop into root
277  parentContainer = rootContainer();
278  } else {
279  //make sure a container cannot be dropped into one of its child containers!
280  KEduVocContainer* childTest = parentContainer;
281  while (childTest != 0) {
282  if (childTest == container) {
283  kDebug() << "Cannot drop a container into one of its child containers!";
284  return false;
285  }
286  childTest = childTest->parent();
287  }
288  }
289 
290  QModelIndex oldParent = index(container->parent());
291 
292 
293 
294  beginRemoveRows(oldParent, container->row(), container->row());
295  container->parent()->removeChildContainer(container->row());
296  endRemoveRows();
297 
298  // if we get to choose, append seems sane.
299  if (row < 0) {
300  row = parentContainer->childContainerCount();
301  }
302 
303  // use index because we sometimes reparent to the root container instead of dropping into nowhere
304  beginInsertRows(index(parentContainer), row, row);
305  parentContainer->insertChildContainer(row, container);
306  endInsertRows();
307 
308  return true;
309  }
310  }
311  }
312 
313 
314  // if it's a translation, get the pointers
315  const VocabularyMimeData * translationData =
316  qobject_cast<const VocabularyMimeData *>(data);
317 
318  if (translationData) {
319  if (!parent.isValid()) {
320  return false;
321  }
322  if (containerType() == KEduVocContainer::Lesson) {
323  // Create a list of the entries associated with the translations being copied. This prevents duplicates if they highlighted several columns.
324  QList<KEduVocExpression*> entries;
325 
326  foreach(KEduVocTranslation * translation, translationData->translationList()) {
327  if (!entries.contains(translation->entry())) {
328  entries << translation->entry();
329  }
330  }
331 
332  foreach(KEduVocExpression * entry, entries) {
333  static_cast<KEduVocLesson*>(parent.internalPointer())->appendEntry(new KEduVocExpression(*entry));
334  }
335  }
336 
337  if (containerType() == KEduVocContainer::WordType) {
338  foreach(KEduVocTranslation * translation, translationData->translationList()) {
339  translation->setWordType(
340  static_cast<KEduVocWordType*>(parent.internalPointer()));
341  }
342  }
343  return false;
344  }
345 
346 
347  kDebug() << data->formats();
348  /*
349  if (data->hasText()) {
350  if (action == Qt::CopyAction | action == Qt::MoveAction) {
351  QString name;
352  name = data->text();
353  kDebug() << "Copy lesson " << name;
354 
355  appendLesson(parent, name);
356  return true;
357  }
358  }*/
359 
360  return false;
361 }
362 
363 /*
364 bool ContainerModel::removeRows(int row, int count, const QModelIndex & parent)
365 {
366 // BIG FAT WARNING this code works, but it gets called by the drag and drop implementation automatically, so either this gets used or the other (dropMimeData) to remove the containers. If both are active, containers get deleted without warning or visible signs.
367 
368  KEduVocContainer* parentContainer;
369  if (!parent.internalPointer()) {
370  parentContainer = m_container;
371  } else {
372  parentContainer = static_cast<KEduVocContainer*>(parent.internalPointer());
373  }
374  kDebug() << "removeRows from " << parentContainer->name() << " row " << row << "count" << count;
375 
376  beginRemoveRows ( parent, row, row+count );
377  for (int i = 0; i<count; i++) {
378  parentContainer->removeChildContainer(row);
379  }
380  endRemoveRows();
381 
382  return true;
383 }
384 
385 */
386 
387 
388 #include "containermodel.moc"
ReadonlyContainerModel
Model for the tree of containers (lessons, word types).
Definition: readonlycontainermodel.h:33
QModelIndex
ReadonlyContainerModel::rowCount
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: readonlycontainermodel.cpp:108
ContainerModel::supportedDropActions
virtual Qt::DropActions supportedDropActions() const
Definition: containermodel.cpp:214
ContainerModel::mimeTypes
virtual QStringList mimeTypes() const
Definition: containermodel.cpp:219
ReadonlyContainerModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: readonlycontainermodel.cpp:49
ContainerModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Change the name or checkbox of a lesson.
Definition: containermodel.cpp:112
QMimeData
ContainerModel::FirstDataColumn
Definition: containermodel.h:41
vocabularymimedata.h
ContainerMimeData::containerList
QList< KEduVocContainer * > containerList() const
Definition: containermimedata.cpp:24
QObject::name
const char * name() const
containermodel.h
QModelIndex::isValid
bool isValid() const
ContainerModel::dropMimeData
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
Definition: containermodel.cpp:249
ContainerModel::headerData
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
Definition: containermodel.cpp:163
QAbstractItemModel::dataChanged
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
QAbstractItemModel::endInsertRows
void endInsertRows()
QObject
ReadonlyContainerModel::m_doc
KEduVocDocument * m_doc
Definition: readonlycontainermodel.h:62
containermimedata.h
QAbstractItemModel::beginRemoveRows
void beginRemoveRows(const QModelIndex &parent, int first, int last)
QModelIndex::row
int row() const
QMimeData::setText
void setText(const QString &text)
QModelIndex::internalPointer
void * internalPointer() const
QString
QList
ContainerModel::data
virtual QVariant data(const QModelIndex &index, int role) const
Definition: containermodel.cpp:74
QAbstractItemModel::setSupportedDragActions
void setSupportedDragActions(QFlags< Qt::DropAction > actions)
QModelIndex::parent
QModelIndex parent() const
QStringList
ContainerModel::documentModified
void documentModified()
emitted when the inPractice state or name of a lesson changed.
ContainerModel::TotalCountColumn
Definition: containermodel.h:40
ContainerModel::appendContainer
QModelIndex appendContainer(const QModelIndex &parent, const QString &containerName=QString())
Definition: containermodel.cpp:43
QList::contains
bool contains(const T &value) const
QModelIndex::child
QModelIndex child(int row, int column) const
QAbstractItemModel::beginInsertRows
void beginInsertRows(const QModelIndex &parent, int first, int last)
Qt::DropActions
typedef DropActions
ContainerModel::columnCount
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: containermodel.cpp:187
ContainerModel::mimeData
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
Definition: containermodel.cpp:225
QModelIndex::column
int column() const
QVariant::toBool
bool toBool() const
ContainerModel::deleteContainer
void deleteContainer(const QModelIndex &containerIndex)
Definition: containermodel.cpp:199
ContainerMimeData::addContainer
void addContainer(KEduVocContainer *container)
Definition: containermimedata.cpp:19
QMimeData::formats
virtual QStringList formats() const
VocabularyMimeData
Definition: vocabularymimedata.h:26
ReadonlyContainerModel::rootContainer
virtual KEduVocContainer * rootContainer() const =0
QAbstractItemModel::endRemoveRows
void endRemoveRows()
ContainerModel::ContainerModel
ContainerModel(KEduVocContainer::EnumContainerType type, QObject *parent=0)
Definition: containermodel.cpp:34
QObject::parent
QObject * parent() const
ContainerModel::flags
virtual Qt::ItemFlags flags(const QModelIndex &index) const
Definition: containermodel.cpp:144
ContainerModel::ContainerNameColumn
Definition: containermodel.h:39
VocabularyMimeData::translationList
QList< KEduVocTranslation * > translationList() const
Definition: vocabularymimedata.cpp:67
QVariant::toString
QString toString() const
ReadonlyContainerModel::m_type
KEduVocContainer::EnumContainerType m_type
Definition: readonlycontainermodel.h:61
ReadonlyContainerModel::containerType
KEduVocContainer::EnumContainerType containerType()
Definition: readonlycontainermodel.cpp:179
QVariant
ContainerMimeData
Definition: containermimedata.h:26
Qt::ItemFlags
typedef ItemFlags
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:15:56 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

parley

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

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

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