00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "droptionview.h"
00021
#include "driver.h"
00022
#include "driveritem.h"
00023
00024
#include <math.h>
00025
#include <qlineedit.h>
00026
#include <qslider.h>
00027
#include <qlabel.h>
00028
#include <klistbox.h>
00029
#include <qvbuttongroup.h>
00030
#include <qradiobutton.h>
00031
#include <qwidgetstack.h>
00032
#include <qlayout.h>
00033
#include <qapplication.h>
00034
00035
#include <kcursor.h>
00036
#include <kdialog.h>
00037
#include <klocale.h>
00038
00039 OptionBaseView::OptionBaseView(
QWidget *parent,
const char *name)
00040 :
QWidget(parent,name)
00041 {
00042 blockSS =
false;
00043 }
00044
00045
void OptionBaseView::setOption(DrBase*)
00046 {
00047 }
00048
00049
void OptionBaseView::setValue(
const QString&)
00050 {
00051 }
00052
00053
00054
00055 OptionNumericView::OptionNumericView(
QWidget *parent,
const char *name)
00056 : OptionBaseView(parent,name)
00057 {
00058 m_edit =
new QLineEdit(
this);
00059 m_slider =
new QSlider(Qt::Horizontal,
this);
00060 m_slider->setTickmarks(QSlider::Below);
00061
QLabel *lab =
new QLabel(i18n(
"Value:"),
this);
00062 m_minval =
new QLabel(
this);
00063 m_maxval =
new QLabel(
this);
00064
00065 m_integer =
true;
00066
00067
QVBoxLayout *main_ =
new QVBoxLayout(
this, 0, 10);
00068
QHBoxLayout *sub_ =
new QHBoxLayout(0, 0, 10);
00069 QHBoxLayout *sub2_ =
new QHBoxLayout(0, 0, 5);
00070 main_->addStretch(1);
00071 main_->addLayout(sub_,0);
00072 main_->addLayout(sub2_,0);
00073 main_->addStretch(1);
00074 sub_->addWidget(lab,0);
00075 sub_->addWidget(m_edit,0);
00076 sub_->addStretch(1);
00077 sub2_->addWidget(m_minval,0);
00078 sub2_->addWidget(m_slider,1);
00079 sub2_->addWidget(m_maxval,0);
00080
00081 connect(m_slider,SIGNAL(valueChanged(
int)),SLOT(slotSliderChanged(
int)));
00082 connect(m_edit,SIGNAL(textChanged(
const QString&)),SLOT(slotEditChanged(
const QString&)));
00083 }
00084
00085
void OptionNumericView::setOption(DrBase *opt)
00086 {
00087
if (opt->type() != DrBase::Integer && opt->type() != DrBase::Float)
00088
return;
00089
00090 blockSS =
true;
00091
if (opt->type() == DrBase::Integer)
00092 {
00093 m_integer =
true;
00094
int min_ = opt->get(
"minval").toInt();
00095
int max_ = opt->get(
"maxval").toInt();
00096 m_slider->setRange(min_,max_);
00097 m_slider->setSteps(1,QMAX((max_-min_)/20,1));
00098 m_minval->setText(QString::number(min_));
00099 m_maxval->setText(QString::number(max_));
00100 }
00101
else
00102 {
00103 m_integer =
false;
00104
int min_ = (
int)rint(opt->get(
"minval").toFloat()*1000);
00105
int max_ = (
int)rint(opt->get(
"maxval").toFloat()*1000);
00106 m_slider->setRange(min_,max_);
00107 m_slider->setSteps(1,QMAX((max_-min_)/20,1));
00108 m_minval->setText(opt->get(
"minval"));
00109 m_maxval->setText(opt->get(
"maxval"));
00110 }
00111 m_slider->update();
00112 blockSS =
false;
00113
00114 setValue(opt->valueText());
00115 }
00116
00117
void OptionNumericView::setValue(
const QString& val)
00118 {
00119 m_edit->setText(val);
00120 }
00121
00122
void OptionNumericView::slotSliderChanged(
int value)
00123 {
00124
if (blockSS)
return;
00125
00126
QString txt;
00127
if (m_integer)
00128 txt = QString::number(value);
00129
else
00130 txt = QString::number(
float(value)/1000.0,
'f',3);
00131 blockSS =
true;
00132 m_edit->setText(txt);
00133 blockSS =
false;
00134 emit valueChanged(txt);
00135 }
00136
00137
void OptionNumericView::slotEditChanged(
const QString& txt)
00138 {
00139
if (blockSS)
return;
00140
00141
bool ok(
false);
00142
int val(0);
00143
if (m_integer)
00144 val = txt.toInt(&ok);
00145
else
00146 val = (
int)rint(txt.toFloat(&ok)*1000);
00147
if (ok)
00148 {
00149 blockSS =
true;
00150 m_slider->setValue(val);
00151 blockSS =
false;
00152 emit valueChanged(txt);
00153 }
00154
else
00155 {
00156 m_edit->selectAll();
00157 QApplication::beep();
00158 }
00159 }
00160
00161
00162
00163 OptionStringView::OptionStringView(
QWidget *parent,
const char *name)
00164 : OptionBaseView(parent,name)
00165 {
00166 m_edit =
new QLineEdit(
this);
00167 QLabel *lab =
new QLabel(i18n(
"String value:"),
this);
00168
00169 QVBoxLayout *main_ =
new QVBoxLayout(
this, 0, 5);
00170 main_->addStretch(1);
00171 main_->addWidget(lab,0);
00172 main_->addWidget(m_edit,0);
00173 main_->addStretch(1);
00174
00175 connect(m_edit,SIGNAL(textChanged(
const QString&)),SIGNAL(valueChanged(
const QString&)));
00176 }
00177
00178
void OptionStringView::setOption(DrBase *opt)
00179 {
00180
if (opt->type() == DrBase::String)
00181 m_edit->setText(opt->valueText());
00182 }
00183
00184
void OptionStringView::setValue(
const QString& val)
00185 {
00186 m_edit->setText(val);
00187 }
00188
00189
00190
00191 OptionListView::OptionListView(
QWidget *parent,
const char *name)
00192 : OptionBaseView(parent,name)
00193 {
00194 m_list =
new KListBox(
this);
00195
00196 QVBoxLayout *main_ =
new QVBoxLayout(
this, 0, 10);
00197 main_->addWidget(m_list);
00198
00199 connect(m_list,SIGNAL(selectionChanged()),SLOT(slotSelectionChanged()));
00200 }
00201
00202
void OptionListView::setOption(DrBase *opt)
00203 {
00204
if (opt->type() == DrBase::List)
00205 {
00206 blockSS =
true;
00207 m_list->clear();
00208 m_choices.clear();
00209
QPtrListIterator<DrBase> it(*(((DrListOption*)opt)->choices()));
00210
for (;it.current();++it)
00211 {
00212 m_list->insertItem(it.current()->get(
"text"));
00213 m_choices.append(it.current()->name());
00214 }
00215 blockSS =
false;
00216 setValue(opt->valueText());
00217 }
00218 }
00219
00220
void OptionListView::setValue(
const QString& val)
00221 {
00222 m_list->setCurrentItem(m_choices.findIndex(val));
00223 }
00224
00225
void OptionListView::slotSelectionChanged()
00226 {
00227
if (blockSS)
return;
00228
00229
QString s = m_choices[m_list->currentItem()];
00230 emit valueChanged(s);
00231 }
00232
00233
00234
00235 OptionBooleanView::OptionBooleanView(
QWidget *parent,
const char *name)
00236 : OptionBaseView(parent,name)
00237 {
00238 m_group =
new QVButtonGroup(
this);
00239 m_group->setFrameStyle(QFrame::NoFrame);
00240
00241
QRadioButton *btn =
new QRadioButton(m_group);
00242 btn->setCursor(KCursor::handCursor());
00243 btn =
new QRadioButton(m_group);
00244 btn->setCursor(KCursor::handCursor());
00245
00246 QVBoxLayout *main_ =
new QVBoxLayout(
this, 0, 10);
00247 main_->addWidget(m_group);
00248
00249 connect(m_group,SIGNAL(clicked(
int)),SLOT(slotSelected(
int)));
00250 }
00251
00252
void OptionBooleanView::setOption(DrBase *opt)
00253 {
00254
if (opt->type() == DrBase::Boolean)
00255 {
00256
QPtrListIterator<DrBase> it(*(((DrBooleanOption*)opt)->choices()));
00257 m_choices.clear();
00258 m_group->find(0)->setText(it.toFirst()->get(
"text"));
00259 m_choices.append(it.toFirst()->name());
00260 m_group->find(1)->setText(it.toLast()->get(
"text"));
00261 m_choices.append(it.toLast()->name());
00262 setValue(opt->valueText());
00263 }
00264 }
00265
00266
void OptionBooleanView::setValue(
const QString& val)
00267 {
00268
int ID = m_choices.findIndex(val);
00269 m_group->setButton(ID);
00270 }
00271
00272
void OptionBooleanView::slotSelected(
int ID)
00273 {
00274
QString s = m_choices[ID];
00275 emit valueChanged(s);
00276 }
00277
00278
00279
00280 DrOptionView::DrOptionView(
QWidget *parent,
const char *name)
00281 :
QGroupBox(parent,name)
00282 {
00283 m_stack =
new QWidgetStack(
this);
00284
00285 OptionBaseView *w =
new OptionListView(m_stack);
00286 connect(w,SIGNAL(valueChanged(
const QString&)),SLOT(slotValueChanged(
const QString&)));
00287 m_stack->addWidget(w,DrBase::List);
00288
00289 w =
new OptionStringView(m_stack);
00290 connect(w,SIGNAL(valueChanged(
const QString&)),SLOT(slotValueChanged(
const QString&)));
00291 m_stack->addWidget(w,DrBase::String);
00292
00293 w =
new OptionNumericView(m_stack);
00294 connect(w,SIGNAL(valueChanged(
const QString&)),SLOT(slotValueChanged(
const QString&)));
00295 m_stack->addWidget(w,DrBase::Integer);
00296
00297 w =
new OptionBooleanView(m_stack);
00298 connect(w,SIGNAL(valueChanged(
const QString&)),SLOT(slotValueChanged(
const QString&)));
00299 m_stack->addWidget(w,DrBase::Boolean);
00300
00301 w =
new OptionBaseView(m_stack);
00302 connect(w,SIGNAL(valueChanged(
const QString&)),SLOT(slotValueChanged(
const QString&)));
00303 m_stack->addWidget(w,0);
00304
00305 m_stack->raiseWidget(w);
00306 setTitle(i18n(
"No Option Selected"));
00307
00308 setColumnLayout(0, Qt::Vertical );
00309 layout()->setSpacing( KDialog::spacingHint() );
00310 layout()->setMargin( KDialog::marginHint() );
00311 QVBoxLayout *main_ =
new QVBoxLayout(layout(), KDialog::marginHint());
00312 main_->addWidget(m_stack);
00313
00314 m_item = 0;
00315 m_block =
false;
00316 m_allowfixed =
true;
00317 }
00318
00319
void DrOptionView::slotItemSelected(
QListViewItem *i)
00320 {
00321 m_item = (DriverItem*)i;
00322
if (m_item && !m_item->drItem()->isOption())
00323 m_item = 0;
00324
int ID(0);
00325
if (m_item)
00326
if (m_item->drItem()->type() == DrBase::Float) ID = DrBase::Integer;
00327
else ID = m_item->drItem()->type();
00328
00329 OptionBaseView *w = (OptionBaseView*)m_stack->widget(ID);
00330
if (w)
00331 {
00332 m_block =
true;
00333
bool enabled(
true);
00334
if (m_item)
00335 {
00336 w->setOption((m_item ? m_item->drItem() : 0));
00337 setTitle(m_item->drItem()->get(
"text"));
00338 enabled = ((m_item->drItem()->get(
"fixed") !=
"1") || m_allowfixed);
00339 }
00340
else
00341 setTitle(i18n(
"No Option Selected"));
00342 m_stack->raiseWidget(w);
00343 w->setEnabled(enabled);
00344 m_block =
false;
00345 }
00346 }
00347
00348
void DrOptionView::slotValueChanged(
const QString& val)
00349 {
00350
if (m_item && m_item->drItem() && !m_block)
00351 {
00352 m_item->drItem()->setValueText(val);
00353 m_item->updateText();
00354 emit changed();
00355 }
00356 }
00357
00358
#include "droptionview.moc"