summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Bieber <robby@bieberphoto.com>2010-06-18 21:10:01 +0000
committerRobert Bieber <robby@bieberphoto.com>2010-06-18 21:10:01 +0000
commitd8827b5ff10c66a065a210d8aaf1d88214ee1070 (patch)
tree26a23ff031105ee98cbba967a4554ebf8ac423a6
parent62622277dc2a11117605e5e7ff3d2a5f0423d8da (diff)
downloadrockbox-d8827b5ff10c66a065a210d8aaf1d88214ee1070.tar.gz
rockbox-d8827b5ff10c66a065a210d8aaf1d88214ee1070.zip
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
-rw-r--r--utils/themeeditor/graphics/rbrenderinfo.cpp46
-rw-r--r--utils/themeeditor/graphics/rbrenderinfo.h49
-rw-r--r--utils/themeeditor/graphics/rbscreen.h4
-rw-r--r--utils/themeeditor/graphics/rbviewport.cpp110
-rw-r--r--utils/themeeditor/graphics/rbviewport.h54
-rw-r--r--utils/themeeditor/gui/skindocument.cpp2
-rw-r--r--utils/themeeditor/gui/skinviewer.cpp4
-rw-r--r--utils/themeeditor/models/parsetreemodel.cpp8
-rw-r--r--utils/themeeditor/models/parsetreenode.cpp32
-rw-r--r--utils/themeeditor/models/parsetreenode.h6
-rw-r--r--utils/themeeditor/themeeditor.pro8
11 files changed, 317 insertions, 6 deletions
diff --git a/utils/themeeditor/graphics/rbrenderinfo.cpp b/utils/themeeditor/graphics/rbrenderinfo.cpp
new file mode 100644
index 0000000000..c2612373c8
--- /dev/null
+++ b/utils/themeeditor/graphics/rbrenderinfo.cpp
@@ -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()
+{
+}
diff --git a/utils/themeeditor/graphics/rbrenderinfo.h b/utils/themeeditor/graphics/rbrenderinfo.h
new file mode 100644
index 0000000000..c99de7beaa
--- /dev/null
+++ b/utils/themeeditor/graphics/rbrenderinfo.h
@@ -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
diff --git a/utils/themeeditor/graphics/rbscreen.h b/utils/themeeditor/graphics/rbscreen.h
index f244089b2d..78bbcfd8b2 100644
--- a/utils/themeeditor/graphics/rbscreen.h
+++ b/utils/themeeditor/graphics/rbscreen.h
@@ -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;
diff --git a/utils/themeeditor/graphics/rbviewport.cpp b/utils/themeeditor/graphics/rbviewport.cpp
new file mode 100644
index 0000000000..1f1f02ce55
--- /dev/null
+++ b/utils/themeeditor/graphics/rbviewport.cpp
@@ -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);
+}
+
diff --git a/utils/themeeditor/graphics/rbviewport.h b/utils/themeeditor/graphics/rbviewport.h
new file mode 100644
index 0000000000..0ec377bc39
--- /dev/null
+++ b/utils/themeeditor/graphics/rbviewport.h
@@ -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
diff --git a/utils/themeeditor/gui/skindocument.cpp b/utils/themeeditor/gui/skindocument.cpp
index aeefcc38f4..6d28de38a8 100644
--- a/utils/themeeditor/gui/skindocument.cpp
+++ b/utils/themeeditor/gui/skindocument.cpp
@@ -257,6 +257,8 @@ void SkinDocument::codeChanged()
else
emit titleChanged(titleText);
+ model->render(project);
+
cursorChanged();
}
diff --git a/utils/themeeditor/gui/skinviewer.cpp b/utils/themeeditor/gui/skinviewer.cpp
index 152450e149..cabe788d47 100644
--- a/utils/themeeditor/gui/skinviewer.cpp
+++ b/utils/themeeditor/gui/skinviewer.cpp
@@ -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()
diff --git a/utils/themeeditor/models/parsetreemodel.cpp b/utils/themeeditor/models/parsetreemodel.cpp
index 762443f4a5..41cecc4c20 100644
--- a/utils/themeeditor/models/parsetreemodel.cpp
+++ b/utils/themeeditor/models/parsetreemodel.cpp
@@ -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;
}
diff --git a/utils/themeeditor/models/parsetreenode.cpp b/utils/themeeditor/models/parsetreenode.cpp
index 397031aee1..97beca4c3d 100644
--- a/utils/themeeditor/models/parsetreenode.cpp
+++ b/utils/themeeditor/models/parsetreenode.cpp
@@ -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)
{
- for(int i = 0; i < children.count(); i++)
- delete children[i];
+ /* 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++)
+ {
+ children[i]->render(info);
+ }
+
+ return;
+ }
+
+ switch(element->type)
+ {
+ case VIEWPORT:
+ rendered = new RBViewport(element, info);
+ break;
+ }
}
+
diff --git a/utils/themeeditor/models/parsetreenode.h b/utils/themeeditor/models/parsetreenode.h
index 7a0807bb0d..bfbd5968d3 100644
--- a/utils/themeeditor/models/parsetreenode.h
+++ b/utils/themeeditor/models/parsetreenode.h
@@ -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;
};
diff --git a/utils/themeeditor/themeeditor.pro b/utils/themeeditor/themeeditor.pro
index 157433ef55..ba3efa92db 100644
--- a/utils/themeeditor/themeeditor.pro
+++ b/utils/themeeditor/themeeditor.pro
@@ -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 \