mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
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:
parent
2db08d4153
commit
49865b23f6
12 changed files with 104 additions and 23 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(); }
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue