void ExampleBrowserWindow::handleEvent(Event *event) { if(event->getEventType() == "UIEvent") { if(event->getEventCode() == UIEvent::CLICK_EVENT) { UITree *node = templateContainer->getRootNode()->getSelectedNode(); ExampleTemplateUserData *data = (ExampleTemplateUserData*)node->getUserData(); if(event->getDispatcher() == okButton && data->type == 1) { dispatchEvent(new UIEvent(), UIEvent::OK_EVENT); } if(event->getDispatcher() == cancelButton) { dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT); } } } if(event->getEventType() == "UITreeEvent" && event->getEventCode() == UITreeEvent::SELECTED_EVENT) { if(event->getDispatcher() == templateContainer->getRootNode()) { UITreeEvent *treeEvent = (UITreeEvent*) event; ExampleTemplateUserData *data = (ExampleTemplateUserData *)treeEvent->selection->getUserData(); if(data->type == 1) templateFolder = data->templateFolder; } } UIWindow::handleEvent(event); }
void AssetBrowser::setResourcePools(std::vector<ResourcePool*> pools, int resourceFilter) { if(this->resourceFilter != resourceFilter) { assetList->clearList(); } this->resourceFilter = resourceFilter; templateContainer->getRootNode()->clearTree(); templateContainer->getRootNode()->setLabelText("Resource pools"); FolderUserData *userData = (FolderUserData*) templateContainer->getRootNode()->getUserData(); if(userData) { delete userData; } templateContainer->getRootNode()->setUserData(NULL); for(int i=0; i < pools.size(); i++) { ResourcePool *pool = pools[i]; UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", pool->getName(), (void*)pool); newChild->setUserData(pool); } }
void AssetBrowser::setProject(PolycodeProject *project) { if(project == currentProject) { return; } templateContainer->getRootNode()->clearTree(); vector<OSFileEntry> templates = OSBasics::parseFolder(project->getRootFolder(), false); templateContainer->getRootNode()->setLabelText(project->getProjectName()); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", entry.name, NULL); FolderUserData *data = new FolderUserData(); data->type = 0; data->folderPath = entry.fullPath; newChild->setUserData(data); newChild->toggleCollapsed(); parseFolderIntoTree(newChild, entry); } } currentProject = project; }
void parseOpenNodesIntoEntry(ObjectEntry *entry, UITree *node, bool addNewNode) { bool hasOpenNodes = false; for(int i=0; i < node->getNumTreeChildren(); i++) { UITree *child = node->getTreeChild(i); if(!child->isCollapsed()) { hasOpenNodes = true; } } if(!hasOpenNodes) { return; } ObjectEntry *childNodes = entry; if(addNewNode) { childNodes = entry->addChild("child_nodes"); } for(int i=0; i < node->getNumTreeChildren(); i++) { UITree *child = node->getTreeChild(i); if(!child->isCollapsed()) { ObjectEntry *newEntry = childNodes->addChild("open_node"); newEntry->addChild("name", child->getLabelText()); parseOpenNodesIntoEntry(newEntry, child, true); } } }
NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 580, 280) { defaultTemplateTree = NULL; Config *conf = CoreServices::getInstance()->getConfig(); String fontName = conf->getStringValue("Polycode", "uiDefaultFontName"); closeOnEscape = true; templateContainer = new UITreeContainer("boxIcon.png", L"File Templates", 250, 300-topPadding-padding-padding); FileTemplateUserData *data = new FileTemplateUserData(); data->type = 0; templateContainer->getRootNode()->setUserData(data); addChild(templateContainer); templateContainer->setPosition(padding,topPadding+padding); templateContainer->getRootNode()->toggleCollapsed(); templateContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT); templateContainer->getRootNode()->addEventListener(this, UITreeEvent::EXECUTED_EVENT); vector<OSFileEntry> templates = OSBasics::parseFolder(RESOURCE_PATH"FileTemplates", false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", entry.name, NULL); FileTemplateUserData *data = new FileTemplateUserData(); data->type = 0; newChild->setUserData(data); newChild->toggleCollapsed(); parseTemplatesIntoTree(newChild, entry); } } UILabel *label2 = new UILabel(L"NEW FILE NAME (NO EXTENSION)", 18, "section", Label::ANTIALIAS_FULL); label2->color.a = 1.0; label2->getLabel()->setColorForRange(Color(),0, 12); label2->getLabel()->setColorForRange(Color(0.6, 0.6, 0.6, 1.0),12, 40); label2->setText("NEW FILE NAME (NO EXTENSION)"); addChild(label2); label2->setPosition(padding+270, templateContainer->getPosition().y-5); fileNameInput = new UITextInput(false, 550-padding-210-padding-padding, 12); addFocusChild(fileNameInput); fileNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+30); cancelButton = new UIButton(L"Cancel", 100); cancelButton->addEventListener(this, UIEvent::CLICK_EVENT); addFocusChild(cancelButton); cancelButton->setPosition(600-100-padding-100-10, 265); okButton = new UIButton(L"Create File", 100); okButton->addEventListener(this, UIEvent::CLICK_EVENT); addFocusChild(okButton); okButton->setPosition(600-100-padding, 265); }
// RECURSIVE HELPER FUNCTIONS // // used in KEY_UP tree nav UITree *UITreeContainer::findLastOpenNode(UITree *tree) { if (!tree->hasTreeChildren() || tree->isCollapsed()) return tree; UITree *t = tree->getTreeChild(tree->getNumTreeChildren()-1); if (t->isCollapsed() || !t->hasTreeChildren()) return t; else return findLastOpenNode(t); }
UITree *PolycodeProjectBrowser::nodeHasName(UITree *node, String name) { for(int i=0; i < node->getNumTreeChildren(); i++) { UITree *projectChild = node->getTreeChild(i); if(projectChild->getLabelText() == name) { return projectChild; } } return NULL; }
UITree::~UITree() { for(int i=0; i < treeChildren.size(); i++) { UITree *child = treeChildren[i]; removeChild(child); child->removeEventListener(this, UITreeEvent::NEED_REFRESH_EVENT); child->removeEventListener(this, UITreeEvent::SELECTED_EVENT); child->removeEventListener(this, UITreeEvent::EXECUTED_EVENT); //treeChildren.erase(treeChildren.begin()+i); delete child; } }
void PolycodeProjectBrowser::addProject(PolycodeProject *project) { UITree *projectTree = treeContainer->getRootNode()->addTreeChild("projectIcon.png", project->getProjectName(), (void*) project); projectTree->toggleCollapsed(); BrowserUserData *data = new BrowserUserData(); data->type = 3; data->parentProject = project; projectTree->setUserData((void*) data) ; parseFolderIntoNode(projectTree, project->getRootFolder(), project); }
void CurveEditor::addCurve(String name, BezierCurve *curve, Color curveColor) { UITree *newNode = treeContainer->getRootNode()->addTreeChild("Images/curve_icon.png", name); EditCurve *editCurve = new EditCurve(curve, curveColor); addChild(editCurve); editCurve->setPosition(160, 63); curves.push_back(editCurve); newNode->setUserData((void*) editCurve); }
NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 480, 280) { defaultTemplateTree = NULL; Config *conf = CoreServices::getInstance()->getConfig(); String fontName = conf->getStringValue("Polycode", "uiDefaultFontName"); int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize"); closeOnEscape = true; templateContainer = new UITreeContainer("boxIcon.png", L"File Templates", 200, 300-topPadding-padding-padding); FileTemplateUserData *data = new FileTemplateUserData(); data->type = 0; templateContainer->getRootNode()->setUserData(data); addChild(templateContainer); templateContainer->setPosition(padding,topPadding+padding); templateContainer->getRootNode()->toggleCollapsed(); templateContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT); vector<OSFileEntry> templates = OSBasics::parseFolder(RESOURCE_PATH"FileTemplates", false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", entry.name, NULL); FileTemplateUserData *data = new FileTemplateUserData(); data->type = 0; newChild->setUserData(data); newChild->toggleCollapsed(); parseTemplatesIntoTree(newChild, entry); } } ScreenLabel *label2 = new ScreenLabel(L"New File Name (without extension)", fontSize, fontName, Label::ANTIALIAS_FULL); addChild(label2); label2->setPosition(padding+220, templateContainer->getPosition().y); fileNameInput = new UITextInput(false, 500-padding-220-padding-padding, 12); addChild(fileNameInput); fileNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()+2); cancelButton = new UIButton(L"Cancel", 100); cancelButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(cancelButton); cancelButton->setPosition(500-100-padding-100-10, 265); okButton = new UIButton(L"Create File", 100); okButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(okButton); okButton->setPosition(500-100-padding, 265); }
void UITree::clearTree() { for(int i=0; i < treeChildren.size(); i++) { UITree *child = treeChildren[i]; removeChild(child); child->removeEventListener(this, UITreeEvent::NEED_REFRESH_EVENT); child->removeEventListener(this, UITreeEvent::SELECTED_EVENT); child->removeEventListener(this, UITreeEvent::EXECUTED_EVENT); delete child; } treeChildren.clear(); }
ExampleBrowserWindow::ExampleBrowserWindow() : UIWindow(L"Example Browser", 320, 300){ templateFolder = ""; closeOnEscape = true; defaultTemplateTree = NULL; Config *conf = CoreServices::getInstance()->getConfig(); String fontName = conf->getStringValue("Polycode", "uiDefaultFontName"); int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize"); templateContainer = new UITreeContainer("boxIcon.png", L"Examples", 300, 300-topPadding-padding-padding- 40); ExampleTemplateUserData *data = new ExampleTemplateUserData(); data->type = 0; templateContainer->getRootNode()->setUserData(data); addChild(templateContainer); templateContainer->setPosition(padding,topPadding+padding); templateContainer->getRootNode()->toggleCollapsed(); templateContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT); vector<OSFileEntry> templates = OSBasics::parseFolder(RESOURCE_PATH"Standalone/Examples/Lua", false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", entry.name, NULL); ExampleTemplateUserData *data = new ExampleTemplateUserData(); data->type = 0; newChild->setUserData(data); if(i == 0) { newChild->toggleCollapsed(); } parseTemplatesIntoTree(newChild, entry); } } cancelButton = new UIButton(L"Cancel", 100); cancelButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(cancelButton); cancelButton->setPosition(300-100-padding-80-10, 265); okButton = new UIButton(L"Open Example", 100); okButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(okButton); okButton->setPosition(300-80-padding, 265); }
void AssetBrowser::parseFolderIntoTree(UITree *tree, OSFileEntry folder) { vector<OSFileEntry> templates = OSBasics::parseFolder(folder.fullPath, false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = tree->addTreeChild("folder.png", entry.nameWithoutExtension, NULL); FolderUserData *data = new FolderUserData(); data->type = 1; data->folderPath = entry.fullPath; newChild->setUserData(data); parseFolderIntoTree(newChild, entry); } } }
void PolycodeProjectBrowser::refreshProject(PolycodeProject *project) { UITree *projectTree = treeContainer->getRootNode(); for(int i=0; i < projectTree->getNumTreeChildren(); i++) { UITree *projectChild = projectTree->getTreeChild(i); BrowserUserData *userData = (BrowserUserData*)projectChild->getUserData(); if(userData->parentProject == project) { parseFolderIntoNode(projectChild, project->getRootFolder(), project); return; } } }
void NewProjectWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) { vector<OSFileEntry> templates = OSBasics::parseFolder(folder.fullPath, false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = tree->addTreeChild("templateIcon.png", entry.name, NULL); TemplateUserData *data = new TemplateUserData(); data->type = 1; data->templateFolder = entry.fullPath; newChild->setUserData(data); if(entry.name == "Empty Project") { defaultTemplateTree = newChild; newChild->setSelected(); } } } }
void NewFileWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) { vector<OSFileEntry> templates = OSBasics::parseFolder(folder.fullPath, false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type != OSFileEntry::TYPE_FOLDER) { UITree *newChild = tree->addTreeChild("templateIcon.png", entry.nameWithoutExtension, NULL); FileTemplateUserData *data = new FileTemplateUserData(); data->type = 1; data->templatePath = entry.fullPath; newChild->setUserData(data); if(entry.name == "LUA Source File.lua") { defaultTemplateTree = newChild; newChild->setSelected(); } } } }
void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath, PolycodeProject *parentProject) { vector<OSFileEntry> files = OSBasics::parseFolder(spath, false); // check if files got deleted for(int i=0; i < node->getNumTreeChildren(); i++) { UITree *projectChild = node->getTreeChild(i); if(!listHasFileEntry(files, ((BrowserUserData*)projectChild->getUserData())->fileEntry)) { node->removeTreeChild(projectChild); } } for(int i=0; i < files.size(); i++) { OSFileEntry entry = files[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *existing = nodeHasName(node, entry.name); if(!existing) { BrowserUserData *data = new BrowserUserData(); data->fileEntry = entry; UITree *newChild = node->addTreeChild("folder.png", entry.name, (void*) data); data->type = 2; data->parentProject = parentProject; parseFolderIntoNode(newChild, entry.fullPath, parentProject); } else { parseFolderIntoNode(existing, entry.fullPath, parentProject); } } else { if(!nodeHasName(node, entry.name)) { BrowserUserData *data = new BrowserUserData(); data->fileEntry = entry; data->type = 1; data->parentProject = parentProject; node->addTreeChild("file.png", entry.name, (void*) data); } } } }
UITree *UITree::addTreeChild(String icon, String text, void *userData) { UITree *newTree = new UITree(icon, text, treeWidth, treeOffset+11); newTree->setUserData(userData); addChild(newTree); newTree->setParent(this); newTree->addEventListener(this, UITreeEvent::NEED_REFRESH_EVENT); newTree->addEventListener(this, UITreeEvent::SELECTED_EVENT); newTree->addEventListener(this, UITreeEvent::EXECUTED_EVENT); newTree->addEventListener(this, UITreeEvent::DRAG_START_EVENT); treeChildren.push_back(newTree); refreshTree(); return newTree; }
void PolycodeProjectBrowser::removeProject(PolycodeProject *project) { UITree *projectTree = treeContainer->getRootNode(); for(int i=0; i < projectTree->getNumTreeChildren(); i++) { UITree *projectChild = projectTree->getTreeChild(i); BrowserUserData *userData = (BrowserUserData*)projectChild->getUserData(); if(userData->parentProject == project) { projectTree->removeTreeChild(projectChild); return; } } }
void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) { if (hasFocus) { // KEYBOARD NAV STUFF // TODO: add ability to jump to prev/next sibling via holding down some button // if (keyNavigable) { enum { NONE, UP, DOWN } scrollDir = NONE; UITree *currentSelection = getRootNode()->getSelectedNode(); if (!currentSelection) return; UITree *parent = currentSelection->getParent(); // - select parent if currently selected node is first in the tree // - else, select the last opened node in a sibling above if (key == KEY_UP) { if (parent) { for (int i=0; i < parent->getNumTreeChildren(); i++) { if (parent->getTreeChild(i) == currentSelection) { if (i == 0) parent->setSelected(true); else findLastOpenNode((parent->getTreeChild(i-1)))->setSelected(true); scrollDir = UP; break; } } } } // - select first child of currently selected if expanded and has children // - or select next sibling // - else, select the next sibling of some ancestor node if (key == KEY_DOWN) { if (currentSelection == getRootNode()) parent = getRootNode(); if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed()) { currentSelection->getTreeChild(0)->setSelected(true); scrollDir = DOWN; } else { for (int i=0; i < parent->getNumTreeChildren(); i++) { if (parent->getTreeChild(i) == currentSelection) { if (i == parent->getNumTreeChildren()-1) { UITree *psib = findNextParentSibling(parent); if (psib) psib->setSelected(true); } else { parent->getTreeChild(i+1)->setSelected(true); } scrollDir = DOWN; break; } } } } if (key == KEY_LEFT) { if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed()) currentSelection->toggleCollapsed(); else if (parent) { parent->setSelected(true); scrollDir = UP; } } if (key == KEY_RIGHT) { if (currentSelection->hasTreeChildren()) { if (currentSelection->isCollapsed()) currentSelection->toggleCollapsed(); } } if (scrollDir != NONE) scrollToNode(getRootNode()->getSelectedNode(), (scrollDir == UP) ? true : false); } // // END KEYBOARD NAV STUFF } }
NewProjectWindow::NewProjectWindow() : UIWindow(L"Create New Project", 480, 280){ templateFolder = ""; closeOnEscape = true; defaultTemplateTree = NULL; Config *conf = CoreServices::getInstance()->getConfig(); String fontName = conf->getStringValue("Polycode", "uiDefaultFontName"); int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize"); templateContainer = new UITreeContainer("boxIcon.png", L"Templates", 200, 300-topPadding-padding-padding); TemplateUserData *data = new TemplateUserData(); data->type = 0; templateContainer->getRootNode()->setUserData(data); addChild(templateContainer); templateContainer->setPosition(padding,topPadding+padding); templateContainer->getRootNode()->toggleCollapsed(); templateContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT); vector<OSFileEntry> templates = OSBasics::parseFolder(RESOURCE_PATH"ProjectTemplates", false); for(int i=0; i < templates.size(); i++) { OSFileEntry entry = templates[i]; if(entry.type == OSFileEntry::TYPE_FOLDER) { UITree *newChild = templateContainer->getRootNode()->addTreeChild("folder.png", entry.name, NULL); TemplateUserData *data = new TemplateUserData(); data->type = 0; newChild->setUserData(data); if(i == 0) { newChild->toggleCollapsed(); } parseTemplatesIntoTree(newChild, entry); } } ScreenLabel *label2 = new ScreenLabel(L"PROJECT NAME", 22, "section", Label::ANTIALIAS_FULL); label2->color.a = 0.4; addChild(label2); label2->setPosition(padding+220, templateContainer->getPosition().y-5); projectNameInput = new UITextInput(false, 500-padding-210-padding-padding, 12); addChild(projectNameInput); projectNameInput->setPosition(label2->getPosition().x, label2->getPosition().y + 30); ScreenLabel *label3 = new ScreenLabel(L"PROJECT LOCATION", 22, "section", Label::ANTIALIAS_FULL); label3->color.a = 0.4; addChild(label3); label3->setPosition(padding+220, templateContainer->getPosition().y+60); projectLocationInput = new UITextInput(false, 500-padding-210-padding-padding, 12); addChild(projectLocationInput); projectLocationInput->setPosition(label3->getPosition().x, label3->getPosition().y+30); locationSelectButton = new UIButton(L"Choose...", 100); locationSelectButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(locationSelectButton); locationSelectButton->setPosition(500-103-padding, projectLocationInput->getPosition().y+projectLocationInput->getHeight()+10); cancelButton = new UIButton(L"Cancel", 100); cancelButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(cancelButton); cancelButton->setPosition(500-100-padding-100-10, 265); okButton = new UIButton(L"Create Project", 100); okButton->addEventListener(this, UIEvent::CLICK_EVENT); addChild(okButton); okButton->setPosition(500-100-padding, 265); }