• 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
  • tools
conjunctions.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  conjunctions.cpp - Conjunctions Tool
3  -------------------
4  begin : Sun 20th Apr 2008
5  copyright : (C) 2008 Akarsh Simha
6  email : akarshsimha@gmail.com
7 ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 /***************************************************************************
19  * *
20  * Much of the code here is taken from Pablo de Vicente's *
21  * modcalcplanets.cpp *
22  * *
23  ***************************************************************************/
24 
25 #include "conjunctions.h"
26 
27 #include <QProgressDialog>
28 #include <QStandardItemModel>
29 #include <QSortFilterProxyModel>
30 #include <QHeaderView>
31 #include <QPointer>
32 #include <KGlobal>
33 #include <KLocale>
34 #include <kfiledialog.h>
35 #include <kmessagebox.h>
36 
37 #include "ksconjunct.h"
38 #include "geolocation.h"
39 #include "dialogs/locationdialog.h"
40 #include "dms.h"
41 #include "kstars.h"
42 #include "kstarsdata.h"
43 #include "ksnumbers.h"
44 #include "widgets/dmsbox.h"
45 #include "dialogs/finddialog.h"
46 #include "skyobjects/kssun.h"
47 #include "skyobjects/ksplanet.h"
48 #include "skyobjects/ksplanetbase.h"
49 #include "skyobjects/ksmoon.h"
50 #include "skyobjects/kspluto.h"
51 #include "skyobjects/kscomet.h"
52 #include "skyobjects/ksasteroid.h"
53 #include "skycomponents/skymapcomposite.h"
54 #include "skymap.h"
55 
56 ConjunctionsTool::ConjunctionsTool(QWidget *parentSplit)
57  : QFrame(parentSplit), Object1( 0 ), Object2( 0 ) {
58 
59  setupUi(this);
60 
61  KStarsData *kd = KStarsData::Instance();
62  KStarsDateTime dtStart ( KStarsDateTime::currentDateTime() );
63  KStarsDateTime dtStop ( dtStart.djd() + 365.24 ); // TODO: Refine
64 
65  startDate -> setDateTime( dtStart.dateTime() );
66  stopDate -> setDateTime( dtStop.dateTime() );
67 
68  geoPlace = kd -> geo();
69  LocationButton -> setText( geoPlace -> fullName() );
70 
71  // Init filter type combobox
72  FilterTypeComboBox->addItem( i18n ("Single Object...") );
73  FilterTypeComboBox->addItem( i18n ("Any") );
74  FilterTypeComboBox->addItem( i18n ("Stars") );
75  FilterTypeComboBox->addItem( i18n ("Solar System") );
76  FilterTypeComboBox->addItem( i18n ("Planets") );
77  FilterTypeComboBox->addItem( i18n ("Comets") );
78  FilterTypeComboBox->addItem( i18n ("Asteroids") );
79  FilterTypeComboBox->addItem( i18n ("Open Clusters") );
80  FilterTypeComboBox->addItem( i18n ("Globular Clusters") );
81  FilterTypeComboBox->addItem( i18n ("Gaseous Nebulae") );
82  FilterTypeComboBox->addItem( i18n ("Planetary Nebulae") );
83  FilterTypeComboBox->addItem( i18n ("Galaxies") );
84 
85  pNames[KSPlanetBase::MERCURY] = i18n("Mercury");
86  pNames[KSPlanetBase::VENUS] = i18n("Venus");
87  pNames[KSPlanetBase::MARS] = i18n("Mars");
88  pNames[KSPlanetBase::JUPITER] = i18n("Jupiter");
89  pNames[KSPlanetBase::SATURN] = i18n("Saturn");
90  pNames[KSPlanetBase::URANUS] = i18n("Uranus");
91  pNames[KSPlanetBase::NEPTUNE] = i18n("Neptune");
92  pNames[KSPlanetBase::PLUTO] = i18n("Pluto");
93  pNames[KSPlanetBase::SUN] = i18n("Sun");
94  pNames[KSPlanetBase::MOON] = i18n("Moon");
95 
96  for ( int i=0; i<KSPlanetBase::UNKNOWN_PLANET; ++i ) {
97  // Obj1ComboBox->insertItem( i, pNames[i] );
98  Obj2ComboBox->insertItem( i, pNames[i] );
99  }
100 
101  // Initialize the Maximum Separation box to 1 degree
102  maxSeparationBox->setDegType( true );
103  maxSeparationBox->setDMS( "01 00 00.0" );
104 
105  //Set up the Table Views
106  m_Model = new QStandardItemModel( 0, 4, this );
107  m_Model->setHorizontalHeaderLabels( QStringList() << i18n( "Conjunction/Opposition" )
108  << i18n( "Date && Time (UT)" ) << i18n( "Object" ) << i18n( "Separation" ) );
109  m_SortModel = new QSortFilterProxyModel( this );
110  m_SortModel->setSourceModel( m_Model );
111  OutputList->setModel( m_SortModel );
112  OutputList->setSortingEnabled(true);
113  OutputList->horizontalHeader()->setStretchLastSection( true );
114  OutputList->horizontalHeader()->setResizeMode( QHeaderView::ResizeToContents, QHeaderView::ResizeToContents );
115 
116  //FilterEdit->showClearButton = true;
117  ClearFilterButton->setIcon( KIcon( "edit-clear" ) );
118 
119  m_index = 0;
120 
121  // signals and slots connections
122  connect(LocationButton, SIGNAL(clicked()), this, SLOT(slotLocation()));
123  connect(Obj1FindButton, SIGNAL(clicked()), this, SLOT(slotFindObject()));
124  connect(ComputeButton, SIGNAL(clicked()), this, SLOT(slotCompute()));
125  connect( FilterTypeComboBox, SIGNAL( currentIndexChanged(int) ), SLOT( slotFilterType(int) ) );
126  connect( ClearButton, SIGNAL( clicked() ), this, SLOT( slotClear() ) );
127  connect( ExportButton, SIGNAL( clicked() ), this, SLOT( slotExport() ) );
128  connect( OutputList, SIGNAL( doubleClicked( const QModelIndex& ) ), this, SLOT( slotGoto() ) );
129  connect( ClearFilterButton, SIGNAL( clicked() ), FilterEdit, SLOT( clear() ) );
130  connect( FilterEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( slotFilterReg( const QString & ) ) );
131 
132  show();
133 }
134 
135 ConjunctionsTool::~ConjunctionsTool(){
136  delete Object1;
137  delete Object2;
138 }
139 
140 void ConjunctionsTool::slotGoto() {
141  int index = m_SortModel->mapToSource( OutputList->currentIndex() ).row(); // Get the number of the line
142  long double jd = outputJDList.value( index );
143  KStarsDateTime dt;
144  KStars *ks = KStars::Instance();
145  KStarsData *data = KStarsData::Instance();
146  SkyMap *map = ks->map();
147 
148  // Show conjunction
149  data->setLocation( *geoPlace );
150  dt.setDJD( jd );
151  data->changeDateTime( dt );
152  map->setClickedObject( data->skyComposite()->findByName( m_Model->data( m_Model->index( index, 2 ) ).toString() ) );
153  map->setClickedPoint( map->clickedObject() );
154  map->slotCenter();
155 }
156 
157 void ConjunctionsTool::slotFindObject() {
158  QPointer<FindDialog> fd = new FindDialog( KStars::Instance() );
159  if ( fd->exec() == QDialog::Accepted ) {
160  delete Object1;
161  if( !fd->selectedObject() )
162  return;
163  Object1 = fd->selectedObject()->clone();
164  if( Object1 )
165  Obj1FindButton->setText( Object1->name() );
166  }
167  delete fd;
168 }
169 
170 void ConjunctionsTool::slotLocation()
171 {
172  QPointer<LocationDialog> ld( new LocationDialog( this ) );
173  if ( ld->exec() == QDialog::Accepted && ld ) {
174  geoPlace = ld->selectedCity();
175  LocationButton -> setText( geoPlace -> fullName() );
176  }
177  delete ld;
178 }
179 
180 void ConjunctionsTool::slotFilterType( int )
181 {
182  // Disable find button if the user select an object type
183  if ( FilterTypeComboBox->currentIndex() == 0 )
184  Obj1FindButton->setEnabled( true );
185  else
186  Obj1FindButton->setEnabled( false );
187 }
188 
189 void ConjunctionsTool::slotClear()
190 {
191  m_Model->setRowCount ( 0 );
192  outputJDList.clear();
193  m_index = 0;
194 }
195 
196 void ConjunctionsTool::slotExport()
197 {
198  int i, j;
199  QByteArray line;
200 
201  QFile file( KFileDialog::getSaveFileName( QDir::homePath(), "*|All files", this, "Save Conjunctions" ) );
202  file.open( QIODevice::WriteOnly | QIODevice::Text );
203 
204  for ( i=0; i<m_Model->rowCount(); ++i ) {
205  for ( j=0; j<m_Model->columnCount(); ++j ) {
206  line.append( m_Model->data( m_Model->index( i, j ) ).toByteArray() );
207  if ( j < m_Model->columnCount() - 1 )
208  line.append( ";" );
209  else
210  line.append( "\n" );
211  }
212  file.write( line );
213  line.clear();
214  }
215 
216  file.close();
217 }
218 
219 void ConjunctionsTool::slotFilterReg( const QString & filter)
220 {
221  m_SortModel->setFilterRegExp( QRegExp( filter, Qt::CaseInsensitive, QRegExp::RegExp ) );
222  m_SortModel->setFilterKeyColumn( -1 );
223 }
224 
225 void ConjunctionsTool::slotCompute (void)
226 {
227  KStarsDateTime dtStart = startDate -> dateTime(); // Start date
228  KStarsDateTime dtStop = stopDate -> dateTime(); // Stop date
229  long double startJD = dtStart.djd(); // Start julian day
230  long double stopJD = dtStop.djd(); // Stop julian day
231  bool opposition = false; // true=opposition, false=conjunction
232  if( Opposition->currentIndex() ) opposition = true;
233  QStringList objects; // List of sky object used as Object1
234  KStarsData *data = KStarsData::Instance();
235  int progress = 0;
236 
237  // Check if we have a valid angle in maxSeparationBox
238  dms maxSeparation( 0.0 );
239  bool ok;
240  maxSeparation = maxSeparationBox->createDms( true, &ok );
241 
242  if( !ok ) {
243  KMessageBox::sorry( 0, i18n("Maximum separation entered is not a valid angle. Use the What's this help feature for information on how to enter a valid angle") );
244  return;
245  }
246 
247  // Check if Object1 and Object2 are set
248  if( FilterTypeComboBox->currentIndex() == 0 && !Object1 ) {
249  KMessageBox::sorry( 0, i18n("Please select an object to check conjunctions with, by clicking on the \'Find Object\' button.") );
250  return;
251  }
252  Object2 = KSPlanetBase::createPlanet( Obj2ComboBox->currentIndex() );
253  if( FilterTypeComboBox->currentIndex() == 0 && Object1->name() == Object2->name() ) {
254  // FIXME: Must free the created Objects
255  KMessageBox::sorry( 0 , i18n("Please select two different objects to check conjunctions with.") );
256  return;
257  }
258 
259  // Init KSConjunct object
260  KSConjunct ksc;
261  connect( &ksc, SIGNAL(madeProgress(int)), this, SLOT(showProgress(int)) );
262  ksc.setGeoLocation( geoPlace );
263 
264  switch ( FilterTypeComboBox->currentIndex() ) {
265  case 1: // All object types
266  foreach( int type, data->skyComposite()->objectNames().keys() )
267  objects += data->skyComposite()->objectNames( type );
268  break;
269  case 2: // Stars
270  objects += data->skyComposite()->objectNames( SkyObject::STAR );
271  objects += data->skyComposite()->objectNames( SkyObject::CATALOG_STAR );
272  break;
273  case 3: // Solar system
274  objects += data->skyComposite()->objectNames( SkyObject::PLANET );
275  objects += data->skyComposite()->objectNames( SkyObject::COMET );
276  objects += data->skyComposite()->objectNames( SkyObject::ASTEROID );
277  objects += data->skyComposite()->objectNames( SkyObject::MOON );
278  objects += i18n("Sun");
279  // Remove Object2 planet
280  objects.removeAll( Object2->name() );
281  break;
282  case 4: // Planet
283  objects += data->skyComposite()->objectNames( SkyObject::PLANET );
284  // Remove Object2 planet
285  objects.removeAll( Object2->name() );
286  break;
287  case 5: // Comet
288  objects += data->skyComposite()->objectNames( SkyObject::COMET );
289  break;
290  case 6: // Ateroid
291  objects += data->skyComposite()->objectNames( SkyObject::ASTEROID );
292  break;
293  case 7: // Open Clusters
294  objects = data->skyComposite()->objectNames( SkyObject::OPEN_CLUSTER );
295  break;
296  case 8: // Open Clusters
297  objects = data->skyComposite()->objectNames( SkyObject::GLOBULAR_CLUSTER );
298  break;
299  case 9: // Gaseous nebulae
300  objects = data->skyComposite()->objectNames( SkyObject::GASEOUS_NEBULA );
301  break;
302  case 10: // Planetary nebula
303  objects = data->skyComposite()->objectNames( SkyObject::PLANETARY_NEBULA );
304  break;
305  case 11: // Galaxies
306  objects = data->skyComposite()->objectNames( SkyObject::GALAXY );
307  break;
308  }
309 
310  // Remove all Jupiter and Saturn moons
311  // KStars crash if we compute a conjunction between a planet and one of this moon
312  if ( FilterTypeComboBox->currentIndex() == 1 ||
313  FilterTypeComboBox->currentIndex() == 3 ||
314  FilterTypeComboBox->currentIndex() == 6 ) {
315  objects.removeAll( "Io" );
316  objects.removeAll( "Europa" );
317  objects.removeAll( "Ganymede" );
318  objects.removeAll( "Callisto" );
319  objects.removeAll( "Mimas" );
320  objects.removeAll( "Enceladus" );
321  objects.removeAll( "Tethys" );
322  objects.removeAll( "Dione" );
323  objects.removeAll( "Rhea" );
324  objects.removeAll( "Titan" );
325  objects.removeAll( "Hyperion" );
326  objects.removeAll( "Iapetus" );
327  }
328 
329  if ( FilterTypeComboBox->currentIndex() != 0 ) {
330  // Show a progress dialog while processing
331  QProgressDialog progressDlg( i18n( "Compute conjunction..." ), i18n( "Abort" ), 0, objects.count(), this);
332  progressDlg.setWindowModality( Qt::WindowModal );
333  progressDlg.setValue( 0 );
334 
335  foreach( QString object, objects ) {
336  // If the user click on the 'cancel' button
337  if ( progressDlg.wasCanceled() )
338  break;
339 
340  // Update progress dialog
341  ++progress;
342  progressDlg.setValue( progress );
343  progressDlg.setLabelText( i18n( "Compute conjunction between %1 and %2", Object2->name(), object ) );
344 
345  // Compute conjuction
346  Object1 = data->skyComposite()->findByName( object );
347  showConjunctions( ksc.findClosestApproach(*Object1, *Object2, startJD, stopJD, maxSeparation, opposition), object );
348  }
349 
350  progressDlg.setValue( objects.count() );
351  } else {
352  // Change cursor while we search for conjunction
353  QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
354 
355  ComputeStack->setCurrentIndex( 1 );
356  showConjunctions( ksc.findClosestApproach(*Object1, *Object2, startJD, stopJD, maxSeparation, opposition), Object1->name() );
357  ComputeStack->setCurrentIndex( 0 );
358 
359  // Restore cursor
360  QApplication::restoreOverrideCursor();
361  }
362 
363  delete Object2;
364  Object2 = NULL;
365 }
366 
367 void ConjunctionsTool::showProgress(int n) {
368  progress->setValue( n );
369 }
370 
371 void ConjunctionsTool::showConjunctions(const QMap<long double, dms> &conjunctionlist, QString object)
372 {
373  KStarsDateTime dt;
374  QMap<long double, dms>::ConstIterator it;
375  QList<QStandardItem*> itemList;
376 
377  for(it = conjunctionlist.constBegin(); it != conjunctionlist.constEnd(); ++it) {
378  dt.setDJD( it.key() );
379  QStandardItem* typeItem;
380 
381  if ( ! Opposition->currentIndex() )
382  typeItem = new QStandardItem( i18n( "Conjunction" ) );
383  else
384  typeItem = new QStandardItem( i18n( "Opposition" ) );
385 
386  itemList << typeItem
387  << new QStandardItem( KGlobal::locale()->formatDateTime( dt, KLocale::IsoDate ) )
388  << new QStandardItem( object )
389  << new QStandardItem( it.value().toDMSString() );
390  m_Model->appendRow( itemList );
391  itemList.clear();
392 
393  outputJDList.insert( m_index, it.key() );
394  ++m_index;
395  }
396 }
ConjunctionsTool::slotFindObject
void slotFindObject()
Definition: conjunctions.cpp:157
KSConjunct::setGeoLocation
void setGeoLocation(GeoLocation *geo)
Sets the geographic location to compute conjunctions at.
Definition: ksconjunct.cpp:33
ksplanetbase.h
LocationDialog
Dialog for changing the geographic location of the observer.
Definition: locationdialog.h:57
ksconjunct.h
KStarsData
KStarsData is the backbone of KStars.
Definition: kstarsdata.h:66
KSPlanetBase::NEPTUNE
Definition: ksplanetbase.h:82
conjunctions.h
KStars::map
SkyMap * map() const
Definition: kstars.h:134
ConjunctionsTool::slotFilterReg
void slotFilterReg(const QString &)
Definition: conjunctions.cpp:219
SkyMap::slotCenter
void slotCenter()
Center the display at the point ClickedPoint.
Definition: skymap.cpp:373
KSPlanetBase::JUPITER
Definition: ksplanetbase.h:82
ConjunctionsTool::slotGoto
void slotGoto()
Definition: conjunctions.cpp:140
KSPlanetBase::MOON
Definition: ksplanetbase.h:82
SkyObject::PLANET
Definition: skyobject.h:108
SkyMap::setClickedObject
void setClickedObject(SkyObject *o)
Set the ClickedObject pointer to the argument.
Definition: skymap.cpp:361
QWidget
KStarsData::Instance
static KStarsData * Instance()
Definition: kstarsdata.h:92
KSPlanetBase::UNKNOWN_PLANET
Definition: ksplanetbase.h:82
ConjunctionsTool::~ConjunctionsTool
~ConjunctionsTool()
Definition: conjunctions.cpp:135
KStars::Instance
static KStars * Instance()
Definition: kstars.h:125
ConjunctionsTool::slotLocation
void slotLocation()
Definition: conjunctions.cpp:170
SkyObject::GALAXY
Definition: skyobject.h:109
KSPlanetBase::MERCURY
Definition: ksplanetbase.h:82
KStars
This is the main window for KStars.
Definition: kstars.h:94
SkyObject::COMET
Definition: skyobject.h:110
geolocation.h
dms.h
ksplanet.h
ConjunctionsTool::slotClear
void slotClear()
Definition: conjunctions.cpp:189
KSPlanetBase::createPlanet
static KSPlanetBase * createPlanet(int n)
Definition: ksplanetbase.cpp:73
kspluto.h
KSConjunct::findClosestApproach
QMap< long double, dms > findClosestApproach(SkyObject &Object1, KSPlanetBase &Object2, long double startJD, long double stopJD, dms maxSeparation, bool _opposition=false)
Compute the closest approach of two planets in the given range.
Definition: ksconjunct.cpp:40
ConjunctionsTool::slotCompute
void slotCompute()
Definition: conjunctions.cpp:225
skymapcomposite.h
KStarsData::changeDateTime
void changeDateTime(const KStarsDateTime &newDate)
change the current simulation date/time to the KStarsDateTime argument.
Definition: kstarsdata.cpp:272
locationdialog.h
KStarsDateTime::currentDateTime
static KStarsDateTime currentDateTime(KDateTime::Spec ts=KDateTime::Spec::ClockTime())
Definition: kstarsdatetime.cpp:67
KStarsDateTime::djd
long double djd() const
Definition: kstarsdatetime.h:145
KSPlanetBase::MARS
Definition: ksplanetbase.h:82
skymap.h
ConjunctionsTool::slotFilterType
void slotFilterType(int)
Definition: conjunctions.cpp:180
ConjunctionsTool::ConjunctionsTool
ConjunctionsTool(QWidget *p)
Definition: conjunctions.cpp:56
KStarsDateTime
Extension of KDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day...
Definition: kstarsdatetime.h:45
SkyObject::MOON
Definition: skyobject.h:110
ksnumbers.h
KStarsData::skyComposite
SkyMapComposite * skyComposite()
Definition: kstarsdata.h:146
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
QSortFilterProxyModel
KSConjunct
A class that implements a method to compute close conjunctions between any two solar system objects e...
Definition: ksconjunct.h:47
KSPlanetBase::SATURN
Definition: ksplanetbase.h:82
KSPlanetBase::PLUTO
Definition: ksplanetbase.h:82
SkyObject::clone
virtual SkyObject * clone() const
Create copy of object.
Definition: skyobject.cpp:76
kssun.h
finddialog.h
kscomet.h
SkyMap::setClickedPoint
void setClickedPoint(SkyPoint *f)
Set the ClickedPoint to the skypoint given as an argument.
Definition: skymap.cpp:829
KStarsDateTime::setDJD
void setDJD(long double jd)
Assign the (long double) Julian Day value, which includes the time of day encoded in the fractional p...
Definition: kstarsdatetime.cpp:99
NaN::ld
const long double ld
Definition: nan.h:37
ksmoon.h
SkyObject::PLANETARY_NEBULA
Definition: skyobject.h:109
SkyMap
This is the canvas on which the sky is painted.
Definition: skymap.h:72
SkyMapComposite::findByName
virtual SkyObject * findByName(const QString &name)
Search the children of this SkyMapComposite for a SkyObject whose name matches the argument...
Definition: skymapcomposite.cpp:426
SkyObject::ASTEROID
Definition: skyobject.h:110
ksasteroid.h
KSPlanetBase::SUN
Definition: ksplanetbase.h:82
kstarsdata.h
SkyObject::GASEOUS_NEBULA
Definition: skyobject.h:109
dmsbox.h
SkyMap::clickedObject
SkyObject * clickedObject() const
Retrieve the object nearest to a mouse click event.
Definition: skymap.h:214
SkyObject::name
virtual QString name(void) const
Definition: skyobject.h:124
SkyObject::GLOBULAR_CLUSTER
Definition: skyobject.h:108
KSPlanetBase::VENUS
Definition: ksplanetbase.h:82
SkyComponent::objectNames
QHash< int, QStringList > & objectNames()
Definition: skycomponent.h:127
SkyObject::STAR
Definition: skyobject.h:108
QFrame
SkyObject::CATALOG_STAR
Definition: skyobject.h:108
SkyObject::OPEN_CLUSTER
Definition: skyobject.h:108
KSPlanetBase::URANUS
Definition: ksplanetbase.h:82
kstars.h
ConjunctionsTool::slotExport
void slotExport()
Definition: conjunctions.cpp:196
QList
KStarsData::setLocation
void setLocation(const GeoLocation &l)
Set the GeoLocation according to the argument.
Definition: kstarsdata.cpp:323
ConjunctionsTool::showProgress
void showProgress(int)
Definition: conjunctions.cpp:367
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 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