• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.10.5 API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • kdeui
  • widgets
kactionselector.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2  Copyright (C) 2002 Anders Lund <anders.lund@lund.tdcadsl.dk>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License version 2 as published by the Free Software Foundation.
7 
8  This library 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 GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public License
14  along with this library; see the file COPYING.LIB. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 */
18 
19 
20 #include "kactionselector.h"
21 
22 #include <klocale.h>
23 #include <kicon.h>
24 #include <kdebug.h>
25 #include <QtGui/QApplication>
26 #include <QtGui/QToolButton>
27 #include <QtGui/QLabel>
28 #include <QtGui/QLayout>
29 #include <QtGui/QActionEvent>
30 #include <QListWidget>
31 
32 class KActionSelectorPrivate {
33  public:
34  KActionSelectorPrivate(KActionSelector *q): q(q) {}
35 
36  KActionSelector *q;
37  QListWidget *availableListWidget, *selectedListWidget;
38  QToolButton *btnAdd, *btnRemove, *btnUp, *btnDown;
39  QLabel *lAvailable, *lSelected;
40  bool moveOnDoubleClick : 1;
41  bool keyboardEnabled : 1;
42  bool showUpDownButtons : 1;
43  QString addIcon, removeIcon, upIcon, downIcon;
44  KActionSelector::InsertionPolicy availableInsertionPolicy, selectedInsertionPolicy;
45 
49  void moveItem( QListWidgetItem *item );
50 
54  void loadIcons();
55 
63  int insertionIndex( QListWidget *lb, KActionSelector::InsertionPolicy policy );
64 
69  int selectedRowIndex( QListWidget *lb );
70 
71  void buttonAddClicked();
72  void buttonRemoveClicked();
73  void buttonUpClicked();
74  void buttonDownClicked();
75  void itemDoubleClicked( QListWidgetItem *item );
76  void slotCurrentChanged( QListWidgetItem * )
77  { q->setButtonsEnabled(); }
78 };
79 
80 //BEGIN Constructor/destructor
81 
82 KActionSelector::KActionSelector( QWidget *parent )
83  : QWidget( parent )
84  , d( new KActionSelectorPrivate(this) )
85 {
86  d->moveOnDoubleClick = true;
87  d->keyboardEnabled = true;
88  d->addIcon = QApplication::isRightToLeft()? "go-previous" : "go-next";
89  d->removeIcon = QApplication::isRightToLeft()? "go-next" : "go-previous";
90  d->upIcon = "go-up";
91  d->downIcon = "go-down";
92  d->availableInsertionPolicy = Sorted;
93  d->selectedInsertionPolicy = BelowCurrent;
94  d->showUpDownButtons = true;
95 
96  QHBoxLayout *lo = new QHBoxLayout( this );
97 
98  QVBoxLayout *loAv = new QVBoxLayout();
99  lo->addLayout( loAv );
100  d->lAvailable = new QLabel( i18n("&Available:"), this );
101  loAv->addWidget( d->lAvailable );
102  d->availableListWidget = new QListWidget( this );
103  loAv->addWidget( d->availableListWidget );
104  d->lAvailable->setBuddy( d->availableListWidget );
105 
106  QVBoxLayout *loHBtns = new QVBoxLayout();
107  lo->addLayout( loHBtns );
108  loHBtns->addStretch( 1 );
109  d->btnAdd = new QToolButton( this );
110  loHBtns->addWidget( d->btnAdd );
111  d->btnRemove = new QToolButton( this );
112  loHBtns->addWidget( d->btnRemove );
113  loHBtns->addStretch( 1 );
114 
115  QVBoxLayout *loS = new QVBoxLayout();
116  lo->addLayout( loS );
117  d->lSelected = new QLabel( i18n("&Selected:"), this );
118  loS->addWidget( d->lSelected );
119  d->selectedListWidget = new QListWidget( this );
120  loS->addWidget( d->selectedListWidget );
121  d->lSelected->setBuddy( d->selectedListWidget );
122 
123  QVBoxLayout *loVBtns = new QVBoxLayout();
124  lo->addLayout( loVBtns );
125  loVBtns->addStretch( 1 );
126  d->btnUp = new QToolButton( this );
127  d->btnUp->setAutoRepeat( true );
128  loVBtns->addWidget( d->btnUp );
129  d->btnDown = new QToolButton( this );
130  d->btnDown->setAutoRepeat( true );
131  loVBtns->addWidget( d->btnDown );
132  loVBtns->addStretch( 1 );
133 
134  d->loadIcons();
135 
136  connect( d->btnAdd, SIGNAL(clicked()), this, SLOT(buttonAddClicked()) );
137  connect( d->btnRemove, SIGNAL(clicked()), this, SLOT(buttonRemoveClicked()) );
138  connect( d->btnUp, SIGNAL(clicked()), this, SLOT(buttonUpClicked()) );
139  connect( d->btnDown, SIGNAL(clicked()), this, SLOT(buttonDownClicked()) );
140  connect( d->availableListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
141  this, SLOT(itemDoubleClicked(QListWidgetItem*)) );
142  connect( d->selectedListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
143  this, SLOT(itemDoubleClicked(QListWidgetItem*)) );
144  connect( d->availableListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(polish()) );
145  connect( d->selectedListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(polish()) );
146 
147  d->availableListWidget->installEventFilter( this );
148  d->selectedListWidget->installEventFilter( this );
149  setButtonsEnabled();
150 }
151 
152 KActionSelector::~KActionSelector()
153 {
154  delete d;
155 }
156 
157 //END Constructor/destroctor
158 
159 //BEGIN Public Methods
160 
161 QListWidget *KActionSelector::availableListWidget() const
162 {
163  return d->availableListWidget;
164 }
165 
166 QListWidget *KActionSelector::selectedListWidget() const
167 {
168  return d->selectedListWidget;
169 }
170 
171 void KActionSelector::setButtonIcon( const QString &icon, MoveButton button )
172 {
173  switch ( button )
174  {
175  case ButtonAdd:
176  d->addIcon = icon;
177  d->btnAdd->setIcon( KIcon( icon ) );
178  break;
179  case ButtonRemove:
180  d->removeIcon = icon;
181  d->btnRemove->setIcon( KIcon( icon ) );
182  break;
183  case ButtonUp:
184  d->upIcon = icon;
185  d->btnUp->setIcon( KIcon( icon ) );
186  break;
187  case ButtonDown:
188  d->downIcon = icon;
189  d->btnDown->setIcon( KIcon( icon ) );
190  break;
191  default:
192  kDebug(13001)<<"KActionSelector::setButtonIcon: DAINBREAD!";
193  }
194 }
195 
196 void KActionSelector::setButtonIconSet( const QIcon &iconset, MoveButton button )
197 {
198  switch ( button )
199  {
200  case ButtonAdd:
201  d->btnAdd->setIcon( iconset );
202  break;
203  case ButtonRemove:
204  d->btnRemove->setIcon( iconset );
205  break;
206  case ButtonUp:
207  d->btnUp->setIcon( iconset );
208  break;
209  case ButtonDown:
210  d->btnDown->setIcon( iconset );
211  break;
212  default:
213  kDebug(13001)<<"KActionSelector::setButtonIconSet: DAINBREAD!";
214  }
215 }
216 
217 void KActionSelector::setButtonTooltip( const QString &tip, MoveButton button )
218 {
219  switch ( button )
220  {
221  case ButtonAdd:
222  d->btnAdd->setText( tip );
223  d->btnAdd->setToolTip( tip );
224  break;
225  case ButtonRemove:
226  d->btnRemove->setText( tip );
227  d->btnRemove->setToolTip( tip );
228  break;
229  case ButtonUp:
230  d->btnUp->setText( tip );
231  d->btnUp->setToolTip( tip );
232  break;
233  case ButtonDown:
234  d->btnDown->setText( tip );
235  d->btnDown->setToolTip( tip );
236  break;
237  default:
238  kDebug(13001)<<"KActionSelector::setButtonToolTip: DAINBREAD!";
239  }
240 }
241 
242 void KActionSelector::setButtonWhatsThis( const QString &text, MoveButton button )
243 {
244  switch ( button )
245  {
246  case ButtonAdd:
247  d->btnAdd->setWhatsThis(text );
248  break;
249  case ButtonRemove:
250  d->btnRemove->setWhatsThis(text );
251  break;
252  case ButtonUp:
253  d->btnUp->setWhatsThis(text );
254  break;
255  case ButtonDown:
256  d->btnDown->setWhatsThis(text );
257  break;
258  default:
259  kDebug(13001)<<"KActionSelector::setButtonWhatsThis: DAINBREAD!";
260  }
261 }
262 
263 void KActionSelector::setButtonsEnabled()
264 {
265  d->btnAdd->setEnabled( d->selectedRowIndex(d->availableListWidget) > -1 );
266  d->btnRemove->setEnabled( d->selectedRowIndex(d->selectedListWidget) > -1 );
267  d->btnUp->setEnabled( d->selectedRowIndex(d->selectedListWidget) > 0 );
268  d->btnDown->setEnabled( d->selectedRowIndex(d->selectedListWidget) > -1 &&
269  d->selectedRowIndex(d->selectedListWidget) < d->selectedListWidget->count() - 1 );
270 }
271 
272 //END Public Methods
273 
274 //BEGIN Properties
275 
276 bool KActionSelector::moveOnDoubleClick() const
277 {
278  return d->moveOnDoubleClick;
279 }
280 
281 void KActionSelector::setMoveOnDoubleClick( bool b )
282 {
283  d->moveOnDoubleClick = b;
284 }
285 
286 bool KActionSelector::keyboardEnabled() const
287 {
288  return d->keyboardEnabled;
289 }
290 
291 void KActionSelector::setKeyboardEnabled( bool b )
292 {
293  d->keyboardEnabled = b;
294 }
295 
296 QString KActionSelector::availableLabel() const
297 {
298  return d->lAvailable->text();
299 }
300 
301 void KActionSelector::setAvailableLabel( const QString &text )
302 {
303  d->lAvailable->setText( text );
304 }
305 
306 QString KActionSelector::selectedLabel() const
307 {
308  return d->lSelected->text();
309 }
310 
311 void KActionSelector::setSelectedLabel( const QString &text )
312 {
313  d->lSelected->setText( text );
314 }
315 
316 KActionSelector::InsertionPolicy KActionSelector::availableInsertionPolicy() const
317 {
318  return d->availableInsertionPolicy;
319 }
320 
321 void KActionSelector::setAvailableInsertionPolicy( InsertionPolicy p )
322 {
323  d->availableInsertionPolicy = p;
324 }
325 
326 KActionSelector::InsertionPolicy KActionSelector::selectedInsertionPolicy() const
327 {
328  return d->selectedInsertionPolicy;
329 }
330 
331 void KActionSelector::setSelectedInsertionPolicy( InsertionPolicy p )
332 {
333  d->selectedInsertionPolicy = p;
334 }
335 
336 bool KActionSelector::showUpDownButtons() const
337 {
338  return d->showUpDownButtons;
339 }
340 
341 void KActionSelector::setShowUpDownButtons( bool show )
342 {
343  d->showUpDownButtons = show;
344  if ( show )
345  {
346  d->btnUp->show();
347  d->btnDown->show();
348  }
349  else
350  {
351  d->btnUp->hide();
352  d->btnDown->hide();
353  }
354 }
355 
356 //END Properties
357 
358 //BEGIN Public Slots
359 
360 void KActionSelector::polish()
361 {
362  setButtonsEnabled();
363 }
364 
365 //END Public Slots
366 
367 //BEGIN Protected
368 void KActionSelector::keyPressEvent( QKeyEvent *e )
369 {
370  if ( ! d->keyboardEnabled ) return;
371  if ( (e->modifiers() & Qt::ControlModifier) )
372  {
373  switch ( e->key() )
374  {
375  case Qt::Key_Right:
376  d->buttonAddClicked();
377  break;
378  case Qt::Key_Left:
379  d->buttonRemoveClicked();
380  break;
381  case Qt::Key_Up:
382  d->buttonUpClicked();
383  break;
384  case Qt::Key_Down:
385  d->buttonDownClicked();
386  break;
387  default:
388  e->ignore();
389  return;
390  }
391  }
392 }
393 
394 bool KActionSelector::eventFilter( QObject *o, QEvent *e )
395 {
396  if ( d->keyboardEnabled && e->type() == QEvent::KeyPress )
397  {
398  if ( (((QKeyEvent*)e)->modifiers() & Qt::ControlModifier) )
399  {
400  switch ( ((QKeyEvent*)e)->key() )
401  {
402  case Qt::Key_Right:
403  d->buttonAddClicked();
404  break;
405  case Qt::Key_Left:
406  d->buttonRemoveClicked();
407  break;
408  case Qt::Key_Up:
409  d->buttonUpClicked();
410  break;
411  case Qt::Key_Down:
412  d->buttonDownClicked();
413  break;
414  default:
415  return QWidget::eventFilter( o, e );
416  break;
417  }
418  return true;
419  }
420  else if ( QListWidget *lb = qobject_cast<QListWidget*>(o) )
421  {
422  switch ( ((QKeyEvent*)e)->key() )
423  {
424  case Qt::Key_Return:
425  case Qt::Key_Enter:
426  int index = lb->currentRow();
427  if ( index < 0 ) break;
428  d->moveItem( lb->item( index ) );
429  return true;
430  }
431  }
432  }
433  return QWidget::eventFilter( o, e );
434 }
435 
436 //END Protected
437 
438 //BEGIN Private Slots
439 
440 void KActionSelectorPrivate::buttonAddClicked()
441 {
442  // move all selected items from available to selected listbox
443  QList<QListWidgetItem *> list = availableListWidget->selectedItems();
444  foreach (QListWidgetItem* item, list) {
445  availableListWidget->takeItem( availableListWidget->row( item ) );
446  selectedListWidget->insertItem( insertionIndex( selectedListWidget, selectedInsertionPolicy ), item );
447  selectedListWidget->setCurrentItem( item );
448  emit q->added( item );
449  }
450  if ( selectedInsertionPolicy == KActionSelector::Sorted )
451  selectedListWidget->sortItems();
452  selectedListWidget->setFocus();
453 }
454 
455 void KActionSelectorPrivate::buttonRemoveClicked()
456 {
457  // move all selected items from selected to available listbox
458  QList<QListWidgetItem *> list = selectedListWidget->selectedItems();
459  foreach (QListWidgetItem* item, list) {
460  selectedListWidget->takeItem( selectedListWidget->row( item ) );
461  availableListWidget->insertItem( insertionIndex( availableListWidget, availableInsertionPolicy ), item );
462  availableListWidget->setCurrentItem( item );
463  emit q->removed( item );
464  }
465  if ( availableInsertionPolicy == KActionSelector::Sorted )
466  availableListWidget->sortItems();
467  availableListWidget->setFocus();
468 }
469 
470 void KActionSelectorPrivate::buttonUpClicked()
471 {
472  int c = selectedRowIndex(selectedListWidget);
473  if ( c < 1 ) return;
474  QListWidgetItem *item = selectedListWidget->item( c );
475  selectedListWidget->takeItem( c );
476  selectedListWidget->insertItem( c-1, item );
477  selectedListWidget->setCurrentItem( item );
478  emit q->movedUp( item );
479 }
480 
481 void KActionSelectorPrivate::buttonDownClicked()
482 {
483  int c = selectedRowIndex(selectedListWidget);
484  if ( c < 0 || c == selectedListWidget->count() - 1 ) return;
485  QListWidgetItem *item = selectedListWidget->item( c );
486  selectedListWidget->takeItem( c );
487  selectedListWidget->insertItem( c+1, item );
488  selectedListWidget->setCurrentItem( item );
489  emit q->movedDown( item );
490 }
491 
492 void KActionSelectorPrivate::itemDoubleClicked( QListWidgetItem *item )
493 {
494  if ( moveOnDoubleClick )
495  moveItem( item );
496 }
497 
498 //END Private Slots
499 
500 //BEGIN Private Methods
501 
502 void KActionSelectorPrivate::loadIcons()
503 {
504  btnAdd->setIcon( KIcon( addIcon ) );
505  btnRemove->setIcon( KIcon( removeIcon ) );
506  btnUp->setIcon( KIcon( upIcon ) );
507  btnDown->setIcon( KIcon( downIcon ) );
508 }
509 
510 void KActionSelectorPrivate::moveItem( QListWidgetItem *item )
511 {
512  QListWidget *lbFrom = item->listWidget();
513  QListWidget *lbTo;
514  if ( lbFrom == availableListWidget )
515  lbTo = selectedListWidget;
516  else if ( lbFrom == selectedListWidget )
517  lbTo = availableListWidget;
518  else //?! somewhat unlikely...
519  return;
520 
521  KActionSelector::InsertionPolicy p = ( lbTo == availableListWidget ) ?
522  availableInsertionPolicy : selectedInsertionPolicy;
523 
524  lbFrom->takeItem( lbFrom->row( item ) );
525  lbTo->insertItem( insertionIndex( lbTo, p ), item );
526  lbTo->setFocus();
527  lbTo->setCurrentItem( item );
528 
529  if ( p == KActionSelector::Sorted )
530  lbTo->sortItems();
531  if ( lbTo == selectedListWidget )
532  emit q->added( item );
533  else
534  emit q->removed( item );
535 }
536 
537 int KActionSelectorPrivate::insertionIndex( QListWidget *lb, KActionSelector::InsertionPolicy policy )
538 {
539  int index;
540  switch ( policy )
541  {
542  case KActionSelector::BelowCurrent:
543  index = lb->currentRow();
544  if ( index > -1 ) index += 1;
545  break;
546  case KActionSelector::AtTop:
547  index = 0;
548  break;
549  default:
550  index = -1;
551  }
552  return index;
553 }
554 
555 int KActionSelectorPrivate::selectedRowIndex( QListWidget *lb )
556 {
557  QList<QListWidgetItem *> list = lb->selectedItems();
558  if (list.isEmpty()) {
559  return -1;
560  }
561  return lb->row(list.at(0));
562 }
563 
564 //END Private Methods
565 #include "kactionselector.moc"
i18n
QString i18n(const char *text)
KActionSelector::setButtonWhatsThis
void setButtonWhatsThis(const QString &text, MoveButton button)
Sets the whatsthis help for button button to text.
Definition: kactionselector.cpp:242
KActionSelector::setButtonsEnabled
void setButtonsEnabled()
Sets the enabled state of all moving buttons to reflect the current options.
Definition: kactionselector.cpp:263
KActionSelector::BelowCurrent
Definition: kactionselector.h:128
KActionSelector::keyPressEvent
void keyPressEvent(QKeyEvent *)
Reimplamented for internal reasons.
Definition: kactionselector.cpp:368
KActionSelector::KActionSelector
KActionSelector(QWidget *parent=0)
Definition: kactionselector.cpp:82
kdebug.h
KActionSelector::setAvailableInsertionPolicy
void setAvailableInsertionPolicy(InsertionPolicy policy)
Sets the insertion policy for the available listbox.
Definition: kactionselector.cpp:321
KActionSelector::InsertionPolicy
InsertionPolicy
This enum defines policies for where to insert moved items in a listbox.
Definition: kactionselector.h:127
QWidget
QListWidget
KActionSelector::polish
void polish()
Emitted when an item is moved to the &quot;selected&quot; listbox.
Definition: kactionselector.cpp:360
QString
KActionSelector::moveOnDoubleClick
bool moveOnDoubleClick() const
QObject
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
klocale.h
KActionSelector::setButtonIconSet
void setButtonIconSet(const QIcon &iconset, MoveButton button)
Sets the iconset for button button to iconset.
Definition: kactionselector.cpp:196
KActionSelector::ButtonDown
Definition: kactionselector.h:112
kactionselector.h
KActionSelector::setAvailableLabel
void setAvailableLabel(const QString &text)
Sets the label for the available items listbox to text.
Definition: kactionselector.cpp:301
KActionSelector::availableListWidget
QListWidget * availableListWidget() const
Definition: kactionselector.cpp:161
KActionSelector::setMoveOnDoubleClick
void setMoveOnDoubleClick(bool enable)
Sets moveOnDoubleClick to enable.
Definition: kactionselector.cpp:281
KActionSelector::setKeyboardEnabled
void setKeyboardEnabled(bool enable)
Sets the keyboard enabled depending on enable.
Definition: kactionselector.cpp:291
KActionSelector::ButtonUp
Definition: kactionselector.h:111
KActionSelector::setSelectedInsertionPolicy
void setSelectedInsertionPolicy(InsertionPolicy policy)
Sets the insertion policy for the selected listbox.
Definition: kactionselector.cpp:331
KActionSelector::setButtonIcon
void setButtonIcon(const QString &icon, MoveButton button)
Sets the pixmap of the button button to icon.
Definition: kactionselector.cpp:171
KActionSelector::setShowUpDownButtons
void setShowUpDownButtons(bool show)
Sets whether the Up and Down buttons should be displayed according to show.
Definition: kactionselector.cpp:341
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:40
KActionSelector::ButtonRemove
Definition: kactionselector.h:110
KActionSelector::selectedInsertionPolicy
InsertionPolicy selectedInsertionPolicy() const
KActionSelector::setButtonTooltip
void setButtonTooltip(const QString &tip, MoveButton button)
Sets the tooltip for the button button to tip.
Definition: kactionselector.cpp:217
KActionSelector::availableInsertionPolicy
InsertionPolicy availableInsertionPolicy() const
KActionSelector::Sorted
Definition: kactionselector.h:129
KActionSelector::selectedLabel
QString selectedLabel() const
KActionSelector::keyboardEnabled
bool keyboardEnabled() const
KActionSelector::selectedListWidget
QListWidget * selectedListWidget() const
Definition: kactionselector.cpp:166
KActionSelector::AtTop
Definition: kactionselector.h:130
KActionSelector::eventFilter
bool eventFilter(QObject *, QEvent *)
Reimplemented for internal reasons.
Definition: kactionselector.cpp:394
QLabel
KActionSelector::showUpDownButtons
bool showUpDownButtons() const
KActionSelector::availableLabel
QString availableLabel() const
QToolButton
KActionSelector::~KActionSelector
~KActionSelector()
Definition: kactionselector.cpp:152
kicon.h
KActionSelector
A widget for selecting and arranging actions/objects.
Definition: kactionselector.h:80
KActionSelector::setSelectedLabel
void setSelectedLabel(const QString &text)
Sets the label for the selected items listbox to text.
Definition: kactionselector.cpp:311
KActionSelector::ButtonAdd
Definition: kactionselector.h:109
KActionSelector::MoveButton
MoveButton
This enum indentifies the moving buttons.
Definition: kactionselector.h:108
QList
This file is part of the KDE documentation.
Documentation copyright © 1996-2017 The KDE developers.
Generated on Sat Feb 25 2017 06:45:27 by doxygen 1.8.5 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

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

kdelibs-4.10.5 API Reference

Skip menu "kdelibs-4.10.5 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
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