VR-Forces 4.0.4 Class Documentation
include/vrvCore/DtSelectionManager.h
Go to the documentation of this file.
00001 /******************************************************************************
00002 ** Copyright (c) 2010 MAK Technologies, Inc.
00003 ** All rights reserved.
00004 ******************************************************************************/
00005 /******************************************************************************
00006 ** $RCSfile: DtSelectionManager.h,v $ $Revision: 1.21 $ $State: Exp $
00007 ******************************************************************************/
00008 
00012 
00013 #pragma once
00014 #include <vrvCore/vrvCore.h>
00015 #include <vrvUtil/DtVirtualBaseClass.h>
00016 #include <vrvUtil/DtSignalConnectionManager.h>
00017 #include <vrvCore/DtElementData.h>
00018 #include <vrvCore/DtElementEntry.h>
00019 #include <vrvCore/DtMouseEvent.h>
00020 #include <vrvCore/DtUniqueID.h>
00021 #include <set>
00022 #include <queue>
00023 
00024 namespace makVrv
00025 {
00026    class DtDe;
00027    class DtDriverManager;
00028  
00031    class DT_DLL_VRVCORE DtSelectionManager : public DtVirtualBaseClass
00032    {
00033    public:
00034    
00035       typedef std::set<DtUniqueID> IdSet;
00036 
00037       enum SelectionMode
00038       {
00039          SelectionModeAll      = 0,
00040          SelectionModeEntities = 1,
00041          SelectionModeTerrain  = 2
00042       };
00043 
00045       enum SelectionType
00046       {
00047          NoValidSelection,
00048          Entity,
00049          Prop,
00050          Terrain,
00051          Aggregate,
00052          Observer,
00053          ControlObject,
00054          OverlayObject,
00055          Intervisibility,
00056          Feature,
00057          Mixed 
00058       }; 
00059 
00060       enum SelectionOperation
00061       {
00062          NoOperation = 0,
00063          AddToSelection,
00064          RemoveFromSelection,
00065          MultipleSelection,
00066          SetSelection,       
00067          ClearSelection,
00068          MaintainSelectionIfSelected   
00072       };
00073 
00075       static DtSelectionManager& instance(DtDe& de);
00076          
00078       ~DtSelectionManager();
00079       
00081       void performSelectionOperation(SelectionOperation op, const IdSet& ids);
00082 
00084       void setCurrentSelections( const IdSet& selections );
00085       
00087       const DtSelectionManager::IdSet& currentSelections() const;
00088       
00090       void addToCurrentSelection( const IdSet& adds );
00091 
00095       void maintainCurrentSelectionIfSelected( const IdSet& maintain );
00096 
00098       void removeFromCurrentSelection( const IdSet& removes );
00099 
00102       void toggleFromCurrentSelection( const IdSet& toggles );
00103 
00105       void removeFromCurrentSelection(
00106          const DtElementData::UniqueIdList& removes );
00107      
00109       SelectionMode selectionMode() const;
00110       void setSelectionMode( SelectionMode mode );
00111       
00117       bool isSelectable( DtUniqueID id ) const;
00118       
00122       bool isSelectable( const DtElementEntry* entry ) const;
00123 
00125       bool isSelected( DtUniqueID id ) const;     
00126 
00127       SelectionType selectionType() const;
00128          
00131       virtual bool propSelectionMajorityTransparent();
00132       
00134       virtual void slot_onElementsRemoved( 
00135          const DtElementData::UniqueIdList& elementIds);
00136          
00138       virtual void backupCurrentSelection();
00139 
00142       virtual bool restoreCurrentSelection();
00143       
00144       bool selectionIsVertex( const IdSet& selection );
00145 
00146       bool objectIsVertex( const DtUniqueID& id );     
00147       DtUniqueID parentId( const DtUniqueID& id );
00148 
00153       virtual bool allItemsWantVertexSelection(const IdSet&) const;
00154 
00156       void addWantsVertexSelection(DtElementEntry::ElementType);
00157 
00159       void removeWantsVertexSelection(DtElementEntry::ElementType);
00160 
00162       bool wantsVertexSelection(DtElementID) const;
00163 
00165       boost::signal<void (const IdSet& selected, const IdSet& deselected, 
00166          SelectionType newType, 
00167          SelectionType oldType)> signal_currentSelectionChanged;
00168 
00171       boost::signal<void (const DtUniqueID& id, const DtUniqueID& parentId)> 
00172          signal_vertexSelected;
00173          
00176       boost::signal<void (const DtUniqueID& id, const DtUniqueID& parentId)> 
00177          signal_vertexDeselected;
00178          
00181       boost::signal<void (const IdSet& entityIds)> signal_entityInfoToggled;
00182 
00184       boost::signal<void ()> signal_selectionModeChanged;
00185 
00187       virtual void addSelectableObjectType(DtElementEntry::ElementType type,
00188          SelectionMode = SelectionModeAll);
00189       virtual void removeSelectableObjectType(DtElementEntry::ElementType type,
00190          SelectionMode);
00191       virtual void removeSelectableObjectTypeFromAllModes(
00192          DtElementEntry::ElementType type);
00193       virtual bool objectTypeSelectable( DtElementEntry::ElementType type,
00194          SelectionMode mode ) const;
00195 
00197       virtual bool objectTypeSelectable( DtElementEntry::ObjectType type) const;
00199 
00202       static SelectionOperation selectionOperationForMouseEvent(
00203          const DtMouseEvent& mouseEvent);
00204 
00208       static bool typeSupportsMultipleSelection(DtElementEntry::ObjectType type, 
00209          bool vertexSelectsParent );
00210 
00211    protected:
00212    
00214       DtSelectionManager(DtDe& de);
00215          
00217       void addToCurrentSelection( DtUniqueID id );
00218 
00220       void removeFromCurrentSelection( DtUniqueID id );
00221       
00223       void announceCurrentSelectionChanged( const IdSet& selected, 
00224          const IdSet& deselected, SelectionType oldType );
00225       
00226       void updateSelectionDisplay( const IdSet& selected, 
00227          const IdSet& deselected );
00228 
00229       void updateSelectionType();
00230 
00232       SelectionType elementSelectionType( DtElementEntry* entry ) const;
00233       
00234       void convertVertexIdsToParentIds( const IdSet& in, IdSet& out ); 
00235 
00236    protected:
00237       typedef std::set<DtElementEntry::ElementType> WantsVertexSelection;
00238       typedef std::set<DtElementEntry::ElementType> ElementTypeSet;
00239       typedef boost::unordered_map<SelectionMode, ElementTypeSet> 
00240          SelectionModeMap;
00241       typedef std::queue<IdSet> IdSetQueue;
00242 
00243 
00244       DtDe& myDe;
00245       IdSet myCurrentSelections;
00246       SelectionMode mySelectionMode;      
00248       bool myIgnoreSelectionChanges;
00249       bool myIgnoreSelectionModeChanges;     
00250       SelectionType mySelectionType;
00251       IdSetQueue myBackupSelections;
00252       WantsVertexSelection myWantsVertexSelection;
00253       SelectionModeMap mySelectionModeMap;
00254       DtSignalConnectionManager mySignals;
00255    };
00256 }
00257 

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)