PageRenderTime 61ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/IDE/Contents/Source/PolycodeFrame.cpp

http://github.com/ivansafrin/Polycode
C++ | 1842 lines | 1417 code | 362 blank | 63 comment | 327 complexity | 2059f95975a7851349393043b1e783f5 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. Copyright (C) 2012 by Ivan Safrin
  3. Permission is hereby granted, free of charge, to any person obtaining a copy
  4. of this software and associated documentation files (the "Software"), to deal
  5. in the Software without restriction, including without limitation the rights
  6. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in
  10. all copies or substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  17. THE SOFTWARE.
  18. */
  19. #include "PolycodeFrame.h"
  20. UIColorPicker *globalColorPicker;
  21. PolycodeFrame *globalFrame;
  22. extern UIGlobalMenu *globalMenu;
  23. EditorHolder *activeEditorHolder = NULL;
  24. extern PolycodeEditorManager *globalEditorManager;
  25. EditPoint::EditPoint(BezierPoint *point, unsigned int type) : Entity() {
  26. this->point = point;
  27. this->type = type;
  28. processInputEvents = true;
  29. draggingPoint = NULL;
  30. dragging = false;
  31. controlHandle1 = new UIRect(5, 5);
  32. controlHandle1->setColor(0.0, 1.0, 0.3, 1.0);
  33. controlHandle1->setAnchorPoint(0.0, 0.0, 0.0);
  34. controlHandle1->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  35. controlHandle1->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  36. controlHandle1->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
  37. controlHandle1->processInputEvents = true;
  38. controlHandle1->setWidth(30);
  39. controlHandle1->setHeight(30);
  40. addChild(controlHandle1);
  41. controlHandle2 = new UIRect(5, 5);
  42. controlHandle2->setColor(0.0, 1.0, 0.3, 1.0);
  43. controlHandle2->setAnchorPoint(0.0, 0.0, 0.0);
  44. controlHandle2->processInputEvents = true;
  45. controlHandle2->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  46. controlHandle2->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  47. controlHandle2->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
  48. controlHandle2->setWidth(30);
  49. controlHandle2->setHeight(30);
  50. addChild(controlHandle2);
  51. pointHandle = new UIRect(8, 8);
  52. pointHandle->setColor(1.0, 0.5, 0.2, 1.0);
  53. pointHandle->processInputEvents = true;
  54. pointHandle->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  55. pointHandle->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  56. pointHandle->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
  57. pointHandle->setAnchorPoint(0.0, 0.0, 0.0);
  58. pointHandle->setWidth(30);
  59. pointHandle->setHeight(30);
  60. if(type == TYPE_START_POINT) {
  61. controlHandle1->visible = false;
  62. controlHandle1->enabled = false;
  63. connectorLine1 = NULL;
  64. } else {
  65. connectorLine1 = new SceneLine(pointHandle, controlHandle1);
  66. addChild(connectorLine1);
  67. connectorLine1->setColorInt(39, 212, 255, 100);
  68. connectorLine1->setLineWidth(2.0);
  69. connectorLine1->lineSmooth = true;
  70. }
  71. if(type == TYPE_END_POINT) {
  72. controlHandle2->visible = false;
  73. controlHandle2->enabled = false;
  74. connectorLine2 = NULL;
  75. } else {
  76. connectorLine2 = new SceneLine(pointHandle, controlHandle2);
  77. addChild(connectorLine2);
  78. connectorLine2->setColorInt(39, 212, 255, 100);
  79. connectorLine2->setLineWidth(2.0);
  80. connectorLine2->lineSmooth = true;
  81. }
  82. CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
  83. addChild(pointHandle);
  84. updatePosition();
  85. }
  86. void EditPoint::setMode(unsigned int mode) {
  87. this->mode = mode;
  88. }
  89. void EditPoint::updateCurvePoint() {
  90. point->p1.x = controlHandle1->getPosition2D().x/300;
  91. point->p1.y = controlHandle1->getPosition2D().y/-100;
  92. point->p2.x = pointHandle->getPosition2D().x/300;
  93. point->p2.y = pointHandle->getPosition2D().y/-100;
  94. point->p3.x = controlHandle2->getPosition2D().x/300;
  95. point->p3.y = controlHandle2->getPosition2D().y/-100;
  96. }
  97. void EditPoint::handleEvent(Event *event) {
  98. if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
  99. switch(event->getEventCode()) {
  100. case InputEvent::EVENT_MOUSEMOVE:
  101. if(dragging) {
  102. if(draggingPoint) {
  103. Vector2 newPosition = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
  104. Vector2 translateAmt = Vector2(basePosition.x - newPosition.x, basePosition.y - newPosition.y);
  105. if(type != TYPE_POINT && draggingPoint == pointHandle) {
  106. // don't let drag start and end control points
  107. translateAmt.x = 0.0;
  108. }
  109. draggingPoint->setPosition(basePointPosition.x - translateAmt.x, basePointPosition.y - translateAmt.y);
  110. if(draggingPoint == pointHandle) {
  111. controlHandle1->setPosition(baseControl1.x - translateAmt.x, baseControl1.y - translateAmt.y);
  112. controlHandle2->setPosition(baseControl2.x - translateAmt.x, baseControl2.y - translateAmt.y);
  113. }
  114. limitPoint(pointHandle);
  115. limitPoint(controlHandle1);
  116. limitPoint(controlHandle2);
  117. updateCurvePoint();
  118. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  119. }
  120. }
  121. break;
  122. }
  123. }
  124. if(event->getDispatcher() == pointHandle || event->getDispatcher() == controlHandle1 || event->getDispatcher() == controlHandle2) {
  125. switch(event->getEventCode()) {
  126. case InputEvent::EVENT_MOUSEDOWN:
  127. if(mode == CurveEditor::MODE_SELECT) {
  128. draggingPoint = (UIImage*)event->getDispatcher();
  129. dragging = true;
  130. basePosition = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
  131. basePointPosition = draggingPoint->getPosition2D();
  132. baseControl1 = controlHandle1->getPosition2D();
  133. baseControl2 = controlHandle2->getPosition2D();
  134. }
  135. if(mode == CurveEditor::MODE_REMOVE) {
  136. if(type == TYPE_POINT) {
  137. dispatchEvent(new Event(), Event::CANCEL_EVENT);
  138. }
  139. }
  140. break;
  141. case InputEvent::EVENT_MOUSEUP:
  142. case InputEvent::EVENT_MOUSEUP_OUTSIDE:
  143. dragging = false;
  144. draggingPoint = NULL;
  145. break;
  146. }
  147. }
  148. }
  149. void EditPoint::limitPoint(UIRect *point) {
  150. if(point->getPosition().x < 0.0)
  151. point->setPositionX(0.0);
  152. if(point->getPosition().x > 300.0)
  153. point->setPositionX(300.0);
  154. if(point->getPosition().y > 0.0)
  155. point->setPositionY(0.0);
  156. if(point->getPosition().y < -100.0)
  157. point->setPositionY(-100.0);
  158. }
  159. void EditPoint::updatePosition() {
  160. pointHandle->setPosition(300.0*point->p2.x, -100*point->p2.y, 0.0);
  161. controlHandle1->setPosition(300.0*point->p1.x, -100*point->p1.y, 0.0);
  162. controlHandle2->setPosition(300.0*point->p3.x, -100*point->p3.y, 0.0);
  163. }
  164. EditPoint::~EditPoint() {
  165. }
  166. EditCurve::EditCurve(BezierCurve *targetCurve, Color curveColor) : UIElement() {
  167. this->targetCurve = targetCurve;
  168. visMesh = new SceneMesh(Mesh::LINE_STRIP_MESH);
  169. for(int i=0; i < CURVE_SIZE; i++) {
  170. visMesh->getMesh()->addVertex(0.0, 0.0, 0.0);
  171. }
  172. visMesh->lineSmooth = true;
  173. visMesh->lineWidth = 2.0;
  174. addChild(visMesh);
  175. visMesh->setPosition(0, 100);
  176. visMesh->color = curveColor;
  177. pointsBase = new UIElement();
  178. addChild(pointsBase);
  179. pointToRemove = NULL;
  180. updateCurve();
  181. updatePoints();
  182. Deactivate();
  183. }
  184. void EditCurve::updatePoints() {
  185. for(int i=0; i < points.size(); i++) {
  186. pointsBase->removeChild(points[i]);
  187. //delete points[i];
  188. }
  189. points.clear();
  190. for(int i=0; i < targetCurve->getNumControlPoints(); i++) {
  191. unsigned int type = EditPoint::TYPE_POINT;
  192. if(i == 0)
  193. type = EditPoint::TYPE_START_POINT;
  194. if(i == targetCurve->getNumControlPoints()-1)
  195. type = EditPoint::TYPE_END_POINT;
  196. EditPoint *point = new EditPoint(targetCurve->getControlPoint(i), type);
  197. point->setMode(mode);
  198. point->addEventListener(this, Event::CHANGE_EVENT);
  199. point->addEventListener(this, Event::CANCEL_EVENT);
  200. pointsBase->addChild(point);
  201. points.push_back(point);
  202. point->setPosition(0, 100);
  203. }
  204. }
  205. void EditCurve::setMode(unsigned int mode) {
  206. this->mode = mode;
  207. for(int i=0; i < points.size(); i++) {
  208. points[i]->setMode(mode);
  209. }
  210. }
  211. void EditCurve::Activate() {
  212. pointsBase->visible = true;
  213. pointsBase->enabled = true;
  214. visMesh->color.a = 1.0;
  215. }
  216. void EditCurve::Deactivate() {
  217. pointsBase->visible = false;
  218. pointsBase->enabled = false;
  219. visMesh->color.a = 1.0;
  220. }
  221. void EditCurve::Update() {
  222. if(pointToRemove) {
  223. targetCurve->removePoint(pointToRemove->point);
  224. updatePoints();
  225. updateCurve();
  226. pointToRemove = NULL;
  227. }
  228. }
  229. void EditCurve::handleEvent(Event *event) {
  230. if(event->getEventCode() == Event::CHANGE_EVENT) {
  231. updateCurve();
  232. }
  233. if(event->getEventCode() == Event::CANCEL_EVENT) {
  234. for(int i=0; i < points.size(); i++) {
  235. if(event->getDispatcher() == points[i]) {
  236. pointToRemove = points[i];
  237. break;
  238. }
  239. }
  240. }
  241. }
  242. void EditCurve::updateCurve() {
  243. targetCurve->recalculateDistances();
  244. Number interval = 300.0/CURVE_SIZE;
  245. Number normInterval = 1.0/CURVE_SIZE;
  246. interval += interval/CURVE_SIZE;
  247. normInterval += normInterval/CURVE_SIZE;
  248. visMesh->getMesh()->vertexPositionArray.data.clear();
  249. for(int i=0; i < CURVE_SIZE; i++) {
  250. visMesh->getMesh()->addVertex(targetCurve->getPointAt(normInterval * i).x * 300, targetCurve->getPointAt(normInterval * i).y * 100.0, 0.0);
  251. }
  252. visMesh->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
  253. }
  254. EditCurve::~EditCurve() {
  255. }
  256. CurveEditor::CurveEditor() : UIWindow("", 440, 160) {
  257. closeOnEscape = true;
  258. bg = new UIRect(300, 100);
  259. bg->setColor(0.1, 0.1, 0.1, 1.0);
  260. addChild(bg);
  261. bg->setPosition(160, 63);
  262. bg->processInputEvents = true;
  263. bg->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  264. selectorImage = new UIImage("main/selector.png", 24, 24);
  265. addChild(selectorImage);
  266. selectButton = new UIImageButton("main/arrow.png", 1.0, 24, 24);
  267. addChild(selectButton);
  268. selectButton->addEventListener(this, UIEvent::CLICK_EVENT);
  269. selectButton->setPosition(170, 33);
  270. addButton = new UIImageButton("main/arrow_add.png", 1.0, 24, 24);
  271. addChild(addButton);
  272. addButton->addEventListener(this, UIEvent::CLICK_EVENT);
  273. addButton->setPosition(170 + 32, 33);
  274. removeButton = new UIImageButton("main/arrow_remove.png", 1.0, 24, 24);
  275. addChild(removeButton);
  276. removeButton->addEventListener(this, UIEvent::CLICK_EVENT);
  277. removeButton->setPosition(170 + 64, 33);
  278. selectorImage->setPosition(selectButton->getPosition().x, selectButton->getPosition().y);
  279. selectedCurve = NULL;
  280. setMode(0);
  281. treeContainer = new UITreeContainer("boxIcon.png", L"Curves", 145, 135);
  282. treeContainer->getRootNode()->toggleCollapsed();
  283. treeContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
  284. treeContainer->setPosition(12, 33);
  285. treeContainer->getRootNode()->setUserData(NULL);
  286. addChild(treeContainer);
  287. }
  288. void CurveEditor::onClose() {
  289. visible = false;
  290. enabled = false;
  291. }
  292. void CurveEditor::clearCurves() {
  293. selectedCurve = NULL;
  294. treeContainer->getRootNode()->clearTree();
  295. for(int i=0; i < curves.size(); i++) {
  296. removeChild(curves[i]);
  297. delete curves[i];
  298. }
  299. curves.clear();
  300. }
  301. void CurveEditor::addCurve(String name, BezierCurve *curve, Color curveColor) {
  302. UITree *newNode = treeContainer->getRootNode()->addTreeChild("main/curve_icon.png", name);
  303. EditCurve *editCurve = new EditCurve(curve, curveColor);
  304. addChild(editCurve);
  305. editCurve->setPosition(160, 63);
  306. curves.push_back(editCurve);
  307. newNode->setUserData((void*) editCurve);
  308. }
  309. void CurveEditor::setMode(unsigned int mode) {
  310. this->mode = mode;
  311. if(selectedCurve) {
  312. selectedCurve->setMode(mode);
  313. }
  314. }
  315. void CurveEditor::handleEvent(Event *event) {
  316. if(mode == MODE_ADD) {
  317. if(event->getDispatcher() == bg) {
  318. if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN) {
  319. InputEvent *inputEvent = (InputEvent*)event;
  320. if(selectedCurve) {
  321. Vector2 pos = inputEvent->mousePosition;
  322. pos.x = pos.x/300.0;
  323. pos.y = 1.0-(pos.y/100.0);
  324. BezierCurve *targetCurve = selectedCurve->targetCurve;
  325. bool done = false;
  326. for(int i=0; i < targetCurve->getNumControlPoints(); i++) {
  327. if(pos.x < targetCurve->getControlPoint(i)->p2.x && !done) {
  328. targetCurve->insertPoint = targetCurve->getControlPoint(i);
  329. done = true;
  330. }
  331. }
  332. targetCurve->addControlPoint2dWithHandles(pos.x-0.1, pos.y, pos.x, pos.y, pos.x + 0.1, pos.y);
  333. selectedCurve->updatePoints();
  334. selectedCurve->updateCurve();
  335. }
  336. }
  337. }
  338. }
  339. if(event->getDispatcher() == selectButton) {
  340. selectorImage->setPosition(selectButton->getPosition().x, selectButton->getPosition().y);
  341. setMode(0);
  342. }
  343. if(event->getDispatcher() == addButton) {
  344. selectorImage->setPosition(addButton->getPosition().x, addButton->getPosition().y );
  345. setMode(1);
  346. }
  347. if(event->getDispatcher() == removeButton) {
  348. selectorImage->setPosition(removeButton->getPosition().x, removeButton->getPosition().y);
  349. setMode(2);
  350. }
  351. if(event->getDispatcher() == treeContainer->getRootNode()) {
  352. if(event->getEventCode() == UITreeEvent::SELECTED_EVENT){
  353. EditCurve *curve = (EditCurve *)treeContainer->getRootNode()->getSelectedNode()->getUserData();
  354. if(selectedCurve) {
  355. selectedCurve->Deactivate();
  356. }
  357. selectedCurve = curve;
  358. if(curve) {
  359. curve->Activate();
  360. curve->setMode(mode);
  361. curve->getParentEntity()->moveChildTop(curve);
  362. }
  363. }
  364. }
  365. UIWindow::handleEvent(event);
  366. }
  367. CurveEditor::~CurveEditor() {
  368. }
  369. EditorHolder::EditorHolder(PolycodeProject *project, PolycodeEditorManager *editorManager, EditorHolder *parentHolder) : UIElement() {
  370. this->editorManager = editorManager;
  371. this->parentHolder = parentHolder;
  372. this->project = project;
  373. currentEditor = NULL;
  374. holderBar = new UIElement();
  375. addChild(holderBar);
  376. snapToPixels = true;
  377. headerBg = new UIRect(30, 30);
  378. holderBar->addChild(headerBg);
  379. headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
  380. vSplitButton = new UIImageButton("main/editor_vsplit.png", 1.0, 19, 13);
  381. holderBar->addChild(vSplitButton);
  382. vSplitButton->addEventListener(this, UIEvent::CLICK_EVENT);
  383. hSplitButton = new UIImageButton("main/editor_hsplit.png", 1.0, 19, 13);
  384. holderBar->addChild(hSplitButton);
  385. hSplitButton->addEventListener(this, UIEvent::CLICK_EVENT);
  386. mergeSplitButton = new UIImageButton("main/editor_mergesplit.png", 1.0, 19, 13);
  387. holderBar->addChild(mergeSplitButton);
  388. mergeSplitButton->addEventListener(this, UIEvent::CLICK_EVENT);
  389. closeFileButton = new UIImageButton("main/remove_icon.png", 1.0, 12, 12);
  390. holderBar->addChild(closeFileButton);
  391. closeFileButton->setPosition(10, 8);
  392. closeFileButton->addEventListener(this, UIEvent::CLICK_EVENT);
  393. currentFileSelector = new UIComboBox(globalMenu, 350);
  394. currentFileSelector->addEventListener(this, UIEvent::CHANGE_EVENT);
  395. holderBar->addChild(currentFileSelector);
  396. currentFileSelector->setPosition(30, 3);
  397. addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  398. vSizer = NULL;
  399. hSizer = NULL;
  400. firstChildHolder = NULL;
  401. secondChildHolder = NULL;
  402. displayFilePathInSelector = false;
  403. initialUpdate = true;
  404. updateFileSelector();
  405. editorToMerge = NULL;
  406. isActive = false;
  407. setOwnsChildrenRecursive(true);
  408. }
  409. void EditorHolder::activateEditor(bool val) {
  410. if(firstChildHolder) {
  411. firstChildHolder->activateEditor(val);
  412. secondChildHolder->activateEditor(val);
  413. return;
  414. }
  415. if(currentEditor) {
  416. if(val) {
  417. currentEditor->Activate();
  418. } else {
  419. currentEditor->Deactivate();
  420. }
  421. }
  422. }
  423. ObjectEntry *EditorHolder::getEditorHolderConfig() {
  424. ObjectEntry *configEntry = new ObjectEntry();
  425. configEntry->name = "editor_holder";
  426. if(vSizer) {
  427. configEntry->addChild("split", "vsplit");
  428. ObjectEntry *childEditors = configEntry->addChild("child_editors");
  429. childEditors->addChild(firstChildHolder->getEditorHolderConfig())->addChild("size", vSizer->getMainHeight());
  430. childEditors->addChild(secondChildHolder->getEditorHolderConfig());
  431. } else if(hSizer) {
  432. configEntry->addChild("split", "hsplit");
  433. ObjectEntry *childEditors = configEntry->addChild("child_editors");
  434. childEditors->addChild(firstChildHolder->getEditorHolderConfig())->addChild("size", hSizer->getMainWidth());
  435. childEditors->addChild(secondChildHolder->getEditorHolderConfig());
  436. } else {
  437. configEntry->addChild("split", "none");
  438. if(currentEditor) {
  439. configEntry->addChild("file_name", currentEditor->getFilePath());
  440. ObjectEntry *editorConfig = currentEditor->getEditorConfig();
  441. if(editorConfig) {
  442. configEntry->addChild(editorConfig)->name = "editor_config";
  443. }
  444. }
  445. }
  446. return configEntry;
  447. }
  448. void EditorHolder::applyConfig(ObjectEntry *entry) {
  449. ObjectEntry *splitEntry = (*entry)["split"];
  450. if(splitEntry) {
  451. if(splitEntry->stringVal == "none") {
  452. ObjectEntry *fileNameEntry = (*entry)["file_name"];
  453. if(fileNameEntry) {
  454. OSFileEntry file = OSFileEntry(fileNameEntry->stringVal, OSFileEntry::TYPE_FILE);
  455. PolycodeEditor *editor = globalEditorManager->openFile(file);
  456. if(editor) {
  457. setEditor(editor);
  458. ObjectEntry *editorConfig = (*entry)["editor_config"];
  459. if(editorConfig) {
  460. editor->applyEditorConfig(editorConfig);
  461. }
  462. }
  463. }
  464. } else {
  465. if(splitEntry->stringVal == "hsplit") {
  466. makeHSplit();
  467. } else {
  468. makeVSplit();
  469. }
  470. ObjectEntry *childEntries = (*entry)["child_editors"];
  471. if(childEntries) {
  472. ObjectEntry *firstChildEntry = (*childEntries)[0];
  473. if(firstChildEntry) {
  474. firstChildHolder->applyConfig(firstChildEntry);
  475. if(vSizer) {
  476. vSizer->setMainHeightWithMinimum((*firstChildEntry)["size"]->NumberVal);
  477. } else if(hSizer) {
  478. hSizer->setMainWidthWithMinimum((*firstChildEntry)["size"]->NumberVal);
  479. }
  480. }
  481. ObjectEntry *secondChildEntry = (*childEntries)[1];
  482. if(secondChildEntry) {
  483. secondChildHolder->applyConfig(secondChildEntry);
  484. }
  485. }
  486. }
  487. }
  488. }
  489. void EditorHolder::setActive(bool val) {
  490. isActive = val;
  491. if(firstChildHolder) {
  492. firstChildHolder->setActive(val);
  493. return;
  494. }
  495. if(val) {
  496. headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiAccentColor"));
  497. if(activeEditorHolder && activeEditorHolder != this) {
  498. activeEditorHolder->setActive(false);
  499. }
  500. activeEditorHolder = this;
  501. editorManager->setCurrentEditor(currentEditor);
  502. } else {
  503. headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
  504. }
  505. }
  506. void EditorHolder::updateFileSelector() {
  507. currentFileSelector->removeAllHandlersForListener(this);
  508. currentFileSelector->clearItems();
  509. std::vector<PolycodeEditor*> editors = editorManager->getOpenEditorsForProject(project);
  510. for(int i=0; i < editors.size(); i++) {
  511. OSFileEntry entry(editors[i]->getFilePath(), OSFileEntry::TYPE_FILE);
  512. String projName = editors[i]->parentProject->getProjectName();
  513. String rootFolder = editors[i]->parentProject->getRootFolder();
  514. String filePath = editors[i]->getFilePath();
  515. String fullEntry = filePath;
  516. if(filePath.find(rootFolder) != -1) {
  517. fullEntry = projName + filePath.substr(rootFolder.size(), filePath.size()-1);
  518. }
  519. if(editors[i]->hasChanges()) {
  520. if (displayFilePathInSelector)
  521. currentFileSelector->addComboItem("* "+fullEntry, (void*)editors[i]);
  522. else
  523. currentFileSelector->addComboItem("* "+entry.name, (void*)editors[i]);
  524. } else {
  525. if (displayFilePathInSelector)
  526. currentFileSelector->addComboItem(fullEntry, (void*)editors[i]);
  527. else
  528. currentFileSelector->addComboItem(entry.name, (void*)editors[i]);
  529. }
  530. if(currentEditor == editors[i]) {
  531. if(!initialUpdate) {
  532. currentFileSelector->setSelectedIndex(i);
  533. }
  534. }
  535. }
  536. if(firstChildHolder) {
  537. firstChildHolder->updateFileSelector();
  538. }
  539. if(secondChildHolder) {
  540. secondChildHolder->updateFileSelector();
  541. }
  542. currentFileSelector->addEventListener(this, UIEvent::CHANGE_EVENT);
  543. initialUpdate = false;
  544. }
  545. void EditorHolder::setEditor(PolycodeEditor *newEditor) {
  546. if(vSizer || hSizer) {
  547. firstChildHolder->setEditor(newEditor);
  548. return;
  549. }
  550. if(currentEditor) {
  551. removeChild(currentEditor);
  552. currentEditor->Deactivate();
  553. currentEditor->setEditorHolder(NULL);
  554. }
  555. currentEditor = newEditor;
  556. if(currentEditor) {
  557. currentEditor->Activate();
  558. EditorHolder *currentEditorHolder = currentEditor->getEditorHolder();
  559. if(currentEditorHolder) {
  560. currentEditorHolder->setEditor(NULL);
  561. }
  562. if(currentEditor) {
  563. currentEditor->setEditorHolder(this);
  564. }
  565. addChild(currentEditor);
  566. }
  567. updateFileSelector();
  568. if(isActive) {
  569. editorManager->setCurrentEditor(currentEditor);
  570. }
  571. Resize(getWidth(), getHeight());
  572. }
  573. PolycodeEditor *EditorHolder::getEditor() {
  574. return currentEditor;
  575. }
  576. void EditorHolder::makeVSplit() {
  577. holderBar->visible = false;
  578. holderBar->enabled = false;
  579. vSizer = new UIVSizer(getWidth(), getHeight(), getHeight()/2.0, true);
  580. vSizer->setMinimumSize(200);
  581. vSizer->setProportionalResize(true);
  582. addChild(vSizer);
  583. firstChildHolder = new EditorHolder(project, editorManager, this);
  584. firstChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
  585. vSizer->addTopChild(firstChildHolder);
  586. if(isActive) {
  587. firstChildHolder->setActive(true);
  588. }
  589. secondChildHolder = new EditorHolder(project, editorManager, this);
  590. secondChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
  591. vSizer->addBottomChild(secondChildHolder);
  592. if(currentEditor) {
  593. removeChild(currentEditor);
  594. currentEditor->setEditorHolder(NULL);
  595. firstChildHolder->setEditor(currentEditor);
  596. currentEditor = NULL;
  597. }
  598. Resize(getWidth(), getHeight());
  599. }
  600. void EditorHolder::makeHSplit() {
  601. holderBar->visible = false;
  602. holderBar->enabled = false;
  603. hSizer = new UIHSizer(getWidth(), getHeight(), getWidth()/2.0, true);
  604. hSizer->setMinimumSize(200);
  605. hSizer->setProportionalResize(true);
  606. addChild(hSizer);
  607. firstChildHolder = new EditorHolder(project, editorManager, this);
  608. firstChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
  609. hSizer->addLeftChild(firstChildHolder);
  610. secondChildHolder = new EditorHolder(project, editorManager, this);
  611. secondChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
  612. hSizer->addRightChild(secondChildHolder);
  613. if(isActive) {
  614. firstChildHolder->setActive(true);
  615. }
  616. if(currentEditor) {
  617. removeChild(currentEditor);
  618. currentEditor->setEditorHolder(NULL);
  619. firstChildHolder->setEditor(currentEditor);
  620. currentEditor = NULL;
  621. }
  622. Resize(getWidth(), getHeight());
  623. }
  624. void EditorHolder::handleEvent(Event *event) {
  625. if(event->getDispatcher() == this) {
  626. if(holderBar->visible) {
  627. setActive(true);
  628. }
  629. } else if(event->getDispatcher() == vSplitButton) {
  630. makeVSplit();
  631. } else if(event->getDispatcher() == hSplitButton) {
  632. makeHSplit();
  633. } else if(event->getDispatcher() == currentFileSelector) {
  634. PolycodeEditor *editor = (PolycodeEditor*) currentFileSelector->getSelectedItem()->data;
  635. if(currentEditor != editor) {
  636. setEditor(editor);
  637. Resize(getWidth(), getHeight());
  638. }
  639. } else if(event->getDispatcher() == mergeSplitButton) {
  640. if(parentHolder) {
  641. parentHolder->mergeSides(this);
  642. Resize(getWidth(), getHeight());
  643. }
  644. } else if(event->getDispatcher() == closeFileButton) {
  645. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  646. } else if(event->getDispatcher() == firstChildHolder || event->getDispatcher() == secondChildHolder) {
  647. if(event->getEventCode() == UIEvent::CLOSE_EVENT) {
  648. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  649. }
  650. Resize(getWidth(), getHeight());
  651. }
  652. UIElement::handleEvent(event);
  653. }
  654. void EditorHolder::Update() {
  655. if(editorToMerge) {
  656. _mergeSides(editorToMerge);
  657. editorToMerge = NULL;
  658. }
  659. }
  660. void EditorHolder::mergeSides(EditorHolder *mainHolder) {
  661. editorToMerge = mainHolder;
  662. }
  663. void EditorHolder::_mergeSides(EditorHolder *mainHolder) {
  664. holderBar->visible = true;
  665. holderBar->enabled = true;
  666. activeEditorHolder = this;
  667. PolycodeEditor *mainHolderEditor = mainHolder->getEditor();
  668. if(firstChildHolder) {
  669. PolycodeEditor *holderEditor = firstChildHolder->getEditor();
  670. if(holderEditor) {
  671. holderEditor->setEditorHolder(NULL);
  672. }
  673. }
  674. if(secondChildHolder) {
  675. PolycodeEditor *holderEditor = secondChildHolder->getEditor();
  676. if(holderEditor) {
  677. holderEditor->setEditorHolder(NULL);
  678. }
  679. }
  680. if(vSizer) {
  681. removeChild(vSizer);
  682. delete vSizer;
  683. }
  684. if(hSizer) {
  685. removeChild(hSizer);
  686. delete hSizer;
  687. }
  688. firstChildHolder->setOwnsChildrenRecursive(false);
  689. secondChildHolder->setOwnsChildrenRecursive(false);
  690. delete firstChildHolder;
  691. delete secondChildHolder;
  692. firstChildHolder = NULL;
  693. secondChildHolder = NULL;
  694. vSizer = NULL;
  695. hSizer = NULL;
  696. setActive(true);
  697. setEditor(mainHolderEditor);
  698. }
  699. EditorHolder::~EditorHolder() {
  700. if(vSizer) {
  701. removeChild(vSizer);
  702. delete vSizer;
  703. }
  704. if(hSizer) {
  705. removeChild(hSizer);
  706. delete hSizer;
  707. }
  708. if(firstChildHolder) {
  709. delete firstChildHolder;
  710. }
  711. if(secondChildHolder) {
  712. delete secondChildHolder;
  713. }
  714. }
  715. void EditorHolder::Resize(Number width, Number height) {
  716. if(headerBg->visible) {
  717. headerBg->Resize(width, 30);
  718. hSplitButton->setPosition(width - 30, 7);
  719. vSplitButton->setPosition(width - 55, 7);
  720. if(parentHolder) {
  721. mergeSplitButton->visible = true;
  722. mergeSplitButton->enabled = true;
  723. mergeSplitButton->setPosition(width - 80, 7);
  724. currentFileSelector->Resize(width - 125, currentFileSelector->getHeight());
  725. } else {
  726. mergeSplitButton->visible = false;
  727. mergeSplitButton->enabled = false;
  728. currentFileSelector->Resize(width - 100, currentFileSelector->getHeight());
  729. }
  730. }
  731. if(currentEditor) {
  732. currentEditor->setPosition(0, 30);
  733. currentEditor->Resize(width, height-30);
  734. }
  735. if(vSizer) {
  736. vSizer->Resize(width, height);
  737. }
  738. if(hSizer) {
  739. hSizer->Resize(width, height);
  740. }
  741. UIElement::Resize(width, height);
  742. }
  743. PolycodeProjectTab::PolycodeProjectTab(String caption, PolycodeProject *project, PolycodeEditorManager *editorManager) : UIElement() {
  744. tabName = caption;
  745. this->editorManager = editorManager;
  746. editorHolder = new EditorHolder(project, editorManager, NULL);
  747. editorHolder->setActive(true);
  748. editorHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
  749. mainSizer = new UIHSizer(100,100,200,true);
  750. mainSizer->setMinimumSize(100);
  751. addChild(mainSizer);
  752. projectBrowser = new PolycodeProjectBrowser(project);
  753. mainSizer->addLeftChild(projectBrowser);
  754. mainSizer->addRightChild(editorHolder);
  755. active = false;
  756. projectBrowser->treeContainer->getRootNode()->addEventListener(this, UITreeEvent::DRAG_START_EVENT);
  757. }
  758. void PolycodeProjectTab::setActive(bool val) {
  759. active = val;
  760. editorHolder->activateEditor(val);
  761. if(!active) {
  762. projectBrowser->removeAllHandlers();
  763. }
  764. }
  765. bool PolycodeProjectTab::isActive() {
  766. return active;
  767. }
  768. void PolycodeProjectTab::handleEvent(Event *event) {
  769. if(event->getDispatcher() == editorHolder && event->getEventCode() == UIEvent::CLOSE_EVENT) {
  770. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  771. }
  772. UIElement::handleEvent(event);
  773. }
  774. String PolycodeProjectTab::getTabName() {
  775. return tabName;
  776. }
  777. ObjectEntry *PolycodeProjectTab::getTabConfig() {
  778. ObjectEntry *configEntry = new ObjectEntry();
  779. configEntry->name = "tab";
  780. configEntry->addChild(projectBrowser->getBrowserConfig());
  781. configEntry->addChild("tab_name", tabName);
  782. configEntry->addChild("tab_active", isActive());
  783. configEntry->addChild(editorHolder->getEditorHolderConfig());
  784. return configEntry;
  785. }
  786. void PolycodeProjectTab::applyTabConfig(ObjectEntry *tabEntry) {
  787. ObjectEntry *browserEntry = (*tabEntry)["project_browser"];
  788. if(browserEntry) {
  789. ObjectEntry *browserWidthEntry = (*browserEntry)["width"];
  790. if(browserWidthEntry) {
  791. mainSizer->setMainWidth(browserWidthEntry->NumberVal);
  792. }
  793. projectBrowser->applyBrowserConfig(browserEntry);
  794. }
  795. ObjectEntry *editorHolderEntry = (*tabEntry)["editor_holder"];
  796. if(editorHolderEntry) {
  797. editorHolder->applyConfig(editorHolderEntry);
  798. }
  799. }
  800. void PolycodeProjectTab::setTabName(String newName) {
  801. tabName = newName;
  802. }
  803. void PolycodeProjectTab::Resize(Number width, Number height) {
  804. mainSizer->Resize(width, height);
  805. UIElement::Resize(width, height);
  806. }
  807. EditorHolder *PolycodeProjectTab::getEditorHolder() {
  808. return editorHolder;
  809. }
  810. void PolycodeProjectTab::showEditor(PolycodeEditor *editor) {
  811. if(!activeEditorHolder) {
  812. return;
  813. }
  814. if(activeEditorHolder->getEditor()) {
  815. activeEditorHolder->setEditor(NULL);
  816. }
  817. activeEditorHolder->setEditor(editor);
  818. editor->Activate();
  819. Resize(getWidth(), getHeight());
  820. }
  821. PolycodeProjectBrowser *PolycodeProjectTab::getProjectBrowser() {
  822. return projectBrowser;
  823. }
  824. PolycodeProjectTab::~PolycodeProjectTab() {
  825. }
  826. PolycodeTabButton::PolycodeTabButton(PolycodeProjectTab *tab) : UIElement() {
  827. this->tab = tab;
  828. bgRect = new UIImage("main/tab_bg.png", 150,30);
  829. addChild(bgRect);
  830. bgRect->processInputEvents = true;
  831. processInputEvents = true;
  832. bgRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  833. setWidth(150);
  834. setHeight(30);
  835. tabLabel = new UILabel(tab->getTabName().toUpperCase(), 16, "section");
  836. tabLabel->setColor(0.0, 0.0, 0.0, 1.0);
  837. tabLabel->setPosition(getWidth()-tabLabel->getWidth()-10.0, ((getHeight()-tabLabel->getHeight())/2.0) - 3.0);
  838. addChild(tabLabel);
  839. closeButton = new UIImageButton("main/tab_close_button.png", 1.0, 18, 18);
  840. closeButton->setPosition(4.0, floor((30.0 - closeButton->getHeight()) / 2.0));
  841. addChild(closeButton);
  842. closeButton->blockMouseInput = true;
  843. closeButton->addEventListener(this, UIEvent::CLICK_EVENT);
  844. }
  845. void PolycodeTabButton::updateLabel() {
  846. tabLabel->setText(tab->getTabName().toUpperCase());
  847. tabLabel->setPosition(getWidth()-tabLabel->getWidth()-10.0, ((getHeight()-tabLabel->getHeight())/2.0) - 3.0);
  848. }
  849. void PolycodeTabButton::handleEvent(Event *event) {
  850. if(event->getDispatcher() == renamePopup) {
  851. renamePopup->removeAllHandlersForListener(this);
  852. tabLabel->setText(renamePopup->getValue().toUpperCase());
  853. tab->setTabName(renamePopup->getValue());
  854. tabLabel->setPosition(getWidth()-tabLabel->getWidth()-10.0, ((getHeight()-tabLabel->getHeight())/2.0) - 3.0);
  855. }
  856. if(event->getDispatcher() == menu) {
  857. if(menu->getSelectedItem()->_id == "close_tab") {
  858. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  859. } else if(menu->getSelectedItem()->_id == "rename_tab") {
  860. renamePopup = globalFrame->showTextInput("Enter new tab name.", "rename_tab", tab->getTabName());
  861. renamePopup->addEventListener(this, UIEvent::OK_EVENT);
  862. }
  863. }
  864. if(event->getDispatcher() == closeButton) {
  865. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  866. }
  867. if(event->getDispatcher() == bgRect) {
  868. if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN) {
  869. dispatchEvent(new Event(), Event::SELECT_EVENT);
  870. InputEvent *inputEvent = (InputEvent*) event;
  871. if(inputEvent->getMouseButton() == CoreInput::MOUSE_BUTTON2) {
  872. menu = globalMenu->showMenuAtMouse(120);
  873. menu->addOption("Rename tab", "rename_tab");
  874. menu->addOption("Close tab", "close_tab");
  875. menu->addEventListener(this, UIEvent::OK_EVENT);
  876. }
  877. }
  878. }
  879. UIElement::handleEvent(event);
  880. }
  881. void PolycodeTabButton::setActive(bool val) {
  882. if(val) {
  883. bgRect->color.a = 0.4;
  884. } else {
  885. bgRect->color.a = 0.2;
  886. }
  887. }
  888. PolycodeProjectTab *PolycodeTabButton::getTab() {
  889. return tab;
  890. }
  891. PolycodeTabButton::~PolycodeTabButton() {
  892. }
  893. PolycodeProjectFrame::PolycodeProjectFrame(PolycodeProject *project, PolycodeEditorManager *editorManager) {
  894. tabToClose = NULL;
  895. this->editorManager = editorManager;
  896. this->project = project;
  897. lastActiveEditorHolder = NULL;
  898. tabButtonAnchor = new UIElement();
  899. addChild(tabButtonAnchor);
  900. tabButtonAnchor->setPosition(400, -30);
  901. activeTab = NULL;
  902. newTabButton = new UIImageButton("main/new_tab_button.png", 1.0, 27, 26);
  903. tabButtonAnchor->addChild(newTabButton);
  904. newTabButton->addEventListener(this, UIEvent::CLICK_EVENT);
  905. addNewTab("Default");
  906. }
  907. void PolycodeProjectFrame::showNextTab() {
  908. for(int i=0; i < tabs.size(); i++) {
  909. if(tabs[i] == activeTab) {
  910. if(i < tabs.size()-1) {
  911. showTab(tabs[i+1]);
  912. return;
  913. } else {
  914. showTab(tabs[0]);
  915. return;
  916. }
  917. }
  918. }
  919. }
  920. void PolycodeProjectFrame::showPreviousTab() {
  921. for(int i=0; i < tabs.size(); i++) {
  922. if(tabs[i] == activeTab) {
  923. if(i > 0) {
  924. showTab(tabs[i-1]);
  925. return;
  926. } else {
  927. showTab(tabs[tabs.size()-1]);
  928. return;
  929. }
  930. }
  931. }
  932. }
  933. PolycodeProjectTab *PolycodeProjectFrame::getTabAtIndex(unsigned int index) {
  934. return tabs[index];
  935. }
  936. unsigned int PolycodeProjectFrame::getNumTabs() {
  937. return tabs.size();
  938. }
  939. PolycodeProjectTab *PolycodeProjectFrame::getActiveTab() {
  940. return activeTab;
  941. }
  942. PolycodeProjectTab *PolycodeProjectFrame::addNewTab(String caption) {
  943. PolycodeProjectTab *newTab = new PolycodeProjectTab(caption, project, editorManager);
  944. tabs.push_back(newTab);
  945. PolycodeTabButton *newTabButton = new PolycodeTabButton(newTab);
  946. tabButtonAnchor->addChild(newTabButton);
  947. tabButtons.push_back(newTabButton);
  948. newTabButton->addEventListener(this, Event::SELECT_EVENT);
  949. newTabButton->addEventListener(this, UIEvent::CLOSE_EVENT);
  950. showTab(newTab);
  951. return newTab;
  952. }
  953. void PolycodeProjectFrame::Update() {
  954. if(tabToClose) {
  955. // can't close the last tab
  956. if(tabs.size() == 1) {
  957. tabToClose = NULL;
  958. return;
  959. }
  960. for(int i=0; i < tabs.size(); i++) {
  961. if(tabs[i] == tabToClose) {
  962. tabs.erase(tabs.begin()+i);
  963. break;
  964. }
  965. }
  966. for(int i=0; i < tabButtons.size(); i++) {
  967. if(tabButtons[i]->getTab() == tabToClose) {
  968. tabButtonAnchor->removeChild(tabButtons[i]);
  969. delete tabButtons[i];
  970. tabButtons.erase(tabButtons.begin()+i);
  971. break;
  972. }
  973. }
  974. if(tabToClose == activeTab) {
  975. showTab(tabs[0]);
  976. }
  977. delete tabToClose;
  978. tabToClose = NULL;
  979. restructTabs();
  980. }
  981. }
  982. void PolycodeProjectFrame::closeTab(PolycodeProjectTab *tab) {
  983. tabToClose = tab;
  984. }
  985. void PolycodeProjectFrame::showTab(PolycodeProjectTab *tab) {
  986. if(activeTab) {
  987. activeTab->setActive(false);
  988. activeTab->removeAllHandlersForListener(this);
  989. removeChild(activeTab);
  990. }
  991. addChild(tab);
  992. tab->addEventListener(this, UIEvent::CLOSE_EVENT);
  993. tab->setActive(true);
  994. tab->getEditorHolder()->setActive(true);
  995. tab->Resize(getWidth(), getHeight());
  996. activeTab = tab;
  997. restructTabs();
  998. dispatchEvent(new UIEvent(), Event::CHANGE_EVENT);
  999. }
  1000. void PolycodeProjectFrame::restructTabs() {
  1001. int i;
  1002. for(i=0; i < tabButtons.size(); i++) {
  1003. tabButtons[i]->setPosition(i * 152.0, 0.0);
  1004. tabButtons[i]->setActive(tabButtons[i]->getTab()->isActive());
  1005. tabButtons[i]->updateLabel();
  1006. }
  1007. newTabButton->setPosition((i * 152) + 3, 0.0);
  1008. }
  1009. ObjectEntry *PolycodeProjectFrame::getFrameConfig() {
  1010. ObjectEntry *configEntry = new ObjectEntry();
  1011. configEntry->name = "frame";
  1012. ObjectEntry *tabsEntry = configEntry->addChild("tabs");
  1013. for(int i=0; i < tabs.size(); i++) {
  1014. tabsEntry->addChild(tabs[i]->getTabConfig());
  1015. }
  1016. return configEntry;
  1017. }
  1018. void PolycodeProjectFrame::handleEvent(Event *event) {
  1019. for(int i=0; i < tabs.size(); i++) {
  1020. if(event->getDispatcher() == tabs[i] && event->getEventCode() == UIEvent::CLOSE_EVENT) {
  1021. dispatchEvent(new UIEvent, UIEvent::CLOSE_EVENT);
  1022. return;
  1023. }
  1024. }
  1025. if(event->getDispatcher() == newTabButton) {
  1026. addNewTab();
  1027. } else {
  1028. for(int i=0; i < tabButtons.size(); i++) {
  1029. if(event->getDispatcher() == tabButtons[i]) {
  1030. if(event->getEventCode() == Event::SELECT_EVENT) {
  1031. showTab(tabButtons[i]->getTab());
  1032. break;
  1033. } else if(event->getEventCode() == UIEvent::CLOSE_EVENT) {
  1034. closeTab(tabButtons[i]->getTab());
  1035. break;
  1036. } else if(event->getEventCode() == UIEvent::CHANGE_EVENT) {
  1037. dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
  1038. break;
  1039. }
  1040. }
  1041. }
  1042. }
  1043. }
  1044. PolycodeProject *PolycodeProjectFrame::getProject() {
  1045. return project;
  1046. }
  1047. void PolycodeProjectFrame::Resize(Number width, Number height) {
  1048. activeTab->Resize(width, height);
  1049. UIElement::Resize(width, height);
  1050. }
  1051. PolycodeProjectFrame::~PolycodeProjectFrame() {
  1052. }
  1053. PolycodeFrame::PolycodeFrame(PolycodeEditorManager *editorManager) : UIElement() {
  1054. this->editorManager = editorManager;
  1055. activeProjectFrame = NULL;
  1056. consoleSize = 200;
  1057. globalFrame = this;
  1058. processInputEvents = true;
  1059. willHideModal = false;
  1060. showingConsole = true;
  1061. modalChild = NULL;
  1062. welcomeEntity = new Entity();
  1063. welcomeEntity->processInputEvents = true;
  1064. addChild(welcomeEntity);
  1065. welcomeImage = new UIImage("main/welcome.png", 759, 207);
  1066. welcomeEntity->addChild(welcomeImage);
  1067. welcomeEntity->snapToPixels = true;
  1068. newProjectButton = new UIButton("Create A New Project!", 220);
  1069. newProjectButton->setPosition(260,120);
  1070. newProjectButton->addEventListener(this, UIEvent::CLICK_EVENT);
  1071. examplesButton = new UIButton("Browse Example Projects!", 220);
  1072. examplesButton->setPosition(490,120);
  1073. examplesButton->addEventListener(this, UIEvent::CLICK_EVENT);
  1074. welcomeEntity->addChild(newProjectButton);
  1075. welcomeEntity->addChild(examplesButton);
  1076. topBarBg = new UIRect(2,2);
  1077. topBarBg->setColorInt(21, 18, 17, 255);
  1078. topBarBg->setAnchorPoint(-1.0, -1.0, 0.0);
  1079. topBarBg->processInputEvents = true;
  1080. topBarBg->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
  1081. topBarBg->blockMouseInput = true;
  1082. addChild(topBarBg);
  1083. consoleSizer = new UIVSizer(100,100,200, false);
  1084. console = new PolycodeConsole();
  1085. consoleSizer->addBottomChild(console);
  1086. addChild(consoleSizer);
  1087. consoleSizer->setPosition(0.0, 45);
  1088. logo = new UIImage("main/barLogo.png", 38, 38);
  1089. addChild(logo);
  1090. playButton = new UIImageButton("main/play_button.png", 1.0, 32, 32);
  1091. addChild(playButton);
  1092. playButton->setPosition(10,5);
  1093. stopButton = new UIImageButton("main/stop_button.png", 1.0, 32, 32);
  1094. addChild(stopButton);
  1095. stopButton->setPosition(10,5);
  1096. currentProjectSelector = new UIComboBox(globalMenu, 300);
  1097. currentProjectSelector->addEventListener(this, UIEvent::CHANGE_EVENT);
  1098. addChild(currentProjectSelector);
  1099. currentProjectSelector->setPosition(60, 10);
  1100. resizer = new UIImage("main/corner_resize.png", 14, 14);
  1101. addChild(resizer);
  1102. resizer->setColor(0,0,0,0.4);
  1103. modalBlocker = new UIRect(10,10);
  1104. modalBlocker->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
  1105. modalBlocker->setColor(0,0,0,0.4);
  1106. modalBlocker->setAnchorPoint(-1.0, -1.0, 0.0);
  1107. modalBlocker->enabled = false;
  1108. modalBlocker->blockMouseInput = true;
  1109. modalBlocker->processInputEvents = true;
  1110. addChild(modalBlocker);
  1111. assetBrowser = new AssetBrowser();
  1112. assetBrowser->visible = false;
  1113. newProjectWindow = new NewProjectWindow();
  1114. newProjectWindow->visible = false;
  1115. exampleBrowserWindow = new ExampleBrowserWindow();
  1116. exampleBrowserWindow->visible = false;
  1117. settingsWindow = new SettingsWindow();
  1118. settingsWindow->visible = false;
  1119. newFileWindow = new NewFileWindow();
  1120. newFileWindow->visible = false;
  1121. exportProjectWindow = new ExportProjectWindow();
  1122. exportProjectWindow->visible = false;
  1123. textInputPopup = new TextInputPopup();
  1124. textInputPopup->visible = false;
  1125. yesNoPopup = new YesNoPopup();
  1126. yesNoPopup->visible = false;
  1127. messagePopup = new MessagePopup();
  1128. messagePopup->visible = false;
  1129. yesNoCancelPopup = new YesNoCancelPopup();
  1130. yesNoCancelPopup->visible = false;
  1131. aboutWindow = new UIWindow("", 800, 440);
  1132. aboutWindow->closeOnEscape = true;
  1133. UIImage *aboutImage = new UIImage("main/about.png", 321, 122);
  1134. aboutWindow->addChild(aboutImage);
  1135. aboutImage->setPosition(20, 40);
  1136. aboutWindow->visible = false;
  1137. aboutOKButton = new UIButton("OK", 100);
  1138. aboutWindow->addChild(aboutOKButton);
  1139. aboutOKButton->setPosition(700, 420);
  1140. aboutOKButton->addEventListener(this, UIEvent::CLICK_EVENT);
  1141. String info1Text = "Polycode is developed by:\n\nProject lead:\nIvan Safrin\n\nTop project contributors in order of commits:\nCameron Hart, Andi McClure, samiamwork, Christian Bielert,\nChristopher Reed, TheCosmotect, Danny Warren, Paul Smith,\nDevin Stone, Jon Kristinsson, Henry Maddocks,\nJohan Klokkhammer Helsing, Chris Ledet, Per Bodin, Quinlan P.,\nLee-R, Guillaume Papin, Remi Gillig, ZenX2,\nMatt Tuttle, Alejandro Cámara, Jake Scott, tastymorsel";
  1142. UIMultilineLabel *info1 = new UIMultilineLabel(info1Text, 12, 5);
  1143. aboutWindow->addChild(info1);
  1144. info1->setPosition(40, 200);
  1145. String info2Text = "Polycode uses the following open-source libraries:\n\nAssimp (BSD license)\nBox2D (zlib license)\nBullet Physics (zlib license)\nFreetype (Freetype license)\nlibpng (libpng license)\nLua (MIT license),\nOggVorbis (BSD license)\nPhysFS (zlib license)\ntinyXML (zlib license)\nSDL (on Linux only) (zlib license)\n\nPolycode itself is distributed\nunder the MIT license.\n\n\n\nThank you for using Polycode!";
  1146. UIMultilineLabel *info2 = new UIMultilineLabel(info2Text, 12, 5);
  1147. aboutWindow->addChild(info2);
  1148. info2->setPosition(450, 40);
  1149. UILabel *versionLabel = new UILabel("version "POLYCODE_VERSION_STRING, 12, "mono");
  1150. aboutWindow->addChild(versionLabel);
  1151. versionLabel->setPosition(40, 430);
  1152. versionLabel->color.a = 1.0;
  1153. assetImporterWindow = new AssetImporterWindow();
  1154. isDragging = false;
  1155. dragLabel = new UILabel("NONE", 11, "sans");
  1156. dragLabel->setPosition(0,-15);
  1157. dragEntity = new Entity();
  1158. dragEntity->addChild(dragLabel);
  1159. addChild(dragEntity);
  1160. dragEntity->visible = false;
  1161. CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  1162. CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
  1163. CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  1164. curveEditor = new CurveEditor();
  1165. addChild(curveEditor);
  1166. curveEditor->setPosition(200,100);
  1167. curveEditor->visible = false;
  1168. curveEditor->enabled = false;
  1169. globalColorPicker = new UIColorPicker();
  1170. globalColorPicker->setPosition(300,300);
  1171. globalColorPicker->setContinuous(false);
  1172. addChild(globalColorPicker);
  1173. modalRoot = new UIElement();
  1174. addChild(modalRoot);
  1175. fileDialogBlocker = new UIRect(100, 100);
  1176. fileDialogBlocker->setAnchorPoint(-1.0, -1.0, 0.0);
  1177. addChild(fileDialogBlocker);
  1178. fileDialogBlocker->setColor(0.0, 0.0, 0.0, 0.5);
  1179. fileDialogBlocker->processInputEvents = true;
  1180. fileDialogBlocker->blockMouseInput = true;
  1181. fileDialogBlocker->visible = false;
  1182. fileDialogBlocker->enabled = false;
  1183. fileBrowserRoot = new UIElement();
  1184. addChild(fileBrowserRoot);
  1185. fileDialog = NULL;
  1186. displayFilePathInSelector = false;
  1187. }
  1188. void PolycodeFrame::showFileBrowser(String baseDir, bool foldersOnly, std::vector<String> extensions, bool allowMultiple) {
  1189. if(fileDialog)
  1190. delete fileDialog;
  1191. fileDialog = new UIFileDialog(baseDir, foldersOnly, extensions, allowMultiple);
  1192. fileDialog->addEventListener(this, UIEvent::CANCEL_EVENT);
  1193. fileDialog->addEventListener(this, UIEvent::OK_EVENT);
  1194. fileBrowserRoot->addChild(fileDialog);
  1195. fileDialog->setPosition(100,100);
  1196. fileDialogBlocker->visible = true;
  1197. fileDialogBlocker->enabled = true;
  1198. }
  1199. void PolycodeFrame::showCurveEditor() {
  1200. curveEditor->visible = true;
  1201. curveEditor->enabled = true;
  1202. }
  1203. void PolycodeFrame::showModal(UIWindow *modalChild) {
  1204. modalBlocker->enabled = true;
  1205. focusChild(NULL);
  1206. this->modalChild = modalChild;
  1207. modalRoot->addChild(modalChild);
  1208. modalChild->showWindow();
  1209. modalChild->addEventListener(this, UIEvent::CLOSE_EVENT);
  1210. Resize(getWidth(), getHeight());
  1211. modalChild->focusSelf();
  1212. CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
  1213. }
  1214. void PolycodeFrame::hideModal() {
  1215. if(modalChild) {
  1216. modalRoot->removeChild(modalChild);
  1217. assetBrowser->removeAllHandlers();
  1218. modalChild->hideWindow();
  1219. modalChild = NULL;
  1220. }
  1221. modalBlocker->enabled = false;
  1222. }
  1223. bool PolycodeFrame::isShowingConsole() {
  1224. return showingConsole;
  1225. }
  1226. void PolycodeFrame::showConsole() {
  1227. if(!showingConsole)
  1228. toggleConsole();
  1229. }
  1230. void PolycodeFrame::hideConsole() {
  1231. if(showingConsole)
  1232. toggleConsole();
  1233. }
  1234. void PolycodeFrame::toggleConsole() {
  1235. if(showingConsole) {
  1236. consoleSize = consoleSizer->getMainHeight();
  1237. consoleSizer->setMainHeight(0);
  1238. console->visible = false;
  1239. console->enabled = false;
  1240. } else {
  1241. consoleSizer->setMainHeight(consoleSize);
  1242. console->visible = true;
  1243. console->enabled = true;
  1244. }
  1245. showingConsole = !showingConsole;
  1246. }
  1247. Number PolycodeFrame::getConsoleSize() {
  1248. if(showingConsole) {
  1249. return consoleSizer->getMainHeight();
  1250. } else {
  1251. return consoleSize;
  1252. }
  1253. }
  1254. void PolycodeFrame::Update() {
  1255. if(willHideModal) {
  1256. hideModal();
  1257. willHideModal = false;
  1258. }
  1259. }
  1260. TextInputPopup * PolycodeFrame::showTextInput(String caption, String action, String value) {
  1261. textInputPopup->action = action;
  1262. textInputPopup->setCaption(caption);
  1263. textInputPopup->setValue(value);
  1264. showModal(textInputPopup);
  1265. return textInputPopup;
  1266. }
  1267. void PolycodeFrame::showAssetBrowserForPools(std::vector<ResourcePool*> pools, int resourceType) {
  1268. if(!projectManager->getActiveProject()) {
  1269. return;
  1270. }
  1271. assetBrowser->setResourcePools(pools, resourceType);
  1272. assetBrowser->setBrowseMode(AssetBrowser::BROWSE_MODE_RESOURCES);
  1273. showModal(assetBrowser);
  1274. }
  1275. void PolycodeFrame::showAssetBrowser(std::vector<String> extensions) {
  1276. if(!projectManager->getActiveProject()) {
  1277. return;
  1278. }
  1279. assetBrowser->setProject(projectManager->getActiveProject());
  1280. assetBrowser->setExtensions(extensions);
  1281. assetBrowser->setBrowseMode(AssetBrowser::BROWSE_MODE_FILES);
  1282. showModal(assetBrowser);
  1283. }
  1284. void PolycodeFrame::handleEvent(Event *event) {
  1285. if(event->getDispatcher() == activeProjectFrame) {
  1286. if(event->getEventCode() == Event::CHANGE_EVENT) {
  1287. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  1288. }
  1289. }
  1290. if(event->getDispatcher() == activeProjectFrame) {
  1291. if(event->getEventCode() == UIEvent::CLOSE_EVENT) {
  1292. dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
  1293. }
  1294. }
  1295. if(event->getDispatcher() == currentProjectSelector) {
  1296. PolycodeProject *project = (PolycodeProject*)currentProjectSelector->getSelectedItem()->data;
  1297. projectManager->setActiveProject(project);
  1298. }
  1299. if(event->getDispatcher() == editorManager) {
  1300. updateFileSelector();
  1301. }
  1302. if(event->getDispatcher() == topBarBg) {
  1303. CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
  1304. }
  1305. if(event->getDispatcher() == projectManager) {
  1306. currentProjectSelector->clearItems();
  1307. for(int i=0; i < projectManager->getProjectCount(); i++) {
  1308. PolycodeProject *project = projectManager->getProjectByIndex(i);
  1309. currentProjectSelector->addComboItem(project->getProjectName(), (void*) project);
  1310. if(projectManager->getActiveProject() == project) {
  1311. currentProjectSelector->setSelectedIndex(i, true);
  1312. }
  1313. }
  1314. }
  1315. if(event->getDispatcher() == aboutOKButton && event->getEventType() == "UIEvent") {
  1316. hideModal();
  1317. }
  1318. if(event->getDispatcher() == fileDialog && event->getEventType() == "UIEvent") {
  1319. fileBrowserRoot->removeChild(fileDialog);
  1320. fileDialogBlocker->visible = false;
  1321. fileDialogBlocker->enabled = false;
  1322. }
  1323. if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
  1324. switch(event->getEventCode()) {
  1325. case InputEvent::EVENT_MOUSEUP:
  1326. if(isDragging) {
  1327. /*
  1328. if(editorHolder->currentEditor) {
  1329. InputEvent *inputEvent = (InputEvent*) event;
  1330. Number posX = inputEvent->mousePosition.x;
  1331. Number posY = inputEvent->mousePosition.y;
  1332. editorHolder->currentEditor->handleDroppedFile(draggedFile, posX, posY);
  1333. }
  1334. */
  1335. }
  1336. isDragging = false;
  1337. dragEntity->visible = false;
  1338. break;
  1339. case InputEvent::EVENT_MOUSEMOVE:
  1340. if(isDragging) {
  1341. //dragEntity->setPosition(((InputEvent*)event)->mousePosition);
  1342. }
  1343. break;
  1344. // TODO: add in key combos to switch editors in reverse order
  1345. case InputEvent::EVENT_KEYDOWN:
  1346. CoreInput *input = CoreServices::getInstance()->getCore()->getInput();
  1347. if (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER)) {
  1348. InputEvent *inEv = (InputEvent*)event;
  1349. // commenting this out for now until issue with KEY_BACKQUOTE is figured out
  1350. /*if (inEv->getKey() == KEY_BACKQUOTE) {
  1351. showNextEditor();
  1352. }*/
  1353. if (inEv->getKey() == KEY_SLASH) {
  1354. displayFilePathInSelector = (displayFilePathInSelector ? false : true);
  1355. updateFileSelector();
  1356. }
  1357. } else if (input->getKeyState(KEY_LCTRL) || input->getKeyState(KEY_RCTRL)) {
  1358. // InputEvent *inEv = (InputEvent*)event;
  1359. // if (inEv->getKey() == KEY_TAB) {
  1360. // showNextEditor();
  1361. // } else if (inEv->getKey() == KEY_SLASH) {
  1362. // displayFilePathInSelector = (displayFilePathInSelector ? false : true);
  1363. // updateFileSelector();
  1364. // }
  1365. }
  1366. break;
  1367. }
  1368. }
  1369. /*
  1370. if(event->getDispatcher() == projectBrowser->treeContainer->getRootNode()) {
  1371. switch (event->getEventCode()) {
  1372. case UITreeEvent::DRAG_START_EVENT:
  1373. {
  1374. UITreeEvent *treeEvent = (UITreeEvent*) event;
  1375. BrowserUserData *data = (BrowserUserData*)treeEvent->selection->getUserData();
  1376. draggedFile = data->fileEntry;
  1377. dragLabel->setText(data->fileEntry.name);
  1378. dragEntity->visible = true;
  1379. isDragging = true;
  1380. // printf("START DRAG: %s\n", data->fileEntry.name.c_str());
  1381. }
  1382. break;
  1383. }
  1384. }
  1385. */
  1386. if(event->getDispatcher() == modalChild) {
  1387. if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLOSE_EVENT) {
  1388. willHideModal = true;
  1389. }
  1390. } else {
  1391. if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT && event->getDispatcher() == newProjectButton) {
  1392. showModal(newProjectWindow);
  1393. newProjectWindow->ResetForm();
  1394. }
  1395. if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT

Large files files are truncated, but you can click here to view the full file