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

kig

  • sources
  • kde-4.12
  • kdeedu
  • kig
  • kig
kig_commands.cpp
Go to the documentation of this file.
1 
21 #include "kig_commands.h"
22 
23 #include "kig_part.h"
24 #include "kig_document.h"
25 #include "kig_view.h"
26 
27 #include "../modes/mode.h"
28 #include "../objects/object_imp.h"
29 #include "../objects/object_drawer.h"
30 #include "../misc/calcpaths.h"
31 #include "../misc/coordinate_system.h"
32 
33 #include <vector>
34 #include <iterator>
35 
36 using std::vector;
37 using std::max;
38 using std::min;
39 
40 class KigCommand::Private
41 {
42 public:
43  Private( KigPart& d ) : doc( d ) {}
44  KigPart& doc;
45  vector<KigCommandTask*> tasks;
46 };
47 
48 KigCommand::KigCommand( KigPart& doc, const QString& name )
49  : QUndoCommand( name ), d( new Private( doc ) )
50 {
51 }
52 
53 KigCommand::~KigCommand()
54 {
55  for ( uint i = 0; i < d->tasks.size(); ++i )
56  delete d->tasks[i];
57  delete d;
58 }
59 
60 void KigCommand::redo()
61 {
62  for ( uint i = 0; i < d->tasks.size(); ++i )
63  d->tasks[i]->execute( d->doc );
64  d->doc.redrawScreen();
65 }
66 
67 void KigCommand::undo()
68 {
69  for ( uint i = 0; i < d->tasks.size(); ++i )
70  d->tasks[i]->unexecute( d->doc );
71  d->doc.redrawScreen();
72 }
73 
74 void KigCommand::addTask( KigCommandTask* t )
75 {
76  d->tasks.push_back( t );
77 }
78 
79 KigCommand* KigCommand::removeCommand( KigPart& doc, ObjectHolder* o )
80 {
81  std::vector<ObjectHolder*> os;
82  os.push_back( o );
83  return removeCommand( doc, os );
84 }
85 
86 KigCommand* KigCommand::addCommand( KigPart& doc, ObjectHolder* o )
87 {
88  std::vector<ObjectHolder*> os;
89  os.push_back( o );
90  return addCommand( doc, os );
91 }
92 
93 KigCommand* KigCommand::removeCommand( KigPart& doc, const std::vector<ObjectHolder*>& os )
94 {
95  assert( os.size() > 0 );
96  QString text;
97  if ( os.size() == 1 )
98  text = os.back()->imp()->type()->removeAStatement();
99  else
100  text = i18np( "Remove %1 Object", "Remove %1 Objects", os.size() );
101  KigCommand* ret = new KigCommand( doc, text );
102  ret->addTask( new RemoveObjectsTask( os ) );
103  return ret;
104 }
105 
106 KigCommand* KigCommand::addCommand( KigPart& doc, const std::vector<ObjectHolder*>& os )
107 {
108  QString text;
109  if ( os.size() == 1 )
110  text = os.back()->imp()->type()->addAStatement();
111  else
112  text = i18np( "Add %1 Object", "Add %1 Objects", os.size() );
113  KigCommand* ret = new KigCommand( doc, text );
114  ret->addTask( new AddObjectsTask( os ) );
115  return ret;
116 }
117 
118 KigCommand* KigCommand::changeCoordSystemCommand( KigPart& doc, CoordinateSystem* s )
119 {
120  QString text = CoordinateSystemFactory::setCoordinateSystemStatement( s->id() );
121  KigCommand* ret = new KigCommand( doc, text );
122  ret->addTask( new ChangeCoordSystemTask( s ) );
123  return ret;
124 }
125 
126 KigCommandTask::KigCommandTask()
127 {
128 }
129 
130 KigCommandTask::~KigCommandTask()
131 {
132 }
133 
134 AddObjectsTask::AddObjectsTask( const std::vector<ObjectHolder*>& os)
135  : KigCommandTask(), undone( true ), mobjs( os )
136 {
137 }
138 
139 void AddObjectsTask::execute( KigPart& doc )
140 {
141  doc._addObjects( mobjs );
142  undone = false;
143 }
144 
145 void AddObjectsTask::unexecute( KigPart& doc )
146 {
147  doc._delObjects( mobjs );
148  undone = true;
149 }
150 
151 AddObjectsTask::~AddObjectsTask()
152 {
153  if ( undone )
154  for ( std::vector<ObjectHolder*>::iterator i = mobjs.begin();
155  i != mobjs.end(); ++i )
156  delete *i;
157 }
158 
159 RemoveObjectsTask::RemoveObjectsTask( const std::vector<ObjectHolder*>& os )
160  : AddObjectsTask( os )
161 {
162  undone = false;
163 }
164 
165 void RemoveObjectsTask::execute( KigPart& doc )
166 {
167  AddObjectsTask::unexecute( doc );
168 }
169 
170 void RemoveObjectsTask::unexecute( KigPart& doc )
171 {
172  AddObjectsTask::execute( doc );
173 }
174 
175 ChangeObjectConstCalcerTask::ChangeObjectConstCalcerTask( ObjectConstCalcer* calcer, ObjectImp* newimp )
176  : KigCommandTask(), mcalcer( calcer ), mnewimp( newimp )
177 {
178 }
179 
180 void ChangeObjectConstCalcerTask::execute( KigPart& doc )
181 {
182  mnewimp = mcalcer->switchImp( mnewimp );
183 
184  std::set<ObjectCalcer*> allchildren = getAllChildren( mcalcer.get() );
185  std::vector<ObjectCalcer*> allchildrenvect( allchildren.begin(), allchildren.end() );
186  allchildrenvect = calcPath( allchildrenvect );
187  for ( std::vector<ObjectCalcer*>::iterator i = allchildrenvect.begin();
188  i != allchildrenvect.end(); ++i )
189  ( *i )->calc( doc.document() );
190 }
191 
192 void ChangeObjectConstCalcerTask::unexecute( KigPart& doc )
193 {
194  execute( doc );
195 }
196 
197 struct MoveDataStruct
198 {
199  ObjectConstCalcer* o;
200  ObjectImp* oldimp;
201  MoveDataStruct( ObjectConstCalcer* io, ObjectImp* oi )
202  : o( io ), oldimp( oi ) { }
203 };
204 
205 class MonitorDataObjects::Private
206 {
207 public:
208  vector<MoveDataStruct> movedata;
209 };
210 
211 MonitorDataObjects::MonitorDataObjects( const std::vector<ObjectCalcer*>& objs )
212  : d( new Private )
213 {
214  monitor( objs );
215 }
216 
217 void MonitorDataObjects::monitor( const std::vector<ObjectCalcer*>& objs )
218 {
219  for ( std::vector<ObjectCalcer*>::const_iterator i = objs.begin(); i != objs.end(); ++i )
220  if ( dynamic_cast<ObjectConstCalcer*>( *i ) )
221  {
222  MoveDataStruct n( static_cast<ObjectConstCalcer*>( *i ), (*i)->imp()->copy() );
223  d->movedata.push_back( n );
224  };
225 }
226 
227 void MonitorDataObjects::finish( KigCommand* comm )
228 {
229  for ( uint i = 0; i < d->movedata.size(); ++i )
230  {
231  ObjectConstCalcer* o = d->movedata[i].o;
232  if ( ! d->movedata[i].oldimp->equals( *o->imp() ) )
233  {
234  ObjectImp* newimp = o->switchImp( d->movedata[i].oldimp );
235  comm->addTask( new ChangeObjectConstCalcerTask( o, newimp ) );
236  }
237  else
238  delete d->movedata[i].oldimp;
239  };
240  d->movedata.clear();
241 }
242 
243 MonitorDataObjects::~MonitorDataObjects()
244 {
245  assert( d->movedata.empty() );
246  delete d;
247 }
248 
249 ChangeCoordSystemTask::ChangeCoordSystemTask( CoordinateSystem* s )
250  : KigCommandTask(), mcs( s )
251 {
252 }
253 
254 void ChangeCoordSystemTask::execute( KigPart& doc )
255 {
256  mcs = doc.document().switchCoordinateSystem( mcs );
257  std::vector<ObjectCalcer*> calcpath = calcPath( getAllCalcers( doc.document().objects() ) );
258  for ( std::vector<ObjectCalcer*>::iterator i = calcpath.begin(); i != calcpath.end(); ++i )
259  ( *i )->calc( doc.document() );
260  doc.coordSystemChanged( doc.document().coordinateSystem().id() );
261 }
262 
263 void ChangeCoordSystemTask::unexecute( KigPart& doc )
264 {
265  execute( doc );
266 }
267 
268 ChangeCoordSystemTask::~ChangeCoordSystemTask()
269 {
270  delete mcs;
271 }
272 
273 class ChangeParentsAndTypeTask::Private
274 {
275 public:
276  ObjectTypeCalcer* o;
277  std::vector<ObjectCalcer::shared_ptr> newparents;
278  const ObjectType* newtype;
279 };
280 
281 ChangeParentsAndTypeTask::~ChangeParentsAndTypeTask()
282 {
283  delete d;
284 }
285 
286 ChangeParentsAndTypeTask::ChangeParentsAndTypeTask(
287  ObjectTypeCalcer* o, const std::vector<ObjectCalcer*>& newparents,
288  const ObjectType* newtype )
289  : KigCommandTask(), d( new Private )
290 {
291  d->o = o;
292  std::copy( newparents.begin(), newparents.end(),
293  std::back_inserter( d->newparents ) );
294  d->newtype = newtype;
295 }
296 
297 void ChangeParentsAndTypeTask::execute( KigPart& doc )
298 {
299  const ObjectType* oldtype = d->o->type();
300  d->o->setType( d->newtype );
301  d->newtype = oldtype;
302 
303  std::vector<ObjectCalcer*> oldparentso = d->o->parents();
304  std::vector<ObjectCalcer::shared_ptr> oldparents(
305  oldparentso.begin(), oldparentso.end() );
306  std::vector<ObjectCalcer*> newparents;
307  for ( std::vector<ObjectCalcer::shared_ptr>::iterator i = d->newparents.begin();
308  i != d->newparents.end(); ++i )
309  newparents.push_back( i->get() );
310  d->o->setParents( newparents );
311  d->newparents = oldparents;
312 
313  for ( std::vector<ObjectCalcer*>::iterator i = newparents.begin(); i != newparents.end(); ++i )
314  ( *i )->calc( doc.document() );
315  d->o->calc( doc.document() );
316  std::set<ObjectCalcer*> allchildren = getAllChildren( d->o );
317  std::vector<ObjectCalcer*> allchildrenvect( allchildren.begin(), allchildren.end() );
318  allchildrenvect = calcPath( allchildrenvect );
319  for ( std::vector<ObjectCalcer*>::iterator i = allchildrenvect.begin();
320  i != allchildrenvect.end(); ++i )
321  ( *i )->calc( doc.document() );
322 }
323 
324 void ChangeParentsAndTypeTask::unexecute( KigPart& doc )
325 {
326  execute( doc );
327 }
328 
329 class KigViewShownRectChangeTask::Private
330 {
331 public:
332  Private( KigWidget& view, const Rect& r ) : v( view ), rect( r ) { }
333  KigWidget& v;
334  Rect rect;
335 };
336 
337 KigViewShownRectChangeTask::KigViewShownRectChangeTask(
338  KigWidget& v, const Rect& newrect )
339  : KigCommandTask()
340 {
341  d = new Private( v, newrect );
342 }
343 
344 KigViewShownRectChangeTask::~KigViewShownRectChangeTask()
345 {
346  delete d;
347 }
348 
349 void KigViewShownRectChangeTask::execute( KigPart& doc )
350 {
351  Rect oldrect = d->v.showingRect();
352  d->v.setShowingRect( d->rect );
353  doc.mode()->redrawScreen( &d->v );
354  d->v.updateScrollBars();
355  d->rect = oldrect;
356 }
357 
358 void KigViewShownRectChangeTask::unexecute( KigPart& doc )
359 {
360  execute( doc );
361 }
362 
363 ChangeObjectDrawerTask::~ChangeObjectDrawerTask()
364 {
365  delete mnewdrawer;
366 }
367 
368 ChangeObjectDrawerTask::ChangeObjectDrawerTask(
369  ObjectHolder* holder, ObjectDrawer* newdrawer )
370  : KigCommandTask(), mholder( holder ), mnewdrawer( newdrawer )
371 {
372 }
373 
374 void ChangeObjectDrawerTask::execute( KigPart& )
375 {
376  mnewdrawer = mholder->switchDrawer( mnewdrawer );
377 }
378 
379 void ChangeObjectDrawerTask::unexecute( KigPart& doc )
380 {
381  execute( doc );
382 }
383 
384 MonitorDataObjects::MonitorDataObjects( ObjectCalcer* c )
385  : d( new Private )
386 {
387  if ( dynamic_cast<ObjectConstCalcer*>( c ) )
388  {
389  MoveDataStruct n( static_cast<ObjectConstCalcer*>( c ), c->imp()->copy() );
390  d->movedata.push_back( n );
391  };
392 }
393 
394 ChangeObjectConstCalcerTask::~ChangeObjectConstCalcerTask()
395 {
396  delete mnewimp;
397 }
398 
ObjectConstCalcer::switchImp
ObjectImp * switchImp(ObjectImp *newimp)
Set the ObjectImp of this ObjectConstCalcer to the given newimp.
Definition: object_calcer.cc:202
ChangeObjectDrawerTask::unexecute
void unexecute(KigPart &doc)
Definition: kig_commands.cpp:379
CoordinateSystem
a CoordinateSystem is what the user sees: it is kept by KigPart to show the user a grid...
Definition: coordinate_system.h:60
ObjectConstCalcer::imp
const ObjectImp * imp() const
Returns the ObjectImp of this ObjectCalcer.
Definition: object_calcer.cc:65
KigCommand::undo
void undo()
Definition: kig_commands.cpp:67
kig_view.h
AddObjectsTask::undone
bool undone
Definition: kig_commands.h:110
KigPart::mode
KigMode * mode() const
Definition: kig_part.h:143
ChangeObjectDrawerTask::~ChangeObjectDrawerTask
~ChangeObjectDrawerTask()
Definition: kig_commands.cpp:363
KigCommand::KigCommand
KigCommand(KigPart &inDoc, const QString &name)
Definition: kig_commands.cpp:48
ChangeParentsAndTypeTask::unexecute
void unexecute(KigPart &doc)
Definition: kig_commands.cpp:324
KigCommand::~KigCommand
~KigCommand()
Definition: kig_commands.cpp:53
KigCommand
a KigCommand represents almost every action performed in Kig.
Definition: kig_commands.h:44
ObjectConstCalcer
This is an ObjectCalcer that keeps an ObjectImp, and never calculates a new one.
Definition: object_calcer.h:232
RemoveObjectsTask::unexecute
void unexecute(KigPart &)
Definition: kig_commands.cpp:170
KigCommandTask::KigCommandTask
KigCommandTask()
Definition: kig_commands.cpp:126
RemoveObjectsTask
Definition: kig_commands.h:115
RemoveObjectsTask::RemoveObjectsTask
RemoveObjectsTask(const std::vector< ObjectHolder * > &os)
Definition: kig_commands.cpp:159
KigCommand::removeCommand
static KigCommand * removeCommand(KigPart &doc, const std::vector< ObjectHolder * > &os)
make sure that when you delete something, you are also deleting its parents.
Definition: kig_commands.cpp:93
KigViewShownRectChangeTask::execute
void execute(KigPart &doc)
Definition: kig_commands.cpp:349
KigCommand::addTask
void addTask(KigCommandTask *)
Definition: kig_commands.cpp:74
Rect
This file is part of Kig, a KDE program for Interactive Geometry...
Definition: rect.h:34
KigPart::document
const KigDocument & document() const
Definition: kig_part.cpp:989
ChangeObjectConstCalcerTask
Definition: kig_commands.h:124
getAllCalcers
std::vector< ObjectCalcer * > getAllCalcers(const std::vector< ObjectHolder * > &os)
get the calcers that the holders represent and their namecalcers
Definition: common.cc:21
KigMode::redrawScreen
virtual void redrawScreen(KigWidget *w)
Redraw the document on KigWidget w .
Definition: mode.cc:119
kig_part.h
ChangeParentsAndTypeTask::execute
void execute(KigPart &doc)
Definition: kig_commands.cpp:297
KigCommandTask
This represents a single task to be executed in a KigCommand.
Definition: kig_commands.h:91
ChangeObjectConstCalcerTask::mnewimp
ObjectImp * mnewimp
Definition: kig_commands.h:135
ObjectTypeCalcer
This is an ObjectCalcer that uses one of the various ObjectType's to calculate its ObjectImp...
Definition: object_calcer.h:183
ChangeCoordSystemTask::~ChangeCoordSystemTask
~ChangeCoordSystemTask()
Definition: kig_commands.cpp:268
CoordinateSystemFactory::setCoordinateSystemStatement
static QString setCoordinateSystemStatement(int id)
Definition: coordinate_system.cpp:576
AddObjectsTask::mobjs
std::vector< ObjectHolder * > mobjs
Definition: kig_commands.h:112
MonitorDataObjects::monitor
void monitor(const std::vector< ObjectCalcer * > &objs)
add objs to the list of objs to be watched, and save their current imp's.
Definition: kig_commands.cpp:217
ChangeObjectConstCalcerTask::~ChangeObjectConstCalcerTask
~ChangeObjectConstCalcerTask()
Definition: kig_commands.cpp:394
ChangeObjectConstCalcerTask::unexecute
void unexecute(KigPart &)
Definition: kig_commands.cpp:192
calcPath
std::vector< ObjectCalcer * > calcPath(const std::vector< ObjectCalcer * > &os)
This function sorts os such that they're in the right order for calc()-ing.
Definition: calcpaths.cc:48
MonitorDataObjects::MonitorDataObjects
MonitorDataObjects(const std::vector< ObjectCalcer * > &objs)
all the DataObjects in objs will be watched.
Definition: kig_commands.cpp:211
KigViewShownRectChangeTask::unexecute
void unexecute(KigPart &doc)
Definition: kig_commands.cpp:358
ObjectHolder
An ObjectHolder represents an object as it is known to the document.
Definition: object_holder.h:40
ChangeCoordSystemTask::unexecute
void unexecute(KigPart &doc)
Definition: kig_commands.cpp:263
ObjectCalcer
An ObjectCalcer is an object that represents an algorithm for calculating an ObjectImp from other Obj...
Definition: object_calcer.h:66
AddObjectsTask::unexecute
void unexecute(KigPart &doc)
Definition: kig_commands.cpp:145
ChangeParentsAndTypeTask::~ChangeParentsAndTypeTask
~ChangeParentsAndTypeTask()
Definition: kig_commands.cpp:281
KigWidget
This class is the real widget showing the document.
Definition: kig_view.h:50
KigCommand::changeCoordSystemCommand
static KigCommand * changeCoordSystemCommand(KigPart &doc, CoordinateSystem *s)
This creates directly a command to change the coordinate system to s .
Definition: kig_commands.cpp:118
KigDocument::objects
const std::vector< ObjectHolder * > objects() const
Get a hold of the objects of this KigDocument.
Definition: kig_document.cc:46
AddObjectsTask::execute
void execute(KigPart &doc)
Definition: kig_commands.cpp:139
MonitorDataObjects::~MonitorDataObjects
~MonitorDataObjects()
Definition: kig_commands.cpp:243
MonitorDataObjects::finish
void finish(KigCommand *comm)
add the generated KigCommandTasks to the command comm .
Definition: kig_commands.cpp:227
ChangeCoordSystemTask::execute
void execute(KigPart &doc)
Definition: kig_commands.cpp:254
kig_document.h
kig_commands.h
ObjectType
The ObjectType class is a thing that represents the "behaviour" for a certain type.
Definition: object_type.h:32
RemoveObjectsTask::execute
void execute(KigPart &)
Definition: kig_commands.cpp:165
ChangeCoordSystemTask
A task to change the coordinate system.
Definition: kig_commands.h:181
ObjectDrawer
A class holding some information about how a certain object is drawn on the window.
Definition: object_drawer.h:47
ChangeObjectConstCalcerTask::ChangeObjectConstCalcerTask
ChangeObjectConstCalcerTask(ObjectConstCalcer *calcer, ObjectImp *newimp)
Definition: kig_commands.cpp:175
KigCommandTask::~KigCommandTask
virtual ~KigCommandTask()
Definition: kig_commands.cpp:130
AddObjectsTask::AddObjectsTask
AddObjectsTask(const std::vector< ObjectHolder * > &os)
Definition: kig_commands.cpp:134
ChangeObjectConstCalcerTask::execute
void execute(KigPart &)
Definition: kig_commands.cpp:180
KigPart::coordSystemChanged
void coordSystemChanged(int)
Definition: kig_part.cpp:1081
KigPart::_addObjects
void _addObjects(const std::vector< ObjectHolder * > &o)
Definition: kig_part.cpp:547
KigCommand::addCommand
static KigCommand * addCommand(KigPart &doc, const std::vector< ObjectHolder * > &os)
To avoid confusion, this doesn't add a command to anything, this creates an AddCommand ;) ...
Definition: kig_commands.cpp:106
ObjectHolder::switchDrawer
ObjectDrawer * switchDrawer(ObjectDrawer *d)
Set the ObjectDrawer of this ObjectHolder to d , the old ObjectDrawer is not deleted, but returned.
Definition: object_holder.cc:128
KigViewShownRectChangeTask::~KigViewShownRectChangeTask
~KigViewShownRectChangeTask()
Definition: kig_commands.cpp:344
KigCommand::redo
void redo()
Definition: kig_commands.cpp:60
KigViewShownRectChangeTask::KigViewShownRectChangeTask
KigViewShownRectChangeTask(KigWidget &v, const Rect &newrect)
Definition: kig_commands.cpp:337
ChangeParentsAndTypeTask::ChangeParentsAndTypeTask
ChangeParentsAndTypeTask(ObjectTypeCalcer *o, const std::vector< ObjectCalcer * > &newparents, const ObjectType *newtype)
Definition: kig_commands.cpp:286
AddObjectsTask
Definition: kig_commands.h:101
KigDocument::switchCoordinateSystem
CoordinateSystem * switchCoordinateSystem(CoordinateSystem *s)
sets the coordinate system to s , and returns the old one.
Definition: kig_document.cc:61
ChangeObjectDrawerTask::ChangeObjectDrawerTask
ChangeObjectDrawerTask(ObjectHolder *holder, ObjectDrawer *newdrawer)
Definition: kig_commands.cpp:368
ObjectImp::copy
virtual ObjectImp * copy() const =0
Returns a copy of this ObjectImp.
ObjectCalcer::imp
virtual const ObjectImp * imp() const =0
Returns the ObjectImp of this ObjectCalcer.
ChangeCoordSystemTask::ChangeCoordSystemTask
ChangeCoordSystemTask(CoordinateSystem *s)
a command that changes the coordinate-system to s .
Definition: kig_commands.cpp:249
ChangeObjectConstCalcerTask::mcalcer
ObjectConstCalcer::shared_ptr mcalcer
Definition: kig_commands.h:134
ObjectImp
The ObjectImp class represents the behaviour of an object after it is calculated. ...
Definition: object_imp.h:226
KigPart
This is a "Part".
Definition: kig_part.h:68
myboost::intrusive_ptr::get
T * get() const
Definition: boost_intrusive_pointer.hpp:122
KigDocument::coordinateSystem
const CoordinateSystem & coordinateSystem() const
Definition: kig_document.cc:40
CoordinateSystem::id
virtual int id() const =0
getAllChildren
std::set< ObjectCalcer * > getAllChildren(ObjectCalcer *obj)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: calcpaths.cc:281
QUndoCommand
uint
unsigned int uint
Definition: object_imp.h:87
ChangeObjectDrawerTask::execute
void execute(KigPart &doc)
Definition: kig_commands.cpp:374
KigPart::_delObjects
void _delObjects(const std::vector< ObjectHolder * > &o)
Definition: kig_part.cpp:528
AddObjectsTask::~AddObjectsTask
~AddObjectsTask()
Definition: kig_commands.cpp:151
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:35:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kig

Skip menu "kig"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

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