• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kstars

indielement.cpp

Go to the documentation of this file.
00001 /*  INDI Element
00002     Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
00003 
00004     This application is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008     
00009     2004-01-15  INDI element is the most basic unit of the INDI KStars client.
00010  */
00011  
00012 #include "indielement.h"
00013 #include "indiproperty.h"
00014 #include "indigroup.h"
00015 #include "indidevice.h"
00016 
00017 #include "indi/indicom.h"
00018 
00019 #include <qcheckbox.h>
00020 #include <qlabel.h>
00021 #include <qlayout.h>
00022 #include <qstring.h>
00023 #include <qptrlist.h>
00024 #include <qslider.h>
00025 #include <qdir.h>
00026 
00027 #include <kurl.h>
00028 #include <kfiledialog.h>
00029 #include <kled.h>
00030 #include <ksqueezedtextlabel.h> 
00031 #include <klineedit.h>
00032 #include <kpushbutton.h>
00033 #include <klocale.h>
00034 #include <kdebug.h>
00035 #include <kcombobox.h>
00036 #include <knuminput.h>
00037 #include <kdialogbase.h>
00038 
00039 /* search element for attribute.
00040  * return XMLAtt if find, else NULL with helpful info in errmsg.
00041  */
00042 XMLAtt * findAtt (XMLEle *ep, const char *name, char errmsg[])
00043 {
00044     XMLAtt *ap = findXMLAtt (ep, name);
00045     if (ap)
00046         return (ap);
00047     if (errmsg)
00048         snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> missing attribute '%.64s'", tagXMLEle(ep),name);
00049     return NULL;
00050 }
00051 
00052 /* search element for given child. pp is just to build a better errmsg.
00053  * return XMLEle if find, else NULL with helpful info in errmsg.
00054  */
00055 XMLEle * findEle (XMLEle *ep, INDI_P *pp, const char *child, char errmsg[])
00056 {
00057     XMLEle *cp = findXMLEle (ep, child);
00058     if (cp)
00059         return (cp);
00060     if (errmsg)
00061         snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s %.64s %.64s> missing child '%.64s'", tagXMLEle(ep),
00062                         pp->pg->dp->name.ascii(), pp->name.ascii(), child);
00063     return (NULL);
00064 }
00065 
00066 /*******************************************************************
00067 ** INDI Element
00068 *******************************************************************/
00069 INDI_E::INDI_E(INDI_P *parentProperty, QString inName, QString inLabel)
00070 {
00071   name = inName;
00072   label = inLabel;
00073 
00074   pp = parentProperty;
00075 
00076   EHBox     = new QHBoxLayout(0, 0, KDialog::spacingHint());
00077   label_w   = NULL;
00078   read_w    = NULL;
00079   write_w   = NULL;
00080   spin_w    = NULL;
00081   slider_w  = NULL;
00082   push_w    = NULL;
00083   browse_w  = NULL;
00084   check_w   = NULL;
00085   led_w     = NULL;
00086   hSpacer   = NULL;
00087 
00088 }
00089 
00090 INDI_E::~INDI_E()
00091 {
00092     delete (EHBox);
00093     delete (label_w);
00094     delete (read_w);
00095     delete (write_w);
00096     delete (spin_w);
00097     delete (slider_w);
00098     delete (push_w);
00099     delete (browse_w);
00100     delete (check_w);
00101     delete (led_w);
00102     delete (hSpacer);
00103 }
00104 
00105 void INDI_E::setupElementLabel()
00106 {
00107 label_w = new KSqueezedTextLabel(pp->pg->propertyContainer);
00108 label_w->setMinimumWidth(ELEMENT_LABEL_WIDTH);
00109 label_w->setMaximumWidth(ELEMENT_LABEL_WIDTH);
00110 label_w->setFrameShape( KSqueezedTextLabel::Box );
00111 label_w->setPaletteBackgroundColor( QColor( 224, 232, 238 ) );
00112 label_w->setTextFormat( QLabel::RichText );
00113 label_w->setAlignment( int( QLabel::WordBreak | QLabel::AlignCenter ) );
00114 
00115 if (label.length() > MAX_LABEL_LENGTH)
00116 {
00117   QFont tempFont(  label_w->font() );
00118   tempFont.setPointSize( tempFont.pointSize() - MED_INDI_FONT );
00119   label_w->setFont( tempFont );
00120 }
00121 
00122 label_w->setText(label);
00123 
00124 EHBox->addWidget(label_w);
00125 }
00126 
00127 int INDI_E::buildTextGUI(QString initText)
00128 {
00129 
00130   setupElementLabel();  
00131   
00132   text = initText;
00133   
00134   switch (pp->perm)
00135   {
00136     case PP_RW:
00137     setupElementRead(ELEMENT_READ_WIDTH);
00138     setupElementWrite(ELEMENT_WRITE_WIDTH);
00139     
00140     break;
00141     
00142     case PP_RO:
00143     setupElementRead(ELEMENT_FULL_WIDTH);
00144     break;
00145     
00146     case PP_WO:
00147     setupElementWrite(ELEMENT_FULL_WIDTH);
00148     break;
00149   }
00150   
00151   pp->PVBox->addLayout(EHBox);
00152   return (0);
00153     
00154 }
00155 
00156 int INDI_E::buildBLOBGUI()
00157 {
00158 
00159   setupElementLabel();  
00160   
00161   text = "INDI DATA STREAM";
00162   
00163   switch (pp->perm)
00164   {
00165     case PP_RW:
00166       setupElementRead(ELEMENT_READ_WIDTH);
00167       setupElementWrite(ELEMENT_WRITE_WIDTH);
00168       setupBrowseButton();
00169     
00170       break;
00171     
00172     case PP_RO:
00173       setupElementRead(ELEMENT_FULL_WIDTH);
00174       break;
00175     
00176     case PP_WO:
00177       setupElementWrite(ELEMENT_FULL_WIDTH);
00178       setupBrowseButton();
00179       break;
00180   }
00181   
00182   pp->PVBox->addLayout(EHBox);
00183   return (0);
00184     
00185 }
00186 
00187 int INDI_E::buildNumberGUI  (double initValue)
00188 {
00189   bool scale = false;
00190   
00191   updateValue(initValue);
00192   setupElementLabel();
00193   
00194   if (step != 0 && (max - min)/step <= MAXSCSTEPS)
00195     scale = true;
00196   
00197   switch (pp->perm)
00198   {
00199     case PP_RW:
00200      setupElementRead(ELEMENT_READ_WIDTH);
00201      if (scale)
00202        setupElementScale(ELEMENT_WRITE_WIDTH);
00203      else
00204        setupElementWrite(ELEMENT_WRITE_WIDTH);
00205        
00206        pp->PVBox->addLayout(EHBox);
00207      break;
00208      
00209     case PP_RO:
00210     setupElementRead(ELEMENT_READ_WIDTH);
00211     pp->PVBox->addLayout(EHBox);
00212     break;
00213     
00214     case PP_WO:
00215     if (scale)
00216      setupElementScale(ELEMENT_FULL_WIDTH);
00217     else
00218      setupElementWrite(ELEMENT_FULL_WIDTH);
00219      
00220      pp->PVBox->addLayout(EHBox);
00221     
00222     break;
00223   }
00224   
00225   return (0);
00226     
00227 }
00228 
00229 int INDI_E::buildLightGUI()
00230 {
00231 
00232         led_w = new KLed (pp->pg->propertyContainer);
00233     led_w->setMaximumSize(16,16);
00234     led_w->setLook( KLed::Sunken );
00235     drawLt();
00236     
00237     EHBox->addWidget(led_w);
00238     
00239     setupElementLabel();
00240     
00241     pp->PVBox->addLayout(EHBox);
00242     
00243     return (0);
00244 }
00245 
00246 void INDI_E::drawLt()
00247 {
00248         /* set state light */
00249     switch (state)
00250     {
00251       case PS_IDLE:
00252       led_w->setColor(Qt::gray);
00253       break;
00254 
00255       case PS_OK:
00256       led_w->setColor(Qt::green);
00257       break;
00258 
00259       case PS_BUSY:
00260       led_w->setColor(Qt::yellow);
00261       break;
00262 
00263       case PS_ALERT:
00264       led_w->setColor(Qt::red);
00265       break;
00266 
00267       default:
00268       break;
00269 
00270     }
00271 }
00272 
00273 
00274 void INDI_E::updateValue(double newValue)
00275 {
00276   char iNumber[32];
00277   
00278   value = newValue; 
00279 
00280   numberFormat(iNumber, format.ascii(), value);
00281   text = iNumber;
00282 
00283 }
00284 
00285 void INDI_E::setupElementScale(int length)
00286 {
00287 
00288 int steps = (int) ((max - min) / step);
00289 spin_w    = new KDoubleSpinBox(min, max, step, value, 2, pp->pg->propertyContainer );
00290 slider_w  = new QSlider(0, steps, 1, (int) ((value - min) / step),  Qt::Horizontal, pp->pg->propertyContainer );
00291 
00292 connect(spin_w, SIGNAL(valueChanged(double)), this, SLOT(spinChanged(double )));
00293 connect(slider_w, SIGNAL(sliderMoved(int)), this, SLOT(sliderChanged(int )));
00294 
00295 //kdDebug() << "For element " << label << " we have step of " << step << endl;
00296 
00297   if (length == ELEMENT_FULL_WIDTH)
00298     spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
00299   else
00300     spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
00301     
00302 spin_w->setMinimumWidth( (int) (length * 0.45) );
00303 slider_w->setMinimumWidth( (int) (length * 0.55) );
00304 
00305 EHBox->addWidget(slider_w);
00306 EHBox->addWidget(spin_w);
00307 }
00308 
00309 void INDI_E::spinChanged(double value)
00310 {
00311   int slider_value = (int) ((value - min) / step);
00312   slider_w->setValue(slider_value);
00313 }
00314 
00315 void INDI_E::sliderChanged(int value)
00316 {
00317 
00318  double spin_value = (value * step) + min;
00319  spin_w->setValue(spin_value);  
00320 
00321 }
00322    
00323 void INDI_E::setMin (double inMin)
00324 {
00325   min = inMin;
00326   if (spin_w)
00327   {
00328     spin_w->setMinValue(min);
00329     spin_w->setValue(value);
00330   }
00331   if (slider_w)
00332   {
00333     slider_w->setMaxValue((int) ((max - min) / step));
00334     slider_w->setMinValue(0);
00335     slider_w->setPageStep(1);
00336     slider_w->setValue( (int) ((value - min) / step ));
00337   }
00338   
00339 }
00340    
00341 void INDI_E::setMax (double inMax)
00342 {
00343  max = inMax;
00344  if (spin_w)
00345  {
00346    spin_w->setMaxValue(max);
00347    spin_w->setValue(value);
00348  }
00349  if (slider_w)
00350  {
00351     slider_w->setMaxValue((int) ((max - min) / step));
00352     slider_w->setMinValue(0);
00353     slider_w->setPageStep(1);
00354     slider_w->setValue( (int) ((value - min) / step ));
00355  }
00356  
00357 }
00358    
00359 void INDI_E::setupElementWrite(int length)
00360 {
00361     write_w = new KLineEdit( pp->pg->propertyContainer);
00362     write_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, write_w->sizePolicy().hasHeightForWidth() ));
00363     write_w->setMinimumWidth( length );
00364     write_w->setMaximumWidth( length);
00365     
00366     QObject::connect(write_w, SIGNAL(returnPressed()), pp, SLOT(newText()));
00367     EHBox->addWidget(write_w);
00368 }
00369 
00370 
00371 void INDI_E::setupElementRead(int length)
00372 {
00373 
00374   read_w = new KLineEdit( pp->pg->propertyContainer );
00375   read_w->setMinimumWidth( length );
00376   read_w->setFocusPolicy( KLineEdit::NoFocus );
00377   read_w->setFrameShape( KLineEdit::GroupBoxPanel );
00378   read_w->setFrameShadow( KLineEdit::Plain );
00379   read_w->setCursorPosition( 0 );
00380   read_w->setAlignment( int( KLineEdit::AlignHCenter ) );
00381   read_w->setReadOnly( TRUE );
00382   read_w->setText(text);
00383   
00384   EHBox->addWidget(read_w);
00385 
00386 }
00387 
00388 void INDI_E::setupBrowseButton()
00389 {
00390    browse_w = new KPushButton("...", pp->pg->propertyContainer);
00391    browse_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, browse_w->sizePolicy().hasHeightForWidth() ) );
00392    browse_w->setMinimumWidth( MIN_SET_WIDTH );
00393    browse_w->setMaximumWidth( MAX_SET_WIDTH );
00394 
00395    EHBox->addWidget(browse_w);
00396    QObject::connect(browse_w, SIGNAL(clicked()), this, SLOT(browseBlob()));
00397 }
00398 
00399 
00400 void INDI_E::initNumberValues(double newMin, double newMax, double newStep, char * newFormat)
00401 {
00402   min = newMin;
00403   max = newMax;
00404   step = newStep;
00405   format = newFormat;
00406 }
00407 
00408 void INDI_E::browseBlob()
00409 {
00410 
00411   KURL currentURL;
00412 
00413   currentURL = KFileDialog::getOpenURL( QDir::homeDirPath(), "*");
00414 
00415   // if user presses cancel
00416   if (currentURL.isEmpty())
00417           return;
00418 
00419   if ( currentURL.isValid() )
00420     write_w->setText(currentURL.path());
00421 
00422 }
00423 
00424 
00425 #include "indielement.moc"

kstars

Skip menu "kstars"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • keduca
  • kstars
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal