TDME2  1.9.200
EditorView.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <string>
5 #include <vector>
6 
7 #include <tdme/tdme.h>
8 #include <tdme/audio/Audio.h>
9 #include <tdme/engine/Engine.h>
14 #include <tdme/gui/nodes/GUINode.h>
16 #include <tdme/gui/GUI.h>
17 #include <tdme/math/Vector3.h>
38 #include <tdme/utilities/Console.h>
41 
42 using std::make_unique;
43 using std::string;
44 using std::vector;
45 using std::unique_ptr;
46 
47 using tdme::audio::Audio;
55 using tdme::gui::GUI;
82 
83 EditorView::EditorView(PopUps* popUps)
84 {
85  this->popUps = popUps;
86  engine = Engine::getInstance();
87 }
88 
90 }
91 
93 {
94  return popUps;
95 }
96 
98 {
99  for (auto& event: Engine::getInstance()->getGUI()->getKeyboardEvents()) {
100  // skip if already processed
101  if (event.isProcessed() == true) return;
102 
103  // determine redo and undo
104  if (Character::toLowerCase(event.getKeyChar()) == 'z' && event.isControlDown() == true && event.isShiftDown() == true) {
105  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
106  auto selectedTab = editorScreenController->getSelectedTab();
107  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_REDO);
108  }
109  event.setProcessed(true);
110  } else
111  if (Character::toLowerCase(event.getKeyChar()) == 'z' && event.isControlDown() == true) {
112  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
113  auto selectedTab = editorScreenController->getSelectedTab();
114  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_UNDO);
115  }
116  event.setProcessed(true);
117  } else
118  // determine select all, copy, paste, cut
119  if (Character::toLowerCase(event.getKeyChar()) == 'a' && event.isControlDown() == true) {
120  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
121  auto selectedTab = editorScreenController->getSelectedTab();
122  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_SELECTALL);
123  }
124  event.setProcessed(true);
125  } else
126  if (Character::toLowerCase(event.getKeyChar()) == 'x' && event.isControlDown() == true) {
127  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
128  auto selectedTab = editorScreenController->getSelectedTab();
129  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_CUT);
130  }
131  event.setProcessed(true);
132  } else
133  if (Character::toLowerCase(event.getKeyChar()) == 'c' && event.isControlDown() == true) {
134  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
135  auto selectedTab = editorScreenController->getSelectedTab();
136  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_COPY);
137  }
138  event.setProcessed(true);
139  } else
140  if (Character::toLowerCase(event.getKeyChar()) == 'v' && event.isControlDown() == true) {
141  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
142  auto selectedTab = editorScreenController->getSelectedTab();
143  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_PASTE);
144  }
145  event.setProcessed(true);
146  } else
147  if (Character::toLowerCase(event.getKeyChar()) == 'f' && event.isControlDown() == true) {
148  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
149  auto selectedTab = editorScreenController->getSelectedTab();
150  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_FINDREPLACE);
151  }
152  event.setProcessed(true);
153  } else
154  if (Character::toLowerCase(event.getKeyChar()) == 's' && event.isControlDown() == true) {
155  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
156  auto selectedTab = editorScreenController->getSelectedTab();
157  if (selectedTab != nullptr) selectedTab->getTabView()->getTabController()->onCommand(TabController::COMMAND_SAVE);
158  }
159  event.setProcessed(true);
160  } else
161  if (Character::toLowerCase(event.getKeyChar()) == 'w' && event.isControlDown() == true) {
162  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
163  auto selectedTab = editorScreenController->getSelectedTab();
164  if (selectedTab != nullptr) editorScreenController->closeTab(selectedTab->getId());
165  }
166  event.setProcessed(true);
167  } else
168  if (event.getKeyChar() >= '0' && event.getKeyChar() <= '9' && event.isControlDown() == true) {
169  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
170  if (event.getKeyChar() == '0') {
171  editorScreenController->selectTabAt(10);
172  } else {
173  editorScreenController->selectTabAt(event.getKeyChar() - '1');
174  }
175  }
176  event.setProcessed(true);
177  } else {
178  //
179  switch (event.getKeyCode()) {
180  case GUIKeyboardEvent::KEYCODE_PAGE_UP:
181  if (event.isControlDown() == true) {
182  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
183  if (editorScreenController->getTabCount() > 0) {
184  auto selectedTabIdx = editorScreenController->getSelectedTabIdx() - 1;
185  if (selectedTabIdx == -1) selectedTabIdx = editorScreenController->getTabCount() - 1;
186  editorScreenController->selectTabAt(selectedTabIdx);
187  }
188  }
189  event.setProcessed(true);
190  }
191  break;
192  case GUIKeyboardEvent::KEYCODE_PAGE_DOWN:
193  if (event.isControlDown() == true) {
194  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
195  if (editorScreenController->getTabCount() > 0) {
196  auto selectedTabIdx = editorScreenController->getSelectedTabIdx() + 1;
197  if (selectedTabIdx == editorScreenController->getTabCount()) selectedTabIdx = 0;
198  editorScreenController->selectTabAt(selectedTabIdx);
199  }
200  }
201  event.setProcessed(true);
202  }
203  break;
204  case GUIKeyboardEvent::KEYCODE_F4:
205  if (event.isControlDown() == true) {
206  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
207  auto selectedTab = editorScreenController->getSelectedTab();
208  if (selectedTab != nullptr) editorScreenController->closeTab(selectedTab->getId());
209  }
210  event.setProcessed(true);
211  }
212  break;
213  case GUIKeyboardEvent::KEYCODE_F11:
214  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
215  editorScreenController->setFullScreen(editorScreenController->isFullScreen() == false?true:false);
216  }
217  event.setProcessed(true);
218  break;
219  case GUIKeyboardEvent::KEYCODE_F12:
220  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
221  try {
222  if (FileSystem::getStandardFileSystem()->exists("./screenshots") == false) FileSystem::getStandardFileSystem()->createPath("./screenshots");
223  Engine::getInstance()->makeScreenshot("./screenshots", "TDME2-Screenshot-" + StringTools::replace(Time::getAsString(), ':', '-') + ".png");
224  } catch (Exception& exception) {
225  Console::println("EditorView::handleInputEvents(): Could not create screenshot: " + string(exception.what()));
226  }
227  }
228  event.setProcessed(true);
229  break;
230  default: break;
231  }
232  }
233  }
234 
235  //
236  auto tabView = editorScreenController->getSelectedTab();
237  if (tabView != nullptr) {
238  // deactivate old tab/activate new tab
239  if (tabView->getId() != lastSelectedTabId) {
240  auto lastTabView = lastSelectedTabId.empty() == true?nullptr:editorScreenController->getTab(lastSelectedTabId);
241  if (lastTabView != nullptr) lastTabView->getTabView()->deactivate();
242  tabView->getTabView()->activate();
243  editorScreenController->getScreenNode()->invalidateLayout(editorScreenController->getScreenNode()->getNodeById(tabView->getFrameBufferNode()->getId()));
244  }
245  if (tabView->getTabView()->getEngine() != nullptr) {
246  // get viewport position, dimension
247  auto xScale = static_cast<float>(engine->getWidth()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenWidth());
248  auto yScale = static_cast<float>(engine->getHeight()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenHeight());
249  int left, top, width, height, offsetX, offsetY;
250  getViewPort(tabView->getFrameBufferNode(), left, top, width, height, offsetX, offsetY);
251  // forward mouse events if belonging to view
252  for (auto event: Engine::getInstance()->getGUI()->getMouseEvents()) {
253  // event position in our tab
254  auto eventX = (event.getXUnscaled() - left) / xScale + offsetX;
255  auto eventY = (event.getYUnscaled() - top) / yScale + offsetY;
256  // out of tab bounds?
257  if (eventX < 0 || eventX >= width || eventY < 0 || eventY >= height) {
258  switch (event.getType()) {
259  case GUIMouseEvent::MOUSEEVENT_RELEASED:
260  case GUIMouseEvent::MOUSEEVENT_DRAGGED:
261  // if no mouse down is registered on button do not forward the event to the tab
262  if (mouseButtonsDown[event.getButton() - 1] == false) {
263  continue;
264  }
265  break;
266  default:
267  break;
268  }
269  }
270  // track mouse buttons down states
271  switch (event.getType()) {
272  case GUIMouseEvent::MOUSEEVENT_PRESSED:
273  mouseButtonsDown[event.getButton() - 1] = true;
274  break;
275  case GUIMouseEvent::MOUSEEVENT_RELEASED:
276  mouseButtonsDown[event.getButton() - 1] = false;
277  break;
278  default:
279  break;
280  }
281  // pass the event on to tab
282  event.setX(eventX);
283  event.setY(eventY);
284  event.setXUnscaled(eventX);
285  event.setYUnscaled(eventY);
286  tabView->getTabView()->getEngine()->getGUI()->getMouseEvents().push_back(event);
287  }
288  // just forward keyboard events
289  for (auto& event: Engine::getInstance()->getGUI()->getKeyboardEvents()) {
290  tabView->getTabView()->getEngine()->getGUI()->getKeyboardEvents().push_back(event);
291  }
292  // handle events
293  tabView->getTabView()->handleInputEvents();
294  //
295  for (auto i = 0; i < Engine::getInstance()->getGUI()->getKeyboardEvents().size(); i++) {
296  auto& srcEvent = Engine::getInstance()->getGUI()->getKeyboardEvents()[i];
297  const auto& dstEvent = tabView->getTabView()->getEngine()->getGUI()->getKeyboardEvents()[i];
298  if (dstEvent.isProcessed() == true) srcEvent.setProcessed(true);
299  }
300  // clear
301  tabView->getTabView()->getEngine()->getGUI()->getMouseEvents().clear();
302  tabView->getTabView()->getEngine()->getGUI()->getKeyboardEvents().clear();
303  }
304  // last tab
305  lastSelectedTabId = tabView->getId();
306  } else {
307  // no current tab, just deactivate last one
308  auto lastTabView = editorScreenController->getTab(lastSelectedTabId);
309  if (lastTabView != nullptr) lastTabView->getTabView()->deactivate();
310  lastSelectedTabId.clear();
311  }
312 }
313 
315 {
316  auto tabView = editorScreenController->getSelectedTab();
317  if (tabView != nullptr) {
318  auto xScale = static_cast<float>(engine->getWidth()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenWidth());
319  auto yScale = static_cast<float>(engine->getHeight()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenHeight());
320  int left, top, width, height, offsetX, offsetY;
321  getViewPort(tabView->getFrameBufferNode()->getParentNode(), left, top, width, height, offsetX, offsetY);
322  width/= xScale;
323  height/= yScale;
324  auto reshaped = false;
325  if (tabView->getTabView()->hasFixedSize() == false &&
326  tabView->getTabView()->getEngine() != nullptr &&
327  (tabView->getTabView()->getEngine()->getWidth() != width || tabView->getTabView()->getEngine()->getHeight() != height)) {
328  tabView->getTabView()->getEngine()->reshape(width, height);
329  reshaped = true;
330  }
331  if (tabView->getTabView()->getEngine() != nullptr) {
332  tabView->getFrameBufferNode()->setFrameBuffer(tabView->getTabView()->getEngine()->getFrameBuffer());
333  }
334  tabView->getTabView()->display();
335  if (reshaped == true) {
336  editorScreenController->getScreenNode()->invalidateLayout(editorScreenController->getScreenNode()->getNodeById(tabView->getFrameBufferNode()->getId()));
337  }
338  }
339  //
340  Audio::getInstance()->update();
341 }
342 
344 {
345 }
346 
348 {
349  try {
350  editorScreenController = make_unique<EditorScreenController>(this);
351  editorScreenController->initialize();
352  engine->getGUI()->addScreen(editorScreenController->getScreenNode()->getId(), editorScreenController->getScreenNode());
353  editorScreenController->getScreenNode()->setInputEventHandler(this);
354  } catch (Exception& exception) {
355  Console::println("EditorView::initialize(): An error occurred: " + string(exception.what()));
356  }
358 }
359 
361 {
362  engine->reset();
365  engine->getGUI()->addRenderScreen(editorScreenController->getScreenNode()->getId());
378 }
379 
381 {
382 }
383 
385 {
386  editorScreenController->dispose();
387  Engine::getInstance()->reset();
388 }
389 
391 {
392  //
393  editorScreenController->tick();
394 }
395 
396 void EditorView::setOutlinerContent(const string& xml) {
397  editorScreenController->setOutlinerContent(xml);
398 }
399 
401  editorScreenController->setOutlinerAddDropDownContent(xml);
402 }
403 
404 void EditorView::setDetailsContent(const string& xml) {
405  editorScreenController->setDetailsContent(xml);
406 }
407 
408 void EditorView::reloadTabOutliner(const string& newSelectionValue) {
409  auto tabView = editorScreenController->getSelectedTab();
410  if (tabView != nullptr) {
411  TabView::OutlinerState outlinerState;
412  editorScreenController->storeOutlinerState(outlinerState);
413  tabView->getTabView()->reloadOutliner();
414  if (newSelectionValue.empty() == false) outlinerState.value = newSelectionValue;
415  editorScreenController->restoreOutlinerState(outlinerState);
416  }
417  editorScreenController->getScreenNode()->forwardChange(required_dynamic_cast<GUIElementNode*>(editorScreenController->getScreenNode()->getNodeById("selectbox_outliner")));
418 }
419 
420 bool EditorView::getCurrentTabViewPort(int& left, int& top, int& width, int& height, int& offsetX, int& offsetY) {
421  auto currentTab = editorScreenController->getSelectedTab();
422  if (currentTab == nullptr) return false;
423  getViewPort(currentTab->getFrameBufferNode(), left, top, width, height, offsetX, offsetY);
424  return true;
425 }
426 
427 void EditorView::getViewPort(GUINode* viewPortNode, int& left, int& top, int& width, int& height, int& offsetX, int& offsetY) {
428  auto xScale = static_cast<float>(engine->getWidth()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenWidth());
429  auto yScale = static_cast<float>(engine->getHeight()) / static_cast<float>(editorScreenController->getScreenNode()->getScreenHeight());
430  editorScreenController->getViewPort(viewPortNode, left, top, width, height);
431  left = static_cast<int>(static_cast<float>(left) * xScale);
432  top = static_cast<int>(static_cast<float>(top) * yScale);
433  width = static_cast<int>(static_cast<float>(width) * xScale);
434  height = static_cast<int>(static_cast<float>(height) * yScale);
435  offsetX = viewPortNode->computeParentChildrenRenderOffsetXTotal();
436  offsetY = viewPortNode->computeParentChildrenRenderOffsetYTotal();
437 }
438 
439 bool EditorView::getCurrentTabTooltipPosition(GUIScreenNode* screenNode, int mouseX, int mouseY, int& tooltipLeft, int& tooltipTop) {
440  int left, top, width, height, offsetX, offsetY;
441  if (getCurrentTabViewPort(left, top, width, height, offsetX, offsetY) == false) return false;
442  //
443  auto xScale = static_cast<float>(Engine::getInstance()->getWidth()) / static_cast<float>(screenNode->getScreenWidth());
444  auto yScale = static_cast<float>(Engine::getInstance()->getHeight()) / static_cast<float>(screenNode->getScreenHeight());
445  //
446  tooltipLeft = left + mouseX * xScale - offsetX * xScale;
447  tooltipTop = top + mouseY * yScale - offsetY * yScale;
448  //
449  return true;
450 }
451 
452 void EditorView::onDrop(const vector<string>& paths) {
453  editorScreenController->onDrop(paths);
454 }
Interface to audio module.
Definition: Audio.h:29
Engine main class.
Definition: Engine.h:131
int32_t getWidth()
Definition: Engine.h:1029
void setPartition(Partition *partition)
Set partition.
Definition: Engine.cpp:352
int32_t getHeight()
Definition: Engine.h:1036
void reset()
Removes all entities and caches.
Definition: Engine.cpp:716
Frame buffer class.
Definition: FrameBuffer.h:22
Bogus/Simple partition implementation.
GUI module class.
Definition: GUI.h:64
void addRenderScreen(const string &screenId, int screenIdx=-1)
Add render screen.
Definition: GUI.cpp:155
void addScreen(const string &id, GUIScreenNode *screen)
Add screen.
Definition: GUI.cpp:98
void resetRenderScreens()
Reset render screens.
Definition: GUI.cpp:136
GUI node base class.
Definition: GUINode.h:64
float computeParentChildrenRenderOffsetXTotal()
Definition: GUINode.cpp:952
float computeParentChildrenRenderOffsetYTotal()
Definition: GUINode.cpp:962
const string & getId()
Definition: GUINode.h:339
GUI screen node that represents a screen that can be rendered via GUI system.
Definition: GUIScreenNode.h:72
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
File system singleton class.
Definition: FileSystem.h:17
Pop ups controller accessor class.
Definition: PopUps.h:29
DraggingScreenController * getDraggingScreenController()
Definition: PopUps.h:138
AboutDialogScreenController * getAboutDialogScreenController()
Definition: PopUps.h:103
SelectorDialogScreenController * getSelectorDialogScreenController()
Definition: PopUps.h:124
ImportDialogScreenController * getImportDialogScreenController()
Definition: PopUps.h:117
InputDialogScreenController * getInputDialogScreenController()
Definition: PopUps.h:68
FindReplaceDialogScreenController * getFindReplaceDialogScreenController()
Definition: PopUps.h:110
ColorPickerScreenController * getColorPickerScreenController()
Definition: PopUps.h:89
FileDialogScreenController * getFileDialogScreenController()
Definition: PopUps.h:61
TooltipScreenController * getTooltipScreenController()
Definition: PopUps.h:131
ProgressBarScreenController * getProgressBarScreenController()
Definition: PopUps.h:82
ContextMenuScreenController * getContextMenuScreenController()
Definition: PopUps.h:96
InfoDialogScreenController * getInfoDialogScreenController()
Definition: PopUps.h:75
void getViewPort(GUINode *viewPortNode, int &left, int &top, int &width, int &height, int &offsetX, int &offsetY)
Determine viewport screen constraints.
Definition: EditorView.cpp:427
void dispose() override
Disposes the view.
Definition: EditorView.cpp:384
void display() override
Renders the view.
Definition: EditorView.cpp:314
void setOutlinerAddDropDownContent(const string &xml)
Set outliner add drop down content.
Definition: EditorView.cpp:400
void setOutlinerContent(const string &xml)
Set outliner content.
Definition: EditorView.cpp:396
void updateGUIElements()
Init GUI elements.
Definition: EditorView.cpp:343
void initialize() override
Initiates the view.
Definition: EditorView.cpp:347
void deactivate() override
Deactivate view.
Definition: EditorView.cpp:380
void handleInputEvents() override
Handle input events that have not yet been processed.
Definition: EditorView.cpp:97
bool getCurrentTabViewPort(int &left, int &top, int &width, int &height, int &offsetX, int &offsetY)
Determine current tab viewport screen constraints.
Definition: EditorView.cpp:420
void setDetailsContent(const string &xml)
Set details content.
Definition: EditorView.cpp:404
void activate() override
Activate view.
Definition: EditorView.cpp:360
bool getCurrentTabTooltipPosition(GUIScreenNode *screenNode, int mouseX, int mouseY, int &tooltipLeft, int &tooltipTop)
Determine current tab tooltip position.
Definition: EditorView.cpp:439
unique_ptr< EditorScreenController > editorScreenController
Definition: EditorView.h:42
void reloadTabOutliner(const string &newSelectionValue=string())
Reload tab outliner.
Definition: EditorView.cpp:408
void onDrop(const vector< string > &paths)
On drop.
Definition: EditorView.cpp:452
Character class.
Definition: Character.h:17
Console class.
Definition: Console.h:29
String tools class.
Definition: StringTools.h:22
std::exception Exception
Exception base class.
Definition: Exception.h:18