1
0
Fork 0
forked from len0rd/rockbox

Theme Editor: Working on rendering viewports, display will now show %V(...) viewports as red rectangles over backdrop or background color

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26940 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Bieber 2010-06-18 21:10:01 +00:00
parent 62622277dc
commit d8827b5ff1
11 changed files with 317 additions and 6 deletions

View file

@ -0,0 +1,46 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Robert Bieber
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "rbrenderinfo.h"
RBRenderInfo::RBRenderInfo(ParseTreeModel* model,
ProjectModel* project, RBScreen* screen)
:mProject(project), mScreen(screen), mModel(model)
{
}
RBRenderInfo::RBRenderInfo(const RBRenderInfo &other)
{
mProject = other.mProject;
mScreen = other.mScreen;
mModel = other.mModel;
}
const RBRenderInfo& RBRenderInfo::operator=(const RBRenderInfo& other)
{
mProject = other.mProject;
mScreen = other.mScreen;
mModel = other.mModel;
}
RBRenderInfo::~RBRenderInfo()
{
}

View file

@ -0,0 +1,49 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Robert Bieber
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef RBRENDERINFO_H
#define RBRENDERINFO_H
class RBScreen;
class ProjectModel;
class ParseTreeModel;
class RBRenderInfo
{
public:
RBRenderInfo(ParseTreeModel* model,
ProjectModel* project, RBScreen* screen);
RBRenderInfo(const RBRenderInfo& other);
virtual ~RBRenderInfo();
const RBRenderInfo& operator=(const RBRenderInfo& other);
ProjectModel* project() const{ return mProject; }
RBScreen* screen() const{ return mScreen; }
ParseTreeModel* model() const{ return mModel; }
private:
ProjectModel* mProject;
RBScreen* mScreen;
ParseTreeModel* mModel;
};
#endif // RBRENDERINFO_H

View file

@ -38,6 +38,9 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
int getWidth() const{ return width; }
int getHeight() const{ return height; }
static QString safeSetting(ProjectModel* project, QString key,
QString fallback)
{
@ -49,6 +52,7 @@ public:
static QColor stringToColor(QString str, QColor fallback);
private:
int width;
int height;

View file

@ -0,0 +1,110 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Robert Bieber
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include <QPainter>
#include <QPainterPath>
#include "rbviewport.h"
#include "rbscreen.h"
#include "rbrenderinfo.h"
#include "parsetreemodel.h"
#include "tag_table.h"
#include "skin_parser.h"
RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
: QGraphicsItem(info.screen())
{
if(!node->tag)
{
/* Default viewport takes up the entire screen */
size = QRectF(0, 0, info.screen()->getWidth(),
info.screen()->getHeight());
if(info.model()->rowCount(QModelIndex()) > 1)
{
/* If there is more than one viewport in the document */
displayed = false;
}
else
{
displayed = true;
}
}
else
{
int x, y, w, h;
/* Parsing one of the other types of viewport */
switch(node->tag->name[1])
{
case '\0':
/* A normal viewport definition */
x = node->params[0].data.numeric;
y = node->params[1].data.numeric;
if(node->params[2].type == skin_tag_parameter::DEFAULT)
w = info.screen()->getWidth() - x;
else
w = node->params[2].data.numeric;
if(node->params[3].type == skin_tag_parameter::DEFAULT)
h = info.screen()->getHeight() - y;
else
h = node->params[3].data.numeric;
size = QRectF(x, y, w, h);
displayed = true;
break;
case 'l':
/* Preloaded viewport */
break;
case 'i':
/* Custom UI Viewport */
break;
}
}
}
RBViewport::~RBViewport()
{
}
QPainterPath RBViewport::shape() const
{
QPainterPath retval;
retval.addRect(size);
return retval;
}
QRectF RBViewport::boundingRect() const
{
return size;
}
void RBViewport::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
{
if(displayed)
painter->fillRect(size, Qt::red);
}

View file

@ -0,0 +1,54 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Robert Bieber
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef RBVIEWPORT_H
#define RBVIEWPORT_H
#include "skin_parser.h"
class RBScreen;
class RBRenderInfo;
#include <QGraphicsItem>
class RBViewport : public QGraphicsItem
{
public:
RBViewport(skin_element* node, const RBRenderInfo& info);
virtual ~RBViewport();
QPainterPath shape() const;
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
void show(){ displayed = true; }
private:
QRectF size;
QColor background;
QColor foreground;
bool displayed;
};
#endif // RBVIEWPORT_H

View file

@ -257,6 +257,8 @@ void SkinDocument::codeChanged()
else
emit titleChanged(titleText);
model->render(project);
cursorChanged();
}

View file

@ -32,6 +32,8 @@ SkinViewer::SkinViewer(QWidget *parent) :
this, SLOT(zoomOut()));
QObject::connect(ui->zoomInButton, SIGNAL(pressed()),
this, SLOT(zoomIn()));
ui->viewer->setDragMode(QGraphicsView::ScrollHandDrag);
}
SkinViewer::~SkinViewer()
@ -53,7 +55,7 @@ void SkinViewer::changeEvent(QEvent *e)
void SkinViewer::setScene(QGraphicsScene *scene)
{
ui->viewer->setScene(scene);
ui->viewer->setScene(scene);z
}
void SkinViewer::zoomIn()

View file

@ -23,6 +23,7 @@
#include "parsetreemodel.h"
#include "symbols.h"
#include "rbscreen.h"
#include "rbrenderinfo.h"
#include <cstdlib>
@ -280,5 +281,12 @@ QGraphicsScene* ParseTreeModel::render(ProjectModel* project)
RBScreen* screen = new RBScreen(project);
scene->addItem(screen);
RBRenderInfo info(this, project, screen);
/* Rendering the tree */
if(root)
root->render(info);
return scene;
}

View file

@ -98,6 +98,12 @@ ParseTreeNode::ParseTreeNode(skin_tag_parameter *data, ParseTreeNode *parent)
}
ParseTreeNode::~ParseTreeNode()
{
for(int i = 0; i < children.count(); i++)
delete children[i];
}
QString ParseTreeNode::genCode() const
{
QString buffer = "";
@ -467,8 +473,28 @@ ParseTreeNode* ParseTreeNode::getParent() const
return parent;
}
ParseTreeNode::~ParseTreeNode()
void ParseTreeNode::render(const RBRenderInfo& info)
{
/* Parameters don't get rendered */
if(!element && param)
return;
/* If we're at the root, we need to render each viewport */
if(!element && !param)
{
for(int i = 0; i < children.count(); i++)
delete children[i];
{
children[i]->render(info);
}
return;
}
switch(element->type)
{
case VIEWPORT:
rendered = new RBViewport(element, info);
break;
}
}

View file

@ -23,6 +23,9 @@
#define PARSETREENODE_H
#include "skin_parser.h"
#include "rbviewport.h"
#include "rbscreen.h"
#include "rbrenderinfo.h"
#include <QString>
#include <QVariant>
@ -56,6 +59,8 @@ public:
return 0;
}
void render(const RBRenderInfo& info);
private:
ParseTreeNode* parent;
struct skin_element* element;
@ -63,6 +68,7 @@ private:
QList<ParseTreeNode*> children;
static int openConditionals;
QGraphicsItem* rendered;
};

View file

@ -35,7 +35,9 @@ HEADERS += models/parsetreemodel.h \
gui/tabcontent.h \
gui/configdocument.h \
gui/skinviewer.h \
graphics/rbscreen.h
graphics/rbscreen.h \
graphics/rbviewport.h \
graphics/rbrenderinfo.h
SOURCES += main.cpp \
models/parsetreemodel.cpp \
models/parsetreenode.cpp \
@ -47,7 +49,9 @@ SOURCES += main.cpp \
models/projectmodel.cpp \
gui/configdocument.cpp \
gui/skinviewer.cpp \
graphics/rbscreen.cpp
graphics/rbscreen.cpp \
graphics/rbviewport.cpp \
graphics/rbrenderinfo.cpp
OTHER_FILES += README \
resources/windowicon.png \
resources/appicon.xcf \