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

parley

  • sources
  • kde-4.14
  • kdeedu
  • parley
  • src
parleymainwindow.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  main part of parley
4 
5  -----------------------------------------------------------------------
6 
7  begin : Thu Mar 11 20:50:53 MET 1999
8 
9  copyright : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
10  (C) 2004-2007 Peter Hedlund <peter.hedlund@kdemail.net>
11  (C) 2007-2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
12  (C) 2008 Daniel Laidig <d.laidig@gmx.de>
13  -----------------------------------------------------------------------
14 
15  ***************************************************************************/
16 
17 /***************************************************************************
18  * *
19  * This program is free software; you can redistribute it and/or modify *
20  * it under the terms of the GNU General Public License as published by *
21  * the Free Software Foundation; either version 2 of the License, or *
22  * (at your option) any later version. *
23  * *
24  ***************************************************************************/
25 
26 #include "parleymainwindow.h"
27 
28 #include "../config-parley.h"
29 #include "editor/editor.h"
30 #include "statistics/statisticsmainwindow.h"
31 #include "settings/parleyprefs.h"
32 #include "practice/guifrontend.h"
33 #include "practice/practicesummarycomponent.h"
34 #include "practice/configure/configurepracticedialog.h"
35 
36 #include "parleyactions.h"
37 
38 #include "prefs.h"
39 #include "dashboard/dashboard.h"
40 
41 #include <KActionCollection>
42 #include <KRecentFilesAction>
43 #include <KMessageBox>
44 #include <KTipDialog>
45 #include <KXMLGUIFactory>
46 #include <KXmlGuiWindow>
47 #include <KToolBar>
48 #include <KMenuBar>
49 
50 #include <QtCore/QTimer>
51 
52 using namespace Editor;
53 
54 ParleyMainWindow* ParleyMainWindow::s_instance = 0;
55 ParleyMainWindow* ParleyMainWindow::instance()
56 {
57  return s_instance;
58 }
59 
60 ParleyMainWindow::ParleyMainWindow(const KUrl& filename)
61  : KXmlGuiWindow(0)
62  , m_currentComponent(NoComponent)
63  , m_currentComponentWindow(0)
64  , m_sessionManager(this)
65 {
66  s_instance = this;
67  m_document = new ParleyDocument(this);
68 
69  connect(m_document, SIGNAL(documentChanged(KEduVocDocument*))
70  , this, SLOT(documentUpdated(KEduVocDocument*)));
71 
72  setCentralWidget(new QWidget());
73  centralWidget()->setLayout(new QHBoxLayout());
74  centralWidget()->layout()->setMargin(0);
75 
76  initActions();
77 
78  bool startWithDashboard = false;
79 
80  setupGUI(ToolBar | Keys | Create);
81 
82  if (!filename.url().isEmpty()) {
83  m_document->open(filename);
84  } else {
85  bool openLastFile = Prefs::autoOpenLast();
86  if (openLastFile && m_recentFilesAction->actions().count() > 0
87  && m_recentFilesAction->action(m_recentFilesAction->actions().count() - 1)->isEnabled()) {
88  m_recentFilesAction->action(m_recentFilesAction->actions().count() - 1)->trigger();
89  } else {
90  startWithDashboard = true;
91  }
92  }
93 
94  // save position of dock windows etc
95  setAutoSaveSettings();
96 
97  if (startWithDashboard) {
98  showDashboard();
99  } else {
100  showEditor();
101  }
102 
103  connect(this, SIGNAL(preferencesChanged()), this, SLOT(slotApplyPreferences()));
104  menuBar()->show();
105 
106  // finally show tip-of-day (if the user wants it)
107  //QTimer::singleShot( 0, this, SLOT( startupTipOfDay() ) );
108 }
109 
110 ParleyMainWindow::~ParleyMainWindow()
111 {
112  guiFactory()->removeClient(m_currentComponentWindow);
113  centralWidget()->layout()->removeWidget(m_currentComponentWindow);
114  delete m_currentComponentWindow;
115  delete m_document;
116 }
117 
118 void ParleyMainWindow::addRecentFile(const KUrl &url, const QString &name)
119 {
120  m_recentFilesAction->addUrl(url, name);
121  m_recentFilesAction->saveEntries(KGlobal::config()->group("Recent Files"));
122 }
123 
124 void ParleyMainWindow::removeRecentFile(const KUrl &url)
125 {
126  m_recentFilesAction->removeUrl(url);
127  m_recentFilesAction->saveEntries(KGlobal::config()->group("Recent Files"));
128 }
129 
130 void ParleyMainWindow::documentUpdated(KEduVocDocument *doc)
131 {
132  if (doc != 0) {
133  connect(m_document->document(), SIGNAL(docModified(bool))
134  , this, SLOT(slotUpdateWindowCaption()));
135  connect(m_document->document(), SIGNAL(destroyed())
136  , this, SLOT(slotUpdateWindowCaption()));
137  slotUpdateWindowCaption();
138  }
139 }
140 
141 void ParleyMainWindow::updateRecentFilesModel()
142 {
143  emit recentFilesChanged();
144 }
145 
146 void ParleyMainWindow::saveOptions()
147 {
148  Prefs::self()->writeConfig();
149 }
150 
151 void ParleyMainWindow::slotUpdateWindowCaption()
152 {
153  QString title;
154  bool modified = false;
155  if (m_document->document()) {
156  title = m_document->document()->title();
157  modified = m_document->document()->isModified();
158  if (title == i18n("Untitled")) {
159  title.clear();
160  }
161  }
162  setCaption(title, modified);
163 }
164 
165 void ParleyMainWindow::slotGeneralOptions()
166 {
167  ParleyPrefs* dialog = new ParleyPrefs(m_document->document(), this, "settings", Prefs::self());
168  connect(dialog, SIGNAL(settingsChanged(const QString &)), this, SIGNAL(preferencesChanged()));
169  dialog->show();
170 }
171 
172 void ParleyMainWindow::slotApplyPreferences()
173 {
174  m_document->enableAutoBackup((m_currentComponent != DashboardComponent) && Prefs::autoBackup());
175 }
176 
177 void ParleyMainWindow::slotCloseDocument()
178 {
179  if (!queryClose()) {
180  return;
181  }
182  showDashboard();
183  m_document->close();
184 }
185 
186 void ParleyMainWindow::configurePractice()
187 {
188  ConfigurePracticeDialog configurePracticeDialog(m_document->document(), this, "practice settings", Prefs::self());
189  configurePracticeDialog.exec();
190 }
191 
192 void ParleyMainWindow::startPractice()
193 {
194  if (Prefs::learningLanguage() == Prefs::knownLanguage()) {
195  KMessageBox::sorry(this,
196  i18n("You cannot start to practice when the known language is the same as the language to learn."),
197  i18n("Select languages"));
198  return;
199  }
200 
201  switchComponent(PracticeComponent);
202 }
203 
204 void ParleyMainWindow::practiceFinished()
205 {
206  switchComponent(m_componentBeforePractice);
207 }
208 
209 bool ParleyMainWindow::queryClose()
210 {
211  return m_document->queryClose();
212 }
213 
214 QSize ParleyMainWindow::sizeHint() const
215 {
216  return QSize(800, 600).expandedTo(KXmlGuiWindow::minimumSizeHint());
217 }
218 
219 void ParleyMainWindow::tipOfDay()
220 {
221  KTipDialog::showTip(this, "parley/tips", true);
222 }
223 
224 void ParleyMainWindow::startupTipOfDay()
225 {
226  KTipDialog::showTip(this, "parley/tips");
227 }
228 
229 void ParleyMainWindow::slotFileNew()
230 {
231  m_document->slotFileNew();
232  slotUpdateWindowCaption();
233 }
234 
235 void ParleyMainWindow::initActions()
236 {
237  ParleyActions::create(ParleyActions::FileNew, this, SLOT(slotFileNew()), actionCollection());
238  ParleyActions::create(ParleyActions::FileOpen, m_document, SLOT(slotFileOpen()), actionCollection());
239  ParleyActions::createDownloadAction(m_document, SLOT(slotGHNS()), actionCollection());
240  ParleyActions::create(ParleyActions::FileOpenDownloaded, m_document, SLOT(openGHNS()), actionCollection());
241 
242  m_recentFilesAction = ParleyActions::createRecentFilesAction(
243  m_document, SLOT(slotFileOpenRecent(const KUrl&)), actionCollection());
244 
245  m_recentFilesAction->loadEntries(KGlobal::config()->group("Recent Files"));
246 
247  ParleyActions::create(ParleyActions::FileSave, m_document, SLOT(save()), actionCollection());
248  ParleyActions::create(ParleyActions::FileSaveAs, m_document, SLOT(saveAs()), actionCollection());
249 #ifdef HAVE_LIBXSLT
250  ParleyActions::create(ParleyActions::FileExport, m_document, SLOT(exportDialog()), actionCollection());
251 #endif
252 
253  ParleyActions::create(ParleyActions::FileProperties, m_document, SLOT(documentProperties()), actionCollection());
254 
255  ParleyActions::create(ParleyActions::FileClose, this, SLOT(slotCloseDocument()), actionCollection());
256  ParleyActions::create(ParleyActions::FileQuit, this, SLOT(close()), actionCollection());
257  ParleyActions::create(ParleyActions::Preferences, this, SLOT(slotGeneralOptions()), actionCollection());
258 
259  actionCollection()->addAction(KStandardAction::TipofDay, "help_tipofday", this, SLOT(tipOfDay()));
260 }
261 
262 void ParleyMainWindow::showDashboard()
263 {
264  switchComponent(DashboardComponent);
265 }
266 
267 void ParleyMainWindow::showEditor()
268 {
269  switchComponent(EditorComponent);
270 }
271 
272 void ParleyMainWindow::showPracticeConfiguration()
273 {
274  switchComponent(ConfigurePracticeComponent);
275 }
276 
277 void ParleyMainWindow::showPractice()
278 {
279  switchComponent(PracticeComponent);
280 }
281 
282 void ParleyMainWindow::showPracticeSummary()
283 {
284  switchComponent(PracticeSummary);
285 }
286 
287 void ParleyMainWindow::switchComponent(Component component)
288 {
289  if (component == PracticeComponent) {
290 
291  StatisticsMainWindow *statisticsWidget = qobject_cast<StatisticsMainWindow*>(m_currentComponentWindow);
292  if (statisticsWidget) {
293  statisticsWidget->syncConfig();
294  }
295 
296  // Don't start a practice when there are no words to practice.
297  // This has to be checked before deleting the old component.
298  m_sessionManager.setDocument(m_document->document());
299  if (!m_sessionManager.allEntryCount()) {
300  return;
301  }
302  }
303 
304  // Remove and delete the old component window if there is one active.
305  if (m_currentComponentWindow) {
306  guiFactory()->removeClient(m_currentComponentWindow);
307  centralWidget()->layout()->removeWidget(m_currentComponentWindow);
308  m_currentComponentWindow->deleteLater();
309  }
310 
311  switch (component) {
312  case DashboardComponent: {
313  Dashboard *dashboard = new Dashboard(this);
314  m_currentComponentWindow = dashboard;
315  showDocumentActions(true, false);
316  //dashboard->updateRecentFilesModel();
317  break;
318  }
319  case ConfigurePracticeComponent: {
320  StatisticsMainWindow *statisticsWidget = new StatisticsMainWindow(m_document->document(), this);
321  m_currentComponentWindow = statisticsWidget;
322  showDocumentActions(true, true);
323  break;
324  }
325  case EditorComponent: {
326  EditorWindow *editor = new EditorWindow(this);
327  m_currentComponentWindow = editor;
328  showDocumentActions(true, true);
329  editor->updateDocument(m_document->document());
330  break;
331  }
332  case PracticeComponent: {
334  m_document->document()->setModified(true);
335  Practice::PracticeMainWindow *practiceWindow = new Practice::PracticeMainWindow(&m_sessionManager, this);
336  connect(practiceWindow, SIGNAL(stopPractice()), this, SLOT(showPracticeSummary()));
337  m_currentComponentWindow = practiceWindow;
338  showDocumentActions(false, false);
339  practiceWindow->startPractice();
340  break;
341  }
342  case PracticeSummary: {
343  Practice::PracticeSummaryComponent* summary = new Practice::PracticeSummaryComponent(&m_sessionManager, this);
344  m_currentComponentWindow = summary;
345  showDocumentActions(true, true);
346  break;
347  }
348  default:
349  break;
350  }
351  //kDebug() << "new component" << m_currentComponentWindow;
352 
353  guiFactory()->addClient(m_currentComponentWindow);
354  centralWidget()->layout()->addWidget(m_currentComponentWindow);
355  m_currentComponentWindow->show();
356  switch (component) {
357  case DashboardComponent: {
358  setVisibleToolbar(QString());
359  break;
360  }
361  case ConfigurePracticeComponent: {
362  setVisibleToolbar("statisticsToolBar");
363  break;
364  }
365  case EditorComponent: {
366  setVisibleToolbar("editorToolBar");
367  break;
368  }
369  case PracticeComponent: {
370  setVisibleToolbar("practiceToolBar");
371  break;
372  }
373  case PracticeSummary: {
374  setVisibleToolbar("practiceSummaryToolBar");
375  break;
376  }
377  default:
378  break;
379  }
380  m_currentComponent = component;
381  setupToolbarMenuActions();
382 }
383 
384 void ParleyMainWindow::showDocumentActions(bool open, bool edit)
385 {
386  actionCollection()->action("file_new")->setVisible(open);
387  actionCollection()->action("file_open")->setVisible(open);
388  actionCollection()->action("file_open_recent")->setVisible(open);
389  actionCollection()->action("file_ghns")->setVisible(open);
390  actionCollection()->action("file_open_downloaded")->setVisible(open);
391 
392  actionCollection()->action("file_save")->setVisible(edit);
393  actionCollection()->action("file_save_as")->setVisible(edit);
394  actionCollection()->action("file_close")->setVisible(edit);
395 #ifdef HAVE_LIBXSLT
396  actionCollection()->action("file_export")->setVisible(edit);
397 #endif
398  actionCollection()->action("file_properties")->setVisible(edit);
399  actionCollection()->action("file_close")->setVisible(edit);
400 }
401 
402 void ParleyMainWindow::setVisibleToolbar(const QString& name)
403 {
404  Q_FOREACH(KToolBar * toolbar, toolBars()) {
405  if (toolbar && toolbar->objectName() == name) {
406  toolbar->show();
407  } else if (toolbar) {
408  toolbar->hide();
409  }
410  }
411 }
412 
413 ParleyDocument* ParleyMainWindow::parleyDocument()
414 {
415  return m_document;
416 }
417 
418 ParleyMainWindow::Component ParleyMainWindow::currentComponent()
419 {
420  return m_currentComponent;
421 }
422 
423 #include "parleymainwindow.moc"
statisticsmainwindow.h
ParleyMainWindow::saveOptions
void saveOptions()
save the app-specific options on slotAppExit or by an Options dialog
Definition: parleymainwindow.cpp:146
QWidget
ParleyMainWindow::currentComponent
Component currentComponent()
Definition: parleymainwindow.cpp:418
ParleyActions::create
KAction * create(ParleyAction id, const QObject *recvr, const char *slot, QObject *parent)
Definition: parleyactions.cpp:64
ParleyMainWindow::removeRecentFile
void removeRecentFile(const KUrl &url)
remove an entry from the list of recent files
Definition: parleymainwindow.cpp:124
ParleyMainWindow::showPractice
void showPractice()
Definition: parleymainwindow.cpp:277
ParleyActions::FileNew
Definition: parleyactions.h:25
ParleyMainWindow::showEditor
void showEditor()
Definition: parleymainwindow.cpp:267
ParleyMainWindow::queryClose
bool queryClose()
When quitting, ask for confirmation if the doc has not been saved.
Definition: parleymainwindow.cpp:209
ParleyMainWindow
Definition: parleymainwindow.h:41
ConfigurePracticeDialog
Definition: configurepracticedialog.h:34
configurepracticedialog.h
ParleyMainWindow::practiceFinished
void practiceFinished()
Definition: parleymainwindow.cpp:204
ParleyDocument::document
KEduVocDocument * document()
Definition: parleydocument.cpp:97
ParleyMainWindow::DashboardComponent
Definition: parleymainwindow.h:53
QHBoxLayout
prefs.h
ParleyMainWindow::PracticeSummary
Definition: parleymainwindow.h:57
ParleyMainWindow::setVisibleToolbar
void setVisibleToolbar(const QString &name)
Definition: parleymainwindow.cpp:402
ParleyDocument::queryClose
bool queryClose()
When quitting, ask for confirmation if the doc has not been saved.
Definition: parleydocument.cpp:264
ParleyMainWindow::showDocumentActions
void showDocumentActions(bool open, bool edit)
Shows or hides actions that are only relevant when a document is opened.
Definition: parleymainwindow.cpp:384
ParleyMainWindow::showPracticeSummary
void showPracticeSummary()
Definition: parleymainwindow.cpp:282
ParleyActions::FileOpen
Definition: parleyactions.h:26
editor.h
QString::clear
void clear()
parleyactions.h
Prefs::autoOpenLast
static bool autoOpenLast()
Get If true, on each application start the last opened file will be loaded.
Definition: prefs.h:146
ParleyMainWindow::switchComponent
void switchComponent(Component component)
Definition: parleymainwindow.cpp:287
Prefs::self
static Prefs * self()
Definition: prefs.cpp:17
ParleyActions::FileProperties
Definition: parleyactions.h:29
ParleyMainWindow::EditorComponent
Definition: parleymainwindow.h:54
ParleyActions::FileExport
Definition: parleyactions.h:28
ParleyMainWindow::slotApplyPreferences
void slotApplyPreferences()
Definition: parleymainwindow.cpp:172
ParleyDocument
Definition: parleydocument.h:29
parleyprefs.h
Practice::SessionManagerBase::allEntryCount
int allEntryCount() const
The number of entries available for the practice session.
Definition: sessionmanagerbase.cpp:172
KXmlGuiWindow
ParleyMainWindow::instance
static ParleyMainWindow * instance()
Definition: parleymainwindow.cpp:55
ParleyMainWindow::documentUpdated
void documentUpdated(KEduVocDocument *doc)
Updates connections when the ParleyDocument pointer is changed to doc.
Definition: parleymainwindow.cpp:130
ParleyMainWindow::preferencesChanged
void preferencesChanged()
ParleyMainWindow::showPracticeConfiguration
void showPracticeConfiguration()
Definition: parleymainwindow.cpp:272
ParleyMainWindow::ConfigurePracticeComponent
Definition: parleymainwindow.h:55
StatisticsMainWindow
Definition: statisticsmainwindow.h:31
ParleyActions::FileClose
Definition: parleyactions.h:30
QString
ParleyPrefs
Definition: parleyprefs.h:35
ParleyDocument::enableAutoBackup
void enableAutoBackup(bool enable)
Enable/disable the timed auto backup.
Definition: parleydocument.cpp:653
Practice::PracticeMainWindow
Definition: practicemainwindow.h:30
ParleyMainWindow::sizeHint
QSize sizeHint() const
Definition: parleymainwindow.cpp:214
ParleyMainWindow::showDashboard
void showDashboard()
Definition: parleymainwindow.cpp:262
ParleyMainWindow::slotGeneralOptions
void slotGeneralOptions()
set up options
Definition: parleymainwindow.cpp:165
Editor::EditorWindow::updateDocument
void updateDocument(KEduVocDocument *doc)
Set the current doc (after creating a new one or opening a file)
Definition: editor.cpp:104
ParleyActions::FileSave
Definition: parleyactions.h:27
ParleyMainWindow::startupTipOfDay
void startupTipOfDay()
Show the tip of the day - the startup version that can be disabled.
Definition: parleymainwindow.cpp:224
QSize
Practice::SessionManagerBase::setDocument
virtual void setDocument(KEduVocDocument *doc)
Prepare for practice using the entries in this document.
Definition: sessionmanagerbase.cpp:55
Dashboard
Definition: dashboard.h:40
ParleyActions::createDownloadAction
KAction * createDownloadAction(const QObject *recvr, const char *slot, KActionCollection *collection)
Definition: parleyactions.cpp:188
ParleyActions::createRecentFilesAction
KRecentFilesAction * createRecentFilesAction(const QObject *recvr, const char *slot, QObject *parent)
Definition: parleyactions.cpp:183
ParleyMainWindow::Component
Component
enum for the different components that can be displayed
Definition: parleymainwindow.h:51
ParleyMainWindow::slotCloseDocument
void slotCloseDocument()
Definition: parleymainwindow.cpp:177
parleymainwindow.h
ParleyMainWindow::PracticeComponent
Definition: parleymainwindow.h:56
ParleyActions::Preferences
Definition: parleyactions.h:31
ParleyMainWindow::updateRecentFilesModel
void updateRecentFilesModel()
update the list of recent files in the dashboard
Definition: parleymainwindow.cpp:141
ParleyActions::FileSaveAs
Definition: parleyactions.h:27
guifrontend.h
Practice::PracticeSummaryComponent
Definition: practicesummarycomponent.h:25
Prefs::knownLanguage
static int knownLanguage()
Get The language that you know already.
Definition: prefs.h:1267
ParleyActions::FileQuit
Definition: parleyactions.h:30
QSize::expandedTo
QSize expandedTo(const QSize &otherSize) const
ParleyMainWindow::initActions
void initActions()
setup the action (menus etc)
Definition: parleymainwindow.cpp:235
Prefs::autoBackup
static bool autoBackup()
Get If true, a backup is saved every BackupTime minutes.
Definition: prefs.h:203
Editor::EditorWindow
Definition: editor.h:50
practicesummarycomponent.h
Practice::PracticeMainWindow::startPractice
void startPractice()
Definition: practicemainwindow.cpp:155
ParleyMainWindow::addRecentFile
void addRecentFile(const KUrl &url, const QString &name)
add a new entry to the list of recent files
Definition: parleymainwindow.cpp:118
Prefs::learningLanguage
static int learningLanguage()
Get The language that you are learning.
Definition: prefs.h:1248
ParleyMainWindow::recentFilesChanged
void recentFilesChanged()
ParleyMainWindow::~ParleyMainWindow
~ParleyMainWindow()
Definition: parleymainwindow.cpp:110
ParleyDocument::open
bool open(const KUrl &)
Opens the given url, displays an error message and returns false on failure.
Definition: parleydocument.cpp:191
ParleyMainWindow::tipOfDay
void tipOfDay()
Show the tip of the day (force it to be shown)
Definition: parleymainwindow.cpp:219
ParleyMainWindow::configurePractice
void configurePractice()
Definition: parleymainwindow.cpp:186
ParleyMainWindow::parleyDocument
ParleyDocument * parleyDocument()
Return the ParleyDocument member object.
Definition: parleymainwindow.cpp:413
ParleyDocument::close
void close()
close the document
Definition: parleydocument.cpp:254
StatisticsMainWindow::syncConfig
void syncConfig()
Definition: statisticsmainwindow.cpp:80
ParleyMainWindow::startPractice
void startPractice()
Definition: parleymainwindow.cpp:192
dashboard.h
ParleyDocument::slotFileNew
void slotFileNew()
open a new application window
Definition: parleydocument.cpp:112
ParleyActions::FileOpenDownloaded
Definition: parleyactions.h:26
ParleyMainWindow::slotUpdateWindowCaption
void slotUpdateWindowCaption()
Update the title bar of the main window with the current document.
Definition: parleymainwindow.cpp:151
ParleyMainWindow::slotFileNew
void slotFileNew()
Opens a dialog for a new collection.
Definition: parleymainwindow.cpp:229
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:15:56 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

parley

Skip menu "parley"
  • 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
  • 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