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