9d6b5d6317
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27184 a1c6a512-1295-4272-9138-f99709370657
288 lines
9 KiB
C++
288 lines
9 KiB
C++
/***************************************************************************
|
|
* __________ __ ___.
|
|
* 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 "devicestate.h"
|
|
|
|
#include <QScrollArea>
|
|
#include <QFile>
|
|
#include <QCheckBox>
|
|
#include <QSpinBox>
|
|
#include <QComboBox>
|
|
#include <QVBoxLayout>
|
|
#include <QLabel>
|
|
#include <QLineEdit>
|
|
|
|
|
|
DeviceState::DeviceState(QWidget *parent) :
|
|
QWidget(parent), tabs(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 = 0;
|
|
QHBoxLayout* subLayout;
|
|
QWidget* panel;
|
|
|
|
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")
|
|
{
|
|
QLineEdit* temp = new QLineEdit(defVal, currentArea);
|
|
subLayout->addWidget(temp);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(Text, temp));
|
|
|
|
temp->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
|
QSizePolicy::Fixed));
|
|
|
|
QObject::connect(temp, SIGNAL(textChanged(QString)),
|
|
this, SLOT(input()));
|
|
}
|
|
else if(elements[0].trimmed() == "check")
|
|
{
|
|
QCheckBox* temp = new QCheckBox(title, currentArea);
|
|
subLayout->addWidget(temp);
|
|
if(defVal.toLower() == "true")
|
|
temp->setChecked(true);
|
|
else
|
|
temp->setChecked(false);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(Check, temp));
|
|
|
|
QObject::connect(temp, SIGNAL(toggled(bool)),
|
|
this, SLOT(input()));
|
|
}
|
|
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();
|
|
|
|
QSlider* temp = new QSlider(Qt::Horizontal, currentArea);
|
|
temp->setMinimum(min);
|
|
temp->setMaximum(max);
|
|
temp->setValue(defVal.toInt());
|
|
subLayout->addWidget(temp);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(Slide, temp));
|
|
|
|
QObject::connect(temp, SIGNAL(valueChanged(int)),
|
|
this, SLOT(input()));
|
|
}
|
|
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();
|
|
|
|
QSpinBox* temp = new QSpinBox(currentArea);
|
|
temp->setMinimum(min);
|
|
temp->setMaximum(max);
|
|
temp->setValue(defVal.toInt());
|
|
subLayout->addWidget(temp);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(Spin, temp));
|
|
|
|
QObject::connect(temp, SIGNAL(valueChanged(int)),
|
|
this, SLOT(input()));
|
|
}
|
|
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();
|
|
|
|
QDoubleSpinBox* temp = new QDoubleSpinBox(currentArea);
|
|
temp->setMinimum(min);
|
|
temp->setMaximum(max);
|
|
temp->setValue(defVal.toDouble());
|
|
temp->setSingleStep(0.1);
|
|
subLayout->addWidget(temp);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(DSpin, temp));
|
|
|
|
QObject::connect(temp, SIGNAL(valueChanged(double)),
|
|
this, SLOT(input()));
|
|
}
|
|
else if(elements[0].trimmed() == "combo")
|
|
{
|
|
elements = elements[1].trimmed().split(",");
|
|
|
|
int defIndex = 0;
|
|
QComboBox* 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);
|
|
temp->addItem(current, i);
|
|
if(current == defVal)
|
|
defIndex = i;
|
|
}
|
|
temp->setCurrentIndex(defIndex);
|
|
subLayout->addWidget(temp);
|
|
inputs.insert(tag, QPair<InputType, QWidget*>(Combo, temp));
|
|
|
|
QObject::connect(temp, SIGNAL(currentIndexChanged(int)),
|
|
this, SLOT(input()));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
DeviceState::~DeviceState()
|
|
{
|
|
}
|
|
|
|
QVariant DeviceState::data(QString tag, int paramCount,
|
|
skin_tag_parameter *params)
|
|
{
|
|
QPair<InputType, QWidget*> found =
|
|
inputs.value(tag, QPair<InputType, QWidget*>(Slide, 0));
|
|
|
|
if(found.second == 0 && tag[0] == '?')
|
|
found = inputs.value(tag.right(2), 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:
|
|
if(tag[0] == '?')
|
|
return dynamic_cast<QComboBox*>(found.second)->currentIndex();
|
|
else
|
|
return dynamic_cast<QComboBox*>(found.second)->currentText();
|
|
|
|
case Check:
|
|
return dynamic_cast<QCheckBox*>(found.second)->isChecked();
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
void DeviceState::setData(QString tag, QVariant data)
|
|
{
|
|
QPair<InputType, QWidget*> found =
|
|
inputs.value(tag, QPair<InputType, QWidget*>(Slide, 0));
|
|
|
|
if(found.second == 0)
|
|
return;
|
|
|
|
switch(found.first)
|
|
{
|
|
case Text:
|
|
dynamic_cast<QLineEdit*>(found.second)->setText(data.toString());
|
|
break;
|
|
|
|
case Slide:
|
|
dynamic_cast<QSlider*>(found.second)->setValue(data.toInt());
|
|
break;
|
|
|
|
case Spin:
|
|
dynamic_cast<QSpinBox*>(found.second)->setValue(data.toInt());
|
|
break;
|
|
|
|
case DSpin:
|
|
dynamic_cast<QDoubleSpinBox*>(found.second)->setValue(data.toDouble());
|
|
break;
|
|
|
|
case Combo:
|
|
dynamic_cast<QComboBox*>
|
|
(found.second)->
|
|
setCurrentIndex(dynamic_cast<QComboBox*>
|
|
(found.second)->findText(data.toString()));
|
|
break;
|
|
|
|
case Check:
|
|
dynamic_cast<QCheckBox*>(found.second)->setChecked(data.toBool());
|
|
break;
|
|
}
|
|
|
|
emit settingsChanged();
|
|
}
|
|
|
|
void DeviceState::input()
|
|
{
|
|
emit settingsChanged();
|
|
}
|