35 #include <boost/tuple/tuple.hpp>
38 #include <QDragEnterEvent>
39 #include <QDragLeaveEvent>
40 #include <QDragMoveEvent>
43 #include <QMessageBox>
56 typedef boost::tuple<QAction*, std::string, std::string, te::qt::widgets::LayerTreeView::ContextMenuSelectionType, bool>
tuple_type;
63 void add(QAction* action,
64 const std::string& menu,
65 const std::string& layerType,
71 void remove(QAction* action)
73 std::list<tuple_type>::iterator it =
m_menus.begin();
77 if(it->get<0>() == action)
79 std::list<tuple_type>::iterator auxit = it;
96 if(selectedItems.empty())
99 for(std::list<tuple_type>::const_iterator it =
m_menus.begin(); it !=
m_menus.end(); ++it)
101 QAction* action = it->get<0>();
105 menu.addAction(action);
108 else if(selectedItems.size() == 1)
116 std::string selectedItemType;
118 if(layer && !layer->isValid())
119 selectedItemType =
"INVALID_LAYER_ITEM";
120 else if(layer && layer->getSchema().get() && layer->getSchema()->hasRaster())
121 selectedItemType =
"RASTER_LAYER_ITEM";
125 std::list<tuple_type>::const_iterator it;
128 QAction* action = it->get<0>();
129 std::string aItemType = it->get<2>();
137 if((selectedItemType ==
"GROUPING_ITEM" || selectedItemType ==
"CHART_ITEM" || selectedItemType ==
"COLORMAP_ITEM") &&
138 aItemType ==
"ITEM_OF_LAYER")
140 menu.addAction(action);
146 if(selectedItemType ==
"RASTER_LAYER_ITEM" || selectedItemType ==
"FOLDER_LAYER_ITEM" || selectedItemType ==
"INVALID_LAYER_ITEM")
148 if(aItemType == selectedItemType)
149 menu.addAction(action);
153 if(aItemType.empty() || aItemType == selectedItemType)
154 menu.addAction(action);
161 std::map<std::string, std::vector<QAction*> > actionsByLayerType;
164 std::string layerType;
166 std::list<AbstractTreeItem*>::const_iterator it;
167 for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
173 if(!layer->isValid())
174 layerType =
"INVALID_LAYER_ITEM";
175 else if(layer->getSchema().get() && layer->getSchema()->hasRaster())
176 layerType =
"RASTER_LAYER_ITEM";
178 layerType = (*it)->getItemType();
180 actionsByLayerType[layerType] = std::vector<QAction*>();
184 for(std::list<tuple_type>::const_iterator it =
m_menus.begin(); it !=
m_menus.end(); ++it)
186 QAction* action = it->get<0>();
187 std::string alayerType = it->get<2>();
193 layerType = alayerType;
195 if(layerType.empty())
197 for(std::map<std::string, std::vector<QAction*> >::iterator it = actionsByLayerType.begin();
198 it != actionsByLayerType.end(); ++it)
200 it->second.push_back(action);
204 actionsByLayerType[layerType].push_back(action);
208 std::vector<std::vector<QAction*> > setVec;
210 for(std::map<std::string, std::vector<QAction*> >::iterator it = actionsByLayerType.begin();
211 it != actionsByLayerType.end(); ++it)
213 setVec.push_back(it->second);
219 std::vector<QAction*> commonActions = setVec[0];
220 std::sort(commonActions.begin(), commonActions.end());
222 for(std::size_t i = 1; i < setVec.size(); ++i)
224 std::sort(setVec[i].begin(), setVec[i].end());
226 std::vector<QAction*> intersect;
227 std::set_intersection(commonActions.begin(), commonActions.end(),
228 setVec[i].begin(), setVec[i].end(),
229 std::inserter(intersect, intersect.begin()));
231 commonActions = intersect;
235 for(std::size_t i = 0; i < commonActions.size(); ++ i)
236 menu.addAction(commonActions[i]);
252 setAcceptDrops(
true);
253 setDragEnabled(
true);
255 setDefaultDropAction(Qt::MoveAction);
257 setRootIsDecorated(
true);
258 setSelectionMode(QAbstractItemView::ExtendedSelection);
260 viewport()->setAutoFillBackground(
true);
279 std::list<AbstractTreeItem*> selectedItems;
281 QModelIndexList indexes = selectedIndexes();
285 foreach(idx, indexes)
290 selectedItems.push_back(selectedItem);
293 return selectedItems;
298 std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = getSelectedItems();
300 std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems;
302 std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
303 for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
308 selectedLayerItems.push_back(selectedItem);
311 return selectedLayerItems;
316 std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = getSelectedLayerItems();
318 std::list<te::qt::widgets::AbstractTreeItem*> selectedSingleLayerItems;
320 std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
321 for(it = selectedLayerItems.begin(); it != selectedLayerItems.end(); ++it)
325 if(selectedLayerItem->
getLayer() && selectedLayerItem->
getItemType() !=
"FOLDER_LAYER_ITEM")
326 selectedSingleLayerItems.push_back(selectedLayerItem);
329 return selectedSingleLayerItems;
334 std::list<te::map::AbstractLayerPtr> selectedSingleLayers;
336 std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = getSelectedItems();
338 std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
339 for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
343 if(layer && layer->getType() !=
"FOLDERLAYER")
344 selectedSingleLayers.push_back(layer);
347 return selectedSingleLayers;
352 std::list<te::map::AbstractLayerPtr> selectedAndVisibleSingleLayers;
354 std::list<te::map::AbstractLayerPtr> selectedSingleLayers = getSelectedSingleLayers();
356 std::list<te::map::AbstractLayerPtr>::const_iterator it;
357 for(it = selectedSingleLayers.begin(); it != selectedSingleLayers.end(); ++it)
361 selectedAndVisibleSingleLayers.push_back(layer);
364 return selectedAndVisibleSingleLayers;
369 std::list<te::map::AbstractLayerPtr> selectedLayers;
371 std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = getSelectedItems();
373 std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
374 for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
379 selectedLayers.push_back(selectedLayer);
382 if(!selectedLayers.empty())
383 emit selectedLayersChanged(selectedLayers);
387 const std::string& menu,
388 const std::string& itemType,
391 m_pImpl->add(action, menu, itemType, menuSelectionType);
396 m_pImpl->remove(action);
403 emit activated(item);
423 if((itemLayer != 0) && itemLayer->hasVisibilityChanged())
425 if(itemLayer->getType() !=
"FOLDERLAYER")
426 emit visibilityChanged(itemLayer);
429 std::vector<AbstractTreeItem*> descendantItems = item->
getDescendants();
430 for(std::size_t i = 0; i < descendantItems.size(); ++i)
434 if((descendantLayer != 0) && descendantLayer->hasVisibilityChanged())
436 if(descendantLayer->getType() !=
"FOLDERLAYER")
437 emit visibilityChanged(descendantLayer);
442 std::vector<AbstractTreeItem*> ancestorItems = item->
getAncestors();
443 for(std::size_t i = 0; i < ancestorItems.size(); ++i)
447 if((ancestorLayer != 0) && ancestorLayer->hasVisibilityChanged())
449 if(ancestorLayer->getType() !=
"FOLDERLAYER")
450 emit visibilityChanged(ancestorLayer);
460 emit doubleClicked(item);
488 QTreeView::dragEnterEvent(e);
493 if(e->keyboardModifiers() == Qt::ControlModifier)
494 e->setDropAction(Qt::CopyAction);
496 e->setDropAction(Qt::MoveAction);
500 QTreeView::dragMoveEvent(e);
509 QTreeView::dragLeaveEvent(e);
531 QTreeView::dropEvent(e);
538 m_pImpl->showContextMenu(e->globalPos());
This is the base class for layers.
The class that represents an item in a LayerTreeModel.
A tree view for the layers of an application.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void setVisibilityAsChanged(bool visChanged)
It sets that the status of the layer visibility is to be changed or not..