summaryrefslogtreecommitdiff
path: root/utils/themeeditor/models
diff options
context:
space:
mode:
Diffstat (limited to 'utils/themeeditor/models')
-rw-r--r--utils/themeeditor/models/targetdata.cpp245
-rw-r--r--utils/themeeditor/models/targetdata.h80
2 files changed, 325 insertions, 0 deletions
diff --git a/utils/themeeditor/models/targetdata.cpp b/utils/themeeditor/models/targetdata.cpp
new file mode 100644
index 0000000..a20a4cf
--- /dev/null
+++ b/utils/themeeditor/models/targetdata.cpp
@@ -0,0 +1,245 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2010 Robert Bieber
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "targetdata.h"
+
+#include <QStringList>
+
+const QString TargetData::reserved = "{}:#\n";
+
+TargetData::TargetData(QString file)
+{
+ if(!QFile::exists(file))
+ file = ":/targets/targetdb";
+
+ QFile fin(file);
+ fin.open(QFile::ReadOnly | QFile::Text);
+
+ /* Reading the database */
+ QString data = QString(fin.readAll());
+
+ fin.close();
+
+ int cursor = 0;
+ int index = 0;
+ while(cursor < data.count())
+ {
+ QString id = scanString(data, cursor);
+ QString name = "";
+ QRect size(0, 0, 0, 0);
+ ScreenDepth depth = None;
+ QRect rSize(0, 0, 0, 0);
+ ScreenDepth rDepth = None;
+ bool fm = false;
+
+ if(id == "")
+ break;
+
+ if(!require('{', data, cursor))
+ break;
+
+ /* Now we have to parse each of the arguments */
+ while(cursor < data.count())
+ {
+ QString key = scanString(data, cursor);
+ if(key == "")
+ {
+ break;
+ }
+ else
+ {
+ if(!require(':', data, cursor))
+ break;
+
+ if(key.toLower() == "name")
+ {
+ name = scanString(data, cursor);
+ }
+ else if(key.toLower() == "screen")
+ {
+ QString s = scanString(data, cursor);
+ if(s[0].toLower() != 'n')
+ {
+ int subCursor = 0;
+ int width = scanInt(s, subCursor);
+
+ if(!require('x', s, subCursor))
+ break;
+
+ int height = scanInt(s, subCursor);
+
+ if(!require('@', s, subCursor))
+ break;
+
+ size = QRect(0, 0, width, height);
+ depth = scanDepth(s, subCursor);
+ }
+ }
+ else if(key.toLower() == "remote")
+ {
+ QString s = scanString(data, cursor);
+ if(s[0].toLower() != 'n')
+ {
+ int subCursor = 0;
+ int width = scanInt(s, subCursor);
+
+ if(!require('x', s, subCursor))
+ break;
+
+ int height = scanInt(s, subCursor);
+
+ if(!require('@', s, subCursor))
+ break;
+
+ rSize = QRect(0, 0, width, height);
+ rDepth = scanDepth(s, subCursor);
+ }
+ }
+ else if(key.toLower() == "fm")
+ {
+ QString s = scanString(data, cursor);
+ if(s.toLower() == "yes")
+ fm = true;
+ }
+ }
+ }
+
+ /* Checking for the closing '}' and adding the entry */
+ if(require('}', data, cursor))
+ {
+ entries.append(Entry(name, size, depth, rSize, rDepth, fm));
+ indices.insert(id, index);
+ index++;
+ }
+ else
+ {
+ break;
+ }
+ }
+}
+
+TargetData::~TargetData()
+{
+}
+
+QString TargetData::scanString(QString data, int &index)
+{
+ QString retval;
+
+ /* Skipping whitespace and comments */
+ while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
+ {
+ if(data[index] == '#')
+ skipComment(data, index);
+ else
+ index++;
+ }
+
+ while(index < data.count() && !reserved.contains(data[index]))
+ {
+ if(data[index] == '%')
+ {
+ retval.append(data[index + 1]);
+ index += 2;
+ }
+ else
+ {
+ retval.append(data[index]);
+ index++;
+ }
+ }
+
+ return retval.trimmed();
+}
+
+int TargetData::scanInt(QString data, int &index)
+{
+ /* Skipping whitespace and comments */
+ while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
+ {
+ if(data[index] == '#')
+ skipComment(data, index);
+ else
+ index++;
+ }
+
+ QString number;
+ while(index < data.count() && data[index].isDigit())
+ number.append(data[index++]);
+
+ return number.toInt();
+}
+
+TargetData::ScreenDepth TargetData::scanDepth(QString data, int &index)
+{
+ QString depth = scanString(data, index);
+
+ if(depth.toLower() == "grey")
+ return Grey;
+ else if(depth.toLower() == "rgb")
+ return RGB;
+ else if(depth.toLower() == "mono")
+ return Mono;
+ else
+ return None;
+}
+
+void TargetData::skipComment(QString data, int &index)
+{
+ if(data[index] != '#')
+ return;
+
+ while(index < data.count() && data[index] != '\n')
+ index++;
+
+ if(index < data.count())
+ index++;
+}
+
+bool TargetData::require(QChar required, QString data, int &index)
+{
+ /* Skipping whitespace and comments */
+ while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
+ {
+ if(data[index] == '#')
+ skipComment(data, index);
+ else
+ index++;
+ }
+
+ if(index == data.count())
+ {
+ return false;
+ }
+ else
+ {
+ if(data[index] == required)
+ {
+ index++;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+}
diff --git a/utils/themeeditor/models/targetdata.h b/utils/themeeditor/models/targetdata.h
new file mode 100644
index 0000000..6178509
--- /dev/null
+++ b/utils/themeeditor/models/targetdata.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2010 Robert Bieber
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef TARGETDATA_H
+#define TARGETDATA_H
+
+#include <QFile>
+#include <QString>
+#include <QHash>
+#include <QRect>
+
+class TargetData
+{
+
+public:
+ enum ScreenDepth
+ {
+ RGB,
+ Grey,
+ Mono,
+ None
+ };
+
+ TargetData(QString file = "");
+ virtual ~TargetData();
+
+ int count(){ return indices.count(); }
+ int index(QString id){ return indices.value(id, -1); }
+
+ QString id(int index){ return indices.key(index, ""); }
+ QString name(int index){ return entries[index].name; }
+
+private:
+ struct Entry
+ {
+ Entry(QString name, QRect size, ScreenDepth depth, QRect rSize,
+ ScreenDepth rDepth, bool fm)
+ : name(name), size(size), depth(depth), rSize(rSize),
+ rDepth(rDepth), fm(fm){ }
+
+ QString name;
+ QRect size;
+ ScreenDepth depth;
+ QRect rSize;
+ ScreenDepth rDepth;
+ bool fm;
+ };
+
+ static const QString reserved;
+
+ QString scanString(QString data, int& index);
+ int scanInt(QString data, int& index);
+ ScreenDepth scanDepth(QString data, int& index);
+ void skipComment(QString data, int& index);
+ bool require(QChar required, QString data, int& index);
+
+ QHash<QString, int> indices;
+ QList<Entry> entries;
+
+};
+
+#endif // TARGETDATA_H