• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • indi
indiproperty.cpp
Go to the documentation of this file.
1 /* INDI Property
2  Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
3 
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.
8 
9 
10  */
11 
12 #include <indiproperty.h>
13 #include <indicom.h>
14 
15  #include "indielement.h"
16  #include "indiproperty.h"
17  #include "indigroup.h"
18  #include "indidevice.h"
19 #include "clientmanager.h"
20  #include "Options.h"
21  #include "kstars.h"
22  #include "dialogs/timedialog.h"
23  #include "skymap.h"
24 
25  #include <base64.h>
26 #include <basedevice.h>
27 
28  #include <kmenu.h>
29  #include <klineedit.h>
30  #include <kled.h>
31  #include <klocale.h>
32  #include <kcombobox.h>
33  #include <kpushbutton.h>
34  #include <knuminput.h>
35  #include <kdebug.h>
36  #include <kmessagebox.h>
37 
38  #include <QButtonGroup>
39  #include <QCheckBox>
40  #include <QLabel>
41  #include <QTimer>
42  #include <QFile>
43  #include <QDataStream>
44  #include <QFrame>
45  #include <QHBoxLayout>
46  #include <QVBoxLayout>
47  #include <QAbstractButton>
48  #include <QAction>
49 
50  #include <unistd.h>
51  #include <stdlib.h>
52  #include <assert.h>
53 
54 extern const char *libindi_strings_context;
55 
56 /*******************************************************************
57 ** INDI Property: contains widgets, labels, and their status
58 *******************************************************************/
59 INDI_P::INDI_P(INDI_G *ipg, INDI::Property *prop)
60 {
61  pg = ipg;
62  dataProp = prop;
63 
64  name = QString(prop->getName());
65 
66  PHBox = new QHBoxLayout();
67  PHBox->setMargin(0);
68  PHBox->setSpacing(KDialog::spacingHint());
69  PVBox = new QVBoxLayout();
70  PVBox->setMargin(0);
71  PVBox->setSpacing(KDialog::spacingHint());
72 
73  ledStatus = NULL;
74  labelW = NULL;
75  setB = NULL;
76  menuC = NULL;
77  groupB = NULL;
78  initGUI();
79 }
80 
81 void INDI_P::updateStateLED()
82 {
83 
84  /* set state light */
85  switch (dataProp->getState())
86  {
87  case IPS_IDLE:
88  ledStatus->setColor(Qt::gray);
89  break;
90 
91  case IPS_OK:
92  ledStatus->setColor(Qt::green);
93  break;
94 
95  case IPS_BUSY:
96  ledStatus->setColor(Qt::yellow);
97  break;
98 
99  case IPS_ALERT:
100  ledStatus->setColor(Qt::red);
101  break;
102 
103  default:
104  break;
105 
106  }
107 
108 }
109 
110 /* build widgets for property pp using info in root.
111  */
112 void INDI_P::initGUI ()
113 {
114 
115  QString label = i18nc(libindi_strings_context, dataProp->getLabel());
116 
117  if (label == "(I18N_EMPTY_MESSAGE)")
118  label = dataProp->getLabel();
119 
120 
121  /* add to GUI group */
122  ledStatus = new KLed (pg->getContainer());
123  ledStatus->setMaximumSize(16,16);
124  ledStatus->setLook(KLed::Sunken);
125 
126  updateStateLED();
127 
128  /* #1 First widegt is the LED status indicator */
129  PHBox->addWidget(ledStatus);
130 
131  if (label.isEmpty())
132  {
133  label = i18nc(libindi_strings_context, name.toUtf8());
134  if (label == "(I18N_EMPTY_MESSAGE)")
135  label = name.toUtf8();
136 
137  labelW = new QLabel(label, pg->getContainer());
138  }
139  else
140  labelW = new QLabel(label, pg->getContainer());
141 
142  labelW->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
143  labelW->setFrameShape( QFrame::StyledPanel );
144  labelW->setMinimumWidth(PROPERTY_LABEL_WIDTH);
145  labelW->setMaximumWidth(PROPERTY_LABEL_WIDTH);
146  labelW->setTextFormat( Qt::RichText );
147  labelW->setAlignment(Qt::AlignVCenter | Qt::AlignLeft );
148  labelW->setWordWrap(true);
149 
150  PHBox->addWidget(labelW);
151 
152  ledStatus->show();
153  labelW->show();
154 
155  /* #3 Add the Vertical layout thay may contain several elements */
156  PHBox->addLayout(PVBox);
157 
158  switch (dataProp->getType())
159  {
160  case INDI_SWITCH:
161  if (dataProp->getSwitch()->r == ISR_NOFMANY)
162  guiType = PG_RADIO;
163  else if (dataProp->getSwitch()->nsp > 4)
164  guiType = PG_MENU;
165  else
166  guiType = PG_BUTTONS;
167 
168  if (guiType == PG_MENU)
169  buildMenuGUI();
170  else
171  buildSwitchGUI();
172  break;
173 
174  case INDI_TEXT:
175  buildTextGUI();
176  break;
177 
178  case INDI_NUMBER:
179  buildNumberGUI();
180  break;
181 
182  case INDI_LIGHT:
183  buildLightGUI();
184  break;
185 
186  case INDI_BLOB:
187  buildBLOBGUI();
188  break;
189 
190  default:
191  break;
192  }
193 }
194 
195 void INDI_P::buildSwitchGUI()
196 {
197  INDI_E *lp;
198  ISwitchVectorProperty *svp = dataProp->getSwitch();
199 
200  if (svp == NULL)
201  return;
202 
203  groupB = new QButtonGroup(0);
204 
205  if (guiType == PG_BUTTONS)
206  groupB->setExclusive(true);
207  else if (guiType == PG_RADIO)
208  groupB->setExclusive(false);
209 
210  QObject::connect(groupB, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(newSwitch(QAbstractButton *)));
211 
212  for (int i=0; i < svp->nsp; i++)
213  {
214  ISwitch *sp = &(svp->sp[i]);
215  lp = new INDI_E(this, dataProp);
216 
217  lp->buildSwitch(groupB, sp);
218 
219  elementList.append(lp);
220  }
221 
222  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
223 
224  PHBox->addItem(horSpacer);
225 
226 }
227 
228 void INDI_P::buildTextGUI()
229 {
230  INDI_E *lp;
231  ITextVectorProperty *tvp = dataProp->getText();
232 
233  if (tvp == NULL)
234  return;
235 
236  for (int i=0; i < tvp->ntp; i++)
237  {
238  IText *tp = &(tvp->tp[i]);
239  lp = new INDI_E(this, dataProp);
240 
241  lp->buildText(tp);
242 
243  elementList.append(lp);
244  }
245 
246 
247  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
248 
249  PHBox->addItem(horSpacer);
250 
251 
252  if (tvp->p == IP_RO)
253  return;
254 
255  // INDI STD, but we use our own controls
256  if (name == "TIME_UTC")
257  setupSetButton(i18n("Time"));
258  else
259  setupSetButton(i18n("Set"));
260 
261 }
262 
263 void INDI_P::buildNumberGUI()
264 {
265 
266  INDI_E *lp;
267  INumberVectorProperty *nvp = dataProp->getNumber();
268 
269  if (nvp == NULL)
270  return;
271 
272  for (int i=0; i < nvp->nnp; i++)
273  {
274  INumber *np = &(nvp->np[i]);
275  lp = new INDI_E(this, dataProp);
276 
277  lp->buildNumber(np);
278 
279  elementList.append(lp);
280  }
281 
282 
283  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
284 
285  PHBox->addItem(horSpacer);
286 
287 
288  if (nvp->p == IP_RO)
289  return;
290 
291  setupSetButton(i18n("Set"));
292 
293 }
294 
295 void INDI_P::buildLightGUI()
296 {
297 
298  INDI_E *ep;
299  ILightVectorProperty *lvp = dataProp->getLight();
300 
301  if (lvp == NULL)
302  return;
303 
304  for (int i=0; i < lvp->nlp; i++)
305  {
306  ILight *lp = &(lvp->lp[i]);
307  ep = new INDI_E(this, dataProp);
308 
309  ep->buildLight(lp);
310 
311  elementList.append(ep);
312  }
313 
314 
315  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
316 
317  PHBox->addItem(horSpacer);
318 }
319 void INDI_P::buildBLOBGUI()
320 {
321 
322  INDI_E *lp;
323  IBLOBVectorProperty *bvp = dataProp->getBLOB();
324 
325  if (bvp == NULL)
326  return;
327 
328  for (int i=0; i < bvp->nbp; i++)
329  {
330  IBLOB *bp = &(bvp->bp[i]);
331  lp = new INDI_E(this, dataProp);
332 
333  lp->buildBLOB(bp);
334 
335  elementList.append(lp);
336  }
337 
338 
339  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
340 
341  PHBox->addItem(horSpacer);
342 
343  enableBLOBC = new QCheckBox();
344  enableBLOBC->setIcon(KIcon("modem"));
345  enableBLOBC->setChecked(true);
346  enableBLOBC->setToolTip(i18n("Enable binary data transfer from this property to KStars and vice-versa."));
347 
348  PHBox->addWidget(enableBLOBC);
349 
350  connect(enableBLOBC, SIGNAL(stateChanged(int)), this, SLOT(setBLOBOption(int)));
351 
352  if (dataProp->getPermission() != IP_RO)
353  setupSetButton(i18n("Upload"));
354 
355 }
356 
357 void INDI_P::setBLOBOption(int state)
358 {
359  if (state == Qt::Checked)
360  pg->getDevice()->getClientManager()->setBLOBMode(B_ALSO, dataProp->getDeviceName(), dataProp->getName());
361  else
362  pg->getDevice()->getClientManager()->setBLOBMode(B_NEVER, dataProp->getDeviceName(), dataProp->getName());
363 }
364 
365 
366 void INDI_P::newSwitch(QAbstractButton * button)
367 {
368  ISwitchVectorProperty *svp = dataProp->getSwitch();
369  QString buttonText = button->text();
370 
371  if (svp == NULL)
372  return;
373 
374  buttonText.remove("&");
375 
376  foreach(INDI_E *el, elementList)
377  if (el->getLabel() == buttonText)
378  {
379  newSwitch(el->getName());
380  return;
381  }
382 
383 }
384 
385 void INDI_P::newSwitch(int index)
386 {
387  ISwitchVectorProperty *svp = dataProp->getSwitch();
388 
389  if (svp == NULL)
390  return;
391 
392  if (index >= svp->nsp)
393  return;
394 
395  ISwitch *sp = &(svp->sp[index]);
396 
397  IUResetSwitch(svp);
398  sp->s = ISS_ON;
399 
400  sendSwitch();
401 }
402 
403 void INDI_P::newSwitch(const QString & name)
404 {
405 
406  ISwitchVectorProperty *svp = dataProp->getSwitch();
407 
408  if (svp == NULL)
409  return;
410 
411  ISwitch *sp = IUFindSwitch(svp, name.toLatin1().constData());
412 
413  if (sp == NULL)
414  return;
415 
416  if (svp->r == ISR_1OFMANY)
417  {
418  IUResetSwitch(svp);
419  sp->s = ISS_ON;
420  }
421  else
422  sp->s = (sp->s == ISS_ON) ? ISS_OFF : ISS_ON;
423 
424  sendSwitch();
425 
426 }
427 
428 
429 void INDI_P::sendSwitch()
430 {
431  ISwitchVectorProperty *svp = dataProp->getSwitch();
432  if (svp == NULL)
433  return;
434 
435  svp->s = IPS_BUSY;
436 
437  foreach(INDI_E *el, elementList)
438  el->syncSwitch();
439 
440  updateStateLED();
441 
442  // Send it to server
443  pg->getDevice()->getClientManager()->sendNewSwitch(svp);
444 
445 }
446 
447 void INDI_P::sendText()
448 {
449  ITextVectorProperty *tvp = NULL;
450  INumberVectorProperty *nvp = NULL;
451 
452  switch (dataProp->getType())
453  {
454  case INDI_TEXT:
455  tvp = dataProp->getText();
456  if (tvp == NULL)
457  return;
458 
459  tvp->s = IPS_BUSY;
460 
461  foreach(INDI_E *el, elementList)
462  el->updateTP();
463 
464  pg->getDevice()->getClientManager()->sendNewText(tvp);
465 
466  break;
467 
468  case INDI_NUMBER:
469  nvp = dataProp->getNumber();
470  if (nvp == NULL)
471  return;
472 
473  nvp->s = IPS_BUSY;
474 
475  foreach(INDI_E *el, elementList)
476  el->updateNP();
477 
478  pg->getDevice()->getClientManager()->sendNewNumber(nvp);
479 
480  default:
481  break;
482 
483  }
484 
485 
486  updateStateLED();
487 
488 }
489 
490 void INDI_P::buildMenuGUI()
491 {
492  QStringList menuOptions;
493  QString oneOption;
494  int onItem=-1;
495  INDI_E *lp;
496  ISwitchVectorProperty *svp = dataProp->getSwitch();
497 
498  if (svp == NULL)
499  return;
500 
501  menuC = new KComboBox(pg->getContainer());
502 
503  QObject::connect(menuC, SIGNAL(activated(int)), this, SLOT(newSwitch(int)));
504 
505  for (int i=0; i < svp->nsp; i++)
506  {
507  ISwitch *tp = &(svp->sp[i]);
508 
509  if (tp->s == ISS_ON)
510  onItem = i;
511 
512  lp = new INDI_E(this, dataProp);
513 
514  lp->buildMenuItem(tp);
515 
516  oneOption = i18nc(libindi_strings_context, lp->getLabel().toUtf8());
517 
518  if (oneOption == "(I18N_EMPTY_MESSAGE)")
519  oneOption = lp->getLabel().toUtf8();
520 
521  menuOptions.append(oneOption);
522 
523  elementList.append(lp);
524  }
525 
526  menuC->addItems(menuOptions);
527  menuC->setCurrentIndex(onItem);
528 
529  horSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
530 
531 
532  PHBox->addWidget(menuC);
533  PHBox->addItem(horSpacer);
534 
535 }
536 
537 
538 void INDI_P::setupSetButton(const QString &caption)
539 {
540  setB = new QPushButton(caption, pg->getContainer());
541  setB->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
542  setB->setMinimumWidth( MIN_SET_WIDTH );
543  setB->setMaximumWidth( MAX_SET_WIDTH );
544 
545  connect(setB, SIGNAL(clicked()), this, SLOT(processSetButton()));
546 
547  PHBox->addWidget(setB);
548 }
549 
550 void INDI_P::addWidget(QWidget *w)
551 {
552  PHBox->addWidget(w);
553 }
554 
555 void INDI_P::addLayout(QHBoxLayout *layout)
556 {
557  PVBox->addLayout(layout);
558 }
559 
560 void INDI_P::updateMenuGUI()
561 {
562  ISwitchVectorProperty *svp = dataProp->getSwitch();
563  if (svp == NULL)
564  return;
565 
566  int currentIndex = IUFindOnSwitchIndex(svp);
567  menuC->setCurrentIndex(currentIndex);
568 }
569 
570 void INDI_P::processSetButton()
571 {
572  switch (dataProp->getType())
573  {
574  case INDI_TEXT:
575  if (!strcmp(dataProp->getName(), "TIME_UTC"))
576  newTime();
577  else
578  sendText();
579 
580  break;
581 
582  case INDI_NUMBER:
583  sendText();
584  break;
585 
586  case INDI_BLOB:
587  sendBlob();
588  break;
589 
590  default:
591  break;
592  }
593 
594 }
595 
596 void INDI_P::sendBlob()
597 {
598  int index=0;
599  bool openingTag=false;
600  IBLOBVectorProperty *bvp = dataProp->getBLOB();
601 
602  if (bvp == NULL)
603  return;
604 
605  bvp->s = IPS_BUSY;
606 
607 
608  foreach(INDI_E *ep, elementList)
609  {
610  if (ep->getBLOBDirty() == true)
611  {
612 
613  if (openingTag == false)
614  {
615  pg->getDevice()->getClientManager()->startBlob(bvp->device, bvp->name, timestamp());
616  openingTag = true;
617  }
618 
619  IBLOB *bp = &(bvp->bp[index]);
620  ep->setBLOBDirty(false);
621 
622  //qDebug() << "SENDING BLOB " << bp->name << " has size of " << bp->size << " and bloblen of " << bp->bloblen << endl;
623  pg->getDevice()->getClientManager()->sendOneBlob(bp->name, bp->size, bp->format, bp->blob);
624 
625  }
626 
627  index++;
628 
629  }
630 
631  if (openingTag)
632  pg->getDevice()->getClientManager()->finishBlob();
633 
634  updateStateLED();
635 
636 }
637 
638 
639 void INDI_P::newTime()
640 {
641  INDI_E * timeEle;
642  INDI_E * offsetEle;
643 
644  timeEle = getElement("UTC");
645  offsetEle = getElement("OFFSET");
646  if (!timeEle || !offsetEle) return;
647 
648  TimeDialog timedialog ( KStars::Instance()->data()->ut(), KStars::Instance()->data()->geo(), KStars::Instance(), true );
649 
650  if ( timedialog.exec() == QDialog::Accepted )
651  {
652  QTime newTime( timedialog.selectedTime() );
653  QDate newDate( timedialog.selectedDate() );
654 
655  timeEle->setText(QString("%1-%2-%3T%4:%5:%6")
656  .arg(newDate.year()).arg(newDate.month())
657  .arg(newDate.day()).arg(newTime.hour())
658  .arg(newTime.minute()).arg(newTime.second()));
659 
660  offsetEle->setText(QString().setNum(KStars::Instance()->data()->geo()->TZ(), 'g', 2));
661 
662  sendText();
663 
664  }
665  else return;
666 
667 }
668 
669 INDI_E * INDI_P::getElement(const QString &elementName)
670 {
671  foreach(INDI_E *ep, elementList)
672  {
673  if (ep->getName() == elementName)
674  return ep;
675  }
676 
677  return NULL;
678 }
679 
680 /* INDI property desstructor, makes sure everything is "gone" right */
681 INDI_P::~INDI_P()
682 {
683  while ( ! elementList.isEmpty() ) delete elementList.takeFirst();
684  delete (ledStatus);
685  delete (labelW);
686  delete (setB);
687  delete (PHBox);
688  delete (groupB);
689 }
690 
691 
692 
693 #include "indiproperty.moc"
PROPERTY_LABEL_WIDTH
#define PROPERTY_LABEL_WIDTH
Definition: indicommon.h:33
INDI_P::getElement
INDI_E * getElement(const QString &elementName)
Definition: indiproperty.cpp:669
INDI_P::sendBlob
void sendBlob()
Definition: indiproperty.cpp:596
timedialog.h
INDI_E::getBLOBDirty
bool getBLOBDirty()
Definition: indielement.h:89
QWidget
INDI_P::sendText
void sendText()
Definition: indiproperty.cpp:447
INDI_P::setupSetButton
void setupSetButton(const QString &caption)
Definition: indiproperty.cpp:538
PG_MENU
Definition: indicommon.h:47
INDI_G::getDevice
INDI_D * getDevice()
Definition: indigroup.h:46
KStars::Instance
static KStars * Instance()
Definition: kstars.h:125
INDI_P::addLayout
void addLayout(QHBoxLayout *layout)
Definition: indiproperty.cpp:555
MAX_SET_WIDTH
#define MAX_SET_WIDTH
Definition: indicommon.h:39
INDI_E
Definition: indielement.h:44
INDI_P::buildSwitchGUI
void buildSwitchGUI()
Definition: indiproperty.cpp:195
INDI_P::updateMenuGUI
void updateMenuGUI()
Definition: indiproperty.cpp:560
indidevice.h
TimeDialog::selectedDate
QDate selectedDate(void)
Definition: timedialog.cpp:103
clientmanager.h
MIN_SET_WIDTH
#define MIN_SET_WIDTH
Definition: indicommon.h:38
INDI_P::~INDI_P
~INDI_P()
Definition: indiproperty.cpp:681
INDI_E::getName
const QString & getName()
Definition: indielement.h:52
INDI_E::updateNP
void updateNP()
Definition: indielement.cpp:291
INDI_E::syncSwitch
void syncSwitch()
Definition: indielement.cpp:213
INDI_P::buildTextGUI
void buildTextGUI()
Definition: indiproperty.cpp:228
PG_BUTTONS
Definition: indicommon.h:46
INDI_P::updateStateLED
void updateStateLED()
Definition: indiproperty.cpp:81
TimeDialog::selectedTime
QTime selectedTime(void)
Definition: timedialog.cpp:99
INDI_P::newTime
void newTime()
Definition: indiproperty.cpp:639
TimeDialog
A class for adjusting the Time and Date.
Definition: timedialog.h:47
INDI_P::buildMenuGUI
void buildMenuGUI()
Definition: indiproperty.cpp:490
INDI_E::getLabel
const QString & getLabel()
Definition: indielement.h:51
INDI_E::buildText
void buildText(IText *itp)
Definition: indielement.cpp:142
INDI_P::INDI_P
INDI_P(INDI_G *ipg, INDI::Property *prop)
Definition: indiproperty.cpp:59
INDI_E::buildLight
void buildLight(ILight *ilp)
Definition: indielement.cpp:431
INDI_E::buildNumber
void buildNumber(INumber *inp)
Definition: indielement.cpp:374
skymap.h
INDI_G
Definition: indigroup.h:31
i18nc
i18nc("string from libindi, used in the config dialog","100x")
INDI_E::buildMenuItem
void buildMenuItem(ISwitch *sw)
Definition: indielement.cpp:137
INDI_E::updateTP
void updateTP()
Definition: indielement.cpp:282
INDI_P::newSwitch
void newSwitch(QAbstractButton *button)
Definition: indiproperty.cpp:366
INDI_G::getContainer
QFrame * getContainer()
Definition: indigroup.h:43
libindi_strings_context
const char * libindi_strings_context
Definition: indidevice.cpp:54
INDI_E::setText
void setText(const QString &newText)
Definition: indielement.cpp:310
Options.h
INDI_P::sendSwitch
void sendSwitch()
Definition: indiproperty.cpp:429
INDI_P::buildLightGUI
void buildLightGUI()
Definition: indiproperty.cpp:295
INDI_D::getClientManager
ClientManager * getClientManager()
Definition: indidevice.h:45
INDI_P::addWidget
void addWidget(QWidget *w)
Definition: indiproperty.cpp:550
QLabel
INDI_P::buildNumberGUI
void buildNumberGUI()
Definition: indiproperty.cpp:263
PG_RADIO
Definition: indicommon.h:47
INDI_E::buildBLOB
void buildBLOB(IBLOB *ibp)
Definition: indielement.cpp:332
indiproperty.h
indigroup.h
kstars.h
indielement.h
INDI_P::buildBLOBGUI
void buildBLOBGUI()
Definition: indiproperty.cpp:319
INDI_E::setBLOBDirty
void setBLOBDirty(bool isDirty)
Definition: indielement.h:90
INDI_P::processSetButton
void processSetButton()
Definition: indiproperty.cpp:570
INDI_E::buildSwitch
void buildSwitch(QButtonGroup *groupB, ISwitch *sw)
Definition: indielement.cpp:85
INDI_P::setBLOBOption
void setBLOBOption(int state)
Definition: indiproperty.cpp:357
INDI_P::initGUI
void initGUI()
Definition: indiproperty.cpp:112
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

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

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal