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
diff --git a/utils/themeeditor/graphics/rbscreen.cpp b/utils/themeeditor/graphics/rbscreen.cpp
index 054e8fe..c212a6c 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 @@
/* 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 @@
}
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 @@
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 @@
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 b472e8e..5bb8ab1 100644
--- a/utils/themeeditor/graphics/rbscreen.h
+++ b/utils/themeeditor/graphics/rbscreen.h
@@ -67,6 +67,8 @@
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 @@
}
}
+ void breakSBS();
private:
int width;
int height;
+ int fullWidth;
+ int fullHeight;
QColor bgColor;
QColor fgColor;
QPixmap* backdrop;
@@ -102,6 +107,7 @@
QList<QString> displayedViewports;
RBAlbumArt* albumArt;
+ RBViewport* customUI;
};
#endif // RBSCREEN_H
diff --git a/utils/themeeditor/graphics/rbviewport.cpp b/utils/themeeditor/graphics/rbviewport.cpp
index b620e1b..a928253 100644
--- a/utils/themeeditor/graphics/rbviewport.cpp
+++ b/utils/themeeditor/graphics/rbviewport.cpp
@@ -113,12 +113,22 @@
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 ccae865..47b2417 100644
--- a/utils/themeeditor/models/parsetreemodel.cpp
+++ b/utils/themeeditor/models/parsetreemodel.cpp
@@ -290,7 +290,9 @@
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 @@
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 f1ee3b2..ae83f1a 100644
--- a/utils/themeeditor/models/parsetreenode.cpp
+++ b/utils/themeeditor/models/parsetreenode.cpp
@@ -629,7 +629,7 @@
{
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 10a1a89..d7dddb4 100644
--- a/utils/themeeditor/resources/deviceoptions
+++ b/utils/themeeditor/resources/deviceoptions
@@ -36,6 +36,7 @@
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