27 #include "../../../../common/STLUtils.h"
28 #include "../../../../common/Translator.h"
29 #include "../../../../maptools/AbstractLayer.h"
30 #include "../../Exception.h"
37 #include <QMessageBox>
39 #include <QStringList>
42 : QAbstractItemModel(parent),
45 #if (QT_VERSION < 0x050000)
46 setSupportedDragActions(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction);
51 : QAbstractItemModel(parent),
54 #if (QT_VERSION < 0x050000)
55 setSupportedDragActions(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction);
74 for(std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin(); it != layers.end(); ++it)
79 m_items.push_back(litem);
81 m_layers.push_back(*it);
100 return !m_items.empty();
109 if(!parent.isValid())
115 throw Exception(
TE_TR(
"Invalid data associated to the layer model!"));
127 if(!parent.isValid())
128 return static_cast<int>(m_items.size());
133 throw Exception(
TE_TR(
"Error: NULL layer item!"));
135 return item->children().count();
141 return QModelIndex();
143 if(!parent.isValid())
145 if(static_cast<std::size_t>(row) >= m_items.size())
146 return QModelIndex();
151 return createIndex(row, column, item);
157 throw Exception(
TE_TR(
"Invalid data associated to the layer model!"));
159 if(row >= parentItem->children().count())
160 return QModelIndex();
165 throw Exception(
TE_TR(
"The layer item is not an AbstractTreeItem!"));
167 return createIndex(row, column, item);
173 return QModelIndex();
177 if(item == 0 || item->parent() == 0)
178 return QModelIndex();
183 throw Exception(
TE_TR(
"The layer item is not an AbstractTreeItem!"));
187 if(grandParentItem == 0)
190 for(std::size_t i = 0; i != m_items.size(); ++i)
192 if(m_items[i] == parentItem)
193 return createIndex(static_cast<int>(i), index.column(), parentItem);
199 const QObjectList& items = grandParentItem->children();
203 for(QObjectList::const_iterator it = items.begin(); it != items.end(); ++it, ++i)
205 if((*it) == parentItem)
206 return createIndex(i, index.column(), parentItem);
210 throw Exception(
TE_TR(
"Could not determine the layer index in the model!"));
216 return QAbstractItemModel::flags(index) | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
221 throw Exception(
TE_TR(
"Invalid data associated to the layer model!"));
223 return QAbstractItemModel::flags(index) | item->
flags();
231 if(role == Qt::CheckStateRole && !m_checkable)
239 return item->
data(index.column(), role);
247 if(role == Qt::CheckStateRole && !m_checkable)
257 retVal = item->
setData(index.column(), value, role);
259 emit dataChanged(index, index);
262 emitDataChangedForDescendants(index);
265 emitDataChangedForAncestors(index);
272 if(!parent.isValid())
273 return !m_items.empty();
278 throw Exception(
TE_TR(
"Invalid data associated to the layer model!"));
287 mimes <<
"application/x-terralib;value=\"DraggedItems\"";
295 return Qt::MoveAction | Qt::CopyAction | Qt::LinkAction;
298 #if (QT_VERSION >= 0x050000)
299 Qt::DropActions te::qt::widgets::LayerTreeModel::supportedDragActions()
const
301 return Qt::MoveAction | Qt::CopyAction | Qt::LinkAction;
310 std::vector<AbstractTreeItem*>* draggedItems =
new std::vector<AbstractTreeItem*>;
312 for(
int i = 0; i < indexes.count(); ++i)
313 draggedItems->push_back(static_cast<AbstractTreeItem*>(indexes.at(i).internalPointer()));
316 s.setNum((qulonglong)draggedItems);
318 QByteArray encodedData(s.toStdString().c_str());
320 QMimeData* mimeData =
new QMimeData();
322 mimeData->setData(
"application/x-terralib;value=\"DraggedItems\"", encodedData);
328 Qt::DropAction action,
330 const QModelIndex& parent)
332 if(data == 0 || column > 0 || action != Qt::MoveAction)
335 if(action == Qt::IgnoreAction)
338 if(!data->hasFormat(
"application/x-terralib;value=\"DraggedItems\""))
342 QString sitem = data->data(
"application/x-terralib;value=\"DraggedItems\"");
347 qulonglong dataValue = sitem.toULongLong();
350 std::vector<AbstractTreeItem*>* draggedItems =
reinterpret_cast<std::vector<AbstractTreeItem*>*
>(dataValue);
351 int count = draggedItems->size();
353 m_insertingLayers.clear();
354 for(
int i = 0; i < count; ++i)
355 m_insertingLayers.push_back(draggedItems->operator[](i)->getLayer());
358 QModelIndex dropIndex = parent;
366 QModelIndex dropParentIndex = dropIndex.parent();
371 dropParentLayer = dropParentItem->
getLayer();
375 QModelIndex insertingItemParentIndex;
377 removeLayerFromParentChildrenList(m_insertingLayers);
383 if(row < 0 && dropItem && dropLayer.get() &&
384 dropLayer->getType() ==
"FOLDERLAYER" &&
388 insertingItemParentIndex = dropIndex;
391 for(
int i = 0; i < count; ++i)
392 dropLayer->insert(i, m_insertingLayers[i]);
399 QModelIndex dropParentIndex = dropIndex.parent();
404 if(dropParentIndex == QModelIndex())
407 if(dropIndex.row() == -1)
408 insertingRow = m_items.size();
410 insertingRow = dropIndex.row();
413 if(insertingRow >= (
int)m_layers.size())
415 for(
int i = 0; i < count; ++i)
416 m_layers.push_back(m_insertingLayers[i]);
420 for(
int i = 0; i < count; ++i)
421 m_layers.insert(m_layers.begin() + insertingRow + i, m_insertingLayers[i]);
427 insertingRow = dropIndex.row();
428 insertingItemParentIndex = dropParentIndex;
431 int k = insertingRow;
432 for(
int i = 0; i < count; ++i, ++k)
433 dropParentLayer->insert(k, m_insertingLayers[i]);
441 insertingRow = m_layers.size();
444 for(
int i = 0; i < count; ++i)
445 m_layers.insert(m_layers.begin() + insertingRow + i, m_insertingLayers[i]);
449 bool ret = insertRows(insertingRow, count, insertingItemParentIndex);
457 emit layerOrderChanged();
466 beginInsertRows(parent, row, row + count - 1);
470 if(row == m_items.size())
472 for(
int i = 0; i < count; ++i)
475 m_items.push_back(newItem);
481 for(
int i = row; i < row + count; ++i, ++k)
484 m_items.insert(m_items.begin() + i, newItem);
491 int numChildren = parentItem->children().count();
492 QList<QObject*> savedItemsList = parentItem->children();
494 for(
int i = 0; i < numChildren; ++i)
495 savedItemsList.at(i)->setParent(0);
499 for(
int i = row; i < row + count; ++i, ++k)
502 savedItemsList.insert(i, newItem);
506 for(
int i = 0; i < savedItemsList.count(); ++i)
507 savedItemsList.at(i)->setParent(parentItem);
513 m_insertingLayers[0]->updateVisibilityOfAncestors();
514 emitDataChangedForAncestors(parent);
523 beginRemoveRows(parent, row, row + count - 1);
525 if(!parent.isValid())
527 for(
int i = row; i < row + count; ++i)
530 m_items.erase(m_items.begin() + row, m_items.begin() + row + count);
541 const QList<QObject*>& childrenList = parentItem->children();
543 std::vector<QObject*> items;
544 for(
int i = row; i < row + count; ++i)
546 QObject* item = childrenList.at(i);
547 items.push_back(item);
550 for(std::size_t i = 0; i < items.size(); ++i)
554 emitDataChangedForAncestors(parent);
557 parentLayer->updateVisibility();
560 parentLayer->updateVisibilityOfAncestors();
572 m_checkable = checkable;
583 return QModelIndex();
586 QModelIndex parentIndex;
593 for(std::size_t i = 0; i < m_items.size(); ++i)
595 if(m_items[i] == item)
603 itemRow = parentItem->children().indexOf(item);
605 return createIndex(itemRow, 0, item);
618 for(std::size_t i = 0; i < m_layers.size(); ++i)
620 if(m_layers[i] == layer)
627 std::vector<std::size_t> rows;
628 QModelIndex topLayerIndex;
634 rows.push_back(auxLayer->getIndex());
635 auxLayer = parentLayer;
642 for(std::size_t i = 0; i < m_layers.size(); ++i)
644 if(m_layers[i] == topLayer)
646 topItem = m_items[i];
647 topLayerIndex = index(i, 0, QModelIndex());
652 QModelIndex inLayerIndex = topLayerIndex;
654 std::vector<std::size_t>::reverse_iterator it;
655 for(it = rows.rbegin(); it != rows.rend(); ++it)
656 inLayerIndex = index(*it, 0, inLayerIndex);
665 QModelIndex parentIndex;
669 row = m_layers.size();
670 m_layers.push_back(layer);
674 row = parentItem->children().size();
675 parentIndex = getIndex(parentItem);
678 m_insertingLayers.clear();
679 m_insertingLayers.push_back(layer);
681 insertRows(row, 1, parentIndex);
686 QModelIndex itemIndex = getIndex(item);
688 int itemRow = itemIndex.row();
689 QModelIndex parentIndex = parent(itemIndex);
699 for(std::size_t i = 0; i < m_items.size(); ++i)
701 if(m_items[i] == item)
703 m_layers.erase(m_layers.begin() + i);
710 return removeRows(itemRow, 1, parentIndex);
715 for(std::size_t i = 0; i < layers.size(); ++i)
723 for(std::size_t j = 0; j < m_layers.size(); ++j)
725 if(m_layers[j] == layer)
726 m_layers.erase(m_layers.begin() + j);
730 parentLayer->
remove(layer->getIndex());
736 if(!parent.isValid())
739 int rows = rowCount(parent);
741 for(
int i = 0; i != rows; ++i)
743 QModelIndex idx = index(i, 0, parent);
745 emit dataChanged(idx, idx);
748 emitDataChangedForDescendants(idx);
754 QModelIndex ancestorIndex = parent(index);
755 if(parent(index).isValid())
758 while(ancestorIndex.isValid())
760 emit dataChanged(ancestorIndex, ancestorIndex);
761 ancestorIndex = parent(ancestorIndex);
The class that represents a folder layer item in a LayerTreeModel.
This is the base class for layers.
#define TE_TR(message)
It marks a string in order to get translated.
A class for building layer items.
TreeItemPtr remove(std::size_t i)
It removes the i-th child.
The class that represents an item in a LayerTreeModel.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void FreeContents(boost::unordered_map< K, V * > &m)
This function can be applied to a map of pointers. It will delete each pointer in the map...