1
0
Fork 0
forked from len0rd/rockbox

Theme Editor: Co Used a more efficient/less error-prone system for rendering SBS documents underneath WPS documents

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27765 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Bieber 2010-08-09 19:37:23 +00:00
parent 77b682571f
commit d1a392a0e9
10 changed files with 71 additions and 45 deletions

View file

@ -23,12 +23,11 @@
RBRenderInfo::RBRenderInfo(ParseTreeModel* model, ProjectModel* project, RBRenderInfo::RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
SkinDocument* doc, QMap<QString, QString>* settings, SkinDocument* doc, QMap<QString, QString>* settings,
DeviceState* device, RBScreen* screen, DeviceState* device, RBScreen* screen)
RBScreen* sbsScreen)
:mProject(project), mDoc(doc), :mProject(project), mDoc(doc),
mSettings(settings), mSettings(settings),
mDevice(device), mScreen(screen), mDevice(device), mScreen(screen),
mSbsScreen(sbsScreen), mModel(model) mModel(model)
{ {
} }
@ -44,7 +43,6 @@ RBRenderInfo::RBRenderInfo(const RBRenderInfo &other)
mDevice = other.mDevice; mDevice = other.mDevice;
mDoc = other.mDoc; mDoc = other.mDoc;
mScreen = other.mScreen; mScreen = other.mScreen;
mSbsScreen = other.mSbsScreen;
mModel = other.mModel; mModel = other.mModel;
} }
@ -55,7 +53,6 @@ const RBRenderInfo& RBRenderInfo::operator=(const RBRenderInfo& other)
mDevice = other.mDevice; mDevice = other.mDevice;
mDoc = other.mDoc; mDoc = other.mDoc;
mScreen = other.mScreen; mScreen = other.mScreen;
mSbsScreen = other.mSbsScreen;
mModel = other.mModel; mModel = other.mModel;
return *this; return *this;

View file

@ -35,8 +35,7 @@ class RBRenderInfo
public: public:
RBRenderInfo(ParseTreeModel* model, ProjectModel* project, RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
SkinDocument* doc, QMap<QString, QString>* settings, SkinDocument* doc, QMap<QString, QString>* settings,
DeviceState* device, RBScreen* screen, DeviceState* device, RBScreen* screen);
RBScreen* sbsScreen = 0);
RBRenderInfo(); RBRenderInfo();
RBRenderInfo(const RBRenderInfo& other); RBRenderInfo(const RBRenderInfo& other);
virtual ~RBRenderInfo(); virtual ~RBRenderInfo();
@ -48,7 +47,6 @@ public:
SkinDocument* document() const{ return mDoc; } SkinDocument* document() const{ return mDoc; }
QMap<QString, QString>* settings() const{ return mSettings; } QMap<QString, QString>* settings() const{ return mSettings; }
RBScreen* screen() const{ return mScreen; } RBScreen* screen() const{ return mScreen; }
RBScreen* sbsScreen() const{ return mSbsScreen; }
ParseTreeModel* model() const{ return mModel; } ParseTreeModel* model() const{ return mModel; }
private: private:
@ -57,7 +55,6 @@ private:
QMap<QString, QString>* mSettings; QMap<QString, QString>* mSettings;
DeviceState* mDevice; DeviceState* mDevice;
RBScreen* mScreen; RBScreen* mScreen;
RBScreen* mSbsScreen;
ParseTreeModel* mModel; ParseTreeModel* mModel;
}; };

View file

@ -20,6 +20,7 @@
****************************************************************************/ ****************************************************************************/
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QGraphicsItem>
#include <QDebug> #include <QDebug>
@ -33,4 +34,3 @@ RBScene::RBScene(QObject* parent)
RBScene::~RBScene() RBScene::~RBScene()
{ {
} }

View file

@ -24,6 +24,8 @@
#include <QGraphicsScene> #include <QGraphicsScene>
class RBScreen;
class RBScene : public QGraphicsScene class RBScene : public QGraphicsScene
{ {
Q_OBJECT Q_OBJECT

View file

@ -32,7 +32,7 @@
RBScreen::RBScreen(const RBRenderInfo& info, bool remote, RBScreen::RBScreen(const RBRenderInfo& info, bool remote,
QGraphicsItem *parent) QGraphicsItem *parent)
:QGraphicsItem(parent), backdrop(0), project(project), :QGraphicsItem(parent), backdrop(0), project(project),
albumArt(0), customUI(0) albumArt(0), customUI(0), defaultView(0)
{ {
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
@ -221,11 +221,29 @@ void RBScreen::makeCustomUI(QString id)
} }
} }
void RBScreen::endSbsRender()
{
sbsChildren = children();
QList<int> keys = fonts.keys();
for(QList<int>::iterator i = keys.begin(); i != keys.end(); i++)
{
if(*i > 2)
fonts.remove(*i);
}
images.clear();
namedViewports.clear();
displayedViewports.clear();
}
void RBScreen::breakSBS() void RBScreen::breakSBS()
{ {
width = fullWidth; for(QList<QGraphicsItem*>::iterator i = sbsChildren.begin()
height = fullHeight; ; i != sbsChildren.end(); i++)
setParentItem(0); (*i)->hide();
if(defaultView)
defaultView->makeFullScreen();
} }
QColor RBScreen::stringToColor(QString str, QColor fallback) QColor RBScreen::stringToColor(QString str, QColor fallback)

View file

@ -86,6 +86,8 @@ public:
} }
} }
void setDefault(RBViewport* view){ defaultView = view; }
void endSbsRender();
void breakSBS(); void breakSBS();
protected: protected:
@ -111,6 +113,9 @@ private:
RBAlbumArt* albumArt; RBAlbumArt* albumArt;
RBViewport* customUI; RBViewport* customUI;
RBViewport* defaultView;
QList<QGraphicsItem*> sbsChildren;
}; };
#endif // RBSCREEN_H #endif // RBSCREEN_H

View file

@ -56,6 +56,16 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info,
customUI = false; customUI = false;
font = screen->getFont(1); font = screen->getFont(1);
screen->setDefault(this);
if(screen->getCustomUI())
{
RBViewport* cui = screen->getCustomUI();
size = cui->boundingRect();
setPos(cui->pos());
}
/* Making sure the default viewport can't be graphically manipulated */ /* Making sure the default viewport can't be graphically manipulated */
setFlag(ItemIsSelectable, false); setFlag(ItemIsSelectable, false);
setFlag(ItemIsMovable, false); setFlag(ItemIsMovable, false);
@ -299,6 +309,12 @@ void RBViewport::showPlaylist(const RBRenderInfo &info, int start,
} }
} }
void RBViewport::makeFullScreen()
{
size = screen->boundingRect();
setPos(screen->pos());
}
void RBViewport::saveGeometry() void RBViewport::saveGeometry()
{ {
QRectF bounds = boundingRect(); QRectF bounds = boundingRect();

View file

@ -81,6 +81,8 @@ public:
void showPlaylist(const RBRenderInfo& info, int start, skin_element* id3, void showPlaylist(const RBRenderInfo& info, int start, skin_element* id3,
skin_element* noId3); skin_element* noId3);
void makeFullScreen();
protected: protected:
void saveGeometry(); void saveGeometry();

View file

@ -316,7 +316,7 @@ RBScene* ParseTreeModel::render(ProjectModel* project,
} }
/* Rendering SBS, if necessary */ /* Rendering SBS, if necessary */
RBScreen* sbsScreen = 0; RBScreen* screen = 0;
if(wps && device->data("rendersbs").toBool()) if(wps && device->data("rendersbs").toBool())
{ {
QString sbsFile = settings.value(remote ? "rsbs" : "sbs", ""); QString sbsFile = settings.value(remote ? "rsbs" : "sbs", "");
@ -334,49 +334,37 @@ RBScene* ParseTreeModel::render(ProjectModel* project,
if(sbsModel->root != 0) if(sbsModel->root != 0)
{ {
RBRenderInfo sbsInfo(sbsModel, project, doc, &settings, device, RBRenderInfo sbsInfo(sbsModel, project, doc, &settings, device,
sbsScreen); screen);
sbsScreen = new RBScreen(sbsInfo, remote); screen = new RBScreen(sbsInfo, remote);
scene->addItem(sbsScreen); scene->addItem(screen);
sbsInfo = RBRenderInfo(sbsModel, project, doc, &settings, sbsInfo = RBRenderInfo(sbsModel, project, doc, &settings,
device, sbsScreen); device, screen);
sbsModel->root->render(sbsInfo); sbsModel->root->render(sbsInfo);
screen->endSbsRender();
setChildrenUnselectable(sbsScreen); setChildrenUnselectable(screen);
} }
} }
} }
RBScreen* screen = 0; RBRenderInfo info(this, project, doc, &settings, device, screen);
RBRenderInfo info(this, project, doc, &settings, device, screen, sbsScreen);
/* Adding the screen */ /* Adding the screen */
if(sbsScreen) if(!screen)
screen = new RBScreen(info, remote, sbsScreen->getCustomUI()); {
else
screen = new RBScreen(info, remote); screen = new RBScreen(info, remote);
if(!sbsScreen)
scene->addItem(screen); scene->addItem(screen);
}
info = RBRenderInfo(this, project, doc, &settings, device, screen, info = RBRenderInfo(this, project, doc, &settings, device, screen);
sbsScreen);
/* Rendering the tree */ /* Rendering the tree */
if(root) if(root)
root->render(info); root->render(info);
// /* Making sure the Custom UI Viewport can't be selected */
// if(sbsScreen)
// {
// sbsScreen->getCustomUI()->setFlag(QGraphicsItem::ItemIsSelectable,
// false);
// sbsScreen->getCustomUI()->setFlag(QGraphicsItem::ItemIsMovable,
// false);
// }
//
return scene; return scene;
} }

View file

@ -31,6 +31,9 @@
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>
#include <cassert>
#include <QDebug>
int ParseTreeNode::openConditionals = 0; int ParseTreeNode::openConditionals = 0;
bool ParseTreeNode::breakFlag = false; bool ParseTreeNode::breakFlag = false;
@ -571,9 +574,12 @@ void ParseTreeNode::render(const RBRenderInfo &info, RBViewport* viewport,
else if(element->type == CONDITIONAL) else if(element->type == CONDITIONAL)
{ {
int child = evalTag(info, true, element->children_count).toInt(); int child = evalTag(info, true, element->children_count).toInt();
if(child < children.count()) int max = children.count() - element->params_count;
if(child < max)
{
children[element->params_count + child] children[element->params_count + child]
->render(info, viewport, true); ->render(info, viewport, true);
}
} }
else if(element->type == LINE_ALTERNATOR) else if(element->type == LINE_ALTERNATOR)
{ {
@ -856,8 +862,6 @@ bool ParseTreeNode::execTag(const RBRenderInfo& info, RBViewport* viewport)
int height = element->params[3].data.number; int height = element->params[3].data.number;
QString action(element->params[4].data.text); QString action(element->params[4].data.text);
RBTouchArea* temp = new RBTouchArea(width, height, action, info); RBTouchArea* temp = new RBTouchArea(width, height, action, info);
x += viewport->x();
y += viewport->y();
temp->setPos(x, y); temp->setPos(x, y);
return true; return true;
} }
@ -914,10 +918,7 @@ bool ParseTreeNode::execTag(const RBRenderInfo& info, RBViewport* viewport)
case '\0': case '\0':
/* %X */ /* %X */
filename = QString(element->params[0].data.text); filename = QString(element->params[0].data.text);
if(info.sbsScreen() && info.screen()->parentItem()) info.screen()->setBackdrop(filename);
info.sbsScreen()->setBackdrop(filename);
else
info.screen()->setBackdrop(filename);
return true; return true;
} }