• 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
  • scripting
script_mode.cc
Go to the documentation of this file.
1 // Copyright (C) 2003 Dominique Devriese <devriese@kde.org>
2 
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
7 
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 // 02110-1301, USA.
17 
18 #include "script_mode.h"
19 
20 #include <iterator>
21 
22 #include "newscriptwizard.h"
23 #include "python_type.h"
24 #include "python_scripter.h"
25 
26 #include "../kig/kig_commands.h"
27 #include "../kig/kig_part.h"
28 #include "../kig/kig_view.h"
29 #include "../misc/calcpaths.h"
30 #include "../misc/kigpainter.h"
31 #include "../modes/dragrectmode.h"
32 #include "../objects/bogus_imp.h"
33 #include "../objects/object_imp.h"
34 #include "../objects/object_factory.h"
35 
36 #include <qbytearray.h>
37 #include <qlabel.h>
38 #include <qpushbutton.h>
39 
40 #include <kcursor.h>
41 #include <kdialog.h>
42 #include <kicon.h>
43 #include <kmessagebox.h>
44 
45 void ScriptModeBase::dragRect( const QPoint& p, KigWidget& w )
46 {
47  if ( mwawd != SelectingArgs ) return;
48 
49  DragRectMode dm( p, mdoc, w );
50  mdoc.runMode( &dm );
51  std::vector<ObjectHolder*> ret = dm.ret();
52 
53  KigPainter pter( w.screenInfo(), &w.stillPix, mdoc.document() );
54  if ( dm.needClear() )
55  {
56  std::vector<ObjectHolder*> tmp( margs.begin(), margs.begin() );
57  pter.drawObjects( tmp, false );
58  margs.clear();
59  }
60 
61  std::copy( ret.begin(), ret.end(), std::inserter( margs, margs.begin() ) );
62  pter.drawObjects( ret, true );
63 
64  w.updateCurPix( pter.overlay() );
65  w.updateWidget();
66 }
67 
68 void ScriptModeBase::leftClickedObject( ObjectHolder* o, const QPoint&,
69  KigWidget& w, bool )
70 {
71  std::list<ObjectHolder*>::iterator dup_o;
72 
73  if ( mwawd != SelectingArgs ) return;
74 
75  KigPainter pter( w.screenInfo(), &w.stillPix, mdoc.document() );
76 
77  if ( (dup_o = std::find( margs.begin(), margs.end(), o )) != margs.end() )
78  {
79  margs.erase( dup_o );
80  pter.drawObject( o, false );
81  }
82  else
83  {
84  margs.push_back( o );
85  pter.drawObject( o, true );
86  };
87  w.updateCurPix( pter.overlay() );
88  w.updateWidget();
89 }
90 
91 void ScriptModeBase::mouseMoved( const std::vector<ObjectHolder*>& os,
92  const QPoint& pt, KigWidget& w, bool )
93 {
94  if ( mwawd != SelectingArgs ) return;
95 
96  w.updateCurPix();
97  if ( os.empty() )
98  {
99  w.setCursor( Qt::ArrowCursor );
100  mdoc.emitStatusBarText( 0 );
101  w.updateWidget();
102  }
103  else
104  {
105  // the cursor is over an object, show object type next to cursor
106  // and set statusbar text
107 
108  w.setCursor( Qt::PointingHandCursor );
109  QString selectstat = os.front()->selectStatement();
110 
111  // statusbar text
112  mdoc.emitStatusBarText( selectstat );
113  KigPainter p( w.screenInfo(), &w.curPix, mdoc.document() );
114 
115  // set the text next to the arrow cursor
116  QPoint point = pt;
117  point.setX(point.x()+15);
118 
119  p.drawTextStd( point, selectstat );
120  w.updateWidget( p.overlay() );
121  }
122 }
123 
124 ScriptModeBase::ScriptModeBase( KigPart& doc )
125  : BaseMode( doc ), mwizard( 0 ), mpart( doc ),
126  mwawd( SelectingArgs )
127 {
128  mwizard = new NewScriptWizard( doc.widget(), this, doc.iconLoader() );
129 
130  doc.redrawScreen();
131 }
132 
133 ScriptModeBase::~ScriptModeBase()
134 {
135 }
136 
137 void ScriptModeBase::killMode()
138 {
139  mdoc.doneMode( this );
140 }
141 
142 bool ScriptCreationMode::queryCancel()
143 {
144  killMode();
145  return true;
146 }
147 
148 void ScriptModeBase::argsPageEntered()
149 {
150  mwawd = SelectingArgs;
151  mdoc.redrawScreen();
152 }
153 
154 void ScriptModeBase::enableActions()
155 {
156  KigMode::enableActions();
157  // we don't enable any actions..
158 }
159 
160 void ScriptModeBase::codePageEntered()
161 {
162  if ( mwizard->text().isEmpty() )
163  {
164  // insert template code..
165  QString tempcode = ScriptType::templateCode( mtype, margs );
166  mwizard->setText( tempcode );
167  };
168  mwawd = EnteringCode;
169  mdoc.redrawScreen();
170 }
171 
172 void ScriptModeBase::redrawScreen( KigWidget* w )
173 {
174  std::vector<ObjectHolder*> sel;
175  if ( mwawd == SelectingArgs )
176  sel = std::vector<ObjectHolder*>( margs.begin(), margs.end() );
177  w->redrawScreen( sel );
178  w->updateScrollBars();
179 }
180 
181 bool ScriptCreationMode::queryFinish()
182 {
183  std::vector<ObjectCalcer*> args;
184 
185  QString script = mwizard->text();
186  args.push_back( new ObjectConstCalcer( new StringImp( script ) ) );
187 
188  ObjectTypeCalcer* compiledscript =
189  new ObjectTypeCalcer( PythonCompileType::instance(), args );
190  compiledscript->calc( mdoc.document() );
191 
192  args.clear();
193  args.push_back( compiledscript );
194  for ( std::list<ObjectHolder*>::iterator i = margs.begin();
195  i != margs.end(); ++i )
196  args.push_back( ( *i )->calcer() );
197 
198  ObjectTypeCalcer::shared_ptr reto =
199  new ObjectTypeCalcer( PythonExecuteType::instance(), args );
200  reto->calc( mdoc.document() );
201 
202  if ( reto->imp()->inherits( InvalidImp::stype() ) )
203  {
204  PythonScripter* inst = PythonScripter::instance();
205  QByteArray errtrace = inst->lastErrorExceptionTraceback().c_str();
206  if ( inst->errorOccurred() )
207  {
208  KMessageBox::detailedSorry(
209  mwizard, i18n( "The Python interpreter caught an error during the execution of your "
210  "script. Please fix the script and click the Finish button again." ),
211  i18n( "The Python Interpreter generated the following error output:\n%1", QString( errtrace ) ) );
212  }
213  else
214  {
215  KMessageBox::sorry(
216  mwizard, i18n( "There seems to be an error in your script. The Python interpreter "
217  "reported no errors, but the script does not generate "
218  "a valid object. Please fix the script, and click the Finish button "
219  "again." ) );
220  }
221  return false;
222  }
223  else
224  {
225  if ( reto->imp()->inherits( DoubleImp::stype() ) ||
226  reto->imp()->inherits( IntImp::stype() ) )
227  {
228  /*
229  * if the python script returns a DoubleImp (IntImp) we need a way to let the user
230  * interact with the result. We do this by adding a text label (located at
231  * the origin) that contains the DoubleImp (IntImp) value.
232  */
233  QString s = QString("%1");
234  Coordinate coord = Coordinate( 0., 0. );
235  bool needframe = false;
236  std::vector<ObjectCalcer*> args;
237  args.push_back( reto.get() );
238  ObjectHolder* label = 0;
239  label = ObjectFactory::instance()->label( s, coord, needframe, args, mdoc.document() );
240  mdoc.addObject( label );
241  } else if ( reto->imp()->inherits( StringImp::stype() ) )
242  {
243  /*
244  * if the python script returns a StringImp we need a way to let the user
245  * interact with the result, see above.
246  */
247  QString s = QString("%1");
248  Coordinate coord = Coordinate( 0., 0. );
249  bool needframe = false;
250  std::vector<ObjectCalcer*> args;
251  args.push_back( reto.get() );
252  ObjectHolder* label = 0;
253  label = ObjectFactory::instance()->label( s, coord, needframe, args, mdoc.document() );
254  mdoc.addObject( label );
255  } else mdoc.addObject( new ObjectHolder( reto.get() ) );
256  killMode();
257  return true;
258  }
259 }
260 
261 void ScriptModeBase::midClicked( const QPoint&, KigWidget& )
262 {
263 }
264 
265 void ScriptModeBase::rightClicked( const std::vector<ObjectHolder*>&,
266  const QPoint&, KigWidget& )
267 {
268 }
269 
270 void ScriptModeBase::setScriptType( ScriptType::Type type )
271 {
272  mtype = type;
273  mwizard->setType( mtype );
274 }
275 
276 void ScriptModeBase::addArgs( const std::vector<ObjectHolder*>& obj, KigWidget& w )
277 {
278  KigPainter pter( w.screenInfo(), &w.stillPix, mdoc.document() );
279 
280  std::copy( obj.begin(), obj.end(), std::inserter( margs, margs.begin() ) );
281  pter.drawObjects( obj, true );
282 
283  w.updateCurPix( pter.overlay() );
284  w.updateWidget();
285 }
286 
287 void ScriptModeBase::goToCodePage()
288 {
289  mwizard->next();
290 }
291 
292 ScriptCreationMode::ScriptCreationMode( KigPart& doc )
293  : ScriptModeBase( doc )
294 {
295  mwizard->show();
296 }
297 
298 ScriptCreationMode::~ScriptCreationMode()
299 {
300 }
301 
302 ScriptEditMode::ScriptEditMode( ObjectTypeCalcer* exec_calc, KigPart& doc )
303  : ScriptModeBase( doc ), mexecuted( exec_calc )
304 {
305  mwawd = EnteringCode;
306 
307  mexecargs = mexecuted->parents();
308  assert( mexecargs.size() >= 1 );
309 
310  mcompiledargs = mexecargs[0]->parents();
311  assert( mcompiledargs.size() == 1 );
312 
313  const ObjectImp* imp = static_cast<ObjectConstCalcer*>( mcompiledargs[0] )->imp();
314  assert( dynamic_cast<const StringImp*>( imp ) );
315  // save the original script text, in case the user modifies the text
316  // in the editor and aborts the editing
317  morigscript = static_cast<const StringImp*>( imp )->data();
318 
319  mwizard->setWindowTitle( KDialog::makeStandardCaption( i18nc( "'Edit' is a verb", "Edit Script" ) ) );
320  mwizard->setText( morigscript );
321  mwizard->show();
322  mwizard->next();
323  mwizard->button( QWizard::BackButton )->setEnabled( false );
324 }
325 
326 ScriptEditMode::~ScriptEditMode()
327 {
328 }
329 
330 bool ScriptEditMode::queryFinish()
331 {
332  MonitorDataObjects mon( mcompiledargs );
333 
334  static_cast<ObjectConstCalcer*>( mcompiledargs[0] )->switchImp( new StringImp( mwizard->text() ) );
335  mexecargs[0]->calc( mpart.document() );
336 
337  mexecuted->calc( mpart.document() );
338 
339  mpart.redrawScreen();
340 
341  KigCommand* comm = new KigCommand( mpart, i18n( "Edit Python Script" ) );
342  mon.finish( comm );
343 
344  if ( mexecuted->imp()->inherits( InvalidImp::stype() ) )
345  {
346  PythonScripter* inst = PythonScripter::instance();
347  QByteArray errtrace = inst->lastErrorExceptionTraceback().c_str();
348  if ( inst->errorOccurred() )
349  {
350  KMessageBox::detailedSorry(
351  mwizard, i18n( "The Python interpreter caught an error during the execution of your "
352  "script. Please fix the script." ),
353  i18n( "The Python Interpreter generated the following error output:\n%1", QString( errtrace ) ) );
354  }
355  else
356  {
357  KMessageBox::sorry(
358  mwizard, i18n( "There seems to be an error in your script. The Python interpreter "
359  "reported no errors, but the script does not generate "
360  "a valid object. Please fix the script." ) );
361  }
362  delete comm;
363  return false;
364  }
365 
366  mpart.history()->push( comm );
367  mpart.setModified( true );
368 
369  killMode();
370  return true;
371 }
372 
373 bool ScriptEditMode::queryCancel()
374 {
375  // reverting the original script text
376  static_cast<ObjectConstCalcer*>( mcompiledargs[0] )->switchImp( new StringImp( morigscript ) );
377  mexecargs[0]->calc( mpart.document() );
378 
379  mexecuted->calc( mpart.document() );
380  // paranoic check
381  assert( !mexecuted->imp()->inherits( InvalidImp::stype() ) );
382 
383  mpart.redrawScreen();
384 
385  // no need to further checks here, as the original script text is ok
386 
387  killMode();
388  return true;
389 }
390 
ObjectFactory::instance
static const ObjectFactory * instance()
Definition: object_factory.cc:90
ScriptCreationMode::queryFinish
virtual bool queryFinish()
Definition: script_mode.cc:181
PythonScripter::errorOccurred
bool errorOccurred() const
Definition: python_scripter.cc:607
ObjectImp::inherits
bool inherits(const ObjectImpType *t) const
Returns true if this ObjectImp inherits the ObjectImp type represented by t.
Definition: object_imp.cc:279
NewScriptWizard::text
QString text() const
Definition: newscriptwizard.cc:183
ScriptCreationMode::queryCancel
virtual bool queryCancel()
Definition: script_mode.cc:142
ScriptModeBase
Base mode to interact with a script.
Definition: script_mode.h:32
ScriptEditMode::queryFinish
virtual bool queryFinish()
Definition: script_mode.cc:330
StringImp
This ObjectImp is a BogusImp containing only a string value.
Definition: bogus_imp.h:167
KigCommand
a KigCommand represents almost every action performed in Kig.
Definition: kig_commands.h:44
ScriptModeBase::mwizard
NewScriptWizard * mwizard
Definition: script_mode.h:42
ObjectConstCalcer
This is an ObjectCalcer that keeps an ObjectImp, and never calculates a new one.
Definition: object_calcer.h:232
newscriptwizard.h
NewScriptWizard
Definition: newscriptwizard.h:35
PythonExecuteType::instance
static const PythonExecuteType * instance()
Definition: python_type.cc:138
DragRectMode::needClear
bool needClear() const
this returns false if the control or shift button were pressed when the mouse button was released...
Definition: dragrectmode.cc:82
ScriptModeBase::midClicked
void midClicked(const QPoint &, KigWidget &)
Definition: script_mode.cc:261
KigPart::document
const KigDocument & document() const
Definition: kig_part.cpp:989
DoubleImp::stype
static const ObjectImpType * stype()
Returns the ObjectImpType representing the DoubleImp type.
Definition: bogus_imp.cc:270
KigPart::history
QUndoStack * history()
Definition: kig_part.cpp:633
KigPart::emitStatusBarText
void emitStatusBarText(const QString &text)
Definition: kig_part.cpp:695
ScriptModeBase::~ScriptModeBase
virtual ~ScriptModeBase()
Definition: script_mode.cc:133
ScriptType::Type
Type
This enum represents all the script language types actually in Kig.
Definition: script-common.h:36
PythonScripter::instance
static PythonScripter * instance()
Definition: python_scripter.cc:364
KigMode::enableActions
virtual void enableActions()
actions: we enable the actions we want when our mode is made active.
Definition: mode.cc:27
ScriptModeBase::redrawScreen
void redrawScreen(KigWidget *w)
Redraw the document on KigWidget w .
Definition: script_mode.cc:172
IntImp::stype
static const ObjectImpType * stype()
Returns the ObjectImpType representing the IntImp type.
Definition: bogus_imp.cc:278
ScriptModeBase::dragRect
void dragRect(const QPoint &p, KigWidget &w)
Definition: script_mode.cc:45
BaseMode
The BaseMode is a particular mode that allows an easy mapping of the mouse actions to real...
Definition: base_mode.h:33
ObjectTypeCalcer
This is an ObjectCalcer that uses one of the various ObjectType's to calculate its ObjectImp...
Definition: object_calcer.h:183
ScriptModeBase::setScriptType
void setScriptType(ScriptType::Type type)
Definition: script_mode.cc:270
KigMode::mdoc
KigPart & mdoc
Definition: mode.h:94
myboost::intrusive_ptr< ObjectTypeCalcer >
DragRectMode::ret
std::vector< ObjectHolder * > ret() const
this returns the selected objects.
Definition: dragrectmode.cc:77
script_mode.h
Coordinate
The Coordinate class is the basic class representing a 2D location by its x and y components...
Definition: coordinate.h:33
KigWidget::updateScrollBars
void updateScrollBars()
Definition: kig_view.cpp:298
ScriptModeBase::rightClicked
void rightClicked(const std::vector< ObjectHolder * > &, const QPoint &, KigWidget &)
Definition: script_mode.cc:265
KigWidget::screenInfo
const ScreenInfo & screenInfo() const
the part of the document we're currently showing i.e.
Definition: kig_view.cpp:272
ObjectFactory::label
ObjectHolder * label(const QString &s, const Coordinate &loc, bool needframe, const std::vector< ObjectCalcer * > &parents, const KigDocument &doc) const
returns a label with text s at point c .
Definition: object_factory.cc:386
KigPart::redrawScreen
void redrawScreen()
Definition: kig_part.cpp:980
KigPainter
KigPainter is an extended QPainter.
Definition: kigpainter.h:51
python_type.h
ObjectHolder
An ObjectHolder represents an object as it is known to the document.
Definition: object_holder.h:40
ObjectTypeCalcer::imp
const ObjectImp * imp() const
Returns the ObjectImp of this ObjectCalcer.
Definition: object_calcer.cc:100
ScriptModeBase::mpart
KigPart & mpart
Definition: script_mode.h:44
NewScriptWizard::setType
void setType(ScriptType::Type type)
Definition: newscriptwizard.cc:195
MonitorDataObjects
this class monitors a set of DataObjects for changes and returns an appropriate ChangeObjectImpsComma...
Definition: kig_commands.h:153
NewScriptWizard::setText
void setText(const QString &text)
Definition: newscriptwizard.cc:171
ScriptModeBase::ScriptModeBase
ScriptModeBase(KigPart &doc)
Definition: script_mode.cc:124
ScriptEditMode::ScriptEditMode
ScriptEditMode(ObjectTypeCalcer *exec_calc, KigPart &doc)
Definition: script_mode.cc:302
KigPart::runMode
void runMode(KigMode *)
Definition: kig_part.cpp:735
python_scripter.h
PythonScripter
Definition: python_scripter.h:42
KigWidget
This class is the real widget showing the document.
Definition: kig_view.h:50
ScriptModeBase::mouseMoved
void mouseMoved(const std::vector< ObjectHolder * > &os, const QPoint &p, KigWidget &w, bool shiftpressed)
Definition: script_mode.cc:91
ScriptModeBase::mwawd
WAWD mwawd
Definition: script_mode.h:47
KigPart::doneMode
void doneMode(KigMode *)
Definition: kig_part.cpp:749
PythonCompileType::instance
static const PythonCompileType * instance()
Definition: python_type.cc:95
ScriptCreationMode::ScriptCreationMode
ScriptCreationMode(KigPart &doc)
Definition: script_mode.cc:292
ScriptCreationMode::~ScriptCreationMode
virtual ~ScriptCreationMode()
Definition: script_mode.cc:298
KigWidget::updateCurPix
void updateCurPix(const std::vector< QRect > &=std::vector< QRect >())
update curPix (bitBlt stillPix onto curPix..)
Definition: kig_view.cpp:187
MonitorDataObjects::finish
void finish(KigCommand *comm)
add the generated KigCommandTasks to the command comm .
Definition: kig_commands.cpp:227
ScriptModeBase::codePageEntered
void codePageEntered()
Definition: script_mode.cc:160
ScriptModeBase::margs
std::list< ObjectHolder * > margs
Definition: script_mode.h:41
KigPart::addObject
void addObject(ObjectHolder *inObject)
Definition: kig_part.cpp:492
ScriptModeBase::goToCodePage
void goToCodePage()
Definition: script_mode.cc:287
InvalidImp::stype
static const ObjectImpType * stype()
Returns the ObjectImpType representing the InvalidImp type.
Definition: bogus_imp.cc:213
KigWidget::curPix
QPixmap curPix
temporary, gets bitBlt'd (copied) onto the widget (to avoid flickering)
Definition: kig_view.h:84
ScriptModeBase::argsPageEntered
void argsPageEntered()
Definition: script_mode.cc:148
ScriptType::templateCode
static QString templateCode(ScriptType::Type type, std::list< ObjectHolder * > args)
Returns a template code for a script language.
Definition: script-common.cc:44
ScriptModeBase::SelectingArgs
Definition: script_mode.h:46
ScriptModeBase::killMode
void killMode()
Definition: script_mode.cc:137
ScriptModeBase::leftClickedObject
void leftClickedObject(ObjectHolder *o, const QPoint &p, KigWidget &w, bool actrlOrShiftDown)
Definition: script_mode.cc:68
KigWidget::updateWidget
void updateWidget(const std::vector< QRect > &=std::vector< QRect >())
this means bitBlting curPix on the actual widget...
Definition: kig_view.cpp:115
PythonScripter::lastErrorExceptionTraceback
std::string lastErrorExceptionTraceback() const
Definition: python_scripter.cc:503
StringImp::stype
static const ObjectImpType * stype()
Returns the ObjectImpType representing the StringImp type.
Definition: bogus_imp.cc:220
ScriptModeBase::enableActions
void enableActions()
actions: we enable the actions we want when our mode is made active.
Definition: script_mode.cc:154
ObjectTypeCalcer::parents
std::vector< ObjectCalcer * > parents() const
Returns the parent ObjectCalcer's of this ObjectCalcer.
Definition: object_calcer.cc:105
ScriptModeBase::addArgs
void addArgs(const std::vector< ObjectHolder * > &obj, KigWidget &w)
Definition: script_mode.cc:276
ObjectTypeCalcer::calc
void calc(const KigDocument &doc)
Makes the ObjectCalcer recalculate its ObjectImp from its parents.
Definition: object_calcer.cc:32
ObjectImp
The ObjectImp class represents the behaviour of an object after it is calculated. ...
Definition: object_imp.h:226
ScriptModeBase::EnteringCode
Definition: script_mode.h:46
KigPart
This is a "Part".
Definition: kig_part.h:68
ScriptEditMode::queryCancel
virtual bool queryCancel()
Definition: script_mode.cc:373
myboost::intrusive_ptr::get
T * get() const
Definition: boost_intrusive_pointer.hpp:122
KigPainter::drawObjects
void drawObjects(const std::vector< ObjectHolder * > &os, bool sel)
Definition: kigpainter.cpp:518
KigWidget::redrawScreen
void redrawScreen(const std::vector< ObjectHolder * > &selection, bool paintOnWidget=true)
Definition: kig_view.cpp:252
ScriptEditMode::~ScriptEditMode
virtual ~ScriptEditMode()
Definition: script_mode.cc:326
KigWidget::stillPix
QPixmap stillPix
what do the still objects look like wondering if this is appropriate, maybe it should be part of Movi...
Definition: kig_view.h:79
DragRectMode
DragRectMode is a mode that provides a rect for selecting the objects inside it.
Definition: dragrectmode.h:40
KigPainter::drawTextStd
void drawTextStd(const QPoint &p, const QString &s)
draws text in a standard manner, convenience function...
Definition: kigpainter.cpp:531
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:35:40 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