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:
parent
77b682571f
commit
d1a392a0e9
10 changed files with 71 additions and 45 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
|
|
||||||
|
class RBScreen;
|
||||||
|
|
||||||
class RBScene : public QGraphicsScene
|
class RBScene : public QGraphicsScene
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
|
|
||||||
sbsInfo = RBRenderInfo(sbsModel, project, doc, &settings,
|
|
||||||
device, sbsScreen);
|
|
||||||
sbsModel->root->render(sbsInfo);
|
|
||||||
|
|
||||||
setChildrenUnselectable(sbsScreen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RBScreen* screen = 0;
|
|
||||||
RBRenderInfo info(this, project, doc, &settings, device, screen, sbsScreen);
|
|
||||||
|
|
||||||
/* Adding the screen */
|
|
||||||
if(sbsScreen)
|
|
||||||
screen = new RBScreen(info, remote, sbsScreen->getCustomUI());
|
|
||||||
else
|
|
||||||
screen = new RBScreen(info, remote);
|
|
||||||
|
|
||||||
if(!sbsScreen)
|
|
||||||
scene->addItem(screen);
|
scene->addItem(screen);
|
||||||
|
|
||||||
info = RBRenderInfo(this, project, doc, &settings, device, screen,
|
sbsInfo = RBRenderInfo(sbsModel, project, doc, &settings,
|
||||||
sbsScreen);
|
device, screen);
|
||||||
|
sbsModel->root->render(sbsInfo);
|
||||||
|
screen->endSbsRender();
|
||||||
|
|
||||||
|
setChildrenUnselectable(screen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RBRenderInfo info(this, project, doc, &settings, device, screen);
|
||||||
|
|
||||||
|
/* Adding the screen */
|
||||||
|
if(!screen)
|
||||||
|
{
|
||||||
|
screen = new RBScreen(info, remote);
|
||||||
|
scene->addItem(screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
info = RBRenderInfo(this, project, doc, &settings, device, screen);
|
||||||
|
|
||||||
|
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,10 +574,13 @@ 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)
|
||||||
{
|
{
|
||||||
/* First we build a list of the times for each branch */
|
/* First we build a list of the times for each branch */
|
||||||
|
@ -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,9 +918,6 @@ 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.sbsScreen()->setBackdrop(filename);
|
|
||||||
else
|
|
||||||
info.screen()->setBackdrop(filename);
|
info.screen()->setBackdrop(filename);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue