From 9445f37f77c64ad7954b23f4531bfd072f6b7566 Mon Sep 17 00:00:00 2001 From: bieber Date: Thu, 24 Jun 2010 07:59:41 +0000 Subject: [PATCH] Theme Editor: Fixed some resource alias issues, implemented device configuration panel that loads options from a text file git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27102 a1c6a512-1295-4272-9138-f99709370657 --- utils/themeeditor/gui/devicestate.cpp | 182 ++++++++++++++++++++++++++++- utils/themeeditor/gui/devicestate.h | 25 +++- utils/themeeditor/gui/devicestate.ui | 130 --------------------- utils/themeeditor/gui/editorwindow.cpp | 4 + utils/themeeditor/gui/editorwindow.ui | 5 +- utils/themeeditor/gui/preferencesdialog.ui | 8 +- utils/themeeditor/resources.qrc | 3 +- utils/themeeditor/resources/deviceoptions | 39 +++++++ utils/themeeditor/themeeditor.pro | 6 +- 9 files changed, 257 insertions(+), 145 deletions(-) delete mode 100644 utils/themeeditor/gui/devicestate.ui create mode 100644 utils/themeeditor/resources/deviceoptions diff --git a/utils/themeeditor/gui/devicestate.cpp b/utils/themeeditor/gui/devicestate.cpp index af0b84637..fb35e77b3 100644 --- a/utils/themeeditor/gui/devicestate.cpp +++ b/utils/themeeditor/gui/devicestate.cpp @@ -22,14 +22,188 @@ #include "devicestate.h" #include "ui_devicestate.h" +#include +#include +#include +#include +#include + DeviceState::DeviceState(QWidget *parent) : - QWidget(parent), - ui(new Ui::DeviceState) + QWidget(parent), tabs(this) { - ui->setupUi(this); + /* UI stuff */ + resize(500,400); + setWindowIcon(QIcon(":/resources/windowicon.png")); + setWindowTitle(tr("Device Settings")); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(&tabs); + this->setLayout(layout); + + /* Loading the tabs */ + QScrollArea* currentArea; + QHBoxLayout* subLayout; + QWidget* panel; + QWidget* temp; + + QFile fin(":/resources/deviceoptions"); + fin.open(QFile::Text | QFile::ReadOnly); + while(!fin.atEnd()) + { + QString line = QString(fin.readLine()); + line = line.trimmed(); + + /* Continue on a comment or an empty line */ + if(line[0] == '#' || line.length() == 0) + continue; + + if(line[0] == '[') + { + QString buffer; + for(int i = 1; line[i] != ']'; i++) + buffer.append(line[i]); + buffer = buffer.trimmed(); + + panel = new QWidget(); + currentArea = new QScrollArea(); + layout = new QVBoxLayout(panel); + currentArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + currentArea->setWidget(panel); + currentArea->setWidgetResizable(true); + + tabs.addTab(currentArea, buffer); + + continue; + } + + QStringList elements = line.split(";"); + QString tag = elements[0].trimmed(); + QString title = elements[1].trimmed(); + QString type = elements[2].trimmed(); + QString defVal = elements[3].trimmed(); + + subLayout = new QHBoxLayout(); + if(type != "check") + subLayout->addWidget(new QLabel(elements[1].trimmed(), currentArea)); + layout->addLayout(subLayout); + + + elements = type.split("("); + if(elements[0].trimmed() == "text") + { + temp = new QLineEdit(defVal, currentArea); + subLayout->addWidget(temp); + inputs.insert(tag, QPair(Text, temp)); + } + else if(elements[0].trimmed() == "check") + { + temp = new QCheckBox(title, currentArea); + subLayout->addWidget(temp); + if(defVal.toLower() == "true") + dynamic_cast(temp)->setChecked(true); + else + dynamic_cast(temp)->setChecked(false); + inputs.insert(tag, QPair(Check, temp)); + } + else if(elements[0].trimmed() == "slider") + { + elements = elements[1].trimmed().split(","); + int min = elements[0].trimmed().toInt(); + QString maxS = elements[1].trimmed(); + maxS.chop(1); + int max = maxS.toInt(); + + temp = new QSlider(Qt::Horizontal, currentArea); + dynamic_cast(temp)->setMinimum(min); + dynamic_cast(temp)->setMaximum(max); + dynamic_cast(temp)->setValue(defVal.toInt()); + subLayout->addWidget(temp); + inputs.insert(tag, QPair(Slide, temp)); + } + else if(elements[0].trimmed() == "spin") + { + elements = elements[1].trimmed().split(","); + int min = elements[0].trimmed().toInt(); + QString maxS = elements[1].trimmed(); + maxS.chop(1); + int max = maxS.toInt(); + + temp = new QSpinBox(currentArea); + dynamic_cast(temp)->setMinimum(min); + dynamic_cast(temp)->setMaximum(max); + dynamic_cast(temp)->setValue(defVal.toInt()); + subLayout->addWidget(temp); + inputs.insert(tag, QPair(Spin, temp)); + } + else if(elements[0].trimmed() == "fspin") + { + elements = elements[1].trimmed().split(","); + int min = elements[0].trimmed().toDouble(); + QString maxS = elements[1].trimmed(); + maxS.chop(1); + int max = maxS.toDouble(); + + temp = new QDoubleSpinBox(currentArea); + dynamic_cast(temp)->setMinimum(min); + dynamic_cast(temp)->setMaximum(max); + dynamic_cast(temp)->setValue(defVal.toDouble()); + dynamic_cast(temp)->setSingleStep(0.1); + subLayout->addWidget(temp); + inputs.insert(tag, QPair(DSpin, temp)); + } + else if(elements[0].trimmed() == "combo") + { + elements = elements[1].trimmed().split(","); + + int defIndex; + temp = new QComboBox(currentArea); + for(int i = 0; i < elements.count(); i++) + { + QString current = elements[i].trimmed(); + if(i == elements.count() - 1) + current.chop(1); + dynamic_cast(temp)->addItem(current, i); + if(current == defVal) + defIndex = i; + } + dynamic_cast(temp)->setCurrentIndex(defIndex); + subLayout->addWidget(temp); + inputs.insert(tag, QPair(Combo, temp)); + } + + } } DeviceState::~DeviceState() { - delete ui; +} + +QVariant DeviceState::data(QString tag) +{ + QPair found = + inputs.value(tag, QPair(Slide, 0)); + + if(found.second == 0) + return QVariant(); + + switch(found.first) + { + case Text: + return dynamic_cast(found.second)->text(); + + case Slide: + return dynamic_cast(found.second)->value(); + + case Spin: + return dynamic_cast(found.second)->value(); + + case DSpin: + return dynamic_cast(found.second)->value(); + + case Combo: + return dynamic_cast(found.second)->currentIndex(); + + case Check: + return dynamic_cast(found.second)->isChecked(); + } } diff --git a/utils/themeeditor/gui/devicestate.h b/utils/themeeditor/gui/devicestate.h index 66cd98be7..8938e01f2 100644 --- a/utils/themeeditor/gui/devicestate.h +++ b/utils/themeeditor/gui/devicestate.h @@ -23,19 +23,34 @@ #define DEVICESTATE_H #include - -namespace Ui { - class DeviceState; -} +#include +#include +#include +#include class DeviceState : public QWidget { + Q_OBJECT + public: + enum InputType + { + Text, + Slide, + Spin, + DSpin, + Combo, + Check + }; + DeviceState(QWidget *parent = 0); virtual ~DeviceState(); + QVariant data(QString tag); + private: - Ui::DeviceState *ui; + QMap > inputs; + QTabWidget tabs; }; #endif // DEVICESTATE_H diff --git a/utils/themeeditor/gui/devicestate.ui b/utils/themeeditor/gui/devicestate.ui deleted file mode 100644 index 17f6129c9..000000000 --- a/utils/themeeditor/gui/devicestate.ui +++ /dev/null @@ -1,130 +0,0 @@ - - - DeviceState - - - - 0 - 0 - 400 - 300 - - - - Device Settings - - - - :/resources/resources/windowicon.png:/resources/resources/windowicon.png - - - - - - 1 - - - - - 0 - 0 - 382 - 220 - - - - Device Basics - - - - - - - - Screen Width - - - widthBox - - - - - - - - - - - - - - Screen Height - - - heightBox - - - - - - - - - - - - - - Remote Width - - - rWidthBox - - - - - - - - - - - - - - Remote Height - - - rHeightBox - - - - - - - - - - - - - - 0 - 0 - 382 - 220 - - - - Device Status - - - - - - - - - - - diff --git a/utils/themeeditor/gui/editorwindow.cpp b/utils/themeeditor/gui/editorwindow.cpp index 2bd3b5343..1aec46a7c 100644 --- a/utils/themeeditor/gui/editorwindow.cpp +++ b/utils/themeeditor/gui/editorwindow.cpp @@ -144,6 +144,10 @@ void EditorWindow::setupUI() viewer = new SkinViewer(this); ui->skinPreviewLayout->addWidget(viewer); + /* Positioning the device settings dialog */ + QPoint thisPos = pos(); + deviceConfig.move(thisPos.x() + width() / 4, thisPos.y() + height() / 4); + } void EditorWindow::setupMenus() diff --git a/utils/themeeditor/gui/editorwindow.ui b/utils/themeeditor/gui/editorwindow.ui index a7d804bd6..2f84d384c 100644 --- a/utils/themeeditor/gui/editorwindow.ui +++ b/utils/themeeditor/gui/editorwindow.ui @@ -15,7 +15,7 @@ - :/resources/resources/windowicon.png:/resources/resources/windowicon.png + :/resources/windowicon.png:/resources/windowicon.png @@ -299,6 +299,9 @@ &Device Configuration + + Ctrl+D + diff --git a/utils/themeeditor/gui/preferencesdialog.ui b/utils/themeeditor/gui/preferencesdialog.ui index 1da7811b6..7dddcf905 100644 --- a/utils/themeeditor/gui/preferencesdialog.ui +++ b/utils/themeeditor/gui/preferencesdialog.ui @@ -13,6 +13,10 @@ Preferences + + + :/resources/windowicon.png:/resources/windowicon.png + @@ -268,7 +272,9 @@ - + + + buttonBox diff --git a/utils/themeeditor/resources.qrc b/utils/themeeditor/resources.qrc index 6815ccf8e..27d808c24 100644 --- a/utils/themeeditor/resources.qrc +++ b/utils/themeeditor/resources.qrc @@ -1,10 +1,11 @@ - resources/windowicon.png + resources/windowicon.png resources/document-new.png resources/document-open.png resources/document-save.png resources/configkeys + resources/deviceoptions resources/render/scenebg.png diff --git a/utils/themeeditor/resources/deviceoptions b/utils/themeeditor/resources/deviceoptions new file mode 100644 index 000000000..cd306f50d --- /dev/null +++ b/utils/themeeditor/resources/deviceoptions @@ -0,0 +1,39 @@ +# This file defines the options for the device configuration panel +# Declare a section with a line containing a string inside brackets, i.e. +# [Some Section] +# Declare options within the section in the following format, one per line +# tag;Tag Label;[input];default +# tag is the skin tag represented by that option +# +# Tag Label is a human-readable label to attach to the input +# +# [input] is the type of widget that should be used for the tag, and its range +# if applicable. The valid forms are +# check - Inserts a true/false checkbox +# text - Inserts a line edit box +# slider(min, max) - Inserts a horizontal slider with range specified +# spin(min, max) - Inserts a spin box with range specified +# fspin(min, max) - Inserts a floating point spin box with range specified +# combo(option1, option2...) - Inserts a combo box with the options specified +# +# default is the default value for the input +# +# Note that there aren't any provisions for escaping characters at the moment, +# so don't include [, ], or ; in your text, or (, ) in combo box choices +# +# Blank lines are ignored +# +# Be warned: because this file is compiled into the application, I'm not +# performing much of any error checking on it: screwing up the syntax may very +# well segfault the application on startup + +[Test Section 1] +a ; Text Input ; text ; Some text +b ; Checkbox ; check ; false +c ; Slider 1 - 5 ; slider(1, 5) ; 4 + +[Test Section 2] +d ; Spinbox 6 - 10 ; spin(6, 10) ; 8 +e ; Float Spinbox 2.5 - 6.3; fspin(2.5, 6.3) ; 3.9 +# A combo box ends up returning an integer from 0 to n - 1, with n choices +f ; Combo Box; combo(An option, Another Option, A Third option) ; Another Option diff --git a/utils/themeeditor/themeeditor.pro b/utils/themeeditor/themeeditor.pro index 6237ee8f7..50cafe054 100644 --- a/utils/themeeditor/themeeditor.pro +++ b/utils/themeeditor/themeeditor.pro @@ -64,10 +64,10 @@ OTHER_FILES += README \ resources/COPYING \ resources/document-save.png \ resources/document-open.png \ - resources/document-new.png + resources/document-new.png \ + resources/deviceoptions FORMS += gui/editorwindow.ui \ gui/preferencesdialog.ui \ gui/configdocument.ui \ - gui/skinviewer.ui \ - gui/devicestate.ui + gui/skinviewer.ui RESOURCES += resources.qrc -- 2.11.4.GIT