From 2f68e5be5964a24d68b7cd7816228ce340da3845 Mon Sep 17 00:00:00 2001 From: Robert Bieber Date: Sat, 3 Jul 2010 22:57:42 +0000 Subject: Theme Editor: SBS will now render underneath WPS, if both are present in project git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27265 a1c6a512-1295-4272-9138-f99709370657 --- utils/themeeditor/graphics/rbscreen.cpp | 37 ++++++++++++++++++++----- utils/themeeditor/graphics/rbscreen.h | 6 +++++ utils/themeeditor/graphics/rbviewport.cpp | 10 +++++++ utils/themeeditor/models/parsetreemodel.cpp | 42 +++++++++++++++++++++++++++-- utils/themeeditor/models/parsetreenode.cpp | 2 +- utils/themeeditor/resources/deviceoptions | 1 + 6 files changed, 88 insertions(+), 10 deletions(-) (limited to 'utils') diff --git a/utils/themeeditor/graphics/rbscreen.cpp b/utils/themeeditor/graphics/rbscreen.cpp index 054e8fee37..c212a6c1fc 100644 --- a/utils/themeeditor/graphics/rbscreen.cpp +++ b/utils/themeeditor/graphics/rbscreen.cpp @@ -29,18 +29,18 @@ RBScreen::RBScreen(const RBRenderInfo& info, bool remote, QGraphicsItem *parent) :QGraphicsItem(parent), backdrop(0), project(project), - albumArt(0) + albumArt(0), customUI(0) { if(remote) { - width = info.device()->data("remotewidth").toInt(); - height = info.device()->data("remoteheight").toInt(); + fullWidth = info.device()->data("remotewidth").toInt(); + fullHeight = info.device()->data("remoteheight").toInt(); } else { - width = info.device()->data("screenwidth").toInt(); - height = info.device()->data("screenheight").toInt(); + fullWidth = info.device()->data("screenwidth").toInt(); + fullHeight = info.device()->data("screenheight").toInt(); } QString bg = info.settings()->value("background color", "FFFFFF"); @@ -63,8 +63,8 @@ RBScreen::RBScreen(const RBRenderInfo& info, bool remote, /* If a backdrop has been found, use its width and height */ if(!backdrop->isNull()) { - width = backdrop->width(); - height = backdrop->height(); + fullWidth = backdrop->width(); + fullHeight = backdrop->height(); } else { @@ -74,6 +74,17 @@ RBScreen::RBScreen(const RBRenderInfo& info, bool remote, } fonts.insert(0, new RBFont("Nothin'")); + + if(parent == 0) + { + width = fullWidth; + height = fullHeight; + } + else + { + width = parent->boundingRect().width(); + height = parent->boundingRect().height(); + } } RBScreen::~RBScreen() @@ -108,6 +119,9 @@ QRectF RBScreen::boundingRect() const void RBScreen::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + if(parentItem() != 0) + return; + if(backdrop) { painter->drawPixmap(0, 0, width, height, *backdrop); @@ -191,9 +205,18 @@ void RBScreen::makeCustomUI(QString id) namedViewports.value(id)->at(i)->makeCustomUI(); for(int i = 0; i < namedViewports.value(id)->count(); i++) namedViewports.value(id)->at(i)->show(); + + customUI = namedViewports.value(id)->at(0); } } +void RBScreen::breakSBS() +{ + width = fullWidth; + height = fullHeight; + setParentItem(0); +} + QColor RBScreen::stringToColor(QString str, QColor fallback) { diff --git a/utils/themeeditor/graphics/rbscreen.h b/utils/themeeditor/graphics/rbscreen.h index b472e8eae4..5bb8ab1602 100644 --- a/utils/themeeditor/graphics/rbscreen.h +++ b/utils/themeeditor/graphics/rbscreen.h @@ -67,6 +67,8 @@ public: void setBackdrop(QString filename); bool hasBackdrop(){ return backdrop != 0; } void makeCustomUI(QString id); + void setCustomUI(RBViewport* viewport){ customUI = viewport; } + RBViewport* getCustomUI(){ return customUI; } static QColor stringToColor(QString str, QColor fallback); @@ -84,10 +86,13 @@ public: } } + void breakSBS(); private: int width; int height; + int fullWidth; + int fullHeight; QColor bgColor; QColor fgColor; QPixmap* backdrop; @@ -102,6 +107,7 @@ private: QList displayedViewports; RBAlbumArt* albumArt; + RBViewport* customUI; }; #endif // RBSCREEN_H diff --git a/utils/themeeditor/graphics/rbviewport.cpp b/utils/themeeditor/graphics/rbviewport.cpp index b620e1b554..a92825362d 100644 --- a/utils/themeeditor/graphics/rbviewport.cpp +++ b/utils/themeeditor/graphics/rbviewport.cpp @@ -113,12 +113,22 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info) if(h < 0) h = info.screen()->getHeight() + h - y; + /* Adjusting to screen coordinates if necessary */ + if(screen->parentItem() != 0) + { + x -= screen->parentItem()->pos().x(); + y -= screen->parentItem()->pos().y(); + } + + setPos(x, y); size = QRectF(0, 0, w, h); } debug = info.device()->data("showviewports").toBool(); lineHeight = font->lineHeight(); + if(customUI) + screen->setCustomUI(this); } RBViewport::~RBViewport() diff --git a/utils/themeeditor/models/parsetreemodel.cpp b/utils/themeeditor/models/parsetreemodel.cpp index ccae865290..47b24174b7 100644 --- a/utils/themeeditor/models/parsetreemodel.cpp +++ b/utils/themeeditor/models/parsetreemodel.cpp @@ -290,7 +290,9 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project, settings.insert("themebase", base.canonicalPath()); } + /* Finding imagebase and determining remote/wps status */ bool remote = false; + bool wps = false; if(file) { QString skinFile = *file; @@ -304,14 +306,50 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project, QString extension = decomp.last(); if(extension[0] == 'r') remote = true; + if(extension.right(3) == "wps") + wps = true; + } + + /* Rendering SBS, if necessary */ + RBScreen* sbsScreen = 0; + if(wps && device->data("rendersbs").toBool()) + { + QString sbsFile = settings.value(remote ? "rsbs" : "sbs", ""); + sbsFile.replace("/.rockbox" , settings.value("themebase","")); + + if(QFile::exists(sbsFile)) + { + QFile sbs(sbsFile); + sbs.open(QFile::ReadOnly | QFile::Text); + ParseTreeModel sbsModel(QString(sbs.readAll()).toAscii()); + + if(sbsModel.root != 0) + { + RBRenderInfo sbsInfo(&sbsModel, project, &settings, device, + sbsScreen); + + sbsScreen = new RBScreen(sbsInfo, remote); + scene->addItem(sbsScreen); + + sbsInfo = RBRenderInfo(&sbsModel, project, &settings, device, + sbsScreen); + sbsModel.root->render(sbsInfo); + } + + } } RBScreen* screen = 0; RBRenderInfo info(this, project, &settings, device, screen); /* Adding the screen */ - screen = new RBScreen(info, remote); - scene->addItem(screen); + if(sbsScreen) + screen = new RBScreen(info, remote, sbsScreen->getCustomUI()); + else + screen = new RBScreen(info, remote); + + if(!sbsScreen) + scene->addItem(screen); info = RBRenderInfo(this, project, &settings, device, screen); diff --git a/utils/themeeditor/models/parsetreenode.cpp b/utils/themeeditor/models/parsetreenode.cpp index f1ee3b27ca..ae83f1aadf 100644 --- a/utils/themeeditor/models/parsetreenode.cpp +++ b/utils/themeeditor/models/parsetreenode.cpp @@ -629,7 +629,7 @@ bool ParseTreeNode::execTag(const RBRenderInfo& info, RBViewport* viewport) { case 'd': /* %wd */ - /* Disable SBS rendering */ + info.screen()->breakSBS(); return true; case 'e': diff --git a/utils/themeeditor/resources/deviceoptions b/utils/themeeditor/resources/deviceoptions index 10a1a89d75..d7dddb4c13 100644 --- a/utils/themeeditor/resources/deviceoptions +++ b/utils/themeeditor/resources/deviceoptions @@ -36,6 +36,7 @@ screenheight ; Screen Height ; spin(0,800) ; 200 remotewidth ; Remote Width ; spin(0,800) ; 100 remoteheight ; Remote Height ; spin(0,800); 50 showviewports ; Show Viewports ; check ; false +rendersbs ; Render SBS If Available ; check ; true [ID3 Info] ia ; Artist ; text ; Current Artist -- cgit v1.2.3