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:
parent
f641fc62d8
commit
3ecef7d801
5 changed files with 83 additions and 0 deletions
|
@ -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)
|
RBRenderInfo::RBRenderInfo(const RBRenderInfo &other)
|
||||||
{
|
{
|
||||||
mProject = other.mProject;
|
mProject = other.mProject;
|
||||||
|
|
|
@ -35,6 +35,7 @@ public:
|
||||||
RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
|
RBRenderInfo(ParseTreeModel* model, ProjectModel* project,
|
||||||
QMap<QString, QString>* settings, DeviceState* device,
|
QMap<QString, QString>* settings, DeviceState* device,
|
||||||
RBScreen* screen);
|
RBScreen* screen);
|
||||||
|
RBRenderInfo();
|
||||||
RBRenderInfo(const RBRenderInfo& other);
|
RBRenderInfo(const RBRenderInfo& other);
|
||||||
virtual ~RBRenderInfo();
|
virtual ~RBRenderInfo();
|
||||||
|
|
||||||
|
|
|
@ -532,6 +532,47 @@ void ParseTreeNode::render(const RBRenderInfo &info, RBViewport* viewport)
|
||||||
int child = evalTag(info, true, element->children_count).toInt();
|
int child = evalTag(info, true, element->children_count).toInt();
|
||||||
children[child]->render(info, viewport);
|
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)
|
bool ParseTreeNode::execTag(const RBRenderInfo& info, RBViewport* viewport)
|
||||||
|
@ -756,3 +797,34 @@ QVariant ParseTreeNode::evalTag(const RBRenderInfo& info, bool conditional,
|
||||||
return branches - 1;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -62,6 +62,10 @@ public:
|
||||||
void render(const RBRenderInfo& info);
|
void render(const RBRenderInfo& info);
|
||||||
void render(const RBRenderInfo &info, RBViewport* viewport);
|
void render(const RBRenderInfo &info, RBViewport* viewport);
|
||||||
|
|
||||||
|
double findBranchTime(ParseTreeNode* branch, const RBRenderInfo& info);
|
||||||
|
double findConditionalTime(ParseTreeNode* conditional,
|
||||||
|
const RBRenderInfo& info);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool execTag(const RBRenderInfo& info, RBViewport* viewport);
|
bool execTag(const RBRenderInfo& info, RBViewport* viewport);
|
||||||
|
|
|
@ -96,6 +96,7 @@ D3 ; Next File cd up x3 ; text ; /
|
||||||
[Playlist/Song Info]
|
[Playlist/Song Info]
|
||||||
px ; Percent Played ; spin(0,100) ; 50
|
px ; Percent Played ; spin(0,100) ; 50
|
||||||
pc ; Current Time In Song ; text ; 1:00
|
pc ; Current Time In Song ; text ; 1:00
|
||||||
|
?pc ; Time In Song (Conditional) ; fspin(0,5000) ; 60
|
||||||
pe ; Playlist Entries ; spin(0,1000) ; 20
|
pe ; Playlist Entries ; spin(0,1000) ; 20
|
||||||
pn ; Playlist Name ; text ; Current Playlist
|
pn ; Playlist Name ; text ; Current Playlist
|
||||||
pp ; Playlist Position ; spin(0,1000) ; 10
|
pp ; Playlist Position ; spin(0,1000) ; 10
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue