/* This base class is used by the Attribute editor for making your own attribute types. The attribute editor will try and create an attribute called "AttribType_attribute", and if it fails, it will create a "string_attribute". */ #ifndef __C_GUI_ATTRIBUTE_H_INCLUDED__ #define __C_GUI_ATTRIBUTE_H_INCLUDED__ #include "IGUIElement.h" #include "IGUIEnvironment.h" #include "IGUIFont.h" #include "IGUIStaticText.h" #include "IAttributes.h" namespace irr { namespace gui { const u32 ATTRIBEDIT_ATTRIB_CHANGED=MAKE_IRR_ID('A','T','T','R'); class CGUIAttribute : public IGUIElement { public: //! constructor CGUIAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) : IGUIElement(EGUIET_ELEMENT, environment, parent, -1, core::rect(0, 0, 100, 100) ), AttribName(0), Attribs(0), Index(0), MyParentID(myParentID) { #ifdef _DEBUG setDebugName("CGUIAttribute"); #endif AttribName = environment->addStaticText(0, core::rect(0, 0, 100, Environment->getSkin()->getFont()->getDimension(L"A").Height), false, false, this, -1, false); AttribName->grab(); AttribName->setSubElement(true); AttribName->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); } virtual ~CGUIAttribute() { if (Attribs) Attribs->drop(); if (AttribName) AttribName->drop(); } virtual bool OnEvent(const SEvent &e) { if (IsEnabled) { switch (e.EventType) { case EET_GUI_EVENT: switch (e.GUIEvent.EventType) { case EGET_ELEMENT_FOCUSED: if (Parent && isMyChild(e.GUIEvent.Caller)) Parent->bringToFront(this); break; case EGET_ELEMENT_HOVERED: case EGET_ELEMENT_LEFT: return IGUIElement::OnEvent(e); case EGET_ELEMENT_FOCUS_LOST: updateAttrib(); return IGUIElement::OnEvent(e); default: return updateAttrib(); } break; case EET_KEY_INPUT_EVENT: return true; default: break; } } return IGUIElement::OnEvent(e); } //! sets the attribute to use virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex) { if (Attribs) Attribs->drop(); Attribs = attribs; if (Attribs) Attribs->grab(); Index = attribIndex; core::stringw name(attribs->getAttributeName(attribIndex)); name += L" ("; name += attribs->getAttributeTypeString(attribIndex); name += L")"; AttribName->setText(name.c_str()); core::rect r = Parent->getAbsolutePosition(); core::rect r2(0, 5, r.getWidth(), Environment->getSkin()->getFont()->getDimension(L"A").Height + 10 ); AttribName->setRelativePosition(r2); // get minimum height s32 y=0; core::list::Iterator it = Children.begin(); for (; it != Children.end(); ++it) { if (y < (*it)->getRelativePosition().LowerRightCorner.Y) y = (*it)->getRelativePosition().LowerRightCorner.Y; } setMinSize( core::dimension2du(0, y+5)); updateAttrib(false); } //! sets the parent ID, for identifying where events came from void setParentID(s32 parentID) { MyParentID = parentID; } //! save the attribute and possibly post the event to its parent virtual bool updateAttrib(bool sendEvent=true) { if (Attribs && IsEnabled && sendEvent) { // build event and pass to parent SEvent event; event.EventType = (EEVENT_TYPE)ATTRIBEDIT_ATTRIB_CHANGED; event.UserEvent.UserData1 = MyParentID; event.UserEvent.UserData2 = Index; return Parent->OnEvent(event); } return true; } virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) { IGUIElement::serializeAttributes(out, options); } virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) { IGUIElement::deserializeAttributes(in, options); if (AttribName) AttribName->setText(Text.c_str()); } protected: IGUIStaticText* AttribName; io::IAttributes* Attribs; u32 Index; s32 MyParentID; }; } // namespace gui } // namespace irr #endif