moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kstars / kstars / indielement.cpp
blob61dedf1e11795f78c0a5225a4e5804114ba7895e
1 /* INDI Element
2 Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
4 This application is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
9 2004-01-15 INDI element is the most basic unit of the INDI KStars client.
12 #include "indielement.h"
13 #include "indiproperty.h"
14 #include "indigroup.h"
15 #include "indidevice.h"
17 #include "indi/indicom.h"
19 #include <qcheckbox.h>
20 #include <qlabel.h>
21 #include <qlayout.h>
22 #include <qstring.h>
23 #include <qptrlist.h>
24 #include <qslider.h>
25 #include <qdir.h>
27 #include <kurl.h>
28 #include <kfiledialog.h>
29 #include <kled.h>
30 #include <ksqueezedtextlabel.h>
31 #include <klineedit.h>
32 #include <kpushbutton.h>
33 #include <klocale.h>
34 #include <kdebug.h>
35 #include <kcombobox.h>
36 #include <knuminput.h>
37 #include <kdialogbase.h>
39 /* search element for attribute.
40 * return XMLAtt if find, else NULL with helpful info in errmsg.
42 XMLAtt * findAtt (XMLEle *ep, const char *name, char errmsg[])
44 XMLAtt *ap = findXMLAtt (ep, name);
45 if (ap)
46 return (ap);
47 if (errmsg)
48 snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> missing attribute '%.64s'", tagXMLEle(ep),name);
49 return NULL;
52 /* search element for given child. pp is just to build a better errmsg.
53 * return XMLEle if find, else NULL with helpful info in errmsg.
55 XMLEle * findEle (XMLEle *ep, INDI_P *pp, const char *child, char errmsg[])
57 XMLEle *cp = findXMLEle (ep, child);
58 if (cp)
59 return (cp);
60 if (errmsg)
61 snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s %.64s %.64s> missing child '%.64s'", tagXMLEle(ep),
62 pp->pg->dp->name.ascii(), pp->name.ascii(), child);
63 return (NULL);
66 /*******************************************************************
67 ** INDI Element
68 *******************************************************************/
69 INDI_E::INDI_E(INDI_P *parentProperty, QString inName, QString inLabel)
71 name = inName;
72 label = inLabel;
74 pp = parentProperty;
76 EHBox = new QHBoxLayout(0, 0, KDialog::spacingHint());
77 label_w = NULL;
78 read_w = NULL;
79 write_w = NULL;
80 spin_w = NULL;
81 slider_w = NULL;
82 push_w = NULL;
83 browse_w = NULL;
84 check_w = NULL;
85 led_w = NULL;
86 hSpacer = NULL;
90 INDI_E::~INDI_E()
92 delete (EHBox);
93 delete (label_w);
94 delete (read_w);
95 delete (write_w);
96 delete (spin_w);
97 delete (slider_w);
98 delete (push_w);
99 delete (browse_w);
100 delete (check_w);
101 delete (led_w);
102 delete (hSpacer);
105 void INDI_E::setupElementLabel()
107 label_w = new KSqueezedTextLabel(pp->pg->propertyContainer);
108 label_w->setMinimumWidth(ELEMENT_LABEL_WIDTH);
109 label_w->setMaximumWidth(ELEMENT_LABEL_WIDTH);
110 label_w->setFrameShape( KSqueezedTextLabel::Box );
111 label_w->setPaletteBackgroundColor( QColor( 224, 232, 238 ) );
112 label_w->setTextFormat( QLabel::RichText );
113 label_w->setAlignment( int( QLabel::WordBreak | QLabel::AlignCenter ) );
114 label_w->setText(label);
116 EHBox->addWidget(label_w);
119 int INDI_E::buildTextGUI(QString initText)
122 setupElementLabel();
124 text = initText;
126 switch (pp->perm)
128 case PP_RW:
129 setupElementRead(ELEMENT_READ_WIDTH);
130 setupElementWrite(ELEMENT_WRITE_WIDTH);
132 break;
134 case PP_RO:
135 setupElementRead(ELEMENT_FULL_WIDTH);
136 break;
138 case PP_WO:
139 setupElementWrite(ELEMENT_FULL_WIDTH);
140 break;
143 pp->PVBox->addLayout(EHBox);
144 return (0);
148 int INDI_E::buildBLOBGUI()
151 setupElementLabel();
153 text = "INDI DATA STREAM";
155 switch (pp->perm)
157 case PP_RW:
158 setupElementRead(ELEMENT_READ_WIDTH);
159 setupElementWrite(ELEMENT_WRITE_WIDTH);
160 setupBrowseButton();
162 break;
164 case PP_RO:
165 setupElementRead(ELEMENT_FULL_WIDTH);
166 break;
168 case PP_WO:
169 setupElementWrite(ELEMENT_FULL_WIDTH);
170 setupBrowseButton();
171 break;
174 pp->PVBox->addLayout(EHBox);
175 return (0);
179 int INDI_E::buildNumberGUI (double initValue)
181 bool scale = false;
183 updateValue(initValue);
184 setupElementLabel();
186 if (step != 0 && (max - min)/step <= MAXSCSTEPS)
187 scale = true;
189 switch (pp->perm)
191 case PP_RW:
192 setupElementRead(ELEMENT_READ_WIDTH);
193 if (scale)
194 setupElementScale(ELEMENT_WRITE_WIDTH);
195 else
196 setupElementWrite(ELEMENT_WRITE_WIDTH);
198 pp->PVBox->addLayout(EHBox);
199 break;
201 case PP_RO:
202 setupElementRead(ELEMENT_READ_WIDTH);
203 pp->PVBox->addLayout(EHBox);
204 break;
206 case PP_WO:
207 if (scale)
208 setupElementScale(ELEMENT_FULL_WIDTH);
209 else
210 setupElementWrite(ELEMENT_FULL_WIDTH);
212 pp->PVBox->addLayout(EHBox);
214 break;
217 return (0);
221 int INDI_E::buildLightGUI()
224 led_w = new KLed (pp->pg->propertyContainer);
225 led_w->setMaximumSize(16,16);
226 led_w->setLook( KLed::Sunken );
227 drawLt();
229 EHBox->addWidget(led_w);
231 setupElementLabel();
233 pp->PVBox->addLayout(EHBox);
235 return (0);
238 void INDI_E::drawLt()
240 /* set state light */
241 switch (state)
243 case PS_IDLE:
244 led_w->setColor(Qt::gray);
245 break;
247 case PS_OK:
248 led_w->setColor(Qt::green);
249 break;
251 case PS_BUSY:
252 led_w->setColor(Qt::yellow);
253 break;
255 case PS_ALERT:
256 led_w->setColor(Qt::red);
257 break;
259 default:
260 break;
266 void INDI_E::updateValue(double newValue)
268 char iNumber[32];
270 value = newValue;
272 numberFormat(iNumber, format.ascii(), value);
273 text = iNumber;
277 void INDI_E::setupElementScale(int length)
280 int steps = (int) ((max - min) / step);
281 spin_w = new KDoubleSpinBox(min, max, step, value, 2, pp->pg->propertyContainer );
282 slider_w = new QSlider(0, steps, 1, (int) ((value - min) / step), Qt::Horizontal, pp->pg->propertyContainer );
284 connect(spin_w, SIGNAL(valueChanged(double)), this, SLOT(spinChanged(double )));
285 connect(slider_w, SIGNAL(sliderMoved(int)), this, SLOT(sliderChanged(int )));
287 //kdDebug() << "For element " << label << " we have step of " << step << endl;
289 if (length == ELEMENT_FULL_WIDTH)
290 spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
291 else
292 spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
294 spin_w->setMinimumWidth( (int) (length * 0.45) );
295 slider_w->setMinimumWidth( (int) (length * 0.55) );
297 EHBox->addWidget(slider_w);
298 EHBox->addWidget(spin_w);
301 void INDI_E::spinChanged(double value)
303 int slider_value = (int) ((value - min) / step);
304 slider_w->setValue(slider_value);
307 void INDI_E::sliderChanged(int value)
310 double spin_value = (value * step) + min;
311 spin_w->setValue(spin_value);
315 void INDI_E::setMin (double inMin)
317 min = inMin;
318 if (spin_w)
320 spin_w->setMinValue(min);
321 spin_w->setValue(value);
323 if (slider_w)
325 slider_w->setMaxValue((int) ((max - min) / step));
326 slider_w->setMinValue(0);
327 slider_w->setPageStep(1);
328 slider_w->setValue( (int) ((value - min) / step ));
333 void INDI_E::setMax (double inMax)
335 max = inMax;
336 if (spin_w)
338 spin_w->setMaxValue(max);
339 spin_w->setValue(value);
341 if (slider_w)
343 slider_w->setMaxValue((int) ((max - min) / step));
344 slider_w->setMinValue(0);
345 slider_w->setPageStep(1);
346 slider_w->setValue( (int) ((value - min) / step ));
351 void INDI_E::setupElementWrite(int length)
353 write_w = new KLineEdit( pp->pg->propertyContainer);
354 write_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, write_w->sizePolicy().hasHeightForWidth() ));
355 write_w->setMinimumWidth( length );
356 write_w->setMaximumWidth( length);
358 QObject::connect(write_w, SIGNAL(returnPressed()), pp, SLOT(newText()));
359 EHBox->addWidget(write_w);
363 void INDI_E::setupElementRead(int length)
366 read_w = new KLineEdit( pp->pg->propertyContainer );
367 read_w->setMinimumWidth( length );
368 read_w->setFocusPolicy( KLineEdit::NoFocus );
369 read_w->setFrameShape( KLineEdit::GroupBoxPanel );
370 read_w->setFrameShadow( KLineEdit::Plain );
371 read_w->setCursorPosition( 0 );
372 read_w->setAlignment( int( KLineEdit::AlignHCenter ) );
373 read_w->setReadOnly( TRUE );
374 read_w->setText(text);
376 EHBox->addWidget(read_w);
380 void INDI_E::setupBrowseButton()
382 browse_w = new KPushButton("...", pp->pg->propertyContainer);
383 browse_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, browse_w->sizePolicy().hasHeightForWidth() ) );
384 browse_w->setMinimumWidth( MIN_SET_WIDTH );
385 browse_w->setMaximumWidth( MAX_SET_WIDTH );
387 EHBox->addWidget(browse_w);
388 QObject::connect(browse_w, SIGNAL(clicked()), this, SLOT(browseBlob()));
392 void INDI_E::initNumberValues(double newMin, double newMax, double newStep, char * newFormat)
394 min = newMin;
395 max = newMax;
396 step = newStep;
397 format = newFormat;
400 void INDI_E::browseBlob()
403 KURL currentURL;
405 currentURL = KFileDialog::getOpenURL( QDir::homeDirPath(), "*");
407 // if user presses cancel
408 if (currentURL.isEmpty())
409 return;
411 if ( currentURL.isValid() )
412 write_w->setText(currentURL.path());
417 #include "indielement.moc"