Theme Editor: Enabled editing tag parameters from a treeview
[kugel-rb.git] / utils / themeeditor / parsetreenode.cpp
blob98b4187a9e3dad3403e972340b84ab5173ef4d42
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2010 Robert Bieber
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 extern "C"
24 #include "symbols.h"
25 #include "tag_table.h"
28 #include "parsetreenode.h"
29 #include "parsetreemodel.h"
31 /* Root element constructor */
32 ParseTreeNode::ParseTreeNode(struct skin_element* data)
33 : parent(0), element(0), param(0), children()
35 while(data)
37 children.append(new ParseTreeNode(data, this));
38 data = data->next;
42 /* Normal element constructor */
43 ParseTreeNode::ParseTreeNode(struct skin_element* data, ParseTreeNode* parent)
44 : parent(parent), element(data), param(0), children()
46 switch(element->type)
49 case TAG:
50 for(int i = 0; i < element->params_count; i++)
52 if(element->params[i].type == skin_tag_parameter::CODE)
53 children.append(new ParseTreeNode(element->params[i].data.code,
54 this));
55 else
56 children.append(new ParseTreeNode(&element->params[i], this));
58 break;
60 /* CONDITIONAL and SUBLINES fall through to the same code */
61 case CONDITIONAL:
62 case SUBLINES:
63 for(int i = 0; i < element->children_count; i++)
65 children.append(new ParseTreeNode(data->children[i], this));
67 break;
69 case VIEWPORT:
70 case LINE:
71 for(int i = 0; i < data->children_count; i++)
73 for(struct skin_element* current = data->children[i]; current;
74 current = current->next)
76 children.append(new ParseTreeNode(current, this));
79 break;
81 default:
82 break;
86 /* Parameter constructor */
87 ParseTreeNode::ParseTreeNode(skin_tag_parameter *data, ParseTreeNode *parent)
88 : parent(parent), element(0), param(data), children()
93 QString ParseTreeNode::genCode() const
95 QString buffer = "";
97 if(element)
99 switch(element->type)
102 case VIEWPORT:
103 buffer.append(children[0]->genCode());
105 case LINE:
106 for(int i = 0; i < children.count(); i++)
109 Adding a % in case of tag, because the tag rendering code
110 doesn't insert its own
112 if(children[i]->element->type == TAG)
113 buffer.append(TAGSYM);
114 buffer.append(children[i]->genCode());
116 break;
118 case SUBLINES:
119 for(int i = 0; i < children.count(); i++)
121 buffer.append(children[i]->genCode());
122 if(i != children.count() - 1)
123 buffer.append(MULTILINESYM);
125 break;
127 case CONDITIONAL:
128 /* Inserts a %?, the tag renderer doesn't deal with the TAGSYM */
129 buffer.append(TAGSYM);
130 buffer.append(CONDITIONSYM);
131 buffer.append(children[0]->genCode());
133 /* Inserting the sublines */
134 buffer.append(ENUMLISTOPENSYM);
135 for(int i = 1; i < children.count(); i++)
137 buffer.append(children[i]->genCode());
138 if(i != children.count() - 1)
139 buffer.append(ENUMLISTSEPERATESYM);
141 buffer.append(ENUMLISTCLOSESYM);
142 break;
144 case TAG:
145 /* When generating code, we DO NOT insert the leading TAGSYM, leave
146 * the calling functions to handle that
148 buffer.append(element->tag->name);
150 if(element->params_count > 0)
152 /* Rendering parameters if there are any */
153 buffer.append(ARGLISTOPENSYM);
154 for(int i = 0; i < children.count(); i++)
156 buffer.append(children[i]->genCode());
157 if(i != children.count() - 1)
158 buffer.append(ARGLISTSEPERATESYM);
160 buffer.append(ARGLISTCLOSESYM);
162 break;
164 case NEWLINE:
165 buffer.append('\n');
166 break;
168 case TEXT:
169 buffer.append(element->text);
170 break;
172 case COMMENT:
173 buffer.append(COMMENTSYM);
174 buffer.append(element->text);
175 break;
178 else if(param)
180 switch(param->type)
182 case skin_tag_parameter::STRING:
183 buffer.append(param->data.text);
184 break;
186 case skin_tag_parameter::NUMERIC:
187 buffer.append(QString::number(param->data.numeric, 10));
188 break;
190 case skin_tag_parameter::DEFAULT:
191 buffer.append(DEFAULTSYM);
192 break;
194 case skin_tag_parameter::CODE:
195 buffer.append(QObject::tr("This doesn't belong here"));
196 break;
200 else
202 for(int i = 0; i < children.count(); i++)
203 buffer.append(children[i]->genCode());
206 return buffer;
209 ParseTreeNode* ParseTreeNode::child(int row)
211 if(row < 0 || row >= children.count())
212 return 0;
214 return children[row];
217 int ParseTreeNode::numChildren() const
219 return children.count();
223 QVariant ParseTreeNode::data(int column) const
225 switch(column)
227 case ParseTreeModel::typeColumn:
228 if(element)
230 switch(element->type)
232 case VIEWPORT:
233 return QObject::tr("Viewport");
235 case LINE:
236 return QObject::tr("Logical Line");
238 case SUBLINES:
239 return QObject::tr("Alternator");
241 case COMMENT:
242 return QObject::tr("Comment");
244 case CONDITIONAL:
245 return QObject::tr("Conditional Tag");
247 case TAG:
248 return QObject::tr("Tag");
250 case NEWLINE:
251 return QObject::tr("Newline");
253 case TEXT:
254 return QObject::tr("Plaintext");
257 else if(param)
259 switch(param->type)
261 case skin_tag_parameter::STRING:
262 return QObject::tr("String");
264 case skin_tag_parameter::NUMERIC:
265 return QObject::tr("Number");
267 case skin_tag_parameter::DEFAULT:
268 return QObject::tr("Default Argument");
270 case skin_tag_parameter::CODE:
271 return QObject::tr("This doesn't belong here");
274 else
276 return QObject::tr("Root");
279 break;
281 case ParseTreeModel::valueColumn:
282 if(element)
284 switch(element->type)
286 case VIEWPORT:
287 case LINE:
288 case SUBLINES:
289 case CONDITIONAL:
290 return QString();
292 case NEWLINE:
293 return QObject::tr("\\n");
295 case TEXT:
296 case COMMENT:
297 return QString(element->text);
299 case TAG:
300 return QString(element->tag->name);
303 else if(param)
305 switch(param->type)
307 case skin_tag_parameter::DEFAULT:
308 return QObject::tr("-");
310 case skin_tag_parameter::STRING:
311 return QString(param->data.text);
313 case skin_tag_parameter::NUMERIC:
314 return QString::number(param->data.numeric, 10);
316 case skin_tag_parameter::CODE:
317 return QObject::tr("Seriously, something's wrong here");
320 else
322 return QString();
324 break;
326 case ParseTreeModel::lineColumn:
327 if(element)
328 return QString::number(element->line, 10);
329 else
330 return QString();
331 break;
334 return QVariant();
338 int ParseTreeNode::getRow() const
340 if(!parent)
341 return -1;
343 return parent->children.indexOf(const_cast<ParseTreeNode*>(this));
346 ParseTreeNode* ParseTreeNode::getParent() const
348 return parent;
351 ParseTreeNode::~ParseTreeNode()
353 for(int i = 0; i < children.count(); i++)
354 delete children[i];