diff options
author | Robert Bieber <robby@bieberphoto.com> | 2010-06-29 19:59:33 +0000 |
---|---|---|
committer | Robert Bieber <robby@bieberphoto.com> | 2010-06-29 19:59:33 +0000 |
commit | 3ecef7d8015bffb875f5da07c7bd74a30447d3c8 (patch) | |
tree | 251238b40ccfab3fa0a48eea65a503baf5c4eb22 /utils/themeeditor/models | |
parent | f641fc62d89040d72c7908dcf0985f571ddb0531 (diff) | |
download | rockbox-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.cpp | 72 | ||||
-rw-r--r-- | utils/themeeditor/models/parsetreenode.h | 4 |
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); |