1 
2 #include "CGUIAttributeEditor.h"
3 #include "IGUIEnvironment.h"
4 #include "IFileSystem.h"
5 #include "IVideoDriver.h"
6 #include "IAttributes.h"
7 #include "IGUIFont.h"
8 #include "IGUIScrollBar.h"
9 #include "CGUIEditWorkspace.h"
10 #include "CGUIAttribute.h"
11 #include "CGUIStringAttribute.h"
12 
13 namespace irr
14 {
15 namespace gui
16 {
17 
18 using namespace core;
19 using namespace io;
20 
CGUIAttributeEditor(IGUIEnvironment * environment,s32 id,IGUIElement * parent)21 CGUIAttributeEditor::CGUIAttributeEditor(IGUIEnvironment* environment, s32 id, IGUIElement *parent) :
22 	CGUIPanel(environment, parent, id, rect<s32>(0, 0, 100, 100)),
23 		Attribs(0), Panel(0)
24 {
25 	#ifdef _DEBUG
26 	setDebugName("CGUIAttributeEditor");
27 	#endif
28 
29 	// create attributes
30 	Attribs = environment->getFileSystem()->createEmptyAttributes(Environment->getVideoDriver());
31 
32 	calculateClientArea();
33 	resizeInnerPane();
34 
35 	// refresh attrib list
36 	refreshAttribs();
37 
38 	IGUIScrollBar* sb = getVScrollBar();
39 	core::rect<s32> r = sb->getRelativePosition();
40 	r.LowerRightCorner.Y -= 16;
41 	sb->setRelativePosition(r);
42 }
43 
~CGUIAttributeEditor()44 CGUIAttributeEditor::~CGUIAttributeEditor()
45 {
46 	for (u32 i=0; i<AttribList.size(); ++i)
47 	{
48 		AttribList[i]->remove();
49 		AttribList[i]->drop();
50 	}
51 	AttribList.clear();
52 
53 	Attribs->drop();
54 }
55 
56 
getAttribs()57 IAttributes* CGUIAttributeEditor::getAttribs()
58 {
59 	return Attribs;
60 }
61 
refreshAttribs()62 void CGUIAttributeEditor::refreshAttribs()
63 {
64 	// clear the attribute list
65 	u32 i;
66 	for (i=0; i<AttribList.size(); ++i)
67 	{
68 		AttribList[i]->remove();
69 		AttribList[i]->drop();
70 	}
71 	AttribList.clear();
72 
73 	position2di top(10, 5);
74 	rect<s32> r(top.X, top.Y,
75 			getClientArea().getWidth() - 10,
76 			5 + Environment->getSkin()->getFont()->getDimension(L"A").Height);
77 
78 	// add attribute elements
79 	u32 c = Attribs->getAttributeCount();
80 	for (i=0; i<c; ++i)
81 	{
82 
83 		// try to create attribute
84 		stringc str = Attribs->getAttributeTypeString(i);
85 		str += "_attribute";
86 		CGUIAttribute* n = (CGUIAttribute*)Environment->addGUIElement(str.c_str(), 0);
87 
88 		// if this doesn't exist, use a string editor
89 		if (!n)
90 			n = (CGUIAttribute*)Environment->addGUIElement("string_attribute", 0);
91 
92 		if (n)
93 		{
94 			AttribList.push_back(n);
95 			n->setParentID(getID());
96 			n->grab();
97 		}
98 
99 		// We can't set "this" as parent above as we need functionality
100 		// of the overloaded addChild which isn't called in the constructor.
101 		// (that's a general Irrlicht messup with too fat constructors)
102 		addChild(n);
103 
104 		AttribList[i]->setSubElement(true);
105 		AttribList[i]->setRelativePosition(r);
106 		AttribList[i]->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
107 		AttribList[i]->setAttrib(Attribs, i);
108 		r += position2di(0, AttribList[i]->getRelativePosition().getHeight() + 5);
109 	}
110 }
111 
updateAttribs()112 void CGUIAttributeEditor::updateAttribs()
113 {
114 	for (u32 i=0; i<AttribList.size(); ++i)
115 		AttribList[i]->updateAttrib(false);
116 }
117 
118 } // namespace gui
119 } // namespace irr
120 
121