1
0
Fork 0
forked from len0rd/rockbox

Theme Editor: Began implementing code generation for movable viewports

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27691 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Bieber 2010-08-04 09:16:52 +00:00
parent 2db08d4153
commit 49865b23f6
12 changed files with 104 additions and 23 deletions

View file

@ -25,7 +25,7 @@
#include "rbmovable.h" #include "rbmovable.h"
RBMovable::RBMovable(QGraphicsItem* parent) RBMovable::RBMovable(QGraphicsItem* parent)
: QGraphicsItem(parent) : QGraphicsItem(parent), geomChanged(false)
{ {
setFlags(ItemIsMovable | ItemIsSelectable | ItemSendsGeometryChanges); setFlags(ItemIsMovable | ItemIsSelectable | ItemSendsGeometryChanges);
} }
@ -61,7 +61,7 @@ QVariant RBMovable::itemChange(GraphicsItemChange change, const QVariant &value)
pos.setY(qMax(0., pos.y())); pos.setY(qMax(0., pos.y()));
pos.setY(qMin(pos.y(), bound.height() - boundingRect().height())); pos.setY(qMin(pos.y(), bound.height() - boundingRect().height()));
saveGeometry(); geomChanged = true;
return pos; return pos;
} }
@ -69,3 +69,17 @@ QVariant RBMovable::itemChange(GraphicsItemChange change, const QVariant &value)
return QGraphicsItem::itemChange(change, value); return QGraphicsItem::itemChange(change, value);
} }
void RBMovable::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mousePressEvent(event);
}
void RBMovable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mouseReleaseEvent(event);
if(isSelected())
{
saveGeometry();
geomChanged = false;
}
}

View file

@ -41,6 +41,8 @@ public:
virtual void paint(QPainter *painter, virtual void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget); const QStyleOptionGraphicsItem *option, QWidget *widget);
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
protected: protected:
virtual QVariant itemChange(GraphicsItemChange change, virtual QVariant itemChange(GraphicsItemChange change,
@ -48,6 +50,8 @@ protected:
/* Responsible for updating the parse tree */ /* Responsible for updating the parse tree */
virtual void saveGeometry() = 0; virtual void saveGeometry() = 0;
bool geomChanged;
}; };
#endif // RBMOVABLE_H #endif // RBMOVABLE_H

View file

@ -22,10 +22,11 @@
#include "rbrenderinfo.h" #include "rbrenderinfo.h"
RBRenderInfo::RBRenderInfo(ParseTreeModel* model, ProjectModel* project, RBRenderInfo::RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
QMap<QString, QString>* settings, SkinDocument* doc, QMap<QString, QString>* settings,
DeviceState* device, RBScreen* screen, DeviceState* device, RBScreen* screen,
RBScreen* sbsScreen) RBScreen* sbsScreen)
:mProject(project), mSettings(settings), :mProject(project), mDoc(doc),
mSettings(settings),
mDevice(device), mScreen(screen), mDevice(device), mScreen(screen),
mSbsScreen(sbsScreen), mModel(model) mSbsScreen(sbsScreen), mModel(model)
{ {
@ -41,6 +42,7 @@ RBRenderInfo::RBRenderInfo(const RBRenderInfo &other)
mProject = other.mProject; mProject = other.mProject;
mSettings = other.mSettings; mSettings = other.mSettings;
mDevice = other.mDevice; mDevice = other.mDevice;
mDoc = other.mDoc;
mScreen = other.mScreen; mScreen = other.mScreen;
mSbsScreen = other.mSbsScreen; mSbsScreen = other.mSbsScreen;
mModel = other.mModel; mModel = other.mModel;
@ -51,6 +53,7 @@ const RBRenderInfo& RBRenderInfo::operator=(const RBRenderInfo& other)
mProject = other.mProject; mProject = other.mProject;
mSettings = other.mSettings; mSettings = other.mSettings;
mDevice = other.mDevice; mDevice = other.mDevice;
mDoc = other.mDoc;
mScreen = other.mScreen; mScreen = other.mScreen;
mSbsScreen = other.mSbsScreen; mSbsScreen = other.mSbsScreen;
mModel = other.mModel; mModel = other.mModel;

View file

@ -28,13 +28,15 @@ class RBScreen;
class ProjectModel; class ProjectModel;
class ParseTreeModel; class ParseTreeModel;
class DeviceState; class DeviceState;
class SkinDocument;
class RBRenderInfo class RBRenderInfo
{ {
public: public:
RBRenderInfo(ParseTreeModel* model, ProjectModel* project, RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
QMap<QString, QString>* settings, DeviceState* device, SkinDocument* doc, QMap<QString, QString>* settings,
RBScreen* screen, RBScreen* sbsScreen = 0); DeviceState* device, RBScreen* screen,
RBScreen* sbsScreen = 0);
RBRenderInfo(); RBRenderInfo();
RBRenderInfo(const RBRenderInfo& other); RBRenderInfo(const RBRenderInfo& other);
virtual ~RBRenderInfo(); virtual ~RBRenderInfo();
@ -43,6 +45,7 @@ public:
ProjectModel* project() const{ return mProject; } ProjectModel* project() const{ return mProject; }
DeviceState* device() const{ return mDevice; } DeviceState* device() const{ return mDevice; }
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; } RBScreen* sbsScreen() const{ return mSbsScreen; }
@ -50,6 +53,7 @@ public:
private: private:
ProjectModel* mProject; ProjectModel* mProject;
SkinDocument* mDoc;
QMap<QString, QString>* mSettings; QMap<QString, QString>* mSettings;
DeviceState* mDevice; DeviceState* mDevice;
RBScreen* mScreen; RBScreen* mScreen;

View file

@ -34,16 +34,19 @@
#include "parsetreemodel.h" #include "parsetreemodel.h"
#include "tag_table.h" #include "tag_table.h"
#include "skin_parser.h" #include "skin_parser.h"
#include "skindocument.h"
/* Pixels/second of text scrolling */ /* Pixels/second of text scrolling */
const double RBViewport::scrollRate = 30; const double RBViewport::scrollRate = 30;
RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info) RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info,
ParseTreeNode* pNode)
: RBMovable(info.screen()), foreground(info.screen()->foreground()), : RBMovable(info.screen()), foreground(info.screen()->foreground()),
background(info.screen()->background()), textOffset(0,0), background(info.screen()->background()), textOffset(0,0),
screen(info.screen()), textAlign(Left), showStatusBar(false), screen(info.screen()), textAlign(Left), showStatusBar(false),
statusBarTexture(":/render/statusbar.png"), statusBarTexture(":/render/statusbar.png"),
leftGraphic(0), centerGraphic(0), rightGraphic(0), scrollTime(0) leftGraphic(0), centerGraphic(0), rightGraphic(0), scrollTime(0),
node(pNode), doc(info.document())
{ {
setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges); setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges);
@ -67,7 +70,6 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
} }
else else
{ {
int param = 0;
QString ident; QString ident;
int x,y,w,h; int x,y,w,h;
/* Rendering one of the other types of viewport */ /* Rendering one of the other types of viewport */
@ -75,7 +77,7 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
{ {
case '\0': case '\0':
customUI = false; customUI = false;
param = 0; baseParam= 0;
break; break;
case 'l': case 'l':
@ -85,13 +87,13 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
if(!screen->viewPortDisplayed(ident)) if(!screen->viewPortDisplayed(ident))
hide(); hide();
info.screen()->loadViewport(ident, this); info.screen()->loadViewport(ident, this);
param = 1; baseParam= 1;
break; break;
case 'i': case 'i':
/* Custom UI Viewport */ /* Custom UI Viewport */
customUI = true; customUI = true;
param = 1; baseParam= 1;
if(node->params[0].type == skin_tag_parameter::DEFAULT) if(node->params[0].type == skin_tag_parameter::DEFAULT)
{ {
setVisible(true); setVisible(true);
@ -104,6 +106,7 @@ RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
break; break;
} }
/* Now we grab the info common to all viewports */ /* Now we grab the info common to all viewports */
int param = baseParam;
x = node->params[param++].data.number; x = node->params[param++].data.number;
if(x < 0) if(x < 0)
x = info.screen()->boundingRect().right() + x; x = info.screen()->boundingRect().right() + x;
@ -301,7 +304,15 @@ void RBViewport::showPlaylist(const RBRenderInfo &info, int start,
void RBViewport::saveGeometry() void RBViewport::saveGeometry()
{ {
QRectF bounds = boundingRect();
QPointF origin = pos();
node->modParam(static_cast<int>(origin.x()), baseParam);
node->modParam(static_cast<int>(origin.y()), baseParam + 1);
node->modParam(static_cast<int>(bounds.width()), baseParam + 2);
node->modParam(static_cast<int>(bounds.height()), baseParam + 3);
doc->genCode();
} }
void RBViewport::alignLeft() void RBViewport::alignLeft()

View file

@ -28,9 +28,12 @@
class RBScreen; class RBScreen;
class RBRenderInfo; class RBRenderInfo;
class ParseTreeNode;
#include <QGraphicsItem> #include <QGraphicsItem>
class SkinDocument;
class RBViewport : public RBMovable class RBViewport : public RBMovable
{ {
public: public:
@ -43,7 +46,8 @@ public:
static const double scrollRate; static const double scrollRate;
RBViewport(skin_element* node, const RBRenderInfo& info); RBViewport(skin_element* node, const RBRenderInfo& info,
ParseTreeNode* pNode);
virtual ~RBViewport(); virtual ~RBViewport();
QPainterPath shape() const; QPainterPath shape() const;
@ -112,6 +116,10 @@ private:
RBText* rightGraphic; RBText* rightGraphic;
double scrollTime; double scrollTime;
int baseParam;
ParseTreeNode* node;
SkinDocument* doc;
}; };
#endif // RBVIEWPORT_H #endif // RBVIEWPORT_H

View file

@ -301,7 +301,7 @@ void SkinDocument::codeChanged()
if(lastUpdate.msecsTo(QTime::currentTime()) >= updateInterval) if(lastUpdate.msecsTo(QTime::currentTime()) >= updateInterval)
{ {
model->render(project, device, &fileName); model->render(project, device, this, &fileName);
checkUpdate.stop(); checkUpdate.stop();
lastUpdate = QTime::currentTime(); lastUpdate = QTime::currentTime();
} }

View file

@ -76,7 +76,10 @@ public:
TabType type() const{ return Skin; } TabType type() const{ return Skin; }
QGraphicsScene* scene(){ return model->render(project, device, &fileName); } QGraphicsScene* scene()
{
return model->render(project, device, this, &fileName);
}
void showFind(){ findReplace->show(); } void showFind(){ findReplace->show(); }
void hideFind(){ findReplace->hide(); } void hideFind(){ findReplace->hide(); }

View file

@ -271,7 +271,8 @@ bool ParseTreeModel::setData(const QModelIndex &index, const QVariant &value,
} }
QGraphicsScene* ParseTreeModel::render(ProjectModel* project, QGraphicsScene* ParseTreeModel::render(ProjectModel* project,
DeviceState* device, const QString* file) DeviceState* device,
SkinDocument* doc, const QString* file)
{ {
scene->clear(); scene->clear();
@ -327,14 +328,14 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project,
if(sbsModel.root != 0) if(sbsModel.root != 0)
{ {
RBRenderInfo sbsInfo(&sbsModel, project, &settings, device, RBRenderInfo sbsInfo(&sbsModel, project, doc, &settings, device,
sbsScreen); sbsScreen);
sbsScreen = new RBScreen(sbsInfo, remote); sbsScreen = new RBScreen(sbsInfo, remote);
scene->addItem(sbsScreen); scene->addItem(sbsScreen);
sbsInfo = RBRenderInfo(&sbsModel, project, &settings, device, sbsInfo = RBRenderInfo(&sbsModel, project, doc, &settings,
sbsScreen); device, sbsScreen);
sbsModel.root->render(sbsInfo); sbsModel.root->render(sbsInfo);
} }
@ -342,7 +343,7 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project,
} }
RBScreen* screen = 0; RBScreen* screen = 0;
RBRenderInfo info(this, project, &settings, device, screen, sbsScreen); RBRenderInfo info(this, project, doc, &settings, device, screen, sbsScreen);
/* Adding the screen */ /* Adding the screen */
if(sbsScreen) if(sbsScreen)
@ -353,7 +354,8 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project,
if(!sbsScreen) if(!sbsScreen)
scene->addItem(screen); scene->addItem(screen);
info = RBRenderInfo(this, project, &settings, device, screen, sbsScreen); info = RBRenderInfo(this, project, doc, &settings, device, screen,
sbsScreen);
/* Rendering the tree */ /* Rendering the tree */

View file

@ -63,7 +63,7 @@ public:
bool setData(const QModelIndex &index, const QVariant &value, int role); bool setData(const QModelIndex &index, const QVariant &value, int role);
QGraphicsScene* render(ProjectModel* project, DeviceState* device, QGraphicsScene* render(ProjectModel* project, DeviceState* device,
const QString* file = 0); SkinDocument* doc, const QString* file = 0);
static QString safeSetting(ProjectModel* project, QString key, static QString safeSetting(ProjectModel* project, QString key,
QString fallback) QString fallback)

View file

@ -523,7 +523,7 @@ void ParseTreeNode::render(const RBRenderInfo& info)
return; return;
} }
rendered = new RBViewport(element, info); rendered = new RBViewport(element, info, this);
for(int i = element->params_count; i < children.count(); i++) for(int i = element->params_count; i < children.count(); i++)
children[i]->render(info, dynamic_cast<RBViewport*>(rendered)); children[i]->render(info, dynamic_cast<RBViewport*>(rendered));
@ -1057,3 +1057,33 @@ double ParseTreeNode::findConditionalTime(ParseTreeNode *conditional,
conditional->children.count()).toInt(); conditional->children.count()).toInt();
return findBranchTime(conditional->children[child], info); return findBranchTime(conditional->children[child], info);
} }
void ParseTreeNode::modParam(QVariant value, int index)
{
if(element)
{
if(index < 0 || index >= children.count())
return;
children[index]->modParam(value);
}
else if(param)
{
if(value.type() == QVariant::Double)
{
param->type = skin_tag_parameter::DECIMAL;
param->data.number = static_cast<int>(value.toDouble() * 10);
}
else if(value.type() == QVariant::String)
{
param->type = skin_tag_parameter::STRING;
free(param->data.text);
param->data.text = strdup(value.toString().toStdString().c_str());
}
else if(value.type() == QVariant::Int)
{
param->type = skin_tag_parameter::INTEGER;
param->data.number = value.toInt();
}
}
}

View file

@ -67,6 +67,8 @@ public:
double findConditionalTime(ParseTreeNode* conditional, double findConditionalTime(ParseTreeNode* conditional,
const RBRenderInfo& info); const RBRenderInfo& info);
void modParam(QVariant value, int index = -1);
private: private:
bool execTag(const RBRenderInfo& info, RBViewport* viewport); bool execTag(const RBRenderInfo& info, RBViewport* viewport);