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:
parent
103eabd31f
commit
1ae6ee263b
9 changed files with 257 additions and 145 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>&Device Configuration</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+D</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<tabstops>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
39
utils/themeeditor/resources/deviceoptions
Normal file
39
utils/themeeditor/resources/deviceoptions
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue