bool MythUIStateType::ParseElement( const QString &filename, QDomElement &element, bool showWarnings) { QMap<QString, QString> dependsMap; if (element.tagName() == "showempty") m_ShowEmpty = parseBool(element); else if (element.tagName() == "state") { QString name = element.attribute("name", ""); QString type = element.attribute("type", ""); QString statename; if (!type.isEmpty()) statename = type; else statename = name; element.setAttribute("name", statename); MythUIGroup *uitype = dynamic_cast<MythUIGroup *> (ParseUIType(filename, element, "group", this, NULL, showWarnings, dependsMap)); if (!type.isEmpty()) { StateType stype = None; if (type == "off") stype = Off; else if (type == "half") stype = Half; else if (type == "full") stype = Full; if (uitype && !m_ObjectsByState.contains((int)stype)) AddObject(stype, uitype); } else if (!name.isEmpty()) { if (uitype && !m_ObjectsByName.contains(name)) AddObject(name, uitype); } } else { return MythUIType::ParseElement(filename, element, showWarnings); } return true; }
bool XMLParseBase::doLoad(const QString &windowname, MythUIType *parent, const QString &filename, bool onlywindows, bool showWarnings) { QDomDocument doc; QFile f(filename); if (!f.open(QIODevice::ReadOnly)) return false; QString errorMsg; int errorLine = 0; int errorColumn = 0; if (!doc.setContent(&f, false, &errorMsg, &errorLine, &errorColumn)) { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("Location: '%1' @ %2 column: %3" "\n\t\t\tError: %4") .arg(qPrintable(filename)).arg(errorLine).arg(errorColumn) .arg(qPrintable(errorMsg))); f.close(); return false; } f.close(); QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == "include") { QString include = getFirstText(e); if (!include.isEmpty()) LoadBaseTheme(include); } if (onlywindows && e.tagName() == "window") { QString name = e.attribute("name", ""); if (name.isEmpty()) { VERBOSE_XML(VB_IMPORTANT, filename, e, LOC_ERR + "Window needs a name"); return false; } if (name == windowname) { ParseChildren(filename, e, parent, showWarnings); return true; } } if (!onlywindows) { QString type = e.tagName(); if (type == "font" || type == "fontdef") { bool global = (GetGlobalObjectStore() == parent); MythFontProperties *font = MythFontProperties::ParseFromXml( filename, e, parent, global, showWarnings); if (!global && font) { QString name = e.attribute("name"); parent->AddFont(name, font); } delete font; } else if (type == "imagetype" || type == "textarea" || type == "group" || type == "textedit" || type == "button" || type == "buttonlist" || type == "buttonlist2" || type == "buttontree" || type == "spinbox" || type == "checkbox" || type == "statetype" || type == "window" || type == "clock" || type == "progressbar" || type == "webbrowser" || type == "guidegrid" || type == "shape" || type == "editbar" || type == "video") { ParseUIType(filename, e, type, parent, NULL, showWarnings); } else { VERBOSE_XML(VB_IMPORTANT, filename, e, LOC_ERR + "Unknown widget type"); } } } n = n.nextSibling(); } if (onlywindows) return false; return true; }
MythUIType *XMLParseBase::ParseUIType( const QString &filename, QDomElement &element, const QString &type, MythUIType *parent, MythScreenType *screen, bool showWarnings) { QString name = element.attribute("name", ""); if (name.isEmpty()) { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + "This element requires a name"); return NULL; } MythUIType *olduitype = NULL; // check for name in immediate parent as siblings cannot share names if (parent && parent->GetChild(name)) { // if we're the global object store, assume it's just a theme overriding // the defaults.. if (parent == GetGlobalObjectStore()) return NULL; // Reuse the existing child and reparse olduitype = parent->GetChild(name); } MythUIType *uitype = NULL; MythUIType *base = NULL; QString inherits = element.attribute("from", ""); if (!inherits.isEmpty()) { if (parent) base = parent->GetChild(inherits); // might remove this if (screen && !base) base = screen->GetChild(inherits); if (!base) base = GetGlobalObjectStore()->GetChild(inherits); if (!base) { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + QString( "Couldn't find object '%1' to inherit '%2' from") .arg(inherits).arg(name)); return NULL; } } if (type == "imagetype") uitype = new MythUIImage(parent, name); else if (type == "textarea") uitype = new MythUIText(parent, name); else if (type == "group") uitype = new MythUIGroup(parent, name); else if (type == "textedit") uitype = new MythUITextEdit(parent, name); else if (type == "button") uitype = new MythUIButton(parent, name); else if (type == "buttonlist2" || type == "buttonlist") uitype = new MythUIButtonList(parent, name); else if (type == "buttontree") uitype = new MythUIButtonTree(parent, name); else if (type == "spinbox") uitype = new MythUISpinBox(parent, name); else if (type == "checkbox") uitype = new MythUICheckBox(parent, name); else if (type == "statetype") uitype = new MythUIStateType(parent, name); else if (type == "clock") uitype = new MythUIClock(parent, name); else if (type == "progressbar") uitype = new MythUIProgressBar(parent, name); else if (type == "webbrowser") uitype = new MythUIWebBrowser(parent, name); else if (type == "guidegrid") uitype = new MythUIGuideGrid(parent, name); else if (type == "shape") uitype = new MythUIShape(parent, name); else if (type == "editbar") uitype = new MythUIEditBar(parent, name); else if (type == "video") uitype = new MythUIVideo(parent, name); else if (type == "window" && parent == GetGlobalObjectStore()) uitype = new MythScreenType(parent, name); else { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + "Unknown widget type."); return NULL; } if (!uitype) { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + "Failed to instantiate widget type."); return NULL; } if (olduitype) { if (typeid(*olduitype) != typeid(*uitype)) { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + QString("Duplicate name: '%1' in parent '%2'") .arg(name).arg(parent->objectName())); parent->DeleteChild(olduitype); } else { parent->DeleteChild(uitype); uitype = olduitype; } } if (base) { if (typeid(*base) != typeid(*uitype)) { VERBOSE_XML(VB_IMPORTANT, filename, element, LOC_ERR + QString("Type of new widget '%1' doesn't " "match old '%2'") .arg(name).arg(inherits)); parent->DeleteChild(uitype); return NULL; } else uitype->CopyFrom(base); } for (QDomNode child = element.firstChild(); !child.isNull(); child = child.nextSibling()) { QDomElement info = child.toElement(); if (!info.isNull()) { if (uitype->ParseElement(filename, info, showWarnings)) { } else if (info.tagName() == "font" || info.tagName() == "fontdef") { bool global = (GetGlobalObjectStore() == parent); MythFontProperties *font = MythFontProperties::ParseFromXml( filename, info, parent, global, showWarnings); if (!global && font) { QString name = info.attribute("name"); uitype->AddFont(name, font); } delete font; } else if (info.tagName() == "imagetype" || info.tagName() == "textarea" || info.tagName() == "group" || info.tagName() == "textedit" || info.tagName() == "button" || info.tagName() == "buttonlist" || info.tagName() == "buttonlist2" || info.tagName() == "buttontree" || info.tagName() == "spinbox" || info.tagName() == "checkbox" || info.tagName() == "statetype" || info.tagName() == "clock" || info.tagName() == "progressbar" || info.tagName() == "webbrowser" || info.tagName() == "guidegrid" || info.tagName() == "shape" || info.tagName() == "editbar" || info.tagName() == "video") { ParseUIType(filename, info, info.tagName(), uitype, screen, showWarnings); } else { VERBOSE_XML(VB_IMPORTANT, filename, info, LOC_ERR + "Unknown widget type."); } } } uitype->Finalize(); return uitype; }
void XMLParseBase::ParseChildren(const QString &filename, QDomElement &element, MythUIType *parent, bool showWarnings) { if (!parent) { VERBOSE(VB_IMPORTANT, "Parent is NULL"); return; } for (QDomNode child = element.firstChild(); !child.isNull(); child = child.nextSibling()) { QDomElement info = child.toElement(); if (!info.isNull()) { QString type = info.tagName(); if (parent->ParseElement(filename, info, showWarnings)) { } else if (type == "font" || type == "fontdef") { bool global = (GetGlobalObjectStore() == parent); MythFontProperties *font = MythFontProperties::ParseFromXml( filename, info, parent, global, showWarnings); if (!global && font) { QString name = info.attribute("name"); parent->AddFont(name, font); } delete font; } else if (type == "imagetype" || type == "textarea" || type == "group" || type == "textedit" || type == "button" || type == "buttonlist" || type == "buttonlist2" || type == "buttontree" || type == "spinbox" || type == "checkbox" || type == "statetype" || type == "clock" || type == "progressbar" || type == "webbrowser" || type == "guidegrid" || type == "shape" || type == "editbar" || type == "video") { ParseUIType(filename, info, type, parent, NULL, showWarnings); } else { VERBOSE_XML(VB_IMPORTANT, filename, info, LOC_ERR + "Unknown widget type"); } } } }