From 7a1a72a5273bd8179d61a51335c3d4d19c6bd5e5 Mon Sep 17 00:00:00 2001 From: Robert Bieber Date: Sat, 24 Jul 2010 22:41:45 +0000 Subject: [PATCH] Theme Editor: Added resource check to project export git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27543 a1c6a512-1295-4272-9138-f99709370657 --- utils/themeeditor/gui/projectexporter.cpp | 193 ++++++++++++++++++++-- utils/themeeditor/gui/projectexporter.h | 6 + 2 files changed, 187 insertions(+), 12 deletions(-) diff --git a/utils/themeeditor/gui/projectexporter.cpp b/utils/themeeditor/gui/projectexporter.cpp index dec1b13d3e..b73e4d312a 100644 --- a/utils/themeeditor/gui/projectexporter.cpp +++ b/utils/themeeditor/gui/projectexporter.cpp @@ -22,10 +22,15 @@ #include "projectexporter.h" #include "ui_projectexporter.h" +#include "tag_table.h" +#include "skin_parser.h" + #include "quazipfile.h" #include #include +#include +#include ProjectExporter::ProjectExporter(QString path, ProjectModel* project, QWidget *parent) @@ -39,21 +44,16 @@ ProjectExporter::ProjectExporter(QString path, ProjectModel* project, if(zipFile.open(QuaZip::mdCreate)) { - html += tr("Resource Check: " - "Not implemented yet
"); - ui->statusBox->document()->setHtml(html); + + checkRes(project); writeZip(project->getSetting("themebase", "")); zipFile.close(); - html += tr("Project exported " - "successfully
"); - ui->statusBox->document()->setHtml(html); + addSuccess(tr("Project exported successfully")); } else { - html += tr("" - "Error opening zip file
"); - ui->statusBox->document()->setHtml(html); + addError(tr("Couldn't open zip file")); } } @@ -92,9 +92,7 @@ void ProjectExporter::writeZip(QString path, QString base) base = path; if(path == "") { - html += tr("" - "Error: Couldn't locate project directory
"); - ui->statusBox->document()->setHtml(html); + addError(tr("Couldn't locate project directory")); return; } @@ -129,3 +127,174 @@ void ProjectExporter::writeZip(QString path, QString base) writeZip(current.absoluteFilePath(), base); } } + +void ProjectExporter::checkRes(ProjectModel *project) +{ + QMap settings = project->getSettings(); + QMap::iterator i; + + for(i = settings.begin(); i != settings.end(); i++) + { + if(i.key() == "wps" || i.key() == "rwps" || i.key() == "sbs" + || i.key() == "rsbs" || i.key() == "fms" || i.key() == "rfms") + { + checkWPS(project, i.value()); + } + else if(i.value().contains("/.rockbox")) + { + QString absPath = i.value().replace("/.rockbox", + settings.value("themebase")); + if(QFile::exists(absPath)) + { + addSuccess(i.key() + tr(" found")); + } + else + { + if(i.key() == "font") + { + QSettings qset; + qset.beginGroup("RBFont"); + QString fontDir = qset.value("fontDir", "").toString(); + qset.endGroup(); + + QString newDir = fontDir + "/" + absPath.split("/").last(); + + if(QFile::exists(newDir)) + { + addSuccess(tr("font found in font pack")); + } + else + { + addWarning(tr("font not found")); + } + + } + else + { + addWarning(i.key() + tr(" not found")); + } + } + } + } +} + +void ProjectExporter::checkWPS(ProjectModel* project, QString file) +{ + /* Set this to false if any resource checks fail */ + bool check = true; + + QSettings settings; + settings.beginGroup("RBFont"); + QString fontPack = settings.value("fontDir", "").toString() + "/"; + settings.endGroup(); + + QString fontDir = project->getSetting("themebase", "") + "/fonts/"; + QString wpsName = file.split("/").last().split(".").first(); + QString imDir = project->getSetting("themebase", "") + "/wps/" + wpsName + + "/"; + + QFile fin(file.replace("/.rockbox", project->getSetting("themebase", ""))); + if(!fin.open(QFile::ReadOnly | QFile::Text)) + { + addWarning(tr("Couldn't open ") + file.split("/").last()); + } + + QString contents(fin.readAll()); + fin.close(); + + skin_element* root; + root = skin_parse(contents.toAscii()); + if(!root) + { + addWarning(tr("Couldn't parse ") + file.split("/").last()); + return; + } + + /* Now we scan through the tree to check all the resources */ + /* Outer loop scans through all viewports */ + while(root) + { + skin_element* line; + if(root->children_count == 0) + line = 0; + else + line = root->children[0]; + + /* Next loop scans through logical lines */ + while(line) + { + + /* Innermost loop gives top-level tags */ + skin_element* current; + if(line->children_count == 0) + current = 0; + else + current = line->children[0]; + while(current) + { + if(current->type == TAG) + { + if(QString(current->tag->name) == "Fl") + { + QString font = current->params[1].data.text; + if(!QFile::exists(fontDir + font) + && !QFile::exists(fontPack + font)) + { + check = false; + addWarning(font + tr(" not found")); + } + } + else if(QString(current->tag->name) == "X") + { + QString backdrop = current->params[0].data.text; + if(!QFile::exists(imDir + backdrop)) + { + check = false; + addWarning(backdrop + tr(" not found")); + } + } + else if(QString(current->tag->name) == "xl") + { + QString image = current->params[1].data.text; + if(!QFile::exists(imDir + image)) + { + check = false; + addWarning(image + tr(" not found")); + } + } + } + current = current->next; + } + + line = line->next; + } + + root = root->next; + } + + if(check) + addSuccess(file.split("/").last() + tr(" passed resource check")); + else + addWarning(file.split("/").last() + tr(" failed resource check")); + +} + +void ProjectExporter::addSuccess(QString text) +{ + html += tr("") + text + tr("
"); + ui->statusBox->document()->setHtml(html); +} + +void ProjectExporter::addWarning(QString text) +{ + html += tr("Warning: ") + text + + tr("
"); + ui->statusBox->document()->setHtml(html); +} + +void ProjectExporter::addError(QString text) +{ + html += tr("Error: ") + text + + tr("
"); + ui->statusBox->document()->setHtml(html); +} diff --git a/utils/themeeditor/gui/projectexporter.h b/utils/themeeditor/gui/projectexporter.h index d743172dd9..353aadda1c 100644 --- a/utils/themeeditor/gui/projectexporter.h +++ b/utils/themeeditor/gui/projectexporter.h @@ -49,6 +49,12 @@ private slots: private: void writeZip(QString path, QString base = ""); + void checkRes(ProjectModel* project); + void checkWPS(ProjectModel* project, QString file); + + void addSuccess(QString text); + void addWarning(QString text); + void addError(QString text); Ui::ProjectExporter *ui; QuaZip zipFile;