![]() |
VR-Forces 4.0.4 Class Documentation
|
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