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_ITEM_TYPE")
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)
345 if(layer && layer->getType() !=
"FOLDERLAYER")
346 selectedSingleLayers.push_back(layer);
349 return selectedSingleLayers;
354 std::list<te::map::AbstractLayerPtr> selectedAndVisibleSingleLayers;
356 std::list<te::map::AbstractLayerPtr> selectedSingleLayers = getSelectedSingleLayers();
358 std::list<te::map::AbstractLayerPtr>::const_iterator it;
359 for(it = selectedSingleLayers.begin(); it != selectedSingleLayers.end(); ++it)
363 selectedAndVisibleSingleLayers.push_back(layer);
366 return selectedAndVisibleSingleLayers;
371 std::list<te::map::AbstractLayerPtr> selectedLayers;
373 std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = getSelectedItems();
375 std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
376 for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
381 selectedLayers.push_back(selectedLayer);
384 if(!selectedLayers.empty())
385 emit selectedLayersChanged(selectedLayers);
389 const std::string& menu,
390 const std::string& itemType,
393 m_pImpl->add(action, menu, itemType, menuSelectionType);
398 m_pImpl->remove(action);
405 emit activated(item);
425 if((itemLayer != 0) && itemLayer->hasVisibilityChanged())
427 if(itemLayer->getType() !=
"FOLDERLAYER")
428 emit visibilityChanged(itemLayer);
431 std::vector<AbstractTreeItem*> descendantItems = item->
getDescendants();
432 for(std::size_t i = 0; i < descendantItems.size(); ++i)
436 if((descendantLayer != 0) && descendantLayer->hasVisibilityChanged())
438 if(descendantLayer->getType() !=
"FOLDERLAYER")
439 emit visibilityChanged(descendantLayer);
444 std::vector<AbstractTreeItem*> ancestorItems = item->
getAncestors();
445 for(std::size_t i = 0; i < ancestorItems.size(); ++i)
449 if((ancestorLayer != 0) && ancestorLayer->hasVisibilityChanged())
451 if(ancestorLayer->getType() !=
"FOLDERLAYER")
452 emit visibilityChanged(ancestorLayer);
462 emit doubleClicked(item);
490 QTreeView::dragEnterEvent(e);
495 if(e->keyboardModifiers() == Qt::ControlModifier)
496 e->setDropAction(Qt::CopyAction);
498 e->setDropAction(Qt::MoveAction);
502 QTreeView::dragMoveEvent(e);
511 QTreeView::dragLeaveEvent(e);
533 QTreeView::dropEvent(e);
540 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..