1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Robert Bieber 2010-06-24 07:59:41 +00:00
parent 103eabd31f
commit 1ae6ee263b
9 changed files with 257 additions and 145 deletions

View file

@ -22,14 +22,188 @@
#include "devicestate.h"
#include "ui_devicestate.h"
#include <QScrollArea>
#include <QFile>
#include <QCheckBox>
#include <QSpinBox>
#include <QComboBox>
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<InputType, QWidget*>(Text, temp));
}
else if(elements[0].trimmed() == "check")
{
temp = new QCheckBox(title, currentArea);
subLayout->addWidget(temp);
if(defVal.toLower() == "true")
dynamic_cast<QCheckBox*>(temp)->setChecked(true);
else
dynamic_cast<QCheckBox*>(temp)->setChecked(false);
inputs.insert(tag, QPair<InputType, QWidget*>(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<QSlider*>(temp)->setMinimum(min);
dynamic_cast<QSlider*>(temp)->setMaximum(max);
dynamic_cast<QSlider*>(temp)->setValue(defVal.toInt());
subLayout->addWidget(temp);
inputs.insert(tag, QPair<InputType, QWidget*>(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<QSpinBox*>(temp)->setMinimum(min);
dynamic_cast<QSpinBox*>(temp)->setMaximum(max);
dynamic_cast<QSpinBox*>(temp)->setValue(defVal.toInt());
subLayout->addWidget(temp);
inputs.insert(tag, QPair<InputType, QWidget*>(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<QDoubleSpinBox*>(temp)->setMinimum(min);
dynamic_cast<QDoubleSpinBox*>(temp)->setMaximum(max);
dynamic_cast<QDoubleSpinBox*>(temp)->setValue(defVal.toDouble());
dynamic_cast<QDoubleSpinBox*>(temp)->setSingleStep(0.1);
subLayout->addWidget(temp);
inputs.insert(tag, QPair<InputType, QWidget*>(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<QComboBox*>(temp)->addItem(current, i);
if(current == defVal)
defIndex = i;
}
dynamic_cast<QComboBox*>(temp)->setCurrentIndex(defIndex);
subLayout->addWidget(temp);
inputs.insert(tag, QPair<InputType, QWidget*>(Combo, temp));
}
}
}
DeviceState::~DeviceState()
{
delete ui;
}
QVariant DeviceState::data(QString tag)
{
QPair<InputType, QWidget*> found =
inputs.value(tag, QPair<InputType, QWidget*>(Slide, 0));
if(found.second == 0)
return QVariant();
switch(found.first)
{
case Text:
return dynamic_cast<QLineEdit*>(found.second)->text();
case Slide:
return dynamic_cast<QSlider*>(found.second)->value();
case Spin:
return dynamic_cast<QSpinBox*>(found.second)->value();
case DSpin:
return dynamic_cast<QDoubleSpinBox*>(found.second)->value();
case Combo:
return dynamic_cast<QComboBox*>(found.second)->currentIndex();
case Check:
return dynamic_cast<QCheckBox*>(found.second)->isChecked();
}
}

View file

@ -23,19 +23,34 @@
#define DEVICESTATE_H
#include <QWidget>
namespace Ui {
class DeviceState;
}
#include <QMap>
#include <QPair>
#include <QVariant>
#include <QTabWidget>
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<QString, QPair<InputType, QWidget*> > inputs;
QTabWidget tabs;
};
#endif // DEVICESTATE_H

View file

@ -1,130 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DeviceState</class>
<widget class="QWidget" name="DeviceState">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Device Settings</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/resources/windowicon.png</normaloff>:/resources/resources/windowicon.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QToolBox" name="toolBox">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>382</width>
<height>220</height>
</rect>
</property>
<attribute name="label">
<string>Device Basics</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Screen Width</string>
</property>
<property name="buddy">
<cstring>widthBox</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="widthBox"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Screen Height</string>
</property>
<property name="buddy">
<cstring>heightBox</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="heightBox"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Remote Width</string>
</property>
<property name="buddy">
<cstring>rWidthBox</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="rWidthBox"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Remote Height</string>
</property>
<property name="buddy">
<cstring>rHeightBox</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="rHeightBox"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>382</width>
<height>220</height>
</rect>
</property>
<attribute name="label">
<string>Device Status</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -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()

View file

@ -15,7 +15,7 @@
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/resources/windowicon.png</normaloff>:/resources/resources/windowicon.png</iconset>
<normaloff>:/resources/windowicon.png</normaloff>:/resources/windowicon.png</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
@ -299,6 +299,9 @@
<property name="text">
<string>&amp;Device Configuration</string>
</property>
<property name="shortcut">
<string>Ctrl+D</string>
</property>
</action>
</widget>
<tabstops>

View file

@ -13,6 +13,10 @@
<property name="windowTitle">
<string>Preferences</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/windowicon.png</normaloff>:/resources/windowicon.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="prefsGroups">
@ -268,7 +272,9 @@
</item>
</layout>
</widget>
<resources/>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>

View file

@ -1,10 +1,11 @@
<RCC>
<qresource prefix="/resources">
<file>resources/windowicon.png</file>
<file alias="windowicon.png">resources/windowicon.png</file>
<file>resources/document-new.png</file>
<file>resources/document-open.png</file>
<file>resources/document-save.png</file>
<file alias="configkeys">resources/configkeys</file>
<file alias="deviceoptions">resources/deviceoptions</file>
</qresource>
<qresource prefix="/render">
<file alias="scenebg.png">resources/render/scenebg.png</file>

View file

@ -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

View file

@ -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