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