KNewStuff
qprogressindicator.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "qprogressindicator.h"
00023
00024 #include <QtGui/QProgressBar>
00025 #include <QtGui/QPushButton>
00026 #include <QtGui/QLabel>
00027 #include <QtGui/QLayout>
00028
00029 #include <kiconloader.h>
00030
00031 QProgressIndicator::QProgressIndicator(QWidget *parent)
00032 : QFrame(parent)
00033 {
00034 setFrameStyle(QFrame::NoFrame);
00035 m_pb = new QProgressBar();
00036 m_pb->setMinimum(0);
00037 m_pb->setMaximum(100);
00038
00039 m_pbdetails = new QPushButton();
00040 m_pbdetails->setFixedWidth(32);
00041 m_pbdetails->setIcon(SmallIcon("go-up"));
00042 m_pbdetails->setEnabled(false);
00043
00044 QHBoxLayout *hbox = new QHBoxLayout(this);
00045 hbox->setSpacing(0);
00046 hbox->addWidget(m_pbdetails);
00047 hbox->addWidget(m_pb);
00048
00049 m_details = new QWidget(this);
00050 m_details->setWindowFlags(Qt::Popup);
00051 m_details->hide();
00052
00053 m_detailsvbox = new QVBoxLayout(m_details);
00054
00055 connect(m_pbdetails, SIGNAL(clicked()), SLOT(slotClicked()));
00056 }
00057
00058 void QProgressIndicator::slotClicked()
00059 {
00060 QPoint indicatorpos = mapToGlobal(pos());
00061 m_details->move(indicatorpos.x(), indicatorpos.y());
00062
00063 if (m_details->isVisible())
00064 m_details->hide();
00065 else
00066 m_details->show();
00067 }
00068
00069 void QProgressIndicator::addProgress(const QString & message, int percentage)
00070 {
00071 QProgressBar *pb;
00072
00073 m_progress[message] = percentage;
00074
00075 if (!m_progresswidgets.contains(message)) {
00076 QWidget *pbcontainer = new QWidget();
00077
00078
00079 QLabel * urlLabel = new QLabel(pbcontainer);
00080 urlLabel->setText(message);
00081
00082
00083 pb = new QProgressBar(pbcontainer);
00084 pb->setMinimum(0);
00085 pb->setMaximum(100);
00086 m_progresswidgets.insert(message, pb);
00087
00088
00089 QPushButton *pbcancel = new QPushButton();
00090 pbcancel->setFixedWidth(32);
00091 pbcancel->setIcon(SmallIcon("dialog-cancel"));
00092
00093 QGridLayout *layout = new QGridLayout(pbcontainer);
00094 layout->addWidget(urlLabel, 0, 0, 1, 2);
00095 layout->addWidget(pbcancel, 1, 0);
00096 layout->addWidget(pb, 1, 1);
00097
00098 pbcontainer->show();
00099
00100 m_detailsvbox->addWidget(pbcontainer);
00101 } else {
00102 pb = m_progresswidgets[message];
00103 }
00104
00105 pb->setValue(percentage);
00106
00107 if (m_progress.count() > 0)
00108 m_pbdetails->setEnabled(true);
00109
00110 if (percentage == 100)
00111 removeProgress(message);
00112
00113 calculateAverage();
00114 }
00115
00116 void QProgressIndicator::removeProgress(const QString & message)
00117 {
00118 m_progress.remove(message);
00119
00120 if (m_progresswidgets[message]) {
00121 delete m_progresswidgets[message]->parentWidget();
00122 m_progresswidgets.remove(message);
00123 }
00124
00125 if (m_progress.count() == 0) {
00126 m_pbdetails->setEnabled(false);
00127 m_details->hide();
00128 }
00129
00130 calculateAverage();
00131 }
00132
00133 void QProgressIndicator::calculateAverage()
00134 {
00135 if (m_progress.count() == 0) {
00136 m_pb->reset();
00137 return;
00138 }
00139
00140 int average = 0;
00141 QHashIterator<QString, int> it(m_progress);
00142 while (it.hasNext()) {
00143 it.next();
00144 average += it.value();
00145 }
00146 average = (average / m_progress.count());
00147
00148 m_pb->setValue(average);
00149 }
00150
00151 #include "qprogressindicator.moc"