diff options
author | Robert Bieber <robby@bieberphoto.com> | 2010-06-18 21:10:01 +0000 |
---|---|---|
committer | Robert Bieber <robby@bieberphoto.com> | 2010-06-18 21:10:01 +0000 |
commit | d8827b5ff10c66a065a210d8aaf1d88214ee1070 (patch) | |
tree | 26a23ff031105ee98cbba967a4554ebf8ac423a6 /utils | |
parent | 62622277dc2a11117605e5e7ff3d2a5f0423d8da (diff) |
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
Diffstat (limited to 'utils')
-rw-r--r-- | utils/themeeditor/graphics/rbrenderinfo.cpp | 46 | ||||
-rw-r--r-- | utils/themeeditor/graphics/rbrenderinfo.h | 49 | ||||
-rw-r--r-- | utils/themeeditor/graphics/rbscreen.h | 4 | ||||
-rw-r--r-- | utils/themeeditor/graphics/rbviewport.cpp | 110 | ||||
-rw-r--r-- | utils/themeeditor/graphics/rbviewport.h | 54 | ||||
-rw-r--r-- | utils/themeeditor/gui/skindocument.cpp | 2 | ||||
-rw-r--r-- | utils/themeeditor/gui/skinviewer.cpp | 4 | ||||
-rw-r--r-- | utils/themeeditor/models/parsetreemodel.cpp | 8 | ||||
-rw-r--r-- | utils/themeeditor/models/parsetreenode.cpp | 32 | ||||
-rw-r--r-- | utils/themeeditor/models/parsetreenode.h | 6 | ||||
-rw-r--r-- | utils/themeeditor/themeeditor.pro | 8 |
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 \ |