std::string _test_vertical_layout() { struct LayoutProperties layoutProperties; layoutPropertiesInitialize(&layoutProperties); struct Element* e1 = createElement(composite); // Device - top level window layoutProperties.width.valueType = fill; layoutProperties.width.value = NAN; layoutProperties.height.valueType = fill; layoutProperties.height.value = NAN; struct Element* e2 = createElement(composite); measureNodeForVerticalLayout(layoutProperties, e2); layoutProperties.width = {fixed, 100}; layoutProperties.height = {fixed, 100}; struct Element* e3 = createElement(composite); measureNodeForVerticalLayout(layoutProperties, e3); addChildElement(e1, e2); addChildElement(e2, e3); doVerticalLayout((*e1)._children, 449, 662, false, false); ut_assert("error, absolute position top e2", (*e3)._measuredTop == 281); ut_assert("error, absolute position left e2", (*e3)._measuredLeft == 174.5); ut_assert("error, absolute width e2", (*e3)._measuredWidth == 100); ut_assert("error, absolute height e2", (*e3)._measuredHeight == 100); ut_assert("error, absolute position top e3", (*e2)._measuredTop == 0); ut_assert("error, absolute position left e3", (*e2)._measuredLeft == 0); ut_assert("error, absolute position width e3", (*e2)._measuredWidth == 449); ut_assert("error, absolute position height e3", (*e2)._measuredHeight == 662); return ""; }
void nodeAddChild(struct Node* parent, struct Node* child) { child->parent = parent; if (parent->lastChild) { child->prev = parent->lastChild; parent->lastChild->next = child; } else { parent->firstChild = child; } parent->lastChild = child; addChildElement(&parent->element, &child->element); }
GuiStatusBar::GuiStatusBar(const Context& context) : GuiStaticGraphicElement(context), textElement(context) { const IGraphic* backgroundGraphic = context.graphicsMgr->getGraphicSet("statusbar")->getStatic()->getGraphic(); setPosition(0, 734); setGraphic(backgroundGraphic); constexpr int paddingX = 15; textElement.setCoords(paddingX, 0, backgroundGraphic->getWidth() - 2*paddingX, backgroundGraphic->getHeight()); textElement.setColor(&Color::white); textElement.setFontName("DroidSans-Bold.ttf"); textElement.setFontSize(14); textElement.setAlign(RENDERTEXT_HALIGN_RIGHT | RENDERTEXT_VALIGN_MIDDLE); addChildElement(&textElement); }
GuiPanelHeader::GuiPanelHeader(const Context& context) : GuiStaticGraphicElement(context) { // Größe ist fix width = 248; height = 40; setGraphic(context.graphicsMgr->getGraphicSet("panel-header")->getStatic()->getGraphic()); textElement = new GuiStaticTextElement(context); textElement->setCoords(35, 10, 178, 18); textElement->setColor(&Color::lightBrown); textElement->setShadowColor(&Color::black); textElement->setFontName("DroidSans-Bold.ttf"); textElement->setFontSize(14); textElement->setAlign(RENDERTEXT_HALIGN_CENTER | RENDERTEXT_VALIGN_MIDDLE); addChildElement(textElement); }
int main(int argc, char* argv[]) { if (argc != 3) { std::cerr << "usage: PListMerger" << " <first-plist-content>" << " <second-plist-content>" << std::endl; return 1; } const std::vector<std::string> args{argv, argv + argc}; const juce::ScopedPointer<juce::XmlElement> firstPlistElement = juce::XmlDocument::parse(args.at(1)); if (!firstPlistElement || !firstPlistElement->hasTagName("plist")) { std::cerr << "Invalid first plist content, expected <plist> element" << std::endl; return 1; } const auto firstDictElement = firstPlistElement->getChildByName("dict"); if (!firstDictElement) { std::cerr << "Invalid first plist content, expected <dict> element" << std::endl; return 1; } std::vector<std::string> keysInFirstPlist; for (auto childElement = firstDictElement->getFirstChildElement(); childElement != nullptr; childElement = childElement->getNextElement()) { if (childElement->getTagName() != "key" || childElement->getNumChildElements() != 1 || !childElement->getFirstChildElement()->isTextElement()) { std::cerr << "Invalid first plist content, expected <key> element with only one " "text child element" << std::endl; return 1; } const auto key = childElement->getFirstChildElement()->getText().toStdString(); if (std::find(keysInFirstPlist.begin(), keysInFirstPlist.end(), key) != keysInFirstPlist.end()) { std::cerr << "Invalid first plist content, duplicated key \"" << key << "\"" << std::endl; return 1; } keysInFirstPlist.push_back(key); childElement = childElement->getNextElement(); if (childElement == nullptr) { std::cerr << "Invalid first plist content, missing value associated with key \"" << key << "\"" << std::endl; return 1; } } const juce::ScopedPointer<juce::XmlElement> secondPlistElement = juce::XmlDocument::parse(args.at(2)); if (!secondPlistElement || !secondPlistElement->hasTagName("plist")) { std::cerr << "Invalid second plist content, expected <plist> element" << std::endl; return 1; } const auto secondDictElement = secondPlistElement->getChildByName("dict"); if (!secondDictElement) { std::cerr << "Invalid second plist content, expected <dict> element" << std::endl; return 1; } for (auto childElement = secondDictElement->getFirstChildElement(); childElement != nullptr; childElement = childElement->getNextElement()) { if (childElement->getTagName() != "key" || childElement->getNumChildElements() != 1 || !childElement->getFirstChildElement()->isTextElement()) { std::cerr << "Invalid second plist content, expected <key> element with only one " "text child element" << std::endl; return 1; } const auto key = childElement->getFirstChildElement()->getText().toStdString(); const auto isKeyAlreadyInFirstPlist = std::find(keysInFirstPlist.begin(), keysInFirstPlist.end(), key) != keysInFirstPlist.end(); if (!isKeyAlreadyInFirstPlist) { firstDictElement->addChildElement(new juce::XmlElement(*childElement)); } childElement = childElement->getNextElement(); if (childElement == nullptr) { std::cerr << "Invalid second plist content, missing value associated with key \"" << key << "\"" << std::endl; return 1; } if (!isKeyAlreadyInFirstPlist) { firstDictElement->addChildElement(new juce::XmlElement(*childElement)); } } std::cout << firstPlistElement->createDocument(juce::String{}, false, false) << std::flush; return 0; }