kdeprint Library API Documentation

droptionview.cpp

00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License version 2 as published by the Free Software Foundation. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Library General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Library General Public License 00015 * along with this library; see the file COPYING.LIB. If not, write to 00016 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 * Boston, MA 02111-1307, USA. 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 <klocale.h> 00037 00038 OptionBaseView::OptionBaseView(QWidget *parent, const char *name) 00039 : QWidget(parent,name) 00040 { 00041 blockSS = false; 00042 } 00043 00044 void OptionBaseView::setOption(DrBase*) 00045 { 00046 } 00047 00048 void OptionBaseView::setValue(const QString&) 00049 { 00050 } 00051 00052 //****************************************************************************************************** 00053 00054 OptionNumericView::OptionNumericView(QWidget *parent, const char *name) 00055 : OptionBaseView(parent,name) 00056 { 00057 m_edit = new QLineEdit(this); 00058 m_slider = new QSlider(Qt::Horizontal,this); 00059 m_slider->setTickmarks(QSlider::Below); 00060 QLabel *lab = new QLabel(i18n("Value:"),this); 00061 m_minval = new QLabel(this); 00062 m_maxval = new QLabel(this); 00063 00064 m_integer = true; 00065 00066 QVBoxLayout *main_ = new QVBoxLayout(this, 0, 10); 00067 QHBoxLayout *sub_ = new QHBoxLayout(0, 0, 10); 00068 QHBoxLayout *sub2_ = new QHBoxLayout(0, 0, 5); 00069 main_->addStretch(1); 00070 main_->addLayout(sub_,0); 00071 main_->addLayout(sub2_,0); 00072 main_->addStretch(1); 00073 sub_->addWidget(lab,0); 00074 sub_->addWidget(m_edit,0); 00075 sub_->addStretch(1); 00076 sub2_->addWidget(m_minval,0); 00077 sub2_->addWidget(m_slider,1); 00078 sub2_->addWidget(m_maxval,0); 00079 00080 connect(m_slider,SIGNAL(valueChanged(int)),SLOT(slotSliderChanged(int))); 00081 connect(m_edit,SIGNAL(textChanged(const QString&)),SLOT(slotEditChanged(const QString&))); 00082 } 00083 00084 void OptionNumericView::setOption(DrBase *opt) 00085 { 00086 if (opt->type() != DrBase::Integer && opt->type() != DrBase::Float) 00087 return; 00088 00089 blockSS = true; 00090 if (opt->type() == DrBase::Integer) 00091 { 00092 m_integer = true; 00093 int min_ = opt->get("minval").toInt(); 00094 int max_ = opt->get("maxval").toInt(); 00095 m_slider->setRange(min_,max_); 00096 m_slider->setSteps(1,QMAX((max_-min_)/20,1)); 00097 m_minval->setText(QString::number(min_)); 00098 m_maxval->setText(QString::number(max_)); 00099 } 00100 else 00101 { 00102 m_integer = false; 00103 int min_ = (int)rint(opt->get("minval").toFloat()*1000); 00104 int max_ = (int)rint(opt->get("maxval").toFloat()*1000); 00105 m_slider->setRange(min_,max_); 00106 m_slider->setSteps(1,QMAX((max_-min_)/20,1)); 00107 m_minval->setText(opt->get("minval")); 00108 m_maxval->setText(opt->get("maxval")); 00109 } 00110 m_slider->update(); 00111 blockSS = false; 00112 00113 setValue(opt->valueText()); 00114 } 00115 00116 void OptionNumericView::setValue(const QString& val) 00117 { 00118 m_edit->setText(val); 00119 } 00120 00121 void OptionNumericView::slotSliderChanged(int value) 00122 { 00123 if (blockSS) return; 00124 00125 QString txt; 00126 if (m_integer) 00127 txt = QString::number(value); 00128 else 00129 txt = QString::number(float(value)/1000.0,'f',3); 00130 blockSS = true; 00131 m_edit->setText(txt); 00132 blockSS = false; 00133 emit valueChanged(txt); 00134 } 00135 00136 void OptionNumericView::slotEditChanged(const QString& txt) 00137 { 00138 if (blockSS) return; 00139 00140 bool ok(false); 00141 int val(0); 00142 if (m_integer) 00143 val = txt.toInt(&ok); 00144 else 00145 val = (int)rint(txt.toFloat(&ok)*1000); 00146 if (ok) 00147 { 00148 blockSS = true; 00149 m_slider->setValue(val); 00150 blockSS = false; 00151 emit valueChanged(txt); 00152 } 00153 else 00154 { 00155 m_edit->selectAll(); 00156 QApplication::beep(); 00157 } 00158 } 00159 00160 //****************************************************************************************************** 00161 00162 OptionStringView::OptionStringView(QWidget *parent, const char *name) 00163 : OptionBaseView(parent,name) 00164 { 00165 m_edit = new QLineEdit(this); 00166 QLabel *lab = new QLabel(i18n("String value:"),this); 00167 00168 QVBoxLayout *main_ = new QVBoxLayout(this, 0, 5); 00169 main_->addStretch(1); 00170 main_->addWidget(lab,0); 00171 main_->addWidget(m_edit,0); 00172 main_->addStretch(1); 00173 00174 connect(m_edit,SIGNAL(textChanged(const QString&)),SIGNAL(valueChanged(const QString&))); 00175 } 00176 00177 void OptionStringView::setOption(DrBase *opt) 00178 { 00179 if (opt->type() == DrBase::String) 00180 m_edit->setText(opt->valueText()); 00181 } 00182 00183 void OptionStringView::setValue(const QString& val) 00184 { 00185 m_edit->setText(val); 00186 } 00187 00188 //****************************************************************************************************** 00189 00190 OptionListView::OptionListView(QWidget *parent, const char *name) 00191 : OptionBaseView(parent,name) 00192 { 00193 m_list = new KListBox(this); 00194 00195 QVBoxLayout *main_ = new QVBoxLayout(this, 0, 10); 00196 main_->addWidget(m_list); 00197 00198 connect(m_list,SIGNAL(selectionChanged()),SLOT(slotSelectionChanged())); 00199 } 00200 00201 void OptionListView::setOption(DrBase *opt) 00202 { 00203 if (opt->type() == DrBase::List) 00204 { 00205 blockSS = true; 00206 m_list->clear(); 00207 m_choices.clear(); 00208 QPtrListIterator<DrBase> it(*(((DrListOption*)opt)->choices())); 00209 for (;it.current();++it) 00210 { 00211 m_list->insertItem(it.current()->get("text")); 00212 m_choices.append(it.current()->name()); 00213 } 00214 blockSS = false; 00215 setValue(opt->valueText()); 00216 } 00217 } 00218 00219 void OptionListView::setValue(const QString& val) 00220 { 00221 m_list->setCurrentItem(m_choices.findIndex(val)); 00222 } 00223 00224 void OptionListView::slotSelectionChanged() 00225 { 00226 if (blockSS) return; 00227 00228 QString s = m_choices[m_list->currentItem()]; 00229 emit valueChanged(s); 00230 } 00231 00232 //****************************************************************************************************** 00233 00234 OptionBooleanView::OptionBooleanView(QWidget *parent, const char *name) 00235 : OptionBaseView(parent,name) 00236 { 00237 m_group = new QVButtonGroup(this); 00238 m_group->setFrameStyle(QFrame::NoFrame); 00239 00240 QRadioButton *btn = new QRadioButton(m_group); 00241 btn->setCursor(KCursor::handCursor()); 00242 btn = new QRadioButton(m_group); 00243 btn->setCursor(KCursor::handCursor()); 00244 00245 QVBoxLayout *main_ = new QVBoxLayout(this, 0, 10); 00246 main_->addWidget(m_group); 00247 00248 connect(m_group,SIGNAL(clicked(int)),SLOT(slotSelected(int))); 00249 } 00250 00251 void OptionBooleanView::setOption(DrBase *opt) 00252 { 00253 if (opt->type() == DrBase::Boolean) 00254 { 00255 QPtrListIterator<DrBase> it(*(((DrBooleanOption*)opt)->choices())); 00256 m_choices.clear(); 00257 m_group->find(0)->setText(it.toFirst()->get("text")); 00258 m_choices.append(it.toFirst()->name()); 00259 m_group->find(1)->setText(it.toLast()->get("text")); 00260 m_choices.append(it.toLast()->name()); 00261 setValue(opt->valueText()); 00262 } 00263 } 00264 00265 void OptionBooleanView::setValue(const QString& val) 00266 { 00267 int ID = m_choices.findIndex(val); 00268 m_group->setButton(ID); 00269 } 00270 00271 void OptionBooleanView::slotSelected(int ID) 00272 { 00273 QString s = m_choices[ID]; 00274 emit valueChanged(s); 00275 } 00276 00277 //****************************************************************************************************** 00278 00279 DrOptionView::DrOptionView(QWidget *parent, const char *name) 00280 : QGroupBox(parent,name) 00281 { 00282 //setFixedHeight(150); 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); // empty widget 00304 00305 m_stack->raiseWidget(w); 00306 setTitle(i18n("No Option Selected")); 00307 00308 QVBoxLayout *main_ = new QVBoxLayout(this, 10, 10); 00309 main_->addSpacing(10); 00310 main_->addWidget(m_stack); 00311 00312 m_item = 0; 00313 m_block = false; 00314 m_allowfixed = true; 00315 } 00316 00317 void DrOptionView::slotItemSelected(QListViewItem *i) 00318 { 00319 m_item = (DriverItem*)i; 00320 if (m_item && !m_item->drItem()->isOption()) 00321 m_item = 0; 00322 int ID(0); 00323 if (m_item) 00324 if (m_item->drItem()->type() == DrBase::Float) ID = DrBase::Integer; 00325 else ID = m_item->drItem()->type(); 00326 00327 OptionBaseView *w = (OptionBaseView*)m_stack->widget(ID); 00328 if (w) 00329 { 00330 m_block = true; 00331 bool enabled(true); 00332 if (m_item) 00333 { 00334 w->setOption((m_item ? m_item->drItem() : 0)); 00335 setTitle(m_item->drItem()->get("text")); 00336 enabled = ((m_item->drItem()->get("fixed") != "1") || m_allowfixed); 00337 } 00338 else 00339 setTitle(i18n("No Option Selected")); 00340 m_stack->raiseWidget(w); 00341 w->setEnabled(enabled); 00342 m_block = false; 00343 } 00344 } 00345 00346 void DrOptionView::slotValueChanged(const QString& val) 00347 { 00348 if (m_item && m_item->drItem() && !m_block) 00349 { 00350 m_item->drItem()->setValueText(val); 00351 m_item->updateText(); 00352 emit changed(); 00353 } 00354 } 00355 00356 QSize DrOptionView::sizeHint() const 00357 { 00358 return QSize(200,140); 00359 } 00360 #include "droptionview.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Sep 29 09:44:28 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003