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

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • plasma
  • applet
  • piechart
kgetpiechart.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * *
3  * This program is free software; you can redistribute it and/or modify *
4  * it under the terms of the GNU General Public License as published by *
5  * the Free Software Foundation; either version 2 of the License, or *
6  * (at your option) any later version. *
7  * *
8  * Copyright (C) 2007 by Javier Goday <jgoday@gmail.com> *
9  * Copyright (C) 2009 by Matthias Fuchs <mat69@gmx.net> *
10  * *
11  * This program is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU General Public License *
17  * along with this program; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
20  ***************************************************************************/
21 
22 #include "piechart/kgetpiechart.h"
23 #include "piechart/kgetpiechart_p.h"
24 #include "common/kgetappletutils.h"
25 
26 #include "../../../core/transferhandler.h"
27 
28 #include <QVBoxLayout>
29 #include <QGraphicsLinearLayout>
30 #include <QGraphicsLayoutItem>
31 #include <QGraphicsWidget>
32 #include <QPainter>
33 #include <QHBoxLayout>
34 #include <QGraphicsProxyWidget>
35 #include <QStyleOptionGraphicsItem>
36 #include <QLabel>
37 #include <QPushButton>
38 #include <QProgressBar>
39 
40 #include <KDebug>
41 #include <KIcon>
42 #include <KLocale>
43 #include <KGlobal>
44 
45 #include <plasma/svg.h>
46 #include <plasma/applet.h>
47 #include <plasma/theme.h>
48 #include <plasma/dataengine.h>
49 #include <Plasma/Label>
50 #include <Plasma/ScrollWidget>
51 
52 const float KGetPieChart::PieChart::PIE_OPACITY = 0.67f;
53 const float KGetPieChart::PieChart::ACTIVE_PIE_OPACITY = 0.84f;
54 
55 KGetPieChart::PieChart::PieChart(QHash<OrgKdeKgetTransferInterface*, Data> *data, KIO::filesize_t totalSize, QGraphicsWidget *parent)
56  : QGraphicsWidget(parent),
57  m_data(data),
58  m_totalSize(totalSize)
59 {
60  setMinimumSize(QSizeF(80, 80));
61  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
62  setCacheMode(QGraphicsItem::DeviceCoordinateCache);
63 
64  m_totalPen.setWidth(1);
65  m_totalPen.setColor(Qt::darkGray);
66  m_totalPen.setStyle(Qt::SolidLine);
67 
68  m_activePen.setWidth(1);
69  m_activePen.setColor(Qt::white);
70  m_activePen.setStyle(Qt::SolidLine);
71 }
72 
73 KGetPieChart::PieChart::~PieChart()
74 {
75 }
76 
77 void KGetPieChart::PieChart::setTotalSize(KIO::filesize_t totalSize)
78 {
79  m_totalSize = totalSize;
80  m_angles.clear();
81  update();
82 }
83 
84 void KGetPieChart::PieChart::createAngles()
85 {
86  m_angles.clear();
87 
88  if (m_totalSize) {
89  QHash<OrgKdeKgetTransferInterface*, Data>::const_iterator it;
90  QHash<OrgKdeKgetTransferInterface*, Data>::const_iterator itEnd = m_data->constEnd();
91  int startAngle = 90 * 16;
92  for (it = m_data->constBegin(); it != itEnd; ++it) {
93  const int span = (-1 * ((it.value().size * 360 * 16) / m_totalSize));
94  m_angles[it.key()] = qMakePair(startAngle, span);
95 
96  startAngle += span;
97  }
98  }
99 }
100 
101 void KGetPieChart::PieChart::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget)
102 {
103  Q_UNUSED(widget)
104 
105  kDebug() << "Repaint";
106 
107  if (m_totalSize && (m_angles.count() != m_data->count())) {
108  createAngles();
109  }
110 
111  p->setRenderHint(QPainter::Antialiasing);
112  p->setRenderHint(QPainter::SmoothPixmapTransform);
113  p->setRenderHint(QPainter::TextAntialiasing);
114 
115  int size = option->rect.height();
116  if (option->rect.width() < size) {
117  size = option->rect.width();
118  }
119  const QRect rect = QRect(option->rect.x() + option->rect.width() / 2 - size / 2,
120  option->rect.y(),
121  size,
122  size);
123 
124  QHash<OrgKdeKgetTransferInterface*, Data>::const_iterator it;
125  QHash<OrgKdeKgetTransferInterface*, Data>::const_iterator itEnd = m_data->constEnd();
126  for (it = m_data->constBegin(); it != itEnd; ++it) {
127  OrgKdeKgetTransferInterface *transfer = it.key();
128  const Data data = it.value();
129  QPair<int, int> angles = m_angles[transfer];
130  const QBrush brush(data.color);
131 
132  p->setBrush(brush);
133 
134  if (data.isFinished) {
135  p->setPen(m_totalPen);
136  } else {
137  p->setPen(m_activePen);
138  }
139 
140  p->setOpacity(PIE_OPACITY);
141  p->drawPie(rect, angles.first, angles.second);
142 
143  p->setOpacity(ACTIVE_PIE_OPACITY);
144  if (m_totalSize && !data.isFinished) {
145  angles.second = (-1 * ((data.downloadedSize * 360 * 16) / m_totalSize));
146  }
147  p->drawPie(QRect(rect.x() + 15, rect.y() + 15, rect.width() - 30, rect.height() - 30), angles.first, angles.second);
148  }
149 }
150 
151 KGetPieChart::Item::Item(QGraphicsWidget *parent)
152  : QGraphicsWidget(parent)
153 {
154  m_colorLabel = new Plasma::Label();
155  m_colorLabel->nativeWidget()->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
156  m_name = new Plasma::Label();
157  m_name->nativeWidget()->setWordWrap(false);
158  m_name->nativeWidget()->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred));
159  m_sizeLabel = new Plasma::Label();
160  m_sizeLabel->nativeWidget()->setWordWrap(false);
161 
162  QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal);
163  layout->addItem(m_colorLabel);
164  layout->addItem(m_name);
165  layout->addItem(m_sizeLabel);
166 
167  setLayout(layout);
168 }
169 
170 KGetPieChart::Item::~Item()
171 {
172 }
173 
174 void KGetPieChart::Item::setSize(KIO::filesize_t size)
175 {
176  m_sizeLabel->setText(KGlobal::locale()->formatByteSize(size));
177 }
178 
179 void KGetPieChart::Item::setName(const QString &name)
180 {
181  m_name->setText(name);
182 }
183 
184 void KGetPieChart::Item::setColor(const QColor &color)
185 {
186  QPixmap pixmap(10, 10);
187  pixmap.fill(QColor(color));
188  m_colorLabel->nativeWidget()->setPixmap(pixmap);
189 }
190 
191 KGetPieChart::Private::Private(QGraphicsWidget *parent) : QGraphicsWidget(parent),
192  m_colors("Oxygen.colors"),
193  m_totalSize(0),
194  m_piechart(0)
195 {
196  QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, this);
197 
198  m_piechart = new KGetPieChart::PieChart(&m_data, m_totalSize);
199  layout->insertItem(0, m_piechart);
200  m_scrollWidget = new Plasma::ScrollWidget();
201  m_scrollWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
202  m_containerWidget = new QGraphicsWidget(m_scrollWidget);
203  m_scrollWidget->setWidget(m_containerWidget);
204  m_containerLayout = new QGraphicsLinearLayout(Qt::Vertical, m_containerWidget);
205 
206  layout->addItem(m_scrollWidget);
207 
208  setLayout(layout);
209 }
210 
211 KGetPieChart::Private::~Private()
212 {
213 }
214 
215 void KGetPieChart::Private::addTransfers(const QList<OrgKdeKgetTransferInterface*> &transfers)
216 {
217  foreach (OrgKdeKgetTransferInterface *transfer, transfers) {
218  if (m_items.contains(transfer)) {
219  continue;
220  }
221 
222  connect(transfer, SIGNAL(transferChangedEvent(int)), this, SLOT(slotUpdateTransfer(int)));
223 
224  QString fileName = KUrl(transfer->dest().value()).fileName();
225  kDebug() << fileName;
226 
227  Data data;
228  data.name = fileName;
229  data.isFinished = (transfer->status() == Transfer::Finished);
230  data.size = transfer->totalSize();
231  data.downloadedSize = transfer->downloadedSize();
232  m_data[transfer] = data;
233 
234  Item *item = new Item;
235  item->setName(data.name);
236  item->setSize(data.size);
237  m_items[transfer] = item;
238 
239  m_totalSize += data.size;
240 
241  //running downloads are prepended, others appended
242  if (data.isFinished) {
243  m_containerLayout->addItem(item);
244  } else {
245  m_containerLayout->insertItem(0, item);
246  }
247  }
248 
249  updateTransfers();
250 }
251 
252 void KGetPieChart::Private::removeTransfers(const QList<OrgKdeKgetTransferInterface*> &transfers)
253 {
254  // remove the progressbars for the deleted transfers
255  QHash<OrgKdeKgetTransferInterface*, Item*>::iterator it;
256  QHash<OrgKdeKgetTransferInterface*, Item*>::iterator itEnd = m_items.end();
257  for (it = m_items.begin(); it != itEnd; ) {
258  OrgKdeKgetTransferInterface *transfer = it.key();
259  if (transfers.contains(transfer)) {
260  Item *item = it.value();
261  it = m_items.erase(it);
262 
263  m_totalSize -= m_data[transfer].size;
264  m_data.remove(transfer);
265 
266  m_containerLayout->removeItem(item);
267  item->deleteLater();
268  } else {
269  ++it;
270  }
271  }
272 
273  updateTransfers();
274 }
275 
276 void KGetPieChart::Private::slotUpdateTransfer(int transferChange)
277 {
278  OrgKdeKgetTransferInterface *transfer = qobject_cast<OrgKdeKgetTransferInterface*>(QObject::sender());
279 
280  bool updatePieSize = false;
281  bool updatePie = false;
282  if (transfer && m_items.contains(transfer)) {
283  Item *item = m_items[transfer];
284 
285  if (transferChange & Transfer::Tc_Status) {
286  m_data[transfer].isFinished = (transfer->status() == Transfer::Finished);
287  updatePie = true;
288  }
289  if (transferChange & Transfer::Tc_FileName) {
290  m_data[transfer].name = KUrl(transfer->dest().value()).fileName();
291  item->setName(m_data[transfer].name);
292  }
293  if (transferChange & Transfer::Tc_TotalSize) {
294  m_totalSize -= m_data[transfer].size;
295  KIO::filesize_t newSize = transfer->totalSize();
296  m_totalSize += newSize;
297  m_data[transfer].size = newSize;
298 
299  item->setSize(m_data[transfer].size);
300 
301  updatePieSize = true;
302  }
303  if (transferChange & Transfer::Tc_DownloadedSize) {
304  m_data[transfer].downloadedSize = transfer->downloadedSize();
305  updatePie = true;
306  }
307  }
308 
309  if (updatePieSize) {
310  m_piechart->setTotalSize(m_totalSize);
311  } else if (updatePie) {
312  m_piechart->update();
313  }
314 }
315 void KGetPieChart::Private::updateTransfers()
316 {
317  if (m_items.isEmpty()) {
318  return;
319  }
320 
321  int step = m_colors.count() / m_items.count();
322  //there are more items than colors
323  if (!step) {
324  step = 1;
325  }
326 
327  int i = 0;
328  QHash<OrgKdeKgetTransferInterface*, Item*>::const_iterator it;
329  QHash<OrgKdeKgetTransferInterface*, Item*>::const_iterator itEnd = m_items.constEnd();
330  for (it = m_items.constBegin(); it != itEnd; ++it) {
331  m_data[it.key()].color = m_colors.color(i * 6 + 4);
332  it.value()->setColor(m_data[it.key()].color);
333  ++i;
334  }
335 
336  m_piechart->setTotalSize(m_totalSize);
337 }
338 
339 
340 KGetPieChart::KGetPieChart(QObject *parent, const QVariantList &args)
341  : KGetApplet(parent, args)
342 {
343 }
344 
345 KGetPieChart::~KGetPieChart()
346 {
347  delete d;
348 }
349 
350 void KGetPieChart::init()
351 {
352  d = new KGetPieChart::Private(this);
353  setDataWidget(d);
354  connect(this, SIGNAL(transfersAdded(QList<OrgKdeKgetTransferInterface*>)), d, SLOT(addTransfers(QList<OrgKdeKgetTransferInterface*>)));
355  connect(this, SIGNAL(transfersRemoved(QList<OrgKdeKgetTransferInterface*>)), d, SLOT(removeTransfers(QList<OrgKdeKgetTransferInterface*>)));
356 
357  KGetApplet::init();
358 }
359 
360 #include "kgetpiechart.moc"
361 #include "kgetpiechart_p.moc"
KGetApplet::transfersAdded
void transfersAdded(const QList< OrgKdeKgetTransferInterface * > &transfers)
KGetPieChart::Item::Item
Item(QGraphicsWidget *parent=0)
Definition: kgetpiechart.cpp:151
Transfer::Tc_FileName
Definition: transfer.h:52
Job::Finished
The job is stopped, but this also indicates that it stopped because an error occurred.
Definition: job.h:47
KGetPieChart::~KGetPieChart
~KGetPieChart()
Definition: kgetpiechart.cpp:345
KGetPieChart::init
void init()
Definition: kgetpiechart.cpp:350
KGetPieChart::Item::setName
void setName(const QString &name)
Definition: kgetpiechart.cpp:179
KGetPieChart::Data
Definition: kgetpiechart_p.h:39
KGetPieChart::PieChart::PieChart
PieChart(QHash< OrgKdeKgetTransferInterface *, Data > *data, KIO::filesize_t totalSize, QGraphicsWidget *parent=0)
Definition: kgetpiechart.cpp:55
QWidget
kgetappletutils.h
KGetPieChart::Private
Definition: kgetpiechart_p.h:90
QObject
Transfer::Tc_Status
Definition: transfer.h:53
KGetPieChart::Private::~Private
~Private()
Definition: kgetpiechart.cpp:211
KGetPieChart::PieChart
Definition: kgetpiechart_p.h:49
KGetPieChart::KGetPieChart
KGetPieChart(QObject *parent, const QVariantList &args)
Definition: kgetpiechart.cpp:340
KGetPieChart::Data::downloadedSize
KIO::filesize_t downloadedSize
Definition: kgetpiechart_p.h:45
KGetPieChart::PieChart::createAngles
void createAngles()
Definition: kgetpiechart.cpp:84
KGetPieChart::PieChart::setTotalSize
void setTotalSize(KIO::filesize_t totalSize)
Definition: kgetpiechart.cpp:77
KGetPieChart::Item::setColor
void setColor(const QColor &color)
Definition: kgetpiechart.cpp:184
KGetApplet::init
void init()
Definition: kgetapplet.cpp:139
KGetApplet::transfersRemoved
void transfersRemoved(const QList< OrgKdeKgetTransferInterface * > &transfers)
kgetpiechart.h
KGetPieChart::Private::removeTransfers
void removeTransfers(const QList< OrgKdeKgetTransferInterface * > &transfers)
Definition: kgetpiechart.cpp:252
KGetApplet::update
void update()
KGetPieChart::Private::Private
Private(QGraphicsWidget *parent=0)
Definition: kgetpiechart.cpp:191
Transfer::Tc_TotalSize
Definition: transfer.h:54
KGetApplet
Definition: kgetapplet.h:68
KGetPieChart::Data::name
QString name
Definition: kgetpiechart_p.h:42
KGetPieChart::PieChart::paint
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=0)
Definition: kgetpiechart.cpp:101
KGetApplet::setDataWidget
void setDataWidget(QGraphicsWidget *widget)
Definition: kgetapplet.cpp:285
Transfer::Tc_DownloadedSize
Definition: transfer.h:63
KGetPieChart::Data::size
KIO::filesize_t size
Definition: kgetpiechart_p.h:44
KGetPieChart::Data::isFinished
bool isFinished
Definition: kgetpiechart_p.h:43
KGetPieChart::Item::~Item
~Item()
Definition: kgetpiechart.cpp:170
KGetPieChart::Item::setSize
void setSize(KIO::filesize_t size)
Definition: kgetpiechart.cpp:174
KGetPieChart::Data::color
QColor color
Definition: kgetpiechart_p.h:46
KGetPieChart::Item
Definition: kgetpiechart_p.h:72
KGetPieChart::Private::addTransfers
void addTransfers(const QList< OrgKdeKgetTransferInterface * > &transfers)
Definition: kgetpiechart.cpp:215
kgetpiechart_p.h
KGetPieChart::PieChart::~PieChart
~PieChart()
Definition: kgetpiechart.cpp:73
QGraphicsWidget
KGetApplet::m_totalSize
KIO::filesize_t m_totalSize
Definition: kgetapplet.h:113
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

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