//----------------------------------------------------------------------------- // Copyright (c) 2012 GarageGames, LLC // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //----------------------------------------------------------------------------- #ifndef _GUI_INSPECTOR_H_ #define _GUI_INSPECTOR_H_ #ifndef _GUISTACKCTRL_H_ #include "gui/containers/guiStackCtrl.h" #endif class GuiInspectorGroup; class GuiInspectorField; class GuiInspectorDatablockField; /// A control that allows to edit the properties of one or more SimObjects. class GuiInspector : public GuiStackControl { typedef GuiStackControl Parent; public: GuiInspector(); virtual ~GuiInspector(); DECLARE_CONOBJECT(GuiInspector); DECLARE_CATEGORY( "Gui Editor" ); DECLARE_DESCRIPTION( "A control that allows to edit the properties of one or more SimObjects." ); // Console Object static void initPersistFields(); // SimObject virtual void onRemove(); virtual void onDeleteNotify( SimObject *object ); // GuiControl virtual void parentResized( const RectI &oldParentRect, const RectI &newParentRect ); virtual bool resize( const Point2I &newPosition, const Point2I &newExtent ); virtual GuiControl* findHitControl( const Point2I &pt, S32 initialLayer ); virtual void getCursor( GuiCursor *&cursor, bool &showCursor, const GuiEvent &lastGuiEvent ); virtual void onMouseMove( const GuiEvent &event ); virtual void onMouseDown( const GuiEvent &event ); virtual void onMouseUp( const GuiEvent &event ); virtual void onMouseDragged( const GuiEvent &event ); // GuiInspector /// Return true if "object" is in the inspection set of this inspector. bool isInspectingObject( SimObject* object ); /// Set the currently inspected object. virtual void inspectObject( SimObject *object ); /// Add another object to the set of currently inspected objects. virtual void addInspectObject( SimObject* object, bool autoSync = true ); /// Remove the given object from the set of inspected objects. virtual void removeInspectObject( SimObject* object ); /// Remove all objects from the inspection set. virtual void clearInspectObjects(); /// Get the currently inspected object SimObject* getInspectObject(U32 index = 0) { if (!mTargets.empty()) return mTargets[index]; else return nullptr; } S32 getComponentGroupTargetId() { return mComponentGroupTargetId; } void setComponentGroupTargetId(S32 compId) { mComponentGroupTargetId = compId; } /// Return the number of objects being inspected by this GuiInspector. U32 getNumInspectObjects() const { return mTargets.size(); } /// Call inspectPreApply on all inspected objects. void sendInspectPreApply(); /// Call inspectPostApply on all inspected objects. void sendInspectPostApply(); /// Set the currently inspected object name /// @note Only valid in single-object mode. void setName( StringTableEntry newName ); void addInspectorGroup(GuiInspectorGroup* group) { mGroups.push_back(group); } /// /// Inserts a group into group list at a specific position /// /// /// void insertInspectorGroup(U32 insertIndex, GuiInspectorGroup* group) { mGroups.insert(insertIndex, group); } /// Deletes all GuiInspectorGroups void clearGroups(); /// Returns true if the named group exists /// Helper for inspectObject GuiInspectorGroup* findExistentGroup( StringTableEntry groupName ); /// /// Looks through the group list by name to find it's index /// /// /// Returns the index position of the group in the group list as S32. -1 if groupName not found. S32 findExistentGroupIndex(StringTableEntry groupName); /// Should there be a GuiInspectorField associated with this fieldName, /// update it to reflect actual/current value of that field in the inspected object. /// Added to support UndoActions void updateFieldValue( StringTableEntry fieldName, const char* arrayIdx ); /// Divider position is interpreted as an offset /// from the right edge of the field control. /// Divider margin is an offset on both left and right /// sides of the divider in which it can be selected /// with the mouse. void getDivider( S32 &pos, S32 &margin ); void updateDivider(); bool collideDivider( const Point2I &localPnt ); void setHighlightField( GuiInspectorField *field ); // If returns true that group will not be inspected. bool isGroupFiltered( const char *groupName ) const; // Returns true only if the group name follows a minus symbol in the filters. bool isGroupExplicitlyFiltered( const char *groupName ) const; void setObjectField( const char *fieldName, const char *data ); static GuiInspector* findByObject( SimObject *obj ); void refresh(); protected: typedef Vector< SimObjectPtr< SimObject > > TargetVector; Vector mGroups; /// Objects being inspected by this GuiInspector. TargetVector mTargets; S32 mComponentGroupTargetId; F32 mDividerPos; S32 mDividerMargin; bool mOverDivider; bool mMovingDivider; SimObjectPtr mHLField; String mGroupFilters; bool mShowCustomFields; }; #endif