1
0
Fork 0
forked from len0rd/rockbox

Theme Editor: Implemented subline rendering, including conditional subline times

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27182 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Bieber 2010-06-29 19:59:33 +00:00
parent f641fc62d8
commit 3ecef7d801
5 changed files with 83 additions and 0 deletions

View file

@ -29,6 +29,11 @@ RBRenderInfo::RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
{
}
RBRenderInfo::RBRenderInfo()
: mProject(0), mSettings(0), mDevice(0), mScreen(0), mModel(0)
{
}
RBRenderInfo::RBRenderInfo(const RBRenderInfo &other)
{
mProject = other.mProject;

View file

@ -35,6 +35,7 @@ public:
RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
QMap<QString, QString>* settings, DeviceState* device,
RBScreen* screen);
RBRenderInfo();
RBRenderInfo(const RBRenderInfo& other);
virtual ~RBRenderInfo();

View file

@ -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);
}

View file

@ -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);

View file

@ -96,6 +96,7 @@ D3 ; Next File cd up x3 ; text ; /
[Playlist/Song Info]
px ; Percent Played ; spin(0,100) ; 50
pc ; Current Time In Song ; text ; 1:00
?pc ; Time In Song (Conditional) ; fspin(0,5000) ; 60
pe ; Playlist Entries ; spin(0,1000) ; 20
pn ; Playlist Name ; text ; Current Playlist
pp ; Playlist Position ; spin(0,1000) ; 10