int DynamicLayout::heightForWidth(int width) const { int height = reLayout(QRect(0, 0, width, 0), true); return height; }
void DynamicLayout::setGeometry(const QRect& rect) { QLayout::setGeometry(rect); reLayout(rect, false); }
void Button::parse(XmlReader& reader) { // parse xml attributes XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* attribute = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(attribute, value)) { continue; } else if(strcmp(attribute, "width") == 0) { if(sscanf(value, "%f", &fixWidth) != 1) { std::stringstream msg; msg << "Couldn't parse width '" << value << "'."; throw std::runtime_error(msg.str()); } } else if(strcmp(attribute, "height") == 0) { if(sscanf(value, "%f", &fixHeight) != 1) { std::stringstream msg; msg << "Couldn't parse height '" << value << "'."; throw std::runtime_error(msg.str()); } } else if(strcmp(attribute, "lower") == 0) { lowerOnClick=true; } else if(strcmp(attribute, "direction") == 0) { // skip } else { std::cerr << "Skipping unknown attribute '" << attribute << "'.\n"; } } // we need 4 child components childs.assign(4, Child()); // parse contents of the xml-element bool parseTooltip = false; int depth = reader.getDepth(); fixWidth = -1; fixHeight = -1; while(reader.read() && reader.getDepth() > depth) { if(reader.getNodeType() == XML_READER_TYPE_ELEMENT) { std::string element = (const char*) reader.getName(); if(element == "image") { if(comp_normal().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_normal defined.\n"; setChildImage(comp_normal(), reader); } else if(element == "text") { if(comp_normal().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_normal defined.\n"; setChildText(comp_normal(), reader); } else if(element == "image-hover") { if(comp_hover().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_hover defined.\n"; setChildImage(comp_hover(), reader); } else if(element == "text-hover") { if(comp_hover().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_hover defined.\n"; setChildText(comp_hover(), reader); } else if(element == "image-clicked") { if(comp_clicked().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_clicked defined.\n"; setChildImage(comp_clicked(), reader); } else if(element == "text-clicked") { if(comp_clicked().getComponent() != 0) std::cerr << "Warning: more than 1 component for state " "comp_clicked defined.\n"; setChildText(comp_clicked(), reader); } else if(element == "image-caption") { if(comp_caption().getComponent() != 0) std::cerr << "Warning: more than 1 component for comp_caption " "defined.\n"; setChildImage(comp_caption(), reader); } else if(element == "text-caption") { if(comp_caption().getComponent() != 0) std::cerr << "Warning: more than 1 component for comp_caption " "defined.\n"; setChildText(comp_caption(), reader); } else if (element == "tooltip") { parseTooltip = true; } else { std::cerr << "Skipping unknown element '" << element << "'.\n"; } } else if(reader.getNodeType() == XML_READER_TYPE_END_ELEMENT) { std::string element = (const char*) reader.getName(); if(element == "tooltip") parseTooltip = false; } else if(reader.getNodeType() == XML_READER_TYPE_TEXT) { if(!parseTooltip) continue; const char* p = (const char*) reader.getValue(); // skip trailing spaces while(*p != 0 && isspace(static_cast<unsigned char>(*p))) ++p; bool lastspace = tooltip != ""; for( ; *p != 0; ++p) { if(isspace(static_cast<unsigned char>(*p))) { if(!lastspace) { lastspace = true; tooltip += ' '; } } else { lastspace = false; tooltip += *p; } } } } if(tooltip != "") { tooltip = GUI_TRANSLATE(tooltip); } if(comp_normal().getComponent() == 0) throw std::runtime_error("No component for state comp_normal defined."); reLayout(); }