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

liblancelot

  • sources
  • kde-4.14
  • workspace
  • kdeplasma-addons
  • libs
  • lancelot
  • widgets
PopupList.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009, 2010 Ivan Cukic <ivan.cukic(at)kde.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser/Library General Public License version 2,
6  * or (at your option) any later version, as published by the Free
7  * Software Foundation
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser/Library General Public License for more details
13  *
14  * You should have received a copy of the GNU Lesser/Library General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19 
20 #include "PopupList.h"
21 #include "PopupList_p.h"
22 
23 #include <QApplication>
24 #include <QDesktopWidget>
25 
26 #include <Plasma/Theme>
27 
28 #include <KMessageBox>
29 // #include <KWindowSystem>
30 
31 #define MINIMUM_ITEM_HEIGHT 24
32 #define PREFERRED_ITEM_HEIGHT 32
33 #define MAXIMUM_ITEM_HEIGHT 32
34 #define ICON_SIZE QSize(24, 24)
35 #define MENU_WIDTH 100
36 #define POP_BORDER_OFFSET 16
37 #define POP_MINIMUM_OFFSET 64
38 
39 namespace Lancelot {
40 
41 PopupListMarginCache * PopupListMarginCache::m_instance = NULL;
42 
43 PopupListMarginCache::PopupListMarginCache()
44  : m_width(-1), m_height(-1)
45 {
46 }
47 
48 PopupListMarginCache * PopupListMarginCache::self()
49 {
50  if (!m_instance) {
51  m_instance = new PopupListMarginCache();
52  connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
53  m_instance, SLOT(plasmaThemeChanged()));
54  }
55  return m_instance;
56 }
57 
58 int PopupListMarginCache::width()
59 {
60  if (m_width == -1) {
61  updateSizes();
62  }
63  return m_width;
64 }
65 
66 int PopupListMarginCache::height()
67 {
68  if (m_height == -1) {
69  updateSizes();
70  }
71  return m_height;
72 }
73 
74 void PopupListMarginCache::plasmaThemeChanged()
75 {
76  m_width = m_height = -1;
77 }
78 
79 void PopupListMarginCache::updateSizes()
80 {
81  Plasma::FrameSvg * bgsvg = new Plasma::FrameSvg(this);
82  bgsvg->setImagePath("dialogs/background");
83 
84  m_width = bgsvg->marginSize(Plasma::LeftMargin)
85  + bgsvg->marginSize(Plasma::RightMargin) + 4;
86  m_height = bgsvg->marginSize(Plasma::TopMargin)
87  + bgsvg->marginSize(Plasma::BottomMargin) + 4;
88 }
89 
90 PopupList::Private::Private(PopupList * parent)
91  : listModel(NULL),
92  treeModel(NULL),
93  openAction(PopupList::PopupNew),
94  closeTimeout(1000),
95  child(NULL),
96  parentList(NULL),
97  q(parent),
98  hovered(false)
99 {
100  scene = new QGraphicsScene();
101  list = new ActionListView();
102 
103  scene->addItem(list);
104  parent->setGraphicsWidget(list);
105  parent->resize(MENU_WIDTH, 384);
106 
107  list->setShowsExtendersOutside(false);
108  list->setGroupByName("PopupList");
109  list->setItemsGroup(Global::self()
110  ->group("PopupList-Items"));
111  list->setCategoriesGroup(Global::self()
112  ->group("PopupList-Categories"));
113 
114  list->setItemHeight(MINIMUM_ITEM_HEIGHT, Qt::MinimumSize);
115  list->setItemHeight(PREFERRED_ITEM_HEIGHT, Qt::PreferredSize);
116  list->setItemHeight(MAXIMUM_ITEM_HEIGHT, Qt::MaximumSize);
117 
118  list->setCategoryHeight(MINIMUM_ITEM_HEIGHT, Qt::MinimumSize);
119  list->setCategoryHeight(PREFERRED_ITEM_HEIGHT, Qt::PreferredSize);
120  list->setCategoryHeight(MAXIMUM_ITEM_HEIGHT, Qt::MaximumSize);
121 
122  list->setItemIconSize(ICON_SIZE);
123  list->setCategoryIconSize(ICON_SIZE);
124 
125 }
126 
127 void PopupList::Private::connectSignals()
128 {
129  connect(list->list()->itemFactory(), SIGNAL(updated()),
130  q, SLOT(updateSize()));
131  connect(list->list()->itemFactory(), SIGNAL(itemInserted(int)),
132  q, SLOT(updateSize()));
133  connect(list->list()->itemFactory(), SIGNAL(itemDeleted(int)),
134  q, SLOT(updateSize()));
135  connect(list->list()->itemFactory(), SIGNAL(itemAltered(int)),
136  q, SLOT(updateSize()));
137  connect(list->list()->itemFactory(), SIGNAL(activated(int)),
138  this, SLOT(listItemActivated(int)));
139 }
140 
141 PopupList::Private::~Private()
142 {
143  delete list;
144  delete scene;
145 }
146 
147 void PopupList::Private::listItemActivated(int index)
148 {
149  if (treeModel && treeModel->isCategory(index)) {
150  switch (openAction) {
151  case OpenInside:
152  list->setModel(treeModel->child(index));
153  break;
154  case PopupNew:
155  if (!child) {
156  child = new PopupList(q);
157  }
158  child->setModel(treeModel->child(index));
159  child->exec(QCursor::pos(), q);
160  break;
161  default:
162  break;
163  // nothing
164  }
165  } else {
166  hidePopupAndParents();
167  }
168 
169  emit q->activated(index);
170 }
171 
172 void PopupList::Private::hidePopupAndParents()
173 {
174  PopupList * list = q;
175 
176  while (list) {
177  list->hide();
178  list = list->parentList();
179  }
180 }
181 
182 PopupList::PopupList(QWidget * parent, Qt::WindowFlags f)
183  : Plasma::Dialog(parent, f),
184  d(new Private(this))
185 {
186  setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
187  d->list->setDisplayMode(ActionListView::SingleLineNameFirst);
188 
189  d->animation = new QPropertyAnimation(this, "pos", this);
190  d->animation->setEasingCurve(QEasingCurve::InOutQuad);
191  d->animation->setDuration(250);
192 }
193 
194 PopupList::~PopupList()
195 {
196  delete d;
197 }
198 
199 void PopupList::setModel(ActionListModel * model)
200 {
201  if (!model) {
202  return;
203  }
204 
205  if (d->child) {
206  d->child->hide();
207  }
208 
209  d->treeModel = dynamic_cast < ActionTreeModel * > (model);
210 
211  if (!d->treeModel) {
212  d->listModel = model;
213  d->list->setCategoriesGroup(Global::self()
214  ->group("PopupList-CategoriesPass"));
215  } else {
216  d->listModel = NULL;
217  d->list->setCategoriesActivable(true);
218  d->list->setCategoriesGroup(Global::self()
219  ->group("PopupList-CategoriesPass"));
220  }
221 
222  d->list->setModel(model);
223  d->connectSignals();
224 }
225 
226 void PopupList::showEvent(QShowEvent * event)
227 {
228  Plasma::Dialog::showEvent(event);
229  d->list->setFocus();
230  d->timer.stop();
231 }
232 
233 // void PopupList::show()
234 // {
235 // Plasma::Dialog::show();
236 //
237 // KWindowSystem::forceActiveWindow(winId());
238 // }
239 
240 void PopupList::hideEvent(QHideEvent * event)
241 {
242  Plasma::Dialog::hideEvent(event);
243 
244  if (d->child) {
245  d->child->hide();
246  }
247 
248  if (parentList()) {
249  if (!parentList()->d->hovered) {
250  parentList()->close();
251  }
252  }
253 }
254 
255 void PopupList::setCloseTimeout(int timeout)
256 {
257  d->closeTimeout = timeout;
258 }
259 
260 int PopupList::closeTimeout() const
261 {
262  return d->closeTimeout;
263 }
264 
265 PopupList::SublevelOpenAction PopupList::sublevelOpenAction() const
266 {
267  return d->openAction;
268 }
269 
270 void PopupList::setSublevelOpenAction(SublevelOpenAction action)
271 {
272  d->openAction = action;
273 }
274 
275 void PopupList::enterEvent(QEvent * event)
276 {
277  d->timer.stop();
278  Plasma::Dialog::enterEvent(event);
279 
280  d->hovered = true;
281 }
282 
283 void PopupList::leaveEvent(QEvent * event)
284 {
285  if (d->closeTimeout) {
286  d->timer.start(d->closeTimeout, this);
287  }
288  Plasma::Dialog::leaveEvent(event);
289 
290  d->hovered = false;
291 }
292 
293 void PopupList::timerEvent(QTimerEvent * event)
294 {
295  if (d->timer.timerId() == event->timerId()) {
296  if (!d->child || d->child->isHidden()) {
297  close();
298 
299  d->timer.stop();
300  }
301  }
302  Plasma::Dialog::timerEvent(event);
303 }
304 
305 void PopupList::updateSize()
306 {
307  qreal width = d->list->preferredWidth();
308  if (width < MENU_WIDTH) {
309  width = MENU_WIDTH;
310  }
311 
312  qreal height =
313  (d->list->list()->itemFactory()->itemCount()) * PREFERRED_ITEM_HEIGHT;
314  d->list->resize(width, height);
315 
316  resize(width + PopupListMarginCache::self()->width(),
317  height + PopupListMarginCache::self()->height());
318 }
319 
320 void PopupList::Private::prepareToShow()
321 {
322  q->updateSize();
323  timer.stop();
324 }
325 
326 void PopupList::exec(const QPoint & p)
327 {
328  d->prepareToShow();
329 
330  d->parentList = NULL;
331 
332  QRect g = geometry();
333  g.moveTopLeft(p);
334 
335  QRect screen = QApplication::desktop()->screenGeometry(
336  QApplication::desktop()->screenNumber(p)
337  );
338 
339  if (g.right() > screen.right()) {
340  g.moveRight(screen.right());
341  } else if (g.left() < screen.left()) {
342  g.moveLeft(screen.left());
343  }
344 
345  if (g.bottom() > screen.bottom()) {
346  g.moveBottom(screen.bottom());
347  } else if (g.top() < screen.top()) {
348  g.moveTop(screen.top());
349  }
350 
351  moveTo(g.topLeft());
352 
353  show();
354 }
355 
356 void PopupList::exec(const QPoint & p, PopupList * parent)
357 {
358  d->prepareToShow();
359 
360  d->parentList = parent;
361 
362  QRect selfGeometry = geometry();
363  selfGeometry.moveTopLeft(p);
364 
365  QRect screenGeometry = QApplication::desktop()->screenGeometry(
366  QApplication::desktop()->screenNumber(p)
367  );
368 
369  QRect rootParentGeometry;
370  int numberOfParentLists = 0;
371 
372  PopupList * list = this;
373 
374  while (list->parentList()) {
375  list = list->parentList();
376  numberOfParentLists++;
377  }
378 
379  rootParentGeometry = list->geometry();
380 
381  // Moving...
382  selfGeometry.moveLeft(rootParentGeometry.right() - POP_BORDER_OFFSET);
383  if (selfGeometry.right() > screenGeometry.right()) {
384  selfGeometry.moveRight(screenGeometry.right());
385 
386  if (selfGeometry.left() - rootParentGeometry.left() <
387  numberOfParentLists * POP_MINIMUM_OFFSET) {
388  rootParentGeometry.moveLeft(selfGeometry.left()
389  - numberOfParentLists * POP_MINIMUM_OFFSET);
390  }
391  }
392 
393  if (selfGeometry.bottom() > screenGeometry.bottom()) {
394  selfGeometry.moveBottom(screenGeometry.bottom());
395  } else if (selfGeometry.top() < screenGeometry.top()) {
396  selfGeometry.moveTop(screenGeometry.top());
397  }
398 
399  moveTo(selfGeometry.topLeft());
400 
401  list = this;
402 
403  int shift = (selfGeometry.left() - rootParentGeometry.left())
404  / numberOfParentLists;
405  int left = selfGeometry.left();
406 
407  while (list->parentList()) {
408  list = list->parentList();
409 
410  QPoint parentPosition = list->pos();
411 
412  left -= shift;
413  parentPosition.setX(left);
414  list->moveTo(parentPosition);
415 
416  }
417 
418  show();
419 }
420 
421 void PopupList::moveTo(const QPoint & to)
422 {
423  if (!isVisible() ||
424  !(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
425  move(to);
426  return;
427  }
428 
429  if (d->animation->state() == QAbstractAnimation::Running) {
430  d->animation->stop();
431  }
432 
433  d->animation->setEndValue(to);
434  d->animation->start();
435 }
436 
437 bool PopupList::eventFilter(QObject * object, QEvent * event)
438 {
439  if (event->type() == QEvent::KeyPress) {
440  QKeyEvent * keyEvent = static_cast<QKeyEvent *>(event);
441  if (keyEvent->key() == Qt::Key_Escape) {
442  close();
443  }
444  }
445  return Plasma::Dialog::eventFilter(object, event);
446 }
447 
448 PopupList * PopupList::parentList() const
449 {
450  return d->parentList;
451 }
452 
453 } // namespace Lancelot
454 
QHideEvent
MENU_WIDTH
#define MENU_WIDTH
Definition: PopupList.cpp:35
QRect::moveBottom
void moveBottom(int y)
QGraphicsLayoutItem::preferredWidth
qreal preferredWidth() const
Lancelot::Widget::setGroupByName
virtual void setGroupByName(const QString &groupName)
Sets this widget's group by group name.
Definition: Widget.cpp:134
QEvent
QWidget
Lancelot::PopupList::Private::listModel
ActionListModel * listModel
Definition: PopupList_p.h:67
Lancelot::PopupList::setModel
void setModel(ActionListModel *model)
Sets the model for the popup list.
Definition: PopupList.cpp:199
QDesktopWidget::screenGeometry
const QRect screenGeometry(int screen) const
QEvent::type
Type type() const
Lancelot::PopupList::SublevelOpenAction
SublevelOpenAction
This enum represents behaviour patterns when an item with a submenu is activated. ...
Definition: PopupList.h:52
QGraphicsScene
Lancelot::PopupList::Private::connectSignals
void connectSignals()
Definition: PopupList.cpp:127
QVariantAnimation::setEasingCurve
void setEasingCurve(const QEasingCurve &easing)
PopupList_p.h
QRect::right
int right() const
Lancelot::ActionListModel
This class represents a list data model.
Definition: ActionListModel.h:37
QBasicTimer::stop
void stop()
Lancelot::Global::self
static Global * self()
Definition: Global.cpp:307
QBasicTimer::start
void start(int msec, QObject *object)
Lancelot::PopupList::~PopupList
virtual ~PopupList()
Destroys Lancelot::PopupList.
Definition: PopupList.cpp:194
Lancelot::ActionListView::setItemHeight
void setItemHeight(int height, Qt::SizeHint which)
Definition: ActionListView.cpp:938
Lancelot::PopupList::hideEvent
L_Override void hideEvent(QHideEvent *event)
Definition: PopupList.cpp:240
QBasicTimer::timerId
int timerId() const
Lancelot::PopupList::Private::Private
Private(PopupList *parent)
Definition: PopupList.cpp:90
Lancelot::ActionListView::setCategoriesActivable
void setCategoriesActivable(bool value)
Definition: ActionListView.cpp:1168
Lancelot::PopupList::Private::treeModel
ActionTreeModel * treeModel
Definition: PopupList_p.h:68
Lancelot::PopupList::Private
Definition: PopupList_p.h:58
Lancelot::ActionListView::setShowsExtendersOutside
void setShowsExtendersOutside(bool value)
Definition: ActionListView.cpp:1002
PopupList.h
QPoint
Lancelot::ActionListView
Definition: ActionListView.h:33
Lancelot::PopupList::Private::animation
QPropertyAnimation * animation
Definition: PopupList_p.h:79
QRect::moveTopLeft
void moveTopLeft(const QPoint &position)
Lancelot::ActionListView::setDisplayMode
void setDisplayMode(ItemDisplayMode mode)
Definition: ActionListView.cpp:1057
QRect::moveLeft
void moveLeft(int x)
Lancelot::ActionListView::setItemsGroup
void setItemsGroup(Group *group=NULL)
Definition: ActionListView.cpp:1075
Lancelot::PopupListMarginCache
Definition: PopupList_p.h:37
Lancelot::PopupList
The list that pops up in its own window.
Definition: PopupList.h:41
Lancelot::CustomListView::list
CustomList * list() const
Definition: CustomListView.cpp:352
QGraphicsWidget::resize
void resize(const QSizeF &size)
Lancelot::ActionListView::setCategoryIconSize
void setCategoryIconSize(QSize size)
Definition: ActionListView.cpp:986
QTimerEvent
QRect
Lancelot::ActionListView::setItemIconSize
void setItemIconSize(QSize size)
Definition: ActionListView.cpp:970
Lancelot::PopupList::Private::hidePopupAndParents
void hidePopupAndParents()
Definition: PopupList.cpp:172
Lancelot::PopupList::exec
void exec(const QPoint &p)
Pops out the list.
Definition: PopupList.cpp:326
POP_MINIMUM_OFFSET
#define POP_MINIMUM_OFFSET
Definition: PopupList.cpp:37
QAbstractAnimation::stop
void stop()
QPropertyAnimation
Lancelot::PopupList::Private::child
QPointer< PopupList > child
Definition: PopupList_p.h:75
QRect::top
int top() const
Lancelot::PopupList::Private::scene
QGraphicsScene * scene
Definition: PopupList_p.h:65
Lancelot::CustomListItemFactory::itemCount
virtual int itemCount() const =0
Lancelot::PopupList::sublevelOpenAction
SublevelOpenAction sublevelOpenAction() const
PREFERRED_ITEM_HEIGHT
#define PREFERRED_ITEM_HEIGHT
Definition: PopupList.cpp:32
QShowEvent
QObject
Lancelot::PopupList::leaveEvent
L_Override void leaveEvent(QEvent *event)
Definition: PopupList.cpp:283
Lancelot::PopupList::Private::parentList
PopupList * parentList
Definition: PopupList_p.h:76
QRect::left
int left() const
Lancelot::PopupList::moveTo
void moveTo(const QPoint &p)
Moves the list to the specified point.
Definition: PopupList.cpp:421
Lancelot::PopupList::updateSize
void updateSize()
Requests the PopupList to be resized depending on the number of items.
Definition: PopupList.cpp:305
Lancelot::PopupList::showEvent
L_Override void showEvent(QShowEvent *event)
Shows the widget.
Definition: PopupList.cpp:226
Lancelot::PopupList::Private::timer
QBasicTimer timer
Definition: PopupList_p.h:72
Lancelot::PopupList::Private::openAction
PopupList::SublevelOpenAction openAction
Definition: PopupList_p.h:70
MINIMUM_ITEM_HEIGHT
#define MINIMUM_ITEM_HEIGHT
Definition: PopupList.cpp:31
POP_BORDER_OFFSET
#define POP_BORDER_OFFSET
Definition: PopupList.cpp:36
ICON_SIZE
#define ICON_SIZE
Definition: PopupList.cpp:34
Lancelot::ActionListView::setCategoriesGroup
void setCategoriesGroup(Group *group=NULL)
Definition: ActionListView.cpp:1098
QRect::moveTop
void moveTop(int y)
Lancelot::PopupList::enterEvent
L_Override void enterEvent(QEvent *event)
Definition: PopupList.cpp:275
Lancelot::PopupList::Private::closeTimeout
int closeTimeout
Definition: PopupList_p.h:73
Lancelot::PopupList::Private::listItemActivated
void listItemActivated(int index)
Definition: PopupList.cpp:147
QKeyEvent::key
int key() const
Lancelot::PopupListMarginCache::plasmaThemeChanged
void plasmaThemeChanged()
Definition: PopupList.cpp:74
Lancelot::ActionTreeModel
Definition: ActionTreeModel.h:30
Lancelot::PopupList::OpenInside
Opens the sublist inside the current one.
Definition: PopupList.h:55
Lancelot::PopupList::Private::hovered
bool hovered
Definition: PopupList_p.h:80
Lancelot::PopupList::Private::prepareToShow
void prepareToShow()
Definition: PopupList.cpp:320
Lancelot::PopupList::Private::~Private
~Private()
Definition: PopupList.cpp:141
QKeyEvent
Lancelot::PopupList::eventFilter
L_Override bool eventFilter(QObject *object, QEvent *event)
Definition: PopupList.cpp:437
Lancelot::ActionListView::SingleLineNameFirst
Definition: ActionListView.h:51
Lancelot::PopupList::setSublevelOpenAction
void setSublevelOpenAction(SublevelOpenAction action)
Sets the action for opening a sublevel.
Definition: PopupList.cpp:270
QCursor::pos
QPoint pos()
Lancelot::PopupListMarginCache::self
static PopupListMarginCache * self()
Definition: PopupList.cpp:48
QApplication::desktop
QDesktopWidget * desktop()
QGraphicsItem::setFocus
void setFocus(Qt::FocusReason focusReason)
Lancelot::PopupListMarginCache::width
int width()
Definition: PopupList.cpp:58
Lancelot::CustomList::itemFactory
CustomListItemFactory * itemFactory() const
Definition: CustomListView.cpp:237
Lancelot::PopupListMarginCache::height
int height()
Definition: PopupList.cpp:66
Lancelot::PopupList::activated
void activated(int index)
QRect::bottom
int bottom() const
QRect::topLeft
QPoint topLeft() const
QVariantAnimation::setEndValue
void setEndValue(const QVariant &value)
QPoint::setX
void setX(int x)
QVariantAnimation::setDuration
void setDuration(int msecs)
Lancelot::PopupList::closeTimeout
int closeTimeout() const
Lancelot::PopupList::timerEvent
L_Override void timerEvent(QTimerEvent *event)
Definition: PopupList.cpp:293
Qt::WindowFlags
typedef WindowFlags
QAbstractAnimation::start
void start(QAbstractAnimation::DeletionPolicy policy)
QRect::moveRight
void moveRight(int x)
Lancelot::PopupList::PopupNew
Pops a new list.
Definition: PopupList.h:54
Lancelot::PopupList::Private::list
ActionListView * list
Definition: PopupList_p.h:64
Lancelot::PopupList::Private::q
PopupList * q
Definition: PopupList_p.h:77
QAbstractAnimation::state
state
QGraphicsScene::addItem
void addItem(QGraphicsItem *item)
Lancelot::PopupList::PopupList
PopupList(QWidget *parent=0, Qt::WindowFlags f=Qt::Window)
Creates a new Lancelot::PopupList.
Definition: PopupList.cpp:182
MAXIMUM_ITEM_HEIGHT
#define MAXIMUM_ITEM_HEIGHT
Definition: PopupList.cpp:33
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Lancelot::ActionListView::setModel
void setModel(ActionListModel *model)
Definition: ActionListView.cpp:910
Lancelot::ActionListView::setCategoryHeight
void setCategoryHeight(int height, Qt::SizeHint which)
Definition: ActionListView.cpp:954
Lancelot::PopupList::parentList
PopupList * parentList() const
Definition: PopupList.cpp:448
Lancelot::PopupList::setCloseTimeout
void setCloseTimeout(int timeout)
Sets the timer for auto-closing when the popup is not hovered.
Definition: PopupList.cpp:255
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:43:01 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

liblancelot

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

workspace API Reference

Skip menu "workspace API Reference"
  • kdeplasma-addons
  •       GroupingDesktop
  •     liblancelot

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