Theme Editor: Put together a simple GUI to test going back and forth between a tree...
[kugel-rb.git] / utils / themeeditor / parsetreenode.cpp
blob41cdf3ca24b72a80fba121406df52257f21e24b6
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 #include "symbols.h"
23 #include "tag_table.h"
25 #include "parsetreenode.h"
26 #include "parsetreemodel.h"
28 /* Root element constructor */
29 ParseTreeNode::ParseTreeNode(struct skin_element* data)
30 : parent(0), element(0), param(0), children()
32 while(data)
34 children.append(new ParseTreeNode(data, this));
35 data = data->next;
39 /* Normal element constructor */
40 ParseTreeNode::ParseTreeNode(struct skin_element* data, ParseTreeNode* parent)
41 : parent(parent), element(data), param(0), children()
43 switch(element->type)
46 case TAG:
47 for(int i = 0; i < element->params_count; i++)
49 if(element->params[i].type == skin_tag_parameter::CODE)
50 children.append(new ParseTreeNode(element->params[i].data.code,
51 this));
52 else
53 children.append(new ParseTreeNode(&element->params[i], this));
55 break;
57 /* CONDITIONAL and SUBLINES fall through to the same code */
58 case CONDITIONAL:
59 case SUBLINES:
60 for(int i = 0; i < element->children_count; i++)
62 children.append(new ParseTreeNode(data->children[i], this));
64 break;
66 case VIEWPORT:
67 case LINE:
68 for(int i = 0; i < data->children_count; i++)
70 for(struct skin_element* current = data->children[i]; current;
71 current = current->next)
73 children.append(new ParseTreeNode(current, this));
76 break;
78 default:
79 break;
83 /* Parameter constructor */
84 ParseTreeNode::ParseTreeNode(skin_tag_parameter *data, ParseTreeNode *parent)
85 : parent(parent), element(0), param(data), children()
90 QString ParseTreeNode::genCode() const
92 QString buffer = "";
94 if(element)
96 switch(element->type)
99 case VIEWPORT:
100 case LINE:
101 for(int i = 0; i < children.count(); i++)
104 Adding a % in case of tag, because the tag rendering code
105 doesn't insert its own
107 if(children[i]->element->type == TAG)
108 buffer.append(TAGSYM);
109 buffer.append(children[i]->genCode());
111 break;
113 case SUBLINES:
114 for(int i = 0; i < children.count(); i++)
116 buffer.append(children[i]->genCode());
117 if(i != children.count() - 1)
118 buffer.append(MULTILINESYM);
120 break;
122 case CONDITIONAL:
123 /* Inserts a %?, the tag renderer doesn't deal with the TAGSYM */
124 buffer.append(TAGSYM);
125 buffer.append(CONDITIONSYM);
126 buffer.append(children[0]->genCode());
128 /* Inserting the sublines */
129 buffer.append(ENUMLISTOPENSYM);
130 for(int i = 1; i < children.count(); i++)
132 buffer.append(children[i]->genCode());
133 if(i != children.count() - 1)
134 buffer.append(ENUMLISTSEPERATESYM);
136 buffer.append(ENUMLISTCLOSESYM);
137 break;
139 case TAG:
140 /* When generating code, we DO NOT insert the leading TAGSYM, leave
141 * the calling functions to handle that
143 buffer.append(element->tag->name);
145 if(element->params_count > 0)
147 /* Rendering parameters if there are any */
148 buffer.append(ARGLISTOPENSYM);
149 for(int i = 0; i < children.count(); i++)
151 buffer.append(children[i]->genCode());
152 if(i != children.count() - 1)
153 buffer.append(ARGLISTSEPERATESYM);
155 buffer.append(ARGLISTCLOSESYM);
157 break;
159 case NEWLINE:
160 buffer.append('\n');
161 break;
163 case TEXT:
164 buffer.append(element->text);
165 break;
167 case COMMENT:
168 buffer.append(COMMENTSYM);
169 buffer.append(element->text);
170 buffer.append('\n');
171 break;
174 else if(param)
176 switch(param->type)
178 case skin_tag_parameter::STRING:
179 buffer.append(param->data.text);
180 break;
182 case skin_tag_parameter::NUMERIC:
183 buffer.append(QString::number(param->data.numeric, 10));
184 break;
186 case skin_tag_parameter::DEFAULT:
187 buffer.append(DEFAULTSYM);
188 break;
190 case skin_tag_parameter::CODE:
191 buffer.append(QObject::tr("This doesn't belong here"));
192 break;
196 else
198 for(int i = 0; i < children.count(); i++)
199 buffer.append(children[i]->genCode());
202 return buffer;
205 ParseTreeNode* ParseTreeNode::child(int row)
207 if(row < 0 || row >= children.count())
208 return 0;
210 return children[row];
213 int ParseTreeNode::numChildren() const
215 return children.count();
219 QVariant ParseTreeNode::data(int column) const
221 switch(column)
223 case ParseTreeModel::typeColumn:
224 if(element)
226 switch(element->type)
228 case VIEWPORT:
229 return QObject::tr("Viewport");
231 case LINE:
232 return QObject::tr("Logical Line");
234 case SUBLINES:
235 return QObject::tr("Alternator");
237 case COMMENT:
238 return QObject::tr("Comment");
240 case CONDITIONAL:
241 return QObject::tr("Conditional Tag");
243 case TAG:
244 return QObject::tr("Tag");
246 case NEWLINE:
247 return QObject::tr("Newline");
249 case TEXT:
250 return QObject::tr("Plaintext");
253 else if(param)
255 switch(param->type)
257 case skin_tag_parameter::STRING:
258 return QObject::tr("String");
260 case skin_tag_parameter::NUMERIC:
261 return QObject::tr("Number");
263 case skin_tag_parameter::DEFAULT:
264 return QObject::tr("Default Argument");
266 case skin_tag_parameter::CODE:
267 return QObject::tr("This doesn't belong here");
270 else
272 return QObject::tr("Root");
275 break;
277 case ParseTreeModel::valueColumn:
278 if(element)
280 switch(element->type)
282 case VIEWPORT:
283 case LINE:
284 case SUBLINES:
285 case CONDITIONAL:
286 return QString();
288 case NEWLINE:
289 return QObject::tr("\\n");
291 case TEXT:
292 case COMMENT:
293 return QString(element->text);
295 case TAG:
296 return QString(element->tag->name);
299 else if(param)
301 switch(param->type)
303 case skin_tag_parameter::DEFAULT:
304 return QObject::tr("-");
306 case skin_tag_parameter::STRING:
307 return QString(param->data.text);
309 case skin_tag_parameter::NUMERIC:
310 return QString::number(param->data.numeric, 10);
312 case skin_tag_parameter::CODE:
313 return QObject::tr("Seriously, something's wrong here");
316 else
318 return QString();
320 break;
322 case ParseTreeModel::lineColumn:
323 if(element)
324 return QString::number(element->line, 10);
325 else
326 return QString();
327 break;
330 return QVariant();
334 int ParseTreeNode::getRow() const
336 if(!parent)
337 return -1;
339 return parent->children.indexOf(const_cast<ParseTreeNode*>(this));
342 ParseTreeNode* ParseTreeNode::getParent() const
344 return parent;
347 ParseTreeNode::~ParseTreeNode()
349 for(int i = 0; i < children.count(); i++)
350 delete children[i];