aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp')
-rw-r--r--libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp1854
1 files changed, 927 insertions, 927 deletions
diff --git a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp
index a45e5d3..7b09136 100644
--- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp
+++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp
@@ -1,927 +1,927 @@
1// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson 1// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson
2// This file is part of the "Irrlicht Engine". 2// This file is part of the "Irrlicht Engine".
3// For conditions of distribution and use, see copyright notice in irrlicht.h 3// For conditions of distribution and use, see copyright notice in irrlicht.h
4 4
5// Thanks to Midnight for all his testing, bug fixes and patches :) 5// Thanks to Midnight for all his testing, bug fixes and patches :)
6 6
7#include "CGUIEditWorkspace.h" 7#include "CGUIEditWorkspace.h"
8#include "IGUIEnvironment.h" 8#include "IGUIEnvironment.h"
9#include "IVideoDriver.h" 9#include "IVideoDriver.h"
10#include "IOSOperator.h" 10#include "IOSOperator.h"
11#include "IReadFile.h" 11#include "IReadFile.h"
12#include "IFileSystem.h" 12#include "IFileSystem.h"
13#include "IXMLWriter.h" 13#include "IXMLWriter.h"
14#include "IGUISkin.h" 14#include "IGUISkin.h"
15#include "IGUIElementFactory.h" 15#include "IGUIElementFactory.h"
16#include "CGUIEditWindow.h" 16#include "CGUIEditWindow.h"
17#include "IGUIContextMenu.h" 17#include "IGUIContextMenu.h"
18#include "IGUIFileOpenDialog.h" 18#include "IGUIFileOpenDialog.h"
19#include "IGUITreeView.h" 19#include "IGUITreeView.h"
20#include "CGUIAttribute.h" 20#include "CGUIAttribute.h"
21#include "CMemoryReadWriteFile.h" 21#include "CMemoryReadWriteFile.h"
22 22
23namespace irr 23namespace irr
24{ 24{
25namespace gui 25namespace gui
26{ 26{
27 27
28//! constructor 28//! constructor
29CGUIEditWorkspace::CGUIEditWorkspace(IGUIEnvironment* environment, s32 id, IGUIElement *parent) 29CGUIEditWorkspace::CGUIEditWorkspace(IGUIEnvironment* environment, s32 id, IGUIElement *parent)
30: IGUIElement(EGUIET_ELEMENT, environment, parent ? parent : environment->getRootGUIElement(), id, environment->getRootGUIElement()->getAbsolutePosition()), 30: IGUIElement(EGUIET_ELEMENT, environment, parent ? parent : environment->getRootGUIElement(), id, environment->getRootGUIElement()->getAbsolutePosition()),
31 CurrentMode(EGUIEDM_SELECT), MouseOverMode(EGUIEDM_SELECT), 31 CurrentMode(EGUIEDM_SELECT), MouseOverMode(EGUIEDM_SELECT),
32 GridSize(10,10), MenuCommandStart(0x3D17), DrawGrid(false), UseGrid(true), 32 GridSize(10,10), MenuCommandStart(0x3D17), DrawGrid(false), UseGrid(true),
33 MouseOverElement(0), SelectedElement(0), EditorWindow(0) 33 MouseOverElement(0), SelectedElement(0), EditorWindow(0)
34{ 34{
35 #ifdef _DEBUG 35 #ifdef _DEBUG
36 setDebugName("CGUIEditWorkspace"); 36 setDebugName("CGUIEditWorkspace");
37 #endif 37 #endif
38 38
39 // this element is never saved. 39 // this element is never saved.
40 setSubElement(true); 40 setSubElement(true);
41 41
42 // it resizes to fit a resizing window 42 // it resizes to fit a resizing window
43 setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT); 43 setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
44 44
45 EditorWindow = (CGUIEditWindow*) Environment->addGUIElement("GUIEditWindow", this); 45 EditorWindow = (CGUIEditWindow*) Environment->addGUIElement("GUIEditWindow", this);
46 if (EditorWindow) 46 if (EditorWindow)
47 { 47 {
48 EditorWindow->grab(); 48 EditorWindow->grab();
49 EditorWindow->setSubElement(true); 49 EditorWindow->setSubElement(true);
50 50
51 Environment->setFocus(EditorWindow); 51 Environment->setFocus(EditorWindow);
52 serializeAttributes(EditorWindow->getOptionEditor()->getAttribs()); 52 serializeAttributes(EditorWindow->getOptionEditor()->getAttribs());
53 EditorWindow->getOptionEditor()->refreshAttribs(); 53 EditorWindow->getOptionEditor()->refreshAttribs();
54 54
55 if (EditorWindow->getEnvironmentEditor()) 55 if (EditorWindow->getEnvironmentEditor())
56 { 56 {
57 Environment->serializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs()); 57 Environment->serializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs());
58 EditorWindow->getEnvironmentEditor()->refreshAttribs(); 58 EditorWindow->getEnvironmentEditor()->refreshAttribs();
59 } 59 }
60 } 60 }
61} 61}
62 62
63 63
64//! destructor 64//! destructor
65CGUIEditWorkspace::~CGUIEditWorkspace() 65CGUIEditWorkspace::~CGUIEditWorkspace()
66{ 66{
67 if (EditorWindow) 67 if (EditorWindow)
68 EditorWindow->drop(); 68 EditorWindow->drop();
69} 69}
70 70
71 71
72void CGUIEditWorkspace::setMenuCommandIDStart(s32 id) 72void CGUIEditWorkspace::setMenuCommandIDStart(s32 id)
73{ 73{
74 MenuCommandStart = id; 74 MenuCommandStart = id;
75} 75}
76 76
77CGUIEditWorkspace::EGUIEDIT_MODE CGUIEditWorkspace::getModeFromPos(core::position2di p) 77CGUIEditWorkspace::EGUIEDIT_MODE CGUIEditWorkspace::getModeFromPos(core::position2di p)
78{ 78{
79 if (SelectedElement) 79 if (SelectedElement)
80 { 80 {
81 core::rect<s32> r = SelectedElement->getAbsolutePosition(); 81 core::rect<s32> r = SelectedElement->getAbsolutePosition();
82 82
83 if (TLRect.isPointInside(p)) 83 if (TLRect.isPointInside(p))
84 return EGUIEDM_RESIZE_TL; 84 return EGUIEDM_RESIZE_TL;
85 85
86 else if (TRRect.isPointInside(p)) 86 else if (TRRect.isPointInside(p))
87 return EGUIEDM_RESIZE_TR; 87 return EGUIEDM_RESIZE_TR;
88 88
89 else if (BLRect.isPointInside(p) ) 89 else if (BLRect.isPointInside(p) )
90 return EGUIEDM_RESIZE_BL; 90 return EGUIEDM_RESIZE_BL;
91 91
92 else if (BRRect.isPointInside(p)) 92 else if (BRRect.isPointInside(p))
93 return EGUIEDM_RESIZE_BR; 93 return EGUIEDM_RESIZE_BR;
94 94
95 else if (TopRect.isPointInside(p)) 95 else if (TopRect.isPointInside(p))
96 return EGUIEDM_RESIZE_T; 96 return EGUIEDM_RESIZE_T;
97 97
98 else if (BRect.isPointInside(p)) 98 else if (BRect.isPointInside(p))
99 return EGUIEDM_RESIZE_B; 99 return EGUIEDM_RESIZE_B;
100 100
101 else if (LRect.isPointInside(p)) 101 else if (LRect.isPointInside(p))
102 return EGUIEDM_RESIZE_L; 102 return EGUIEDM_RESIZE_L;
103 103
104 else if (RRect.isPointInside(p)) 104 else if (RRect.isPointInside(p))
105 return EGUIEDM_RESIZE_R; 105 return EGUIEDM_RESIZE_R;
106 106
107 else if (getEditableElementFromPoint(SelectedElement, p) == SelectedElement) 107 else if (getEditableElementFromPoint(SelectedElement, p) == SelectedElement)
108 return EGUIEDM_MOVE; 108 return EGUIEDM_MOVE;
109 109
110 else 110 else
111 return EGUIEDM_SELECT; 111 return EGUIEDM_SELECT;
112 } 112 }
113 113
114 return EGUIEDM_SELECT; 114 return EGUIEDM_SELECT;
115 115
116} 116}
117 117
118IGUIElement* CGUIEditWorkspace::getEditableElementFromPoint(IGUIElement *start, const core::position2di &point, s32 index ) 118IGUIElement* CGUIEditWorkspace::getEditableElementFromPoint(IGUIElement *start, const core::position2di &point, s32 index )
119{ 119{
120 IGUIElement* target = 0; 120 IGUIElement* target = 0;
121 121
122 // we have to search from back to front. 122 // we have to search from back to front.
123 123
124 core::list<IGUIElement*>::ConstIterator it = start->getChildren().getLast(); 124 core::list<IGUIElement*>::ConstIterator it = start->getChildren().getLast();
125 s32 count=0; 125 s32 count=0;
126 while(it != start->getChildren().end()) 126 while(it != start->getChildren().end())
127 { 127 {
128 target = getEditableElementFromPoint((*it),point); 128 target = getEditableElementFromPoint((*it),point);
129 if (target) 129 if (target)
130 { 130 {
131 if (!target->isSubElement() && !isMyChild(target) && target != this) 131 if (!target->isSubElement() && !isMyChild(target) && target != this)
132 { 132 {
133 if (index == count) 133 if (index == count)
134 return target; 134 return target;
135 else 135 else
136 count++; 136 count++;
137 } 137 }
138 else 138 else
139 target = 0; 139 target = 0;
140 } 140 }
141 --it; 141 --it;
142 } 142 }
143 143
144 if (start->getAbsolutePosition().isPointInside(point)) 144 if (start->getAbsolutePosition().isPointInside(point))
145 target = start; 145 target = start;
146 146
147 return target; 147 return target;
148} 148}
149 149
150void CGUIEditWorkspace::setSelectedElement(IGUIElement *sel) 150void CGUIEditWorkspace::setSelectedElement(IGUIElement *sel)
151{ 151{
152 IGUIElement* focus = Environment->getFocus(); 152 IGUIElement* focus = Environment->getFocus();
153 // we only give focus back to children 153 // we only give focus back to children
154 if (!isMyChild(focus)) 154 if (!isMyChild(focus))
155 focus = 0; 155 focus = 0;
156 156
157 if (SelectedElement != Parent) 157 if (SelectedElement != Parent)
158 { 158 {
159 if (SelectedElement != sel && EditorWindow) 159 if (SelectedElement != sel && EditorWindow)
160 { 160 {
161 EditorWindow->setSelectedElement(sel); 161 EditorWindow->setSelectedElement(sel);
162 SelectedElement = sel; 162 SelectedElement = sel;
163 } 163 }
164 } 164 }
165 else 165 else
166 SelectedElement = 0; 166 SelectedElement = 0;
167 167
168 if (focus) 168 if (focus)
169 Environment->setFocus(focus); 169 Environment->setFocus(focus);
170 else 170 else
171 Environment->setFocus(this); 171 Environment->setFocus(this);
172} 172}
173 173
174IGUIElement* CGUIEditWorkspace::getSelectedElement() 174IGUIElement* CGUIEditWorkspace::getSelectedElement()
175{ 175{
176 return SelectedElement; 176 return SelectedElement;
177} 177}
178void CGUIEditWorkspace::selectNextSibling() 178void CGUIEditWorkspace::selectNextSibling()
179{ 179{
180 IGUIElement* p=0; 180 IGUIElement* p=0;
181 181
182 if (SelectedElement && SelectedElement->getParent()) 182 if (SelectedElement && SelectedElement->getParent())
183 p = SelectedElement->getParent(); 183 p = SelectedElement->getParent();
184 else 184 else
185 p = Parent; 185 p = Parent;
186 186
187 core::list<IGUIElement*>::ConstIterator it = p->getChildren().begin(); 187 core::list<IGUIElement*>::ConstIterator it = p->getChildren().begin();
188 // find selected element 188 // find selected element
189 if (SelectedElement) 189 if (SelectedElement)
190 while (*it != SelectedElement) 190 while (*it != SelectedElement)
191 ++it; 191 ++it;
192 if (it !=p->getChildren().end()) 192 if (it !=p->getChildren().end())
193 ++it; 193 ++it;
194 // find next non sub-element 194 // find next non sub-element
195 while (it != p->getChildren().end() && (*it)->isSubElement()) 195 while (it != p->getChildren().end() && (*it)->isSubElement())
196 ++it; 196 ++it;
197 197
198 if (it != p->getChildren().end()) 198 if (it != p->getChildren().end())
199 setSelectedElement(*it); 199 setSelectedElement(*it);
200} 200}
201void CGUIEditWorkspace::selectPreviousSibling() 201void CGUIEditWorkspace::selectPreviousSibling()
202{ 202{
203 IGUIElement* p=0; 203 IGUIElement* p=0;
204 204
205 if (SelectedElement && SelectedElement->getParent()) 205 if (SelectedElement && SelectedElement->getParent())
206 p = SelectedElement->getParent(); 206 p = SelectedElement->getParent();
207 else 207 else
208 p = Parent; 208 p = Parent;
209 209
210 core::list<IGUIElement*>::ConstIterator it = p->getChildren().getLast(); 210 core::list<IGUIElement*>::ConstIterator it = p->getChildren().getLast();
211 // find selected element 211 // find selected element
212 if (SelectedElement) 212 if (SelectedElement)
213 while (*it != SelectedElement) 213 while (*it != SelectedElement)
214 --it; 214 --it;
215 if (it != p->getChildren().end()) 215 if (it != p->getChildren().end())
216 --it; 216 --it;
217 // find next non sub-element 217 // find next non sub-element
218 while (it != p->getChildren().end() && (*it)->isSubElement()) 218 while (it != p->getChildren().end() && (*it)->isSubElement())
219 --it; 219 --it;
220 220
221 if (it != p->getChildren().end()) 221 if (it != p->getChildren().end())
222 setSelectedElement(*it); 222 setSelectedElement(*it);
223} 223}
224 224
225//! called if an event happened. 225//! called if an event happened.
226bool CGUIEditWorkspace::OnEvent(const SEvent &e) 226bool CGUIEditWorkspace::OnEvent(const SEvent &e)
227{ 227{
228 IGUIFileOpenDialog* dialog=0; 228 IGUIFileOpenDialog* dialog=0;
229 switch(e.EventType) 229 switch(e.EventType)
230 { 230 {
231 case ATTRIBEDIT_ATTRIB_CHANGED: 231 case ATTRIBEDIT_ATTRIB_CHANGED:
232 { 232 {
233 switch (e.UserEvent.UserData1) 233 switch (e.UserEvent.UserData1)
234 { 234 {
235 case EGUIEDCE_ATTRIB_EDITOR: 235 case EGUIEDCE_ATTRIB_EDITOR:
236 { 236 {
237 // update selected items attributes 237 // update selected items attributes
238 if (SelectedElement) 238 if (SelectedElement)
239 { 239 {
240 SelectedElement->deserializeAttributes(EditorWindow->getAttributeEditor()->getAttribs()); 240 SelectedElement->deserializeAttributes(EditorWindow->getAttributeEditor()->getAttribs());
241 EditorWindow->updateTree(); 241 EditorWindow->updateTree();
242 } 242 }
243 return true; 243 return true;
244 } 244 }
245 case EGUIEDCE_OPTION_EDITOR: 245 case EGUIEDCE_OPTION_EDITOR:
246 { 246 {
247 // update editor options 247 // update editor options
248 deserializeAttributes(EditorWindow->getOptionEditor()->getAttribs()); 248 deserializeAttributes(EditorWindow->getOptionEditor()->getAttribs());
249 return true; 249 return true;
250 } 250 }
251 case EGUIEDCE_ENV_EDITOR: 251 case EGUIEDCE_ENV_EDITOR:
252 { 252 {
253 // update environment 253 // update environment
254 Environment->deserializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs()); 254 Environment->deserializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs());
255 return true; 255 return true;
256 } 256 }
257 } 257 }
258 } 258 }
259 break; 259 break;
260 260
261 case EET_KEY_INPUT_EVENT: 261 case EET_KEY_INPUT_EVENT:
262 if (!e.KeyInput.PressedDown) 262 if (!e.KeyInput.PressedDown)
263 { 263 {
264 switch (e.KeyInput.Key) 264 switch (e.KeyInput.Key)
265 { 265 {
266 case KEY_DELETE: 266 case KEY_DELETE:
267 if (SelectedElement) 267 if (SelectedElement)
268 { 268 {
269 IGUIElement* el = SelectedElement; 269 IGUIElement* el = SelectedElement;
270 setSelectedElement(0); 270 setSelectedElement(0);
271 MouseOverElement = 0; 271 MouseOverElement = 0;
272 el->remove(); 272 el->remove();
273 EditorWindow->updateTree(); 273 EditorWindow->updateTree();
274 } 274 }
275 break; 275 break;
276 case KEY_KEY_X: 276 case KEY_KEY_X:
277 if (e.KeyInput.Control && SelectedElement) 277 if (e.KeyInput.Control && SelectedElement)
278 { 278 {
279 // cut 279 // cut
280 CopySelectedElementXML(); 280 CopySelectedElementXML();
281 // delete element 281 // delete element
282 IGUIElement *el = SelectedElement; 282 IGUIElement *el = SelectedElement;
283 setSelectedElement(0); 283 setSelectedElement(0);
284 MouseOverElement = 0; 284 MouseOverElement = 0;
285 el->remove(); 285 el->remove();
286 } 286 }
287 break; 287 break;
288 case KEY_KEY_C: 288 case KEY_KEY_C:
289 // copy 289 // copy
290 if (e.KeyInput.Control && SelectedElement) 290 if (e.KeyInput.Control && SelectedElement)
291 { 291 {
292 CopySelectedElementXML(); 292 CopySelectedElementXML();
293 } 293 }
294 break; 294 break;
295 case KEY_KEY_V: 295 case KEY_KEY_V:
296 // paste 296 // paste
297 if (e.KeyInput.Control) 297 if (e.KeyInput.Control)
298 { 298 {
299 PasteXMLToSelectedElement(); 299 PasteXMLToSelectedElement();
300 } 300 }
301 break; 301 break;
302 default: 302 default:
303 break; 303 break;
304 } 304 }
305 305
306 return true; 306 return true;
307 } 307 }
308 break; 308 break;
309 309
310 case EET_MOUSE_INPUT_EVENT: 310 case EET_MOUSE_INPUT_EVENT:
311 311
312 switch(e.MouseInput.Event) 312 switch(e.MouseInput.Event)
313 { 313 {
314 case EMIE_MOUSE_WHEEL: 314 case EMIE_MOUSE_WHEEL:
315 { 315 {
316 f32 wheel = e.MouseInput.Wheel; 316 f32 wheel = e.MouseInput.Wheel;
317 317
318 if (wheel > 0) 318 if (wheel > 0)
319 selectPreviousSibling(); 319 selectPreviousSibling();
320 else 320 else
321 selectNextSibling(); 321 selectNextSibling();
322 } 322 }
323 break; 323 break;
324 case EMIE_LMOUSE_PRESSED_DOWN: 324 case EMIE_LMOUSE_PRESSED_DOWN:
325 { 325 {
326 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y); 326 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
327 327
328 IGUIElement* newSelection = getElementFromPoint(p); 328 IGUIElement* newSelection = getElementFromPoint(p);
329 329
330 if (newSelection != this && isMyChild(newSelection) ) // redirect event 330 if (newSelection != this && isMyChild(newSelection) ) // redirect event
331 { 331 {
332 Environment->setFocus(newSelection); 332 Environment->setFocus(newSelection);
333 return true; 333 return true;
334 } 334 }
335 335
336 // hide the gui editor 336 // hide the gui editor
337 if (EditorWindow) 337 if (EditorWindow)
338 EditorWindow->setVisible(false); 338 EditorWindow->setVisible(false);
339 339
340 if (CurrentMode == EGUIEDM_SELECT) 340 if (CurrentMode == EGUIEDM_SELECT)
341 { 341 {
342 if (SelectedElement) 342 if (SelectedElement)
343 { 343 {
344 // start moving or dragging 344 // start moving or dragging
345 CurrentMode = getModeFromPos(p); 345 CurrentMode = getModeFromPos(p);
346 346
347 if (CurrentMode == EGUIEDM_MOVE) 347 if (CurrentMode == EGUIEDM_MOVE)
348 StartMovePos = SelectedElement->getAbsolutePosition().UpperLeftCorner; 348 StartMovePos = SelectedElement->getAbsolutePosition().UpperLeftCorner;
349 349
350 DragStart = p; 350 DragStart = p;
351 SelectedArea = SelectedElement->getAbsolutePosition(); 351 SelectedArea = SelectedElement->getAbsolutePosition();
352 } 352 }
353 353
354 if (CurrentMode < EGUIEDM_MOVE) 354 if (CurrentMode < EGUIEDM_MOVE)
355 { 355 {
356 // selecting an element... 356 // selecting an element...
357 MouseOverElement = getEditableElementFromPoint(Parent, p); 357 MouseOverElement = getEditableElementFromPoint(Parent, p);
358 358
359 if (MouseOverElement == Parent) 359 if (MouseOverElement == Parent)
360 MouseOverElement = 0; 360 MouseOverElement = 0;
361 361
362 setSelectedElement(MouseOverElement); 362 setSelectedElement(MouseOverElement);
363 } 363 }
364 } 364 }
365 365
366 break; 366 break;
367 } 367 }
368 case EMIE_RMOUSE_PRESSED_DOWN: 368 case EMIE_RMOUSE_PRESSED_DOWN:
369 if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT || CurrentMode >= EGUIEDM_MOVE) 369 if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT || CurrentMode >= EGUIEDM_MOVE)
370 { 370 {
371 // cancel dragging 371 // cancel dragging
372 CurrentMode = EGUIEDM_SELECT; 372 CurrentMode = EGUIEDM_SELECT;
373 } 373 }
374 else 374 else
375 { 375 {
376 DragStart = core::position2di(e.MouseInput.X,e.MouseInput.Y); 376 DragStart = core::position2di(e.MouseInput.X,e.MouseInput.Y);
377 // root menu 377 // root menu
378 IGUIContextMenu* mnu = Environment->addContextMenu( 378 IGUIContextMenu* mnu = Environment->addContextMenu(
379 core::rect<s32>(e.MouseInput.X, e.MouseInput.Y, e.MouseInput.Y+100, e.MouseInput.Y+100),this); 379 core::rect<s32>(e.MouseInput.X, e.MouseInput.Y, e.MouseInput.Y+100, e.MouseInput.Y+100),this);
380 mnu->addItem(L"File",-1,true,true); 380 mnu->addItem(L"File",-1,true,true);
381 mnu->addItem(L"Edit",-1,true,true); 381 mnu->addItem(L"Edit",-1,true,true);
382 mnu->addItem(L"View",-1,true,true); 382 mnu->addItem(L"View",-1,true,true);
383 mnu->addItem(SelectedElement ? L"Add child" : L"Add" ,-1,true,true); 383 mnu->addItem(SelectedElement ? L"Add child" : L"Add" ,-1,true,true);
384 384
385 // file menu 385 // file menu
386 IGUIContextMenu* sub = mnu->getSubMenu(0); 386 IGUIContextMenu* sub = mnu->getSubMenu(0);
387 IGUIContextMenu* sub2 =0; 387 IGUIContextMenu* sub2 =0;
388 388
389 sub->addItem(L"New", MenuCommandStart + EGUIEDMC_FILE_NEW ); 389 sub->addItem(L"New", MenuCommandStart + EGUIEDMC_FILE_NEW );
390 sub->addItem(L"Load...",MenuCommandStart + EGUIEDMC_FILE_LOAD); 390 sub->addItem(L"Load...",MenuCommandStart + EGUIEDMC_FILE_LOAD);
391 sub->addItem(L"Save...",MenuCommandStart + EGUIEDMC_FILE_SAVE); 391 sub->addItem(L"Save...",MenuCommandStart + EGUIEDMC_FILE_SAVE);
392 392
393 // edit menu 393 // edit menu
394 sub = mnu->getSubMenu(1); 394 sub = mnu->getSubMenu(1);
395 sub->addItem(L"Cut (ctrl+x)", MenuCommandStart + EGUIEDMC_CUT_ELEMENT, (SelectedElement != 0)); 395 sub->addItem(L"Cut (ctrl+x)", MenuCommandStart + EGUIEDMC_CUT_ELEMENT, (SelectedElement != 0));
396 sub->addItem(L"Copy (ctrl+c)", MenuCommandStart + EGUIEDMC_COPY_ELEMENT, (SelectedElement != 0)); 396 sub->addItem(L"Copy (ctrl+c)", MenuCommandStart + EGUIEDMC_COPY_ELEMENT, (SelectedElement != 0));
397 sub->addItem(L"Paste (ctrl+v)", MenuCommandStart + EGUIEDMC_PASTE_ELEMENT, 397 sub->addItem(L"Paste (ctrl+v)", MenuCommandStart + EGUIEDMC_PASTE_ELEMENT,
398 (core::stringc(Environment->getOSOperator()->getTextFromClipboard()) != "")); 398 (core::stringc(Environment->getOSOperator()->getTextFromClipboard()) != ""));
399 sub->addItem(L"Delete (del)", MenuCommandStart + EGUIEDMC_DELETE_ELEMENT, (SelectedElement != 0)); 399 sub->addItem(L"Delete (del)", MenuCommandStart + EGUIEDMC_DELETE_ELEMENT, (SelectedElement != 0));
400 sub->addSeparator(); 400 sub->addSeparator();
401 sub->addItem(L"Set parent", MenuCommandStart + EGUIEDMC_SET_PARENT, (SelectedElement != 0)); 401 sub->addItem(L"Set parent", MenuCommandStart + EGUIEDMC_SET_PARENT, (SelectedElement != 0));
402 sub->addItem(L"Bring to front", MenuCommandStart + EGUIEDMC_BRING_TO_FRONT, (SelectedElement != 0)); 402 sub->addItem(L"Bring to front", MenuCommandStart + EGUIEDMC_BRING_TO_FRONT, (SelectedElement != 0));
403 sub->addSeparator(); 403 sub->addSeparator();
404 sub->addItem(L"Save to XML...", MenuCommandStart + EGUIEDMC_SAVE_ELEMENT, (SelectedElement != 0)); 404 sub->addItem(L"Save to XML...", MenuCommandStart + EGUIEDMC_SAVE_ELEMENT, (SelectedElement != 0));
405 405
406 sub = mnu->getSubMenu(2); 406 sub = mnu->getSubMenu(2);
407 // view menu 407 // view menu
408 if (EditorWindow) 408 if (EditorWindow)
409 sub->addItem(EditorWindow->isVisible() ? L"Hide window" : L"Show window", MenuCommandStart + EGUIEDMC_TOGGLE_EDITOR); 409 sub->addItem(EditorWindow->isVisible() ? L"Hide window" : L"Show window", MenuCommandStart + EGUIEDMC_TOGGLE_EDITOR);
410 410
411 sub = mnu->getSubMenu(3); 411 sub = mnu->getSubMenu(3);
412 412
413 s32 i,j,c=0; 413 s32 i,j,c=0;
414 sub->addItem(L"Default factory",-1,true, true); 414 sub->addItem(L"Default factory",-1,true, true);
415 415
416 // add elements from each factory 416 // add elements from each factory
417 for (i=0; u32(i) < Environment->getRegisteredGUIElementFactoryCount(); ++i) 417 for (i=0; u32(i) < Environment->getRegisteredGUIElementFactoryCount(); ++i)
418 { 418 {
419 sub2 = sub->getSubMenu(i); 419 sub2 = sub->getSubMenu(i);
420 420
421 IGUIElementFactory *f = Environment->getGUIElementFactory(i); 421 IGUIElementFactory *f = Environment->getGUIElementFactory(i);
422 422
423 for (j=0; j< f->getCreatableGUIElementTypeCount(); ++j) 423 for (j=0; j< f->getCreatableGUIElementTypeCount(); ++j)
424 { 424 {
425 sub2->addItem(core::stringw(f->getCreateableGUIElementTypeName(j)).c_str(), MenuCommandStart + EGUIEDMC_COUNT + c); 425 sub2->addItem(core::stringw(f->getCreateableGUIElementTypeName(j)).c_str(), MenuCommandStart + EGUIEDMC_COUNT + c);
426 c++; 426 c++;
427 } 427 }
428 428
429 if (u32(i+1) < Environment->getRegisteredGUIElementFactoryCount()) 429 if (u32(i+1) < Environment->getRegisteredGUIElementFactoryCount())
430 { 430 {
431 core::stringw strFact; 431 core::stringw strFact;
432 strFact = L"Factory "; 432 strFact = L"Factory ";
433 strFact += i+1; 433 strFact += i+1;
434 sub->addItem(strFact.c_str(),-1, true, true); 434 sub->addItem(strFact.c_str(),-1, true, true);
435 } 435 }
436 } 436 }
437 sub->addSeparator(); 437 sub->addSeparator();
438 sub->addItem(L"From XML...", MenuCommandStart + EGUIEDMC_INSERT_XML); 438 sub->addItem(L"From XML...", MenuCommandStart + EGUIEDMC_INSERT_XML);
439 439
440 // set focus to menu 440 // set focus to menu
441 Environment->setFocus(mnu); 441 Environment->setFocus(mnu);
442 442
443 } 443 }
444 break; 444 break;
445 case EMIE_LMOUSE_LEFT_UP: 445 case EMIE_LMOUSE_LEFT_UP:
446 446
447 // make window visible again 447 // make window visible again
448 if (EditorWindow) 448 if (EditorWindow)
449 EditorWindow->setVisible(true); 449 EditorWindow->setVisible(true);
450 if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT) 450 if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT)
451 { 451 {
452 if (SelectedElement) 452 if (SelectedElement)
453 { 453 {
454 MouseOverElement = getEditableElementFromPoint(Parent, 454 MouseOverElement = getEditableElementFromPoint(Parent,
455 core::position2di(e.MouseInput.X,e.MouseInput.Y)); 455 core::position2di(e.MouseInput.X,e.MouseInput.Y));
456 if (MouseOverElement) 456 if (MouseOverElement)
457 { 457 {
458 MouseOverElement->addChild(SelectedElement); 458 MouseOverElement->addChild(SelectedElement);
459 setSelectedElement(0); 459 setSelectedElement(0);
460 setSelectedElement(SelectedElement); 460 setSelectedElement(SelectedElement);
461 } 461 }
462 } 462 }
463 CurrentMode = EGUIEDM_SELECT; 463 CurrentMode = EGUIEDM_SELECT;
464 } 464 }
465 else if (CurrentMode >= EGUIEDM_MOVE) 465 else if (CurrentMode >= EGUIEDM_MOVE)
466 { 466 {
467 IGUIElement *sel = SelectedElement; 467 IGUIElement *sel = SelectedElement;
468 // unselect 468 // unselect
469 setSelectedElement(0); 469 setSelectedElement(0);
470 470
471 // move 471 // move
472 core::position2d<s32> p(0,0); 472 core::position2d<s32> p(0,0);
473 if (sel->getParent()) 473 if (sel->getParent())
474 p = sel->getParent()->getAbsolutePosition().UpperLeftCorner; 474 p = sel->getParent()->getAbsolutePosition().UpperLeftCorner;
475 475
476 sel->setRelativePosition(SelectedArea - p); 476 sel->setRelativePosition(SelectedArea - p);
477 477
478 // select 478 // select
479 setSelectedElement(sel); 479 setSelectedElement(sel);
480 480
481 // reset selection mode... 481 // reset selection mode...
482 CurrentMode = EGUIEDM_SELECT; 482 CurrentMode = EGUIEDM_SELECT;
483 } 483 }
484 break; 484 break;
485 case EMIE_MOUSE_MOVED: 485 case EMIE_MOUSE_MOVED:
486 // always on top 486 // always on top
487 Parent->bringToFront(this); 487 Parent->bringToFront(this);
488 488
489 // if selecting 489 // if selecting
490 if (CurrentMode == EGUIEDM_SELECT || CurrentMode == EGUIEDM_SELECT_NEW_PARENT) 490 if (CurrentMode == EGUIEDM_SELECT || CurrentMode == EGUIEDM_SELECT_NEW_PARENT)
491 { 491 {
492 492
493 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y); 493 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
494 494
495 // highlight the element that the mouse is over 495 // highlight the element that the mouse is over
496 MouseOverElement = getEditableElementFromPoint(Parent, p); 496 MouseOverElement = getEditableElementFromPoint(Parent, p);
497 if (MouseOverElement == Parent) 497 if (MouseOverElement == Parent)
498 { 498 {
499 MouseOverElement = 0; 499 MouseOverElement = 0;
500 } 500 }
501 501
502 if (CurrentMode == EGUIEDM_SELECT) 502 if (CurrentMode == EGUIEDM_SELECT)
503 { 503 {
504 MouseOverMode = getModeFromPos(p); 504 MouseOverMode = getModeFromPos(p);
505 if (MouseOverMode > EGUIEDM_MOVE) 505 if (MouseOverMode > EGUIEDM_MOVE)
506 { 506 {
507 MouseOverElement = SelectedElement; 507 MouseOverElement = SelectedElement;
508 } 508 }
509 } 509 }
510 } 510 }
511 else if (CurrentMode == EGUIEDM_MOVE) 511 else if (CurrentMode == EGUIEDM_MOVE)
512 { 512 {
513 // get difference 513 // get difference
514 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y); 514 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
515 p -= DragStart; 515 p -= DragStart;
516 516
517 // apply to top corner 517 // apply to top corner
518 p = StartMovePos + p; 518 p = StartMovePos + p;
519 if (UseGrid) 519 if (UseGrid)
520 { 520 {
521 p.X = (p.X/GridSize.Width)*GridSize.Width; 521 p.X = (p.X/GridSize.Width)*GridSize.Width;
522 p.Y = (p.Y/GridSize.Height)*GridSize.Height; 522 p.Y = (p.Y/GridSize.Height)*GridSize.Height;
523 } 523 }
524 524
525 SelectedArea += p - SelectedArea.UpperLeftCorner; 525 SelectedArea += p - SelectedArea.UpperLeftCorner;
526 } 526 }
527 else if (CurrentMode > EGUIEDM_MOVE) 527 else if (CurrentMode > EGUIEDM_MOVE)
528 { 528 {
529 // get difference from start position 529 // get difference from start position
530 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y); 530 core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
531 if (UseGrid) 531 if (UseGrid)
532 { 532 {
533 p.X = (p.X/GridSize.Width)*GridSize.Width; 533 p.X = (p.X/GridSize.Width)*GridSize.Width;
534 p.Y = (p.Y/GridSize.Height)*GridSize.Height; 534 p.Y = (p.Y/GridSize.Height)*GridSize.Height;
535 } 535 }
536 536
537 switch(CurrentMode) 537 switch(CurrentMode)
538 { 538 {
539 case EGUIEDM_RESIZE_T: 539 case EGUIEDM_RESIZE_T:
540 SelectedArea.UpperLeftCorner.Y = p.Y; 540 SelectedArea.UpperLeftCorner.Y = p.Y;
541 break; 541 break;
542 case EGUIEDM_RESIZE_B: 542 case EGUIEDM_RESIZE_B:
543 SelectedArea.LowerRightCorner.Y = p.Y; 543 SelectedArea.LowerRightCorner.Y = p.Y;
544 break; 544 break;
545 case EGUIEDM_RESIZE_L: 545 case EGUIEDM_RESIZE_L:
546 SelectedArea.UpperLeftCorner.X = p.X; 546 SelectedArea.UpperLeftCorner.X = p.X;
547 break; 547 break;
548 case EGUIEDM_RESIZE_R: 548 case EGUIEDM_RESIZE_R:
549 SelectedArea.LowerRightCorner.X = p.X; 549 SelectedArea.LowerRightCorner.X = p.X;
550 break; 550 break;
551 case EGUIEDM_RESIZE_TL: 551 case EGUIEDM_RESIZE_TL:
552 SelectedArea.UpperLeftCorner = p; 552 SelectedArea.UpperLeftCorner = p;
553 break; 553 break;
554 case EGUIEDM_RESIZE_TR: 554 case EGUIEDM_RESIZE_TR:
555 SelectedArea.UpperLeftCorner.Y = p.Y; 555 SelectedArea.UpperLeftCorner.Y = p.Y;
556 SelectedArea.LowerRightCorner.X = p.X; 556 SelectedArea.LowerRightCorner.X = p.X;
557 break; 557 break;
558 case EGUIEDM_RESIZE_BL: 558 case EGUIEDM_RESIZE_BL:
559 SelectedArea.UpperLeftCorner.X = p.X; 559 SelectedArea.UpperLeftCorner.X = p.X;
560 SelectedArea.LowerRightCorner.Y = p.Y; 560 SelectedArea.LowerRightCorner.Y = p.Y;
561 break; 561 break;
562 case EGUIEDM_RESIZE_BR: 562 case EGUIEDM_RESIZE_BR:
563 SelectedArea.LowerRightCorner = p; 563 SelectedArea.LowerRightCorner = p;
564 break; 564 break;
565 default: 565 default:
566 break; 566 break;
567 } 567 }
568 } 568 }
569 569
570 break; 570 break;
571 default: 571 default:
572 break; 572 break;
573 } 573 }
574 break; 574 break;
575 575
576 case EET_GUI_EVENT: 576 case EET_GUI_EVENT:
577 switch(e.GUIEvent.EventType) 577 switch(e.GUIEvent.EventType)
578 { 578 {
579 case EGET_TREEVIEW_NODE_SELECT: 579 case EGET_TREEVIEW_NODE_SELECT:
580 { 580 {
581 IGUITreeViewNode* eventnode = ((IGUITreeView*)e.GUIEvent.Caller)->getLastEventNode(); 581 IGUITreeViewNode* eventnode = ((IGUITreeView*)e.GUIEvent.Caller)->getLastEventNode();
582 if(!eventnode->isRoot()) 582 if(!eventnode->isRoot())
583 setSelectedElement((IGUIElement*)(eventnode->getData())); 583 setSelectedElement((IGUIElement*)(eventnode->getData()));
584 break; 584 break;
585 } 585 }
586 // load a gui file 586 // load a gui file
587 case EGET_FILE_SELECTED: 587 case EGET_FILE_SELECTED:
588 dialog = (IGUIFileOpenDialog*)e.GUIEvent.Caller; 588 dialog = (IGUIFileOpenDialog*)e.GUIEvent.Caller;
589 Environment->loadGUI(core::stringc(dialog->getFileName()).c_str()); 589 Environment->loadGUI(core::stringc(dialog->getFileName()).c_str());
590 break; 590 break;
591 591
592 case EGET_MENU_ITEM_SELECTED: 592 case EGET_MENU_ITEM_SELECTED:
593 { 593 {
594 IGUIContextMenu *menu = (IGUIContextMenu*)e.GUIEvent.Caller; 594 IGUIContextMenu *menu = (IGUIContextMenu*)e.GUIEvent.Caller;
595 s32 cmdID = menu->getItemCommandId(menu->getSelectedItem()) - MenuCommandStart; 595 s32 cmdID = menu->getItemCommandId(menu->getSelectedItem()) - MenuCommandStart;
596 596
597 IGUIElement* el; 597 IGUIElement* el;
598 598
599 switch(cmdID) 599 switch(cmdID)
600 { 600 {
601 601
602 //! file commands 602 //! file commands
603 case EGUIEDMC_FILE_NEW: 603 case EGUIEDMC_FILE_NEW:
604 // clear all elements belonging to our parent 604 // clear all elements belonging to our parent
605 setSelectedElement(0); 605 setSelectedElement(0);
606 MouseOverElement = 0; 606 MouseOverElement = 0;
607 el = Parent; 607 el = Parent;
608 grab(); 608 grab();
609 // remove all children 609 // remove all children
610 while(Children.end() != el->getChildren().begin()) 610 while(Children.end() != el->getChildren().begin())
611 el->removeChild(*(el->getChildren().begin())); 611 el->removeChild(*(el->getChildren().begin()));
612 // attach to parent again 612 // attach to parent again
613 el->addChild(this); 613 el->addChild(this);
614 drop(); 614 drop();
615 615
616 break; 616 break;
617 case EGUIEDMC_FILE_LOAD: 617 case EGUIEDMC_FILE_LOAD:
618 Environment->addFileOpenDialog(L"Please select a GUI file to open", false, this); 618 Environment->addFileOpenDialog(L"Please select a GUI file to open", false, this);
619 break; 619 break;
620 case EGUIEDMC_FILE_SAVE: 620 case EGUIEDMC_FILE_SAVE:
621 Environment->saveGUI("guiTest.xml"); 621 Environment->saveGUI("guiTest.xml");
622 break; 622 break;
623 623
624 //! edit menu 624 //! edit menu
625 case EGUIEDMC_CUT_ELEMENT: 625 case EGUIEDMC_CUT_ELEMENT:
626 { 626 {
627 CopySelectedElementXML(); 627 CopySelectedElementXML();
628 // delete element 628 // delete element
629 el = SelectedElement; 629 el = SelectedElement;
630 setSelectedElement(0); 630 setSelectedElement(0);
631 MouseOverElement = 0; 631 MouseOverElement = 0;
632 el->remove(); 632 el->remove();
633 break; 633 break;
634 } 634 }
635 case EGUIEDMC_COPY_ELEMENT: 635 case EGUIEDMC_COPY_ELEMENT:
636 CopySelectedElementXML(); 636 CopySelectedElementXML();
637 break; 637 break;
638 case EGUIEDMC_PASTE_ELEMENT: 638 case EGUIEDMC_PASTE_ELEMENT:
639 PasteXMLToSelectedElement(); 639 PasteXMLToSelectedElement();
640 break; 640 break;
641 case EGUIEDMC_DELETE_ELEMENT: 641 case EGUIEDMC_DELETE_ELEMENT:
642 el = SelectedElement; 642 el = SelectedElement;
643 setSelectedElement(0); 643 setSelectedElement(0);
644 MouseOverElement = 0; 644 MouseOverElement = 0;
645 el->remove(); 645 el->remove();
646 break; 646 break;
647 case EGUIEDMC_SET_PARENT: 647 case EGUIEDMC_SET_PARENT:
648 CurrentMode = EGUIEDM_SELECT_NEW_PARENT; 648 CurrentMode = EGUIEDM_SELECT_NEW_PARENT;
649 break; 649 break;
650 case EGUIEDMC_BRING_TO_FRONT: 650 case EGUIEDMC_BRING_TO_FRONT:
651 if (SelectedElement->getParent()) 651 if (SelectedElement->getParent())
652 SelectedElement->getParent()->bringToFront(SelectedElement); 652 SelectedElement->getParent()->bringToFront(SelectedElement);
653 break; 653 break;
654 654
655 case EGUIEDMC_SAVE_ELEMENT: 655 case EGUIEDMC_SAVE_ELEMENT:
656 //TODO: add 'save' dialog. 656 //TODO: add 'save' dialog.
657 Environment->saveGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() ); 657 Environment->saveGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() );
658 break; 658 break;
659 659
660 //! toggle edit window 660 //! toggle edit window
661 case EGUIEDMC_TOGGLE_EDITOR: 661 case EGUIEDMC_TOGGLE_EDITOR:
662 break; 662 break;
663 663
664 case EGUIEDMC_INSERT_XML: 664 case EGUIEDMC_INSERT_XML:
665 Environment->loadGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() ); 665 Environment->loadGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() );
666 break; 666 break;
667 667
668 default: 668 default:
669 // create element from factory? 669 // create element from factory?
670 if (cmdID >= EGUIEDMC_COUNT) 670 if (cmdID >= EGUIEDMC_COUNT)
671 { 671 {
672 672
673 s32 num = cmdID - EGUIEDMC_COUNT; // get index 673 s32 num = cmdID - EGUIEDMC_COUNT; // get index
674 // loop through all factories 674 // loop through all factories
675 s32 i, c=Environment->getRegisteredGUIElementFactoryCount(); 675 s32 i, c=Environment->getRegisteredGUIElementFactoryCount();
676 for (i=0; i<c && num > Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount(); ++i) 676 for (i=0; i<c && num > Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount(); ++i)
677 { 677 {
678 num -= Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount(); 678 num -= Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount();
679 } 679 }
680 if (num < Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount() ) 680 if (num < Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount() )
681 { 681 {
682 core::stringc name = Environment->getGUIElementFactory(i)->getCreateableGUIElementTypeName(num); 682 core::stringc name = Environment->getGUIElementFactory(i)->getCreateableGUIElementTypeName(num);
683 IGUIElement *parentElement = SelectedElement ? SelectedElement : Environment->getRootGUIElement(); 683 IGUIElement *parentElement = SelectedElement ? SelectedElement : Environment->getRootGUIElement();
684 // add it 684 // add it
685 IGUIElement *newElement = Environment->getGUIElementFactory(i)->addGUIElement(name.c_str(),parentElement); 685 IGUIElement *newElement = Environment->getGUIElementFactory(i)->addGUIElement(name.c_str(),parentElement);
686 if (newElement) 686 if (newElement)
687 { 687 {
688 core::position2di p = DragStart - parentElement->getAbsolutePosition().UpperLeftCorner; 688 core::position2di p = DragStart - parentElement->getAbsolutePosition().UpperLeftCorner;
689 newElement->setRelativePosition(core::rect<s32>(p,p+core::position2di(100,100))); 689 newElement->setRelativePosition(core::rect<s32>(p,p+core::position2di(100,100)));
690 //Environment->removeFocus(newElement); 690 //Environment->removeFocus(newElement);
691 } 691 }
692 } 692 }
693 } 693 }
694 break; 694 break;
695 } 695 }
696 EditorWindow->updateTree(); 696 EditorWindow->updateTree();
697 } 697 }
698 return true; 698 return true;
699 default: 699 default:
700 break; 700 break;
701 } 701 }
702 break; 702 break;
703 703
704 default: 704 default:
705 break; 705 break;
706 } 706 }
707 707
708 // even if we didn't absorb the event, 708 // even if we didn't absorb the event,
709 // we never pass events back to the GUI we're editing! 709 // we never pass events back to the GUI we're editing!
710 return false; 710 return false;
711} 711}
712 712
713 713
714//! draws the element and its children 714//! draws the element and its children
715void CGUIEditWorkspace::draw() 715void CGUIEditWorkspace::draw()
716{ 716{
717 video::IVideoDriver *driver = Environment->getVideoDriver(); 717 video::IVideoDriver *driver = Environment->getVideoDriver();
718 718
719 if (DrawGrid) 719 if (DrawGrid)
720 { 720 {
721 // draw the grid 721 // draw the grid
722 722
723 core::rect<s32> r = getAbsolutePosition(); 723 core::rect<s32> r = getAbsolutePosition();
724 724
725 s32 cy = r.UpperLeftCorner.Y; 725 s32 cy = r.UpperLeftCorner.Y;
726 while (cy < r.LowerRightCorner.Y) 726 while (cy < r.LowerRightCorner.Y)
727 { 727 {
728 s32 cx = r.UpperLeftCorner.X; 728 s32 cx = r.UpperLeftCorner.X;
729 while (cx < r.LowerRightCorner.X) 729 while (cx < r.LowerRightCorner.X)
730 { 730 {
731 driver->draw2DRectangle(video::SColor(40,0,0,90),core::rect<s32>(cx+1,cy+1,GridSize.Width+cx,GridSize.Height+cy)); 731 driver->draw2DRectangle(video::SColor(40,0,0,90),core::rect<s32>(cx+1,cy+1,GridSize.Width+cx,GridSize.Height+cy));
732 cx += GridSize.Width; 732 cx += GridSize.Width;
733 } 733 }
734 cy += GridSize.Height; 734 cy += GridSize.Height;
735 } 735 }
736 } 736 }
737 if (MouseOverElement && 737 if (MouseOverElement &&
738 MouseOverElement != SelectedElement && 738 MouseOverElement != SelectedElement &&
739 MouseOverElement != Parent) 739 MouseOverElement != Parent)
740 { 740 {
741 core::rect<s32> r = MouseOverElement->getAbsolutePosition(); 741 core::rect<s32> r = MouseOverElement->getAbsolutePosition();
742 driver->draw2DRectangle(video::SColor(100,0,0,255), r); 742 driver->draw2DRectangle(video::SColor(100,0,0,255), r);
743 } 743 }
744 if (SelectedElement && CurrentMode == EGUIEDM_SELECT) 744 if (SelectedElement && CurrentMode == EGUIEDM_SELECT)
745 { 745 {
746 driver->draw2DRectangle(video::SColor(100,0,255,0),SelectedElement->getAbsolutePosition()); 746 driver->draw2DRectangle(video::SColor(100,0,255,0),SelectedElement->getAbsolutePosition());
747 } 747 }
748 if (CurrentMode >= EGUIEDM_MOVE) 748 if (CurrentMode >= EGUIEDM_MOVE)
749 { 749 {
750 driver->draw2DRectangle(video::SColor(100,255,0,0),SelectedArea); 750 driver->draw2DRectangle(video::SColor(100,255,0,0),SelectedArea);
751 } 751 }
752 752
753 if ( (SelectedElement && CurrentMode >= EGUIEDM_MOVE) || 753 if ( (SelectedElement && CurrentMode >= EGUIEDM_MOVE) ||
754 (SelectedElement && MouseOverElement == SelectedElement && MouseOverMode >= EGUIEDM_MOVE) ) 754 (SelectedElement && MouseOverElement == SelectedElement && MouseOverMode >= EGUIEDM_MOVE) )
755 { 755 {
756 // draw handles for moving 756 // draw handles for moving
757 EGUIEDIT_MODE m = CurrentMode; 757 EGUIEDIT_MODE m = CurrentMode;
758 core::rect<s32> r = SelectedArea; 758 core::rect<s32> r = SelectedArea;
759 if (m < EGUIEDM_MOVE) 759 if (m < EGUIEDM_MOVE)
760 { 760 {
761 m = MouseOverMode; 761 m = MouseOverMode;
762 r = SelectedElement->getAbsolutePosition(); 762 r = SelectedElement->getAbsolutePosition();
763 } 763 }
764 764
765 core::position2di d = core::position2di(4,4); 765 core::position2di d = core::position2di(4,4);
766 766
767 TLRect = core::rect<s32>(r.UpperLeftCorner, r.UpperLeftCorner + d ); 767 TLRect = core::rect<s32>(r.UpperLeftCorner, r.UpperLeftCorner + d );
768 TRRect = core::rect<s32>(r.LowerRightCorner.X-4, r.UpperLeftCorner.Y, r.LowerRightCorner.X, r.UpperLeftCorner.Y+4); 768 TRRect = core::rect<s32>(r.LowerRightCorner.X-4, r.UpperLeftCorner.Y, r.LowerRightCorner.X, r.UpperLeftCorner.Y+4);
769 TopRect = core::rect<s32>(r.getCenter().X-2, r.UpperLeftCorner.Y,r.getCenter().X+2, r.UpperLeftCorner.Y+4 ); 769 TopRect = core::rect<s32>(r.getCenter().X-2, r.UpperLeftCorner.Y,r.getCenter().X+2, r.UpperLeftCorner.Y+4 );
770 BLRect = core::rect<s32>(r.UpperLeftCorner.X, r.LowerRightCorner.Y-4, r.UpperLeftCorner.X+4, r.LowerRightCorner.Y); 770 BLRect = core::rect<s32>(r.UpperLeftCorner.X, r.LowerRightCorner.Y-4, r.UpperLeftCorner.X+4, r.LowerRightCorner.Y);
771 LRect = core::rect<s32>(r.UpperLeftCorner.X,r.getCenter().Y-2, r.UpperLeftCorner.X+4, r.getCenter().Y+2 ); 771 LRect = core::rect<s32>(r.UpperLeftCorner.X,r.getCenter().Y-2, r.UpperLeftCorner.X+4, r.getCenter().Y+2 );
772 RRect = core::rect<s32>(r.LowerRightCorner.X-4,r.getCenter().Y-2, r.LowerRightCorner.X, r.getCenter().Y+2 ); 772 RRect = core::rect<s32>(r.LowerRightCorner.X-4,r.getCenter().Y-2, r.LowerRightCorner.X, r.getCenter().Y+2 );
773 BRRect = core::rect<s32>(r.LowerRightCorner-d, r.LowerRightCorner); 773 BRRect = core::rect<s32>(r.LowerRightCorner-d, r.LowerRightCorner);
774 BRect = core::rect<s32>(r.getCenter().X-2, r.LowerRightCorner.Y-4,r.getCenter().X+2, r.LowerRightCorner.Y ); 774 BRect = core::rect<s32>(r.getCenter().X-2, r.LowerRightCorner.Y-4,r.getCenter().X+2, r.LowerRightCorner.Y );
775 775
776 // top left 776 // top left
777 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_TL || m == EGUIEDM_MOVE ) 777 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_TL || m == EGUIEDM_MOVE )
778 driver->draw2DRectangle(video::SColor(100,255,255,255), TLRect); 778 driver->draw2DRectangle(video::SColor(100,255,255,255), TLRect);
779 779
780 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_TR || m == EGUIEDM_MOVE ) 780 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_TR || m == EGUIEDM_MOVE )
781 driver->draw2DRectangle(video::SColor(100,255,255,255), TRRect); 781 driver->draw2DRectangle(video::SColor(100,255,255,255), TRRect);
782 782
783 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_MOVE ) 783 if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_MOVE )
784 driver->draw2DRectangle(video::SColor(100,255,255,255), TopRect); 784 driver->draw2DRectangle(video::SColor(100,255,255,255), TopRect);
785 785
786 if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_BL || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE ) 786 if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_BL || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
787 driver->draw2DRectangle(video::SColor(100,255,255,255), BLRect); 787 driver->draw2DRectangle(video::SColor(100,255,255,255), BLRect);
788 788
789 if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_MOVE ) 789 if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_MOVE )
790 driver->draw2DRectangle(video::SColor(100,255,255,255), LRect); 790 driver->draw2DRectangle(video::SColor(100,255,255,255), LRect);
791 791
792 if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_MOVE ) 792 if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_MOVE )
793 driver->draw2DRectangle(video::SColor(100,255,255,255), RRect); 793 driver->draw2DRectangle(video::SColor(100,255,255,255), RRect);
794 794
795 if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_BR || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE ) 795 if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_BR || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
796 driver->draw2DRectangle(video::SColor(100,255,255,255), BRRect ); 796 driver->draw2DRectangle(video::SColor(100,255,255,255), BRRect );
797 797
798 if (m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE ) 798 if (m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
799 driver->draw2DRectangle(video::SColor(100,255,255,255), BRect); 799 driver->draw2DRectangle(video::SColor(100,255,255,255), BRect);
800 800
801 801
802 } 802 }
803 803
804 IGUIElement::draw(); 804 IGUIElement::draw();
805} 805}
806 806
807 807
808void CGUIEditWorkspace::setDrawGrid(bool drawGrid) 808void CGUIEditWorkspace::setDrawGrid(bool drawGrid)
809{ 809{
810 DrawGrid = drawGrid; 810 DrawGrid = drawGrid;
811} 811}
812 812
813void CGUIEditWorkspace::setGridSize(const core::dimension2di& gridSize) 813void CGUIEditWorkspace::setGridSize(const core::dimension2di& gridSize)
814{ 814{
815 GridSize = gridSize; 815 GridSize = gridSize;
816 if (GridSize.Width < 2) 816 if (GridSize.Width < 2)
817 GridSize.Width = 2; 817 GridSize.Width = 2;
818 if (GridSize.Height < 2) 818 if (GridSize.Height < 2)
819 GridSize.Height = 2; 819 GridSize.Height = 2;
820} 820}
821 821
822void CGUIEditWorkspace::setUseGrid(bool useGrid) 822void CGUIEditWorkspace::setUseGrid(bool useGrid)
823{ 823{
824 UseGrid = useGrid; 824 UseGrid = useGrid;
825} 825}
826 826
827 827
828//! Removes a child. 828//! Removes a child.
829void CGUIEditWorkspace::removeChild(IGUIElement* child) 829void CGUIEditWorkspace::removeChild(IGUIElement* child)
830{ 830{
831 IGUIElement::removeChild(child); 831 IGUIElement::removeChild(child);
832 832
833 if (Children.empty()) 833 if (Children.empty())
834 remove(); 834 remove();
835} 835}
836 836
837 837
838void CGUIEditWorkspace::updateAbsolutePosition() 838void CGUIEditWorkspace::updateAbsolutePosition()
839{ 839{
840 core::rect<s32> parentRect(0,0,0,0); 840 core::rect<s32> parentRect(0,0,0,0);
841 841
842 if (Parent) 842 if (Parent)
843 { 843 {
844 parentRect = Parent->getAbsolutePosition(); 844 parentRect = Parent->getAbsolutePosition();
845 RelativeRect.UpperLeftCorner.X = 0; 845 RelativeRect.UpperLeftCorner.X = 0;
846 RelativeRect.UpperLeftCorner.Y = 0; 846 RelativeRect.UpperLeftCorner.Y = 0;
847 RelativeRect.LowerRightCorner.X = parentRect.getWidth(); 847 RelativeRect.LowerRightCorner.X = parentRect.getWidth();
848 RelativeRect.LowerRightCorner.Y = parentRect.getHeight(); 848 RelativeRect.LowerRightCorner.Y = parentRect.getHeight();
849 } 849 }
850 850
851 IGUIElement::updateAbsolutePosition(); 851 IGUIElement::updateAbsolutePosition();
852} 852}
853 853
854void CGUIEditWorkspace::CopySelectedElementXML() 854void CGUIEditWorkspace::CopySelectedElementXML()
855{ 855{
856 core::stringc XMLText; 856 core::stringc XMLText;
857 core::stringw wXMLText; 857 core::stringw wXMLText;
858 // create memory write file 858 // create memory write file
859 io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#"); 859 io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#");
860 // save gui to mem file 860 // save gui to mem file
861 io::IXMLWriter* xml = Environment->getFileSystem()->createXMLWriter(memWrite); 861 io::IXMLWriter* xml = Environment->getFileSystem()->createXMLWriter(memWrite);
862 Environment->writeGUIElement(xml, SelectedElement); 862 Environment->writeGUIElement(xml, SelectedElement);
863 863
864 // copy to clipboard- wide chars not supported yet :( 864 // copy to clipboard- wide chars not supported yet :(
865 wXMLText = (wchar_t*)&memWrite->getData()[0]; 865 wXMLText = (wchar_t*)&memWrite->getData()[0];
866 u32 i = memWrite->getData().size()/sizeof(wchar_t); 866 u32 i = memWrite->getData().size()/sizeof(wchar_t);
867 if (wXMLText.size() > i) 867 if (wXMLText.size() > i)
868 wXMLText[i] = L'\0'; 868 wXMLText[i] = L'\0';
869 XMLText = wXMLText.c_str(); 869 XMLText = wXMLText.c_str();
870 memWrite->drop(); 870 memWrite->drop();
871 xml->drop(); 871 xml->drop();
872 Environment->getOSOperator()->copyToClipboard(XMLText.c_str()); 872 Environment->getOSOperator()->copyToClipboard(XMLText.c_str());
873} 873}
874 874
875void CGUIEditWorkspace::PasteXMLToSelectedElement() 875void CGUIEditWorkspace::PasteXMLToSelectedElement()
876{ 876{
877 // get clipboard data 877 // get clipboard data
878 core::stringc XMLText = Environment->getOSOperator()->getTextFromClipboard(); 878 core::stringc XMLText = Environment->getOSOperator()->getTextFromClipboard();
879 // convert to stringw 879 // convert to stringw
880 core::stringw wXMLText = XMLText.c_str(); 880 core::stringw wXMLText = XMLText.c_str();
881 881
882 io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#"); 882 io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#");
883 883
884 io::IXMLWriter* xmlw = Environment->getFileSystem()->createXMLWriter(memWrite); 884 io::IXMLWriter* xmlw = Environment->getFileSystem()->createXMLWriter(memWrite);
885 xmlw->writeXMLHeader(); // it needs one of those 885 xmlw->writeXMLHeader(); // it needs one of those
886 xmlw->drop(); 886 xmlw->drop();
887 887
888 // write clipboard data 888 // write clipboard data
889 memWrite->write((void*)&wXMLText[0], wXMLText.size() * sizeof(wchar_t)); 889 memWrite->write((void*)&wXMLText[0], wXMLText.size() * sizeof(wchar_t));
890 890
891 // rewind file 891 // rewind file
892 memWrite->seek(0, false); 892 memWrite->seek(0, false);
893 893
894 // read xml 894 // read xml
895 Environment->loadGUI(memWrite, SelectedElement); 895 Environment->loadGUI(memWrite, SelectedElement);
896 896
897 // reset focus 897 // reset focus
898 Environment->setFocus(this); 898 Environment->setFocus(this);
899 899
900 // drop the read file 900 // drop the read file
901 memWrite->drop(); 901 memWrite->drop();
902} 902}
903 903
904void CGUIEditWorkspace::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) 904void CGUIEditWorkspace::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options)
905{ 905{
906 out->addBool("DrawGrid", DrawGrid); 906 out->addBool("DrawGrid", DrawGrid);
907 out->addBool("UseGrid", UseGrid); 907 out->addBool("UseGrid", UseGrid);
908 out->addPosition2d("GridSize", core::position2di(GridSize.Width, GridSize.Height)); 908 out->addPosition2d("GridSize", core::position2di(GridSize.Width, GridSize.Height));
909 out->addInt("MenuCommandStart", MenuCommandStart); 909 out->addInt("MenuCommandStart", MenuCommandStart);
910} 910}
911 911
912void CGUIEditWorkspace::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) 912void CGUIEditWorkspace::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options)
913{ 913{
914 setDrawGrid(in->getAttributeAsBool("DrawGrid")); 914 setDrawGrid(in->getAttributeAsBool("DrawGrid"));
915 setUseGrid(in->getAttributeAsBool("UseGrid")); 915 setUseGrid(in->getAttributeAsBool("UseGrid"));
916 916
917 core::position2di tmpp = in->getAttributeAsPosition2d("GridSize"); 917 core::position2di tmpp = in->getAttributeAsPosition2d("GridSize");
918 core::dimension2di tmpd(tmpp.X, tmpp.Y); 918 core::dimension2di tmpd(tmpp.X, tmpp.Y);
919 setGridSize(tmpd); 919 setGridSize(tmpd);
920 setMenuCommandIDStart(in->getAttributeAsInt("MenuCommandStart")); 920 setMenuCommandIDStart(in->getAttributeAsInt("MenuCommandStart"));
921} 921}
922 922
923 923
924} // end namespace gui 924} // end namespace gui
925} // end namespace irr 925} // end namespace irr
926 926
927 927