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...