From 3ecef7d8015bffb875f5da07c7bd74a30447d3c8 Mon Sep 17 00:00:00 2001 From: Robert Bieber Date: Tue, 29 Jun 2010 19:59:33 +0000 Subject: Theme Editor: Implemented subline rendering, including conditional subline times git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27182 a1c6a512-1295-4272-9138-f99709370657 --- utils/themeeditor/models/parsetreenode.cpp | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'utils/themeeditor/models/parsetreenode.cpp') diff --git a/utils/themeeditor/models/parsetreenode.cpp b/utils/themeeditor/models/parsetreenode.cpp index 1cf7509..a2781d2 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 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); +} -- cgit v1.1