//takes an XML element definition and creates an object from it GuiComponent* ThemeComponent::createElement(pugi::xml_node data, GuiComponent* parent) { std::string type = data.child("type").text().get(); if(type == "image") { std::string path = expandPath(data.child("path").text().get()); if(!boost::filesystem::exists(path)) { LOG(LogError) << "Error - theme image \"" << path << "\" does not exist."; return NULL; } std::string pos = data.child("pos").text().get(); std::string dim = data.child("dim").text().get(); std::string origin = data.child("origin").text().get(); bool tiled = data.child("tiled") != 0; //split position and dimension information std::string posX, posY; splitString(pos, ' ', &posX, &posY); std::string dimW, dimH; splitString(dim, ' ', &dimW, &dimH); std::string originX, originY; splitString(origin, ' ', &originX, &originY); //resolve to pixels from percentages/variables int x = (int)(resolveExp(posX) * Renderer::getScreenWidth()); int y = (int)(resolveExp(posY) * Renderer::getScreenHeight()); int w = (int)(resolveExp(dimW) * Renderer::getScreenWidth()); int h = (int)(resolveExp(dimH) * Renderer::getScreenHeight()); float ox = strToFloat(originX); float oy = strToFloat(originY); ImageComponent* comp = new ImageComponent(mWindow, x, y, "", w, h, true); comp->setOrigin(ox, oy); comp->setTiling(tiled); comp->setImage(path); addChild(comp); return comp; } LOG(LogError) << "Theme component type \"" << type << "\" unknown!"; return NULL; }
void selectionChanged() override { // we're only really interested in when the selection changes, regardless of if it was // clicked or not so we'll only override this method const File selectedFile (fileTree.getSelectedFile()); if (selectedFile.existsAsFile()) imagePreview.setImage (ImageCache::getFromFile (selectedFile)); // the image cahce is a handly way to load images from files or directly from memory and // will keep them hanging around for a few seconds in case they are requested elsewhere }
void SystemView::populate() { mEntries.clear(); for(auto it = SystemData::sSystemVector.begin(); it != SystemData::sSystemVector.end(); it++) { const std::shared_ptr<ThemeData>& theme = (*it)->getTheme(); Entry e; e.name = (*it)->getName(); e.object = *it; // make logo if(theme->getElement("system", "logo", "image")) { ImageComponent* logo = new ImageComponent(mWindow); logo->setMaxSize(Eigen::Vector2f(logoSize().x(), logoSize().y())); logo->applyTheme((*it)->getTheme(), "system", "logo", ThemeFlags::PATH); logo->setPosition((logoSize().x() - logo->getSize().x()) / 2, (logoSize().y() - logo->getSize().y()) / 2); // center e.data.logo = std::shared_ptr<GuiComponent>(logo); ImageComponent* logoSelected = new ImageComponent(mWindow); logoSelected->setMaxSize(Eigen::Vector2f(logoSize().x() * SELECTED_SCALE, logoSize().y() * SELECTED_SCALE * 0.70f)); logoSelected->applyTheme((*it)->getTheme(), "system", "logo", ThemeFlags::PATH); logoSelected->setPosition((logoSize().x() - logoSelected->getSize().x()) / 2, (logoSize().y() - logoSelected->getSize().y()) / 2); // center e.data.logoSelected = std::shared_ptr<GuiComponent>(logoSelected); }else{ // no logo in theme; use text TextComponent* text = new TextComponent(mWindow, (*it)->getName(), Font::get(FONT_SIZE_LARGE), 0x000000FF, ALIGN_CENTER); text->setSize(logoSize()); e.data.logo = std::shared_ptr<GuiComponent>(text); TextComponent* textSelected = new TextComponent(mWindow, (*it)->getName(), Font::get((int)(FONT_SIZE_LARGE * SELECTED_SCALE)), 0x000000FF, ALIGN_CENTER); textSelected->setSize(logoSize()); e.data.logoSelected = std::shared_ptr<GuiComponent>(textSelected); } // make background extras e.data.backgroundExtras = std::shared_ptr<ThemeExtras>(new ThemeExtras(mWindow)); e.data.backgroundExtras->setExtras(ThemeData::makeExtras((*it)->getTheme(), "system", mWindow)); this->add(e); } }
void handleAsyncUpdate() override { if (incomingImage.isValid()) lastSnapshot.setImage (incomingImage); }
void SystemView::populate() { mEntries.clear(); for(auto it = SystemData::sSystemVector.cbegin(); it != SystemData::sSystemVector.cend(); it++) { const std::shared_ptr<ThemeData>& theme = (*it)->getTheme(); if(mViewNeedsReload) getViewElements(theme); if((*it)->isVisible()) { Entry e; e.name = (*it)->getName(); e.object = *it; // make logo const ThemeData::ThemeElement* logoElem = theme->getElement("system", "logo", "image"); if(logoElem) { std::string path = logoElem->get<std::string>("path"); std::string defaultPath = logoElem->has("default") ? logoElem->get<std::string>("default") : ""; if((!path.empty() && ResourceManager::getInstance()->fileExists(path)) || (!defaultPath.empty() && ResourceManager::getInstance()->fileExists(defaultPath))) { ImageComponent* logo = new ImageComponent(mWindow, false, false); logo->setMaxSize(mCarousel.logoSize * mCarousel.logoScale); logo->applyTheme(theme, "system", "logo", ThemeFlags::PATH | ThemeFlags::COLOR); logo->setRotateByTargetSize(true); e.data.logo = std::shared_ptr<GuiComponent>(logo); } } if (!e.data.logo) { // no logo in theme; use text TextComponent* text = new TextComponent(mWindow, (*it)->getName(), Font::get(FONT_SIZE_LARGE), 0x000000FF, ALIGN_CENTER); text->setSize(mCarousel.logoSize * mCarousel.logoScale); text->applyTheme((*it)->getTheme(), "system", "logoText", ThemeFlags::FONT_PATH | ThemeFlags::FONT_SIZE | ThemeFlags::COLOR | ThemeFlags::FORCE_UPPERCASE | ThemeFlags::LINE_SPACING | ThemeFlags::TEXT); e.data.logo = std::shared_ptr<GuiComponent>(text); if (mCarousel.type == VERTICAL || mCarousel.type == VERTICAL_WHEEL) { text->setHorizontalAlignment(mCarousel.logoAlignment); text->setVerticalAlignment(ALIGN_CENTER); } else { text->setHorizontalAlignment(ALIGN_CENTER); text->setVerticalAlignment(mCarousel.logoAlignment); } } if (mCarousel.type == VERTICAL || mCarousel.type == VERTICAL_WHEEL) { if (mCarousel.logoAlignment == ALIGN_LEFT) e.data.logo->setOrigin(0, 0.5); else if (mCarousel.logoAlignment == ALIGN_RIGHT) e.data.logo->setOrigin(1.0, 0.5); else e.data.logo->setOrigin(0.5, 0.5); } else { if (mCarousel.logoAlignment == ALIGN_TOP) e.data.logo->setOrigin(0.5, 0); else if (mCarousel.logoAlignment == ALIGN_BOTTOM) e.data.logo->setOrigin(0.5, 1); else e.data.logo->setOrigin(0.5, 0.5); } Vector2f denormalized = mCarousel.logoSize * e.data.logo->getOrigin(); e.data.logo->setPosition(denormalized.x(), denormalized.y(), 0.0); // delete any existing extras for (auto extra : e.data.backgroundExtras) delete extra; e.data.backgroundExtras.clear(); // make background extras e.data.backgroundExtras = ThemeData::makeExtras((*it)->getTheme(), "system", mWindow); // sort the extras by z-index std::stable_sort(e.data.backgroundExtras.begin(), e.data.backgroundExtras.end(), [](GuiComponent* a, GuiComponent* b) { return b->getZIndex() > a->getZIndex(); }); this->add(e); } } if (mEntries.size() == 0) { // Something is wrong, there is not a single system to show, check if UI mode is not full if (!UIModeController::getInstance()->isUIModeFull()) { Settings::getInstance()->setString("UIMode", "Full"); mWindow->pushGui(new GuiMsgBox(mWindow, "The selected UI mode has nothing to show,\n returning to UI mode: FULL", "OK", nullptr)); } } }