From 025147effbee00db8bae931b3ef3df25052e0d96 Mon Sep 17 00:00:00 2001 From: Robert Bieber Date: Fri, 16 Jul 2010 20:47:23 +0000 Subject: Theme Editor: Added target database, now populates combo box in new project dialog but otherwise not used yet git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27450 a1c6a512-1295-4272-9138-f99709370657 --- utils/themeeditor/gui/editorwindow.h | 1 + utils/themeeditor/gui/newprojectdialog.cpp | 11 ++ utils/themeeditor/gui/newprojectdialog.h | 3 + utils/themeeditor/gui/newprojectdialog.ui | 10 +- utils/themeeditor/models/targetdata.cpp | 245 +++++++++++++++++++++++++++++ utils/themeeditor/models/targetdata.h | 80 ++++++++++ utils/themeeditor/resources.qrc | 3 + utils/themeeditor/resources/targetdb | 73 +++++++++ utils/themeeditor/themeeditor.pro | 9 +- 9 files changed, 424 insertions(+), 11 deletions(-) create mode 100644 utils/themeeditor/models/targetdata.cpp create mode 100644 utils/themeeditor/models/targetdata.h create mode 100644 utils/themeeditor/resources/targetdb (limited to 'utils') diff --git a/utils/themeeditor/gui/editorwindow.h b/utils/themeeditor/gui/editorwindow.h index 5bfa795714..55e18732d0 100644 --- a/utils/themeeditor/gui/editorwindow.h +++ b/utils/themeeditor/gui/editorwindow.h @@ -35,6 +35,7 @@ #include "skinviewer.h" #include "devicestate.h" #include "skintimer.h" +#include "targetdata.h" class ProjectModel; class TabContent; diff --git a/utils/themeeditor/gui/newprojectdialog.cpp b/utils/themeeditor/gui/newprojectdialog.cpp index 50a8bc4631..0df3250c5b 100644 --- a/utils/themeeditor/gui/newprojectdialog.cpp +++ b/utils/themeeditor/gui/newprojectdialog.cpp @@ -21,6 +21,7 @@ #include "newprojectdialog.h" #include "ui_newprojectdialog.h" +#include "targetdata.h" #include #include @@ -42,6 +43,13 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) : settings.endGroup(); + /* Populating the target box */ + TargetData targets; + for(int i = 0; i < targets.count(); i++) + { + ui->targetBox->insertItem(i, QIcon(), targets.name(i), targets.id(i)); + } + /* Connecting the browse button */ QObject::connect(ui->browseButton, SIGNAL(clicked()), this, SLOT(browse())); @@ -56,6 +64,8 @@ void NewProjectDialog::accept() { status.name = ui->nameBox->text(); status.path = ui->locationBox->text(); + status.target = ui->targetBox->itemData(ui->targetBox->currentIndex()) + .toString(); status.sbs = ui->sbsBox->isChecked(); status.wps = ui->wpsBox->isChecked(); status.fms = ui->fmsBox->isChecked(); @@ -77,6 +87,7 @@ void NewProjectDialog::reject() { ui->nameBox->setText(status.name); ui->locationBox->setText(status.path); + ui->targetBox->setCurrentIndex(0); ui->sbsBox->setChecked(status.sbs); ui->wpsBox->setChecked(status.wps); ui->fmsBox->setChecked(status.fms); diff --git a/utils/themeeditor/gui/newprojectdialog.h b/utils/themeeditor/gui/newprojectdialog.h index c59607c53f..6a54a133bc 100644 --- a/utils/themeeditor/gui/newprojectdialog.h +++ b/utils/themeeditor/gui/newprojectdialog.h @@ -35,6 +35,7 @@ public: { QString name; QString path; + QString target; bool sbs; bool wps; bool fms; @@ -46,6 +47,7 @@ public: { name = ""; path = ""; + target = ""; sbs = true; wps = true; fms = false; @@ -63,6 +65,7 @@ public: { name = other.name; path = other.path; + target = other.target; sbs = other.sbs; wps = other.wps; fms = other.fms; diff --git a/utils/themeeditor/gui/newprojectdialog.ui b/utils/themeeditor/gui/newprojectdialog.ui index f6e2dcc139..86292119c7 100644 --- a/utils/themeeditor/gui/newprojectdialog.ui +++ b/utils/themeeditor/gui/newprojectdialog.ui @@ -63,18 +63,12 @@ Target: - comboBox + targetBox - - - - Not Yet Available - - - + diff --git a/utils/themeeditor/models/targetdata.cpp b/utils/themeeditor/models/targetdata.cpp new file mode 100644 index 0000000000..a20a4cf18f --- /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 + +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 0000000000..6178509514 --- /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 +#include +#include +#include + +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 indices; + QList entries; + +}; + +#endif // TARGETDATA_H diff --git a/utils/themeeditor/resources.qrc b/utils/themeeditor/resources.qrc index bad8edcb20..9674595834 100644 --- a/utils/themeeditor/resources.qrc +++ b/utils/themeeditor/resources.qrc @@ -24,4 +24,7 @@ resources/fonts/08-Schumacher-Clean.fnt + + resources/targetdb + diff --git a/utils/themeeditor/resources/targetdb b/utils/themeeditor/resources/targetdb new file mode 100644 index 0000000000..414e8f03f3 --- /dev/null +++ b/utils/themeeditor/resources/targetdb @@ -0,0 +1,73 @@ +ipod12 +{ + name : iPod 1st/2nd Gen + screen : 160 x 128 @ grey + fm : no + remote : no +} + +ipod3 +{ + name : iPod 3rd Gen + screen : 160 x 128 @ grey + fm : no + remote : no +} + +ipod4 +{ + name : iPod 4th Gen + screen : 160 x 128 @ grey + fm : no + remote : no +} + +ipodmini12 +{ + name : iPod Mini 1st/2nd Gen + screen : 138 x 110 @ grey + fm : no + remote : no +} + +ipodcolor +{ + name : iPod Color/Photo + screen : 220 x 176 @ rgb + fm : no + remote : no +} + +ipodnano1 +{ + name : iPod Nano 1st Gen + screen : 176 x 132 @ rgb + fm : no + remote : no +} + +ipodvideo +{ + name : iPod Video + screen : 320 x 240 @ rgb + fm : no + remote : no +} + +# Olympus units + +mrobe100 +{ + name : m%:robe 100 + screen : 160 x 128 @ mono + fm : no + remote : 79 x 16 @ mono +} + +mrobe500 +{ + name : m%:robe 500 + screen : 640 x 480 @ rgb + fm : no + remote : 79 x 16 @ mono +} diff --git a/utils/themeeditor/themeeditor.pro b/utils/themeeditor/themeeditor.pro index 75bad8373b..48c9f8c24d 100644 --- a/utils/themeeditor/themeeditor.pro +++ b/utils/themeeditor/themeeditor.pro @@ -55,7 +55,8 @@ HEADERS += models/parsetreemodel.h \ graphics/rbtextcache.h \ gui/skintimer.h \ graphics/rbtoucharea.h \ - gui/newprojectdialog.h + gui/newprojectdialog.h \ + models/targetdata.h SOURCES += main.cpp \ models/parsetreemodel.cpp \ models/parsetreenode.cpp \ @@ -81,7 +82,8 @@ SOURCES += main.cpp \ graphics/rbtextcache.cpp \ gui/skintimer.cpp \ graphics/rbtoucharea.cpp \ - gui/newprojectdialog.cpp + gui/newprojectdialog.cpp \ + models/targetdata.cpp OTHER_FILES += README \ resources/windowicon.png \ resources/appicon.xcf \ @@ -102,7 +104,8 @@ OTHER_FILES += README \ resources/lines.xcf \ resources/lines.png \ resources/cursor.xcf \ - resources/cursor.png + resources/cursor.png \ + resources/targetdb FORMS += gui/editorwindow.ui \ gui/preferencesdialog.ui \ gui/configdocument.ui \ -- cgit v1.2.3