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

Plasma

  • plasma
  • extenders
extendergroup.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2009 by Rob Scheepmaker <r.scheepmaker@student.utwente.nl>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library 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 GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301 USA
18 */
19
20#include "extendergroup.h"
21
22#include <QAction>
23#include <QApplication>
24#include <QString>
25#include <QList>
26#include <QTimer>
27#include <QtGui/QGraphicsWidget>
28#include <QtGui/QGraphicsLinearLayout>
29#include <QtGui/QGraphicsSceneDragDropEvent>
30
31#include "applet.h"
32#include "extender.h"
33#include "extenderitem.h"
34#include "theme.h"
35#include "widgets/scrollwidget.h"
36
37#include "private/extender_p.h"
38#include "private/extendergroup_p.h"
39#include "private/extenderitemmimedata_p.h"
40
41namespace Plasma
42{
43
44ExtenderGroup::ExtenderGroup(Extender *parent, uint groupId)
45 : ExtenderItem(parent, groupId),
46 d(new ExtenderGroupPrivate(this))
47{
48 connect(extender(), SIGNAL(itemAttached(Plasma::ExtenderItem*)),
49 this, SLOT(addItemToGroup(Plasma::ExtenderItem*)));
50 connect(extender(), SIGNAL(itemDetached(Plasma::ExtenderItem*)),
51 this, SLOT(removeItemFromGroup(Plasma::ExtenderItem*)));
52
53 //this isn't actually connected to anything, we will just check if it's running or not
54 d->resizeTimer = new QTimer(this);
55 d->resizeTimer->setSingleShot(true);
56
57 config().writeEntry("isGroup", true);
58
59 setAcceptDrops(true);
60
61 QGraphicsLinearLayout *lay = static_cast<QGraphicsLinearLayout *>(layout());
62 d->childsWidget = new QGraphicsWidget(this);
63 d->childsWidget->installEventFilter(this);
64 d->layout = new QGraphicsLinearLayout(Qt::Vertical, d->childsWidget);
65 d->childsWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
66 lay->addItem(d->childsWidget);
67
68 QAction *expand = new QAction(this);
69 expand->setVisible(false);
70 expand->setToolTip(i18n("Show this group."));
71 connect(expand, SIGNAL(triggered()), this, SLOT(expandGroup()));
72 addAction("expand", expand);
73
74 QAction *collapse = new QAction(this);
75 collapse->setVisible(true);
76 collapse->setToolTip(i18n("Hide this group."));
77 connect(collapse, SIGNAL(triggered()), this, SLOT(collapseGroup()));
78 addAction("collapse", collapse);
79
80 d->themeChanged();
81
82 QString groupName;
83 foreach (ExtenderItem *item, extender()->attachedItems()) {
84 groupName = item->config().readEntry("group", "");
85 if (!groupName.isEmpty() && groupName == name()) {
86 item->setGroup(this);
87 }
88 }
89
90 if (items().isEmpty() && d->autoHide && !isDetached()) {
91 extender()->itemRemovedEvent(this);
92 hide();
93 }
94
95 if (!config().readEntry("groupCollapsed", true)) {
96 expandGroup();
97 }
98
99 connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
100 this, SLOT(themeChanged()));
101
102}
103
104ExtenderGroup::~ExtenderGroup()
105{
106 delete d;
107}
108
109QList<ExtenderItem*> ExtenderGroup::items() const
110{
111 QList<ExtenderItem*> result;
112 foreach (ExtenderItem *item, extender()->attachedItems()) {
113 if (item->group() == this) {
114 result.append(item);
115 }
116 }
117
118 return result;
119}
120
121bool ExtenderGroup::autoHide() const
122{
123 return d->autoHide;
124}
125
126void ExtenderGroup::setAutoHide(bool autoHide)
127{
128 d->autoHide = autoHide;
129 if (autoHide && items().isEmpty()) {
130 extender()->itemRemovedEvent(this);
131 hide();
132 } else if (!autoHide && !isVisible()) {
133 extender()->itemAddedEvent(this);
134 show();
135 }
136}
137
138bool ExtenderGroup::isAutoCollapse() const
139{
140 return d->autoCollapse;
141}
142
143void ExtenderGroup::setAutoCollapse(bool collapse)
144{
145 d->autoCollapse = collapse;
146}
147
148bool ExtenderGroup::isGroupCollapsed() const
149{
150 return d->collapsed;
151}
152
153void ExtenderGroup::setGroupCollapsed(bool collapsed)
154{
155 if (collapsed) {
156 collapseGroup();
157 } else {
158 expandGroup();
159 }
160}
161
162void ExtenderGroup::expandGroup()
163{
164 if (d->autoCollapse) {
165 setCollapsed(false);
166 }
167 if (d->collapsed == false) {
168 return;
169 }
170
171 d->collapsed = false;
172 config().writeEntry("groupCollapsed", d->collapsed);
173 action("collapse")->setVisible(true);
174 action("expand")->setVisible(false);
175
176 d->childsWidget->show();
177 static_cast<QGraphicsLinearLayout *>(layout())->addItem(d->childsWidget);
178 updateGeometry();
179
180 foreach (ExtenderItem *item, extender()->attachedItems()) {
181 if (item->group() == this) {
182 item->show();
183 extender()->itemAddedEvent(item);
184 }
185 }
186
187 //extender()->resize(extender()->effectiveSizeHint(Qt::PreferredSize));
188}
189
190void ExtenderGroup::collapseGroup()
191{
192 if (d->autoCollapse) {
193 setCollapsed(true);
194 }
195 if (d->collapsed == true) {
196 return;
197 }
198
199 d->collapsed = true;
200 config().writeEntry("groupCollapsed", d->collapsed);
201 action("collapse")->setVisible(false);
202 action("expand")->setVisible(true);
203
204 d->childsWidget->hide();
205 static_cast<QGraphicsLinearLayout *>(layout())->removeItem(d->childsWidget);
206 updateGeometry();
207
208 foreach (ExtenderItem *item, extender()->attachedItems()) {
209 if (item != this && item->group() == this) {
210 item->hide();
211 extender()->itemRemovedEvent(item);
212 }
213 }
214}
215
216void ExtenderGroup::resizeEvent(QGraphicsSceneResizeEvent *event)
217{
218 ExtenderItem::resizeEvent(event);
219}
220
221bool ExtenderGroup::eventFilter(QObject *watched, QEvent *event)
222{
223 if (watched == d->childsWidget && event->type() == QEvent::GraphicsSceneResize) {
224 static_cast<QGraphicsLayoutItem *>(extender()->d->scrollWidget)->updateGeometry();
225 if (!d->resizeTimer->isActive()) {
226 static_cast<QGraphicsLayoutItem *>(extender())->updateGeometry();
227 extender()->d->adjustSize();
228 d->resizeTimer->start(0);
229 }
230 }
231
232 return ExtenderItem::eventFilter(watched, event);
233}
234
235void ExtenderGroup::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
236{
237 if (event->mimeData()->hasFormat(ExtenderItemMimeData::mimeType())) {
238 event->accept();
239
240 dragMoveEvent(event);
241 }
242}
243
244void ExtenderGroup::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
245{
246 if (event->mimeData()->hasFormat(ExtenderItemMimeData::mimeType())) {
247 const ExtenderItemMimeData *mimeData =
248 qobject_cast<const ExtenderItemMimeData*>(event->mimeData());
249
250 if (mimeData) {
251 QPointF pos(event->pos());
252 if (d->spacerWidget && d->spacerWidget->geometry().contains(pos)) {
253 return;
254 }
255
256 //Make sure we remove any spacer that might already be in the layout.
257 if (d->spacerWidget) {
258 d->layout->removeItem(d->spacerWidget);
259 }
260
261 int insertIndex = d->insertIndexFromPos(pos);
262
263 //Create a widget that functions as spacer, and add that to the layout.
264 if (!d->spacerWidget) {
265 Spacer *widget = new Spacer(this);
266 ExtenderItem *item = mimeData->extenderItem();
267 qreal left, top, right, bottom;
268 extender()->d->background->getMargins(left, top, right, bottom);
269 widget->setMargins(left, 4, right, 4);
270
271 widget->setMinimumSize(item->minimumSize());
272 widget->setPreferredSize(item->preferredSize());
273 widget->setMaximumSize(item->maximumSize());
274 widget->setSizePolicy(item->sizePolicy());
275 d->spacerWidget = widget;
276 }
277 d->layout->insertItem(insertIndex, d->spacerWidget);
278
279 extender()->d->setPositionFromDragPosition(event->scenePos());
280 }
281 }
282}
283
284void ExtenderGroup::dropEvent(QGraphicsSceneDragDropEvent *event)
285{
286 if (event->mimeData()->hasFormat(ExtenderItemMimeData::mimeType())) {
287 const ExtenderItemMimeData *mimeData =
288 qobject_cast<const ExtenderItemMimeData*>(event->mimeData());
289
290 if (mimeData) {
291 mimeData->extenderItem()->setGroup(this, event->pos());
292 QApplication::restoreOverrideCursor();
293 d->layout->removeItem(d->spacerWidget);
294 d->spacerWidget->deleteLater();
295 d->spacerWidget = 0;
296 }
297 }
298}
299
300void ExtenderGroup::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
301{
302 if (event->mimeData()->hasFormat(ExtenderItemMimeData::mimeType())) {
303 if (d->spacerWidget) {
304 d->layout->removeItem(d->spacerWidget);
305 d->spacerWidget->deleteLater();
306 d->spacerWidget = 0;
307 }
308 }
309}
310
311ExtenderGroupPrivate::ExtenderGroupPrivate(ExtenderGroup *group)
312 : q(group),
313 spacerWidget(0),
314 svg(new Svg(group)),
315 collapsed(false),
316 autoHide(true),
317 autoCollapse(false)
318{
319}
320
321ExtenderGroupPrivate::~ExtenderGroupPrivate()
322{
323}
324
325void ExtenderGroupPrivate::addItemToGroup(Plasma::ExtenderItem *item, const QPointF &pos)
326{
327 if (item->group() == q) {
328 item->setParentItem(childsWidget);
329 item->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
330 layout->insertItem(insertIndexFromPos(pos), item);
331 layout->activate();
332
333 if (!q->isVisible() && !q->items().isEmpty()) {
334 q->extender()->itemAddedEvent(q);
335 q->show();
336 }
337 childsWidget->setVisible(!q->isGroupCollapsed());
338
339 if (!q->isGroupCollapsed()) {
340 layout->updateGeometry();
341 static_cast<QGraphicsLayoutItem *>(q)->updateGeometry();
342 static_cast<QGraphicsLayoutItem *>(childsWidget)->updateGeometry();
343 static_cast<QGraphicsLayoutItem *>(q->extender()->d->scrollWidget)->updateGeometry();
344 }
345
346 q->extender()->d->adjustSize();
347 }
348}
349
350void ExtenderGroupPrivate::removeItemFromGroup(Plasma::ExtenderItem *item)
351{
352 if (item->group() == q) {
353 if (q->items().isEmpty() && autoHide && !q->isDetached()) {
354 q->extender()->itemRemovedEvent(q);
355 q->hide();
356 }
357 layout->removeItem(item);
358 item->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
359
360 layout->updateGeometry();
361 static_cast<QGraphicsLayoutItem *>(q)->updateGeometry();
362 static_cast<QGraphicsLayoutItem *>(childsWidget)->updateGeometry();
363 static_cast<QGraphicsLayoutItem *>(q->extender()->d->scrollWidget)->updateGeometry();
364
365 q->extender()->d->adjustSize();
366 }
367}
368
369void ExtenderGroupPrivate::themeChanged()
370{
371 svg->setImagePath("widgets/configuration-icons");
372 svg->resize();
373
374 q->action("expand")->setIcon(QIcon(svg->pixmap("restore")));
375 q->action("collapse")->setIcon(QIcon(svg->pixmap("collapse")));
376}
377
378int ExtenderGroupPrivate::insertIndexFromPos(const QPointF &pos) const
379{
380 int insertIndex = -1;
381
382 //XXX: duplicated from panel
383 if (pos != QPointF(-1, -1)) {
384 for (int i = 0; i < layout->count(); ++i) {
385 QRectF siblingGeometry = layout->itemAt(i)->geometry();
386 qreal middle = (siblingGeometry.top() + siblingGeometry.bottom()) / 2.0;
387 if (pos.y() < middle) {
388 insertIndex = i;
389 break;
390 } else if (pos.y() <= siblingGeometry.bottom()) {
391 insertIndex = i + 1;
392 break;
393 }
394 }
395 }
396
397 return insertIndex;
398}
399
400} // Plasma namespace
401
402#include "extendergroup.moc"
applet.h
Plasma::ExtenderGroup
Allows for grouping of extender items.
Definition: extendergroup.h:51
Plasma::ExtenderGroup::items
QList< ExtenderItem * > items() const
Definition: extendergroup.cpp:109
Plasma::ExtenderGroup::expandGroup
void expandGroup()
Expands this group to show all ExtenderItems that are contained in this group.
Definition: extendergroup.cpp:162
Plasma::ExtenderGroup::autoHide
bool autoHide
Definition: extendergroup.h:53
Plasma::ExtenderGroup::collapseGroup
void collapseGroup()
Collapses this group to hide all ExtenderItems that are contained in this group, and shows the summar...
Definition: extendergroup.cpp:190
Plasma::ExtenderGroup::dragMoveEvent
void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
Definition: extendergroup.cpp:244
Plasma::ExtenderItem
Provides detachable items for an Extender.
Definition: extenderitem.h:81
Plasma::ExtenderItem::widget
QGraphicsItem * widget
Definition: extenderitem.h:83
Plasma::ExtenderItem::isDetached
bool isDetached() const
Definition: extenderitem.cpp:531
Plasma::ExtenderItem::collapsed
bool collapsed
Definition: extenderitem.h:88
Plasma::ExtenderItem::name
QString name
Definition: extenderitem.h:85
Plasma::ExtenderItem::config
KConfigGroup config() const
fetch the configuration of this widget.
Definition: extenderitem.cpp:240
Plasma::ExtenderItem::addAction
void addAction(const QString &name, QAction *action)
Definition: extenderitem.cpp:540
Plasma::ExtenderItem::action
QAction * action(const QString &name) const
Definition: extenderitem.cpp:554
Plasma::ExtenderItem::group
ExtenderGroup * group() const
Definition: extenderitem.cpp:483
Plasma::ExtenderItem::setGroup
void setGroup(ExtenderGroup *group)
Definition: extenderitem.cpp:442
Plasma::ExtenderItem::resizeEvent
void resizeEvent(QGraphicsSceneResizeEvent *event)
Definition: extenderitem.cpp:660
Plasma::ExtenderItem::setCollapsed
void setCollapsed(bool collapsed)
Collapse or expand the extender item.
Definition: extenderitem.cpp:602
Plasma::ExtenderItem::extender
Extender * extender
Definition: extenderitem.h:87
Plasma::Extender
Extends applets to allow detachable parts.
Definition: extender.h:66
Plasma::Extender::itemAddedEvent
virtual void itemAddedEvent(ExtenderItem *item, const QPointF &pos=QPointF(-1, -1))
Get's called after an item has been added to this extender.
Definition: extender.cpp:490
Plasma::Extender::itemRemovedEvent
virtual void itemRemovedEvent(ExtenderItem *item)
Get's called after an item has been removed from this extender.
Definition: extender.cpp:525
Plasma::Svg
A theme aware image-centric SVG class.
Definition: svg.h:57
Plasma::Theme::defaultTheme
static Theme * defaultTheme()
Singleton pattern accessor.
Definition: theme.cpp:544
QGraphicsWidget
QObject
extender.h
extendergroup.h
extenderitem.h
Plasma
Namespace for everything in libplasma.
Definition: abstractdialogmanager.cpp:25
scrollwidget.h
theme.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Plasma

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

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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