• 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
CustomListView.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007, 2008, 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 "CustomListView.h"
21 
22 #include <KIcon>
23 #include <KDebug>
24 
25 namespace Lancelot {
26 
27 //> CustomListItem interface
28 CustomListItem::CustomListItem()
29 {
30 }
31 
32 CustomListItem::~CustomListItem()
33 {
34 }
35 //<
36 
37 //> CustomListItemFactory
38 CustomListItemFactory::CustomListItemFactory()
39 {
40 }
41 
42 CustomListItemFactory::~CustomListItemFactory()
43 {
44 }
45 //<
46 
47 //> CustomList
48 class CustomList::Private {
49 public:
50  Private(CustomList * parent = NULL, CustomListItemFactory * f = NULL) //>
51  : q(parent), factory(f), scale(-1), sizeUpdate(false)
52  {
53  margins[Plasma::TopMargin] = 0;
54  margins[Plasma::LeftMargin] = 0;
55  margins[Plasma::RightMargin] = 0;
56  margins[Plasma::BottomMargin] = 0;
57  } //<
58 
59  #define returnIfFactoryNotSet if (!factory) return
60 
61  QGraphicsWidget * itemForIndex(int position) //>
62  {
63  QGraphicsWidget * item = dynamic_cast < QGraphicsWidget * >
64  (factory->itemForIndex(position));
65 
66  if (item) {
67  item->setParentItem(q);
68  }
69  return item;
70  } //<
71 
72  void positionItems(int startPosition = 0) //>
73  {
74  returnIfFactoryNotSet;
75 
76  if (startPosition < 0 || startPosition > factory->itemCount()) {
77  return;
78  }
79 
80  qreal top(margins[Plasma::TopMargin]);
81 
82  if (startPosition != 0) {
83  top = itemForIndex(startPosition - 1)->geometry().bottom();
84  }
85 
86  QGraphicsWidget * item;
87  for (int i = startPosition; i < factory->itemCount(); i++) {
88  item = itemForIndex(i);
89 
90  int height = (int) (
91  (scale > 0) ?
92  (item->maximumHeight() * scale) :
93  (item->preferredHeight())
94  );
95 
96  item->setGeometry(
97  margins[Plasma::LeftMargin], top,
98  viewport.width() - margins[Plasma::LeftMargin]
99  - margins[Plasma::RightMargin],
100  height
101  );
102  top += height;
103  }
104 
105  viewportOriginUpdated();
106  } //<
107 
108  void updateSizeInfo() //>
109  {
110  QMap < Qt::SizeHint, int > osizes = sizes;
111 
112  sizes[Qt::MinimumSize] = 0;
113  sizes[Qt::PreferredSize] = 0;
114  sizes[Qt::MaximumSize] = 0;
115 
116  returnIfFactoryNotSet;
117 
118  for (int i = 0; i < factory->itemCount(); i++) {
119  sizes[Qt::MinimumSize] +=
120  factory->itemHeight(i, Qt::MinimumSize);
121  sizes[Qt::PreferredSize] +=
122  factory->itemHeight(i, Qt::PreferredSize);
123  sizes[Qt::MaximumSize] +=
124  factory->itemHeight(i, Qt::MaximumSize);
125  }
126 
127  if (q && q->scrollPane() && osizes != sizes) {
128  sizeUpdate = true;
129  q->scrollPane()->scrollableWidgetSizeUpdateNeeded();
130  sizeUpdate = false;
131  }
132 
133  q->setPreferredHeight(sizes[Qt::PreferredSize]);
134  q->setMinimumHeight(sizes[Qt::MinimumSize]);
135  q->setMaximumHeight(sizes[Qt::MaximumSize]);
136  q->updateGeometry();
137 
138  kDebug() << "Sizes" << sizes[Qt::PreferredSize] << sizes[Qt::MinimumSize] << sizes[Qt::MaximumSize];
139 
140  emit q->sizeChanged();
141  } //<
142 
143  void viewportOriginUpdated() //>
144  {
145  returnIfFactoryNotSet;
146 
147  QTransform transform;
148  for (int i = 0; i < factory->itemCount(); i++) {
149  QGraphicsWidget * item = itemForIndex(i);
150  QRectF itemGeometry = item->geometry();
151  if (viewport.intersects(itemGeometry)) {
152  item->show();
153  transform.reset();
154  if (!viewport.contains(itemGeometry)) {
155  QRectF clip = viewport.intersect(itemGeometry);
156  transform.translate(0, clip.top() -
157  itemGeometry.top());
158  transform.scale(1, clip.height() /
159  itemGeometry.height());
160  item->setOpacity(clip.height() /
161  itemGeometry.height());
162  } else {
163  item->setOpacity(1);
164  }
165  item->setTransform(transform);
166  } else {
167  item->hide();
168  }
169  }
170  } //<
171 
172  //> Variable Declarations
173  CustomList * q;
174  CustomListItemFactory * factory;
175  QMap < Qt::SizeHint, int > sizes;
176  QRectF viewport;
177  qreal scale;
178  QMap < Plasma::MarginEdge, qreal > margins;
179  bool sizeUpdate : 1;
180  //<
181 };
182 
183 CustomList::CustomList(QGraphicsItem * parent) //>
184  : QGraphicsWidget(parent), d(new Private(this))
185 {
186 } //<
187 
188 CustomList::CustomList(CustomListItemFactory * factory, QGraphicsItem * parent) //>
189  : QGraphicsWidget(parent), d(new Private(this))
190 {
191  setItemFactory(factory);
192 } //<
193 
194 CustomList::~CustomList() //>
195 {
196  delete d;
197 } //<
198 
199 void CustomList::setItemFactory(CustomListItemFactory * f) //>
200 {
201  // Releasing the old factory
202  if (d->factory) {
203  disconnect(d->factory, NULL, this, NULL);
204  }
205 
206  if (!f) {
207  return;
208  }
209 
210  d->factory = f;
211 
212  connect(f, SIGNAL(itemInserted(int)),
213  this, SLOT(factoryItemInserted(int)));
214  connect(f, SIGNAL(itemDeleted(int)),
215  this, SLOT(factoryItemDeleted(int)));
216  connect(f, SIGNAL(itemAltered(int)),
217  this, SLOT(factoryItemAltered(int)));
218  connect(f, SIGNAL(updated()),
219  this, SLOT(factoryUpdated()));
220 
221  d->updateSizeInfo();
222 } //<
223 
224 int CustomList::itemAtPosition(int y) const
225 {
226  QGraphicsWidget * item;
227  for (int i = 0; i < d->factory->itemCount(); i++) {
228  item = d->itemForIndex(i);
229  if (item->geometry().bottom() > y) {
230  return i;
231  }
232  }
233 
234  return 0;
235 }
236 
237 CustomListItemFactory * CustomList::itemFactory() const //>
238 {
239  return d->factory;
240 } //<
241 
242 QSizeF CustomList::sizeFor(QSizeF viewportSize) const //>
243 {
244  QSizeF result = viewportSize;
245  if (result.height() < d->sizes[Qt::MinimumSize]) {
246  result.setHeight(d->sizes[Qt::PreferredSize]);
247  } else if (result.height() > d->sizes[Qt::MaximumSize]) {
248  result.setHeight(d->sizes[Qt::MaximumSize]);
249  }
250  return result;
251 } //<
252 
253 void CustomList::viewportChanged(QRectF viewport) //>
254 {
255  if (d->sizeUpdate || d->viewport.size() != viewport.size()) {
256  if (d->sizes[Qt::MinimumSize] > viewport.height()) {
257  d->scale = -1;
258  } else {
259  if (d->sizes[Qt::MaximumSize] < viewport.height()) {
260  d->scale = 1;
261  } else {
262  d->scale = viewport.height() /
263  (qreal) d->sizes[Qt::MaximumSize];
264  }
265  }
266 
267  d->viewport.setSize(viewport.size());
268  resize(d->viewport.width(), sizeFor(viewport.size()).height());
269  d->positionItems();
270  d->viewportOriginUpdated();
271  }
272 
273  d->viewport = viewport;
274  d->viewportOriginUpdated();
275  setPos(- d->viewport.topLeft());
276 
277  d->viewport = viewport;
278 } //<
279 
280 qreal CustomList::scrollUnit(Qt::Orientation direction) const //>
281 {
282  Q_UNUSED(direction);
283  return 20;
284 } //<
285 
286 void CustomList::factoryItemInserted(int position) //>
287 {
288  Q_UNUSED(position);
289  d->updateSizeInfo();
290 } //<
291 
292 void CustomList::factoryItemDeleted(int position) //>
293 {
294  Q_UNUSED(position);
295  d->updateSizeInfo();
296 } //<
297 
298 void CustomList::factoryItemAltered(int position) //>
299 {
300  Q_UNUSED(position);
301  d->updateSizeInfo();
302 } //<
303 
304 void CustomList::factoryUpdated() //>
305 {
306  d->updateSizeInfo();
307 } //<
308 
309 void CustomList::setMargin(Plasma::MarginEdge margin, qreal value) //>
310 {
311  d->margins[margin] = value;
312  d->updateSizeInfo();
313 } //<
314 
315 qreal CustomList::margin(Plasma::MarginEdge margin) //>
316 {
317  return d->margins[margin];
318 } //<
319 
320 //<
321 
322 //> CustomListView
323 class CustomListView::Private {
324 public:
325  Private(CustomList * l, CustomListView * parent)
326  : list(l)
327  {
328  parent->setScrollableWidget(list);
329  }
330 
331  CustomList * list;
332 };
333 
334 CustomListView::CustomListView(QGraphicsItem * parent)
335  : ScrollPane(parent), d(new Private(new CustomList(this), this))
336 {
337  clearFlag(ClipScrollable);
338 }
339 
340 CustomListView::CustomListView(CustomListItemFactory * factory,
341  QGraphicsItem * parent)
342  : ScrollPane(parent),
343  d(new Private(new CustomList(factory, this), this))
344 {
345 }
346 
347 CustomListView::~CustomListView()
348 {
349  delete d;
350 }
351 
352 CustomList * CustomListView::list() const
353 {
354  return d->list;
355 }
356 
357 QSizeF CustomListView::sizeHint(Qt::SizeHint which,
358  const QSizeF & constraint) const
359 {
360  return d->list->sizeHint(which, constraint);
361 }
362 
363 //<
364 
365 } // namespace Lancelot
366 
367 
QTransform
QGraphicsItem::y
qreal y() const
Lancelot::CustomListView::~CustomListView
virtual ~CustomListView()
Definition: CustomListView.cpp:347
QTransform::reset
void reset()
Lancelot::CustomList
Class that does the layouting of items in the list.
Definition: CustomListView.h:110
QGraphicsItem::setParentItem
void setParentItem(QGraphicsItem *newParent)
Lancelot::CustomList::~CustomList
virtual ~CustomList()
Definition: CustomListView.cpp:194
QGraphicsLayoutItem::preferredHeight
qreal preferredHeight() const
Lancelot::CustomListView::CustomListView
CustomListView(QGraphicsItem *parent=NULL)
Definition: CustomListView.cpp:334
QRectF::size
QSizeF size() const
QMap< Qt::SizeHint, int >
Lancelot::CustomList::itemAtPosition
int itemAtPosition(int y) const
Definition: CustomListView.cpp:224
returnIfFactoryNotSet
#define returnIfFactoryNotSet
Definition: CustomListView.cpp:59
QRectF::top
qreal top() const
Lancelot::CustomList::setItemFactory
void setItemFactory(CustomListItemFactory *factory)
Definition: CustomListView.cpp:199
QGraphicsItem
Lancelot::CustomList::setMargin
void setMargin(Plasma::MarginEdge margin, qreal value)
Definition: CustomListView.cpp:309
QGraphicsItem::hide
void hide()
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Lancelot::CustomList::factoryItemAltered
void factoryItemAltered(int position)
Definition: CustomListView.cpp:298
Lancelot::CustomList::factoryItemInserted
void factoryItemInserted(int position)
Definition: CustomListView.cpp:286
Lancelot::CustomListView::list
CustomList * list() const
Definition: CustomListView.cpp:352
QGraphicsWidget::resize
void resize(const QSizeF &size)
Lancelot::CustomListItemFactory::~CustomListItemFactory
virtual ~CustomListItemFactory()
Definition: CustomListView.cpp:42
QTransform::translate
QTransform & translate(qreal dx, qreal dy)
QGraphicsLayoutItem::maximumHeight
qreal maximumHeight() const
QTransform::scale
QTransform & scale(qreal sx, qreal sy)
Lancelot::CustomListItemFactory::CustomListItemFactory
CustomListItemFactory()
Definition: CustomListView.cpp:38
QGraphicsItem::setPos
void setPos(const QPointF &pos)
Lancelot::ScrollPane::clearFlag
void clearFlag(Flag flag)
Turns the specified flag off.
Definition: ScrollPane.cpp:247
QGraphicsWidget
Lancelot::CustomList::factoryItemDeleted
void factoryItemDeleted(int position)
Definition: CustomListView.cpp:292
QGraphicsItem::setOpacity
void setOpacity(qreal opacity)
Lancelot::CustomListView
Wrapper around the CustomList which implements the actual scrolling.
Definition: CustomListView.h:151
Lancelot::ScrollPane
Pane for containing scrollable items.
Definition: ScrollPane.h:94
Lancelot::CustomList::margin
qreal margin(Plasma::MarginEdge margin)
Definition: CustomListView.cpp:315
Lancelot::ScrollPane::ClipScrollable
Definition: ScrollPane.h:106
Lancelot::CustomList::CustomList
CustomList(QGraphicsItem *parent=NULL)
Definition: CustomListView.cpp:183
QSizeF
QRectF
QGraphicsItem::transform
QTransform transform() const
Lancelot::CustomList::itemFactory
CustomListItemFactory * itemFactory() const
Definition: CustomListView.cpp:237
QGraphicsItem::setTransform
void setTransform(const QTransform &matrix, bool combine)
QRectF::intersect
QRectF intersect(const QRectF &rectangle) const
Lancelot::CustomList::scrollUnit
L_Override qreal scrollUnit(Qt::Orientation direction) const
Definition: CustomListView.cpp:280
Lancelot::CustomListItem::~CustomListItem
virtual ~CustomListItem()
Definition: CustomListView.cpp:32
QRectF::height
qreal height() const
Lancelot::CustomListView::sizeHint
L_Override QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint=QSizeF()) const
Definition: CustomListView.cpp:357
CustomListView.h
Lancelot::CustomList::factoryUpdated
void factoryUpdated()
Definition: CustomListView.cpp:304
QGraphicsItem::show
void show()
Lancelot::ScrollPane::setScrollableWidget
void setScrollableWidget(Scrollable *widget)
Sets the widget that should be contained by this ScrollPane.
Definition: ScrollPane.cpp:137
Lancelot::CustomListItemFactory
Interface that manages the list model and serves as an interface between the actual data model and Cu...
Definition: CustomListView.h:53
QSizeF::height
qreal height() const
Lancelot::CustomListItem::CustomListItem
CustomListItem()
Definition: CustomListView.cpp:28
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
QSizeF::setHeight
void setHeight(qreal height)
QGraphicsWidget::setGeometry
virtual void setGeometry(const QRectF &rect)
Lancelot::CustomList::sizeFor
L_Override QSizeF sizeFor(QSizeF viewportSize) const
Definition: CustomListView.cpp:242
Lancelot::CustomList::viewportChanged
L_Override void viewportChanged(QRectF viewport)
Sets the currently displayed area.
Definition: CustomListView.cpp:253
QGraphicsItem::scale
qreal scale() const
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