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 Thu Sep 23 17:12:53 2004 by doxygen 1.3.8-20040913 written by Dimitri van Heesch, © 1997-2003