summaryrefslogtreecommitdiffstats
path: root/utils/themeeditor/models
diff options
context:
space:
mode:
authorRobert Bieber <robby@bieberphoto.com>2010-06-29 19:59:33 +0000
committerRobert Bieber <robby@bieberphoto.com>2010-06-29 19:59:33 +0000
commit3ecef7d8015bffb875f5da07c7bd74a30447d3c8 (patch)
tree251238b40ccfab3fa0a48eea65a503baf5c4eb22 /utils/themeeditor/models
parentf641fc62d89040d72c7908dcf0985f571ddb0531 (diff)
downloadrockbox-3ecef7d8015bffb875f5da07c7bd74a30447d3c8.tar.gz
rockbox-3ecef7d8015bffb875f5da07c7bd74a30447d3c8.zip
Theme Editor: Implemented subline rendering, including conditional subline times
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27182 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/themeeditor/models')
-rw-r--r--utils/themeeditor/models/parsetreenode.cpp72
-rw-r--r--utils/themeeditor/models/parsetreenode.h4
2 files changed, 76 insertions, 0 deletions
diff --git a/utils/themeeditor/models/parsetreenode.cpp b/utils/themeeditor/models/parsetreenode.cpp
index 1cf750904c..a2781d237d 100644
--- a/utils/themeeditor/models/parsetreenode.cpp
+++ b/utils/themeeditor/models/parsetreenode.cpp
@@ -532,6 +532,47 @@ void ParseTreeNode::render(const RBRenderInfo &info, RBViewport* viewport)
int child = evalTag(info, true, element->children_count).toInt();
children[child]->render(info, viewport);
}
+ else if(element->type == SUBLINES)
+ {
+ /* First we build a list of the times for each branch */
+ QList<double> times;
+ for(int i = 0; i < children.count() ; i++)
+ times.append(findBranchTime(children[i], info));
+
+ /* Now we figure out which branch to select */
+ double timeLeft = info.device()->data(QString("?pc")).toDouble();
+ int branch = 0;
+ while(timeLeft > 0)
+ {
+ timeLeft -= times[branch];
+ if(timeLeft >= 0)
+ branch++;
+ else
+ break;
+ if(branch >= times.count())
+ branch = 0;
+ }
+
+ /* In case we end up on a disabled branch, skip ahead. If we find that
+ * all the branches are disabled, don't render anything
+ */
+ int originalBranch = branch;
+ while(times[branch] == 0)
+ {
+ branch++;
+ if(branch == originalBranch)
+ {
+ branch = -1;
+ break;
+ }
+ if(branch >= times.count())
+ branch = 0;
+ }
+
+ /* ...and finally render the selected branch */
+ if(branch >= 0)
+ children[branch]->render(info, viewport);
+ }
}
bool ParseTreeNode::execTag(const RBRenderInfo& info, RBViewport* viewport)
@@ -756,3 +797,34 @@ QVariant ParseTreeNode::evalTag(const RBRenderInfo& info, bool conditional,
return branches - 1;
}
}
+
+double ParseTreeNode::findBranchTime(ParseTreeNode *branch,
+ const RBRenderInfo& info)
+{
+ double retval = 2;
+ for(int i = 0; i < branch->children.count(); i++)
+ {
+ ParseTreeNode* current = branch->children[i];
+ if(current->element->type == TAG)
+ {
+ if(current->element->tag->name[0] == 't'
+ && current->element->tag->name[1] == '\0')
+ {
+ retval = atof(current->element->params[0].data.text);
+ }
+ }
+ else if(current->element->type == CONDITIONAL)
+ {
+ retval = findConditionalTime(current, info);
+ }
+ }
+ return retval;
+}
+
+double ParseTreeNode::findConditionalTime(ParseTreeNode *conditional,
+ const RBRenderInfo& info)
+{
+ int child = conditional->evalTag(info, true,
+ conditional->children.count()).toInt();
+ return findBranchTime(conditional->children[child], info);
+}
diff --git a/utils/themeeditor/models/parsetreenode.h b/utils/themeeditor/models/parsetreenode.h
index f85460d93d..7d7154aba8 100644
--- a/utils/themeeditor/models/parsetreenode.h
+++ b/utils/themeeditor/models/parsetreenode.h
@@ -62,6 +62,10 @@ public:
void render(const RBRenderInfo& info);
void render(const RBRenderInfo &info, RBViewport* viewport);
+ double findBranchTime(ParseTreeNode* branch, const RBRenderInfo& info);
+ double findConditionalTime(ParseTreeNode* conditional,
+ const RBRenderInfo& info);
+
private:
bool execTag(const RBRenderInfo& info, RBViewport* viewport);