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

Plasma

  • sources
  • kde-4.12
  • kdelibs
  • 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 
41 namespace Plasma
42 {
43 
44 ExtenderGroup::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 
104 ExtenderGroup::~ExtenderGroup()
105 {
106  delete d;
107 }
108 
109 QList<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 
121 bool ExtenderGroup::autoHide() const
122 {
123  return d->autoHide;
124 }
125 
126 void 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 
138 bool ExtenderGroup::isAutoCollapse() const
139 {
140  return d->autoCollapse;
141 }
142 
143 void ExtenderGroup::setAutoCollapse(bool collapse)
144 {
145  d->autoCollapse = collapse;
146 }
147 
148 bool ExtenderGroup::isGroupCollapsed() const
149 {
150  return d->collapsed;
151 }
152 
153 void ExtenderGroup::setGroupCollapsed(bool collapsed)
154 {
155  if (collapsed) {
156  collapseGroup();
157  } else {
158  expandGroup();
159  }
160 }
161 
162 void 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 
190 void 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 
216 void ExtenderGroup::resizeEvent(QGraphicsSceneResizeEvent *event)
217 {
218  ExtenderItem::resizeEvent(event);
219 }
220 
221 bool 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 
235 void ExtenderGroup::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
236 {
237  if (event->mimeData()->hasFormat(ExtenderItemMimeData::mimeType())) {
238  event->accept();
239 
240  dragMoveEvent(event);
241  }
242 }
243 
244 void 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 
284 void 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 
300 void 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 
311 ExtenderGroupPrivate::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 
321 ExtenderGroupPrivate::~ExtenderGroupPrivate()
322 {
323 }
324 
325 void 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 
350 void 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 
369 void 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 
378 int 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"
Plasma::ExtenderItem::extender
Extender extender
Definition: extenderitem.h:87
Plasma::ExtenderItem::isDetached
bool isDetached() const
Definition: extenderitem.cpp:531
Plasma::Vertical
The applet is constrained horizontally, but can expand vertically.
Definition: plasma.h:77
Plasma::ExtenderGroup::expandGroup
void expandGroup()
Expands this group to show all ExtenderItems that are contained in this group.
Definition: extendergroup.cpp:162
Plasma::Extender
Extends applets to allow detachable parts.
Definition: extender.h:65
Plasma::ExtenderItem::setGroup
void setGroup(ExtenderGroup *group)
Definition: extenderitem.cpp:442
Plasma::ExtenderItem::setCollapsed
void setCollapsed(bool collapsed)
Collapse or expand the extender item.
Definition: extenderitem.cpp:602
Plasma::ExtenderGroup::items
QList< ExtenderItem * > items() const
Definition: extendergroup.cpp:109
Plasma::ExtenderItem::name
QString name() const
Plasma::ExtenderItem::config
KConfigGroup config() const
fetch the configuration of this widget.
Definition: extenderitem.cpp:240
extender.h
Plasma::ExtenderItem::addAction
void addAction(const QString &name, QAction *action)
Definition: extenderitem.cpp:540
Plasma::ExtenderItem::resizeEvent
void resizeEvent(QGraphicsSceneResizeEvent *event)
Definition: extenderitem.cpp:660
Plasma::Extender::itemRemovedEvent
virtual void itemRemovedEvent(ExtenderItem *item)
Get's called after an item has been removed from this extender.
Definition: extender.cpp:525
theme.h
Plasma::ExtenderGroup::autoHide
bool autoHide() const
QObject
Plasma::ExtenderItem::widget
QGraphicsItem * widget() const
Plasma::ExtenderItem::action
QAction * action(const QString &name) const
Definition: extenderitem.cpp:554
Plasma::ExtenderGroup::isGroupCollapsed
bool isGroupCollapsed() const
Definition: extendergroup.cpp:148
Plasma::ExtenderGroup::isAutoCollapse
bool isAutoCollapse() const
Definition: extendergroup.cpp:138
Plasma::ExtenderGroup::setAutoHide
void setAutoHide(bool autoHide)
Definition: extendergroup.cpp:126
Plasma::ExtenderItem::group
ExtenderGroup * group() const
Definition: extenderitem.cpp:483
Plasma::ExtenderGroup::setGroupCollapsed
void setGroupCollapsed(bool collapsed)
expands or collapses this group
Definition: extendergroup.cpp:153
applet.h
Plasma::ExtenderGroup::eventFilter
bool eventFilter(QObject *watched, QEvent *event)
Definition: extendergroup.cpp:221
Plasma::ExtenderGroup::resizeEvent
void resizeEvent(QGraphicsSceneResizeEvent *event)
Definition: extendergroup.cpp:216
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::ExtenderGroup::dragEnterEvent
void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
Definition: extendergroup.cpp:235
Plasma::ExtenderGroup::dragMoveEvent
void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
Definition: extendergroup.cpp:244
scrollwidget.h
Plasma::ExtenderGroup::dropEvent
void dropEvent(QGraphicsSceneDragDropEvent *event)
Definition: extendergroup.cpp:284
Plasma::ExtenderGroup::dragLeaveEvent
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
Definition: extendergroup.cpp:300
Plasma::ExtenderGroup::~ExtenderGroup
~ExtenderGroup()
Definition: extendergroup.cpp:104
Plasma::ExtenderGroup::ExtenderGroup
ExtenderGroup(Extender *parent, uint groupId=0)
Creates a group.
Definition: extendergroup.cpp:44
Plasma::Theme::defaultTheme
static Theme * defaultTheme()
Singleton pattern accessor.
Definition: theme.cpp:544
Plasma::ExtenderGroup
Allows for grouping of extender items.
Definition: extendergroup.h:50
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
extendergroup.h
Plasma::ExtenderItem
Provides detachable items for an Extender.
Definition: extenderitem.h:80
Plasma::Svg
A theme aware image-centric SVG class.
Definition: svg.h:56
Plasma::ExtenderItem::extender
Extender * extender() const
Plasma::ExtenderGroup::setAutoCollapse
void setAutoCollapse(bool collapse)
Definition: extendergroup.cpp:143
extenderitem.h
QGraphicsWidget
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:48:33 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

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