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

libkdepim

  • sources
  • kde-4.12
  • kdepim
  • libkdepim
  • progresswidget
progressdialog.cpp
Go to the documentation of this file.
1 
32 #include "progressdialog.h"
33 #include "progressmanager.h"
34 #include "ssllabel.h"
35 
36 #include <KDebug>
37 #include <KHBox>
38 #include <KLocale>
39 #include <KStandardGuiItem>
40 
41 #include <QApplication>
42 #include <QCloseEvent>
43 #include <QEvent>
44 #include <QFrame>
45 #include <QLabel>
46 #include <QLayout>
47 #include <QObject>
48 #include <QProgressBar>
49 #include <QPushButton>
50 #include <QScrollBar>
51 #include <QTimer>
52 #include <QToolButton>
53 
54 namespace KPIM {
55 
56 static const int MAX_LABEL_WIDTH = 650;
57 
58 class TransactionItem;
59 
60 TransactionItemView::TransactionItemView( QWidget *parent, const char *name )
61  : QScrollArea( parent )
62 {
63  setObjectName( QLatin1String(name) );
64  setFrameStyle( NoFrame );
65  mBigBox = new KVBox( this );
66  setWidget( mBigBox );
67  setWidgetResizable( true );
68  setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
69 }
70 
71 TransactionItem *TransactionItemView::addTransactionItem( ProgressItem *item, bool first )
72 {
73  TransactionItem *ti = new TransactionItem( mBigBox, item, first );
74  mBigBox->layout()->addWidget( ti );
75 
76  resize( mBigBox->width(), mBigBox->height() );
77 
78  return ti;
79 }
80 
81 void TransactionItemView::resizeEvent ( QResizeEvent *event )
82 {
83  // Tell the layout in the parent (progressdialog) that our size changed
84  updateGeometry();
85 
86  QSize sz = parentWidget()->sizeHint();
87  int currentWidth = parentWidget()->width();
88 
89  // Don't resize to sz.width() every time when it only reduces a little bit
90  if ( currentWidth < sz.width() || currentWidth > sz.width() + 100 ) {
91  currentWidth = sz.width();
92  }
93  parentWidget()->resize( currentWidth, sz.height() );
94 
95  QScrollArea::resizeEvent( event );
96 }
97 
98 QSize TransactionItemView::sizeHint() const
99 {
100  return minimumSizeHint();
101 }
102 
103 QSize TransactionItemView::minimumSizeHint() const
104 {
105  int f = 2 * frameWidth();
106  // Make room for a vertical scrollbar in all cases, to avoid a horizontal one
107  int vsbExt = verticalScrollBar()->sizeHint().width();
108  int minw = topLevelWidget()->width() / 3;
109  int maxh = topLevelWidget()->height() / 2;
110  QSize sz( mBigBox->minimumSizeHint() );
111  sz.setWidth( qMax( sz.width(), minw ) + f + vsbExt );
112  sz.setHeight( qMin( sz.height(), maxh ) + f );
113  return sz;
114 }
115 
116 void TransactionItemView::slotLayoutFirstItem()
117 {
118  //This slot is called whenever a TransactionItem is deleted, so this is a
119  //good place to call updateGeometry(), so our parent takes the new size
120  //into account and resizes.
121  updateGeometry();
122 
123  /*
124  The below relies on some details in Qt's behaviour regarding deleting
125  objects. This slot is called from the destroyed signal of an item just
126  going away. That item is at that point still in the list of chilren, but
127  since the vtable is already gone, it will have type QObject. The first
128  one with both the right name and the right class therefor is what will
129  be the first item very shortly. That's the one we want to remove the
130  hline for.
131  */
132  TransactionItem *ti = mBigBox->findChild<KPIM::TransactionItem*>( QLatin1String("TransactionItem") );
133  if ( ti ) {
134  ti->hideHLine();
135  }
136 }
137 
138 // ----------------------------------------------------------------------------
139 
140 TransactionItem::TransactionItem( QWidget *parent,
141  ProgressItem *item, bool first )
142  : KVBox( parent ), mCancelButton( 0 ), mItem( item )
143 
144 {
145  setSpacing( 2 );
146  setMargin( 2 );
147  setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
148 
149  mFrame = new QFrame( this );
150  mFrame->setFrameShape( QFrame::HLine );
151  mFrame->setFrameShadow( QFrame::Raised );
152  mFrame->show();
153  setStretchFactor( mFrame, 3 );
154  layout()->addWidget( mFrame );
155 
156  KHBox *h = new KHBox( this );
157  h->setSpacing( 5 );
158  layout()->addWidget( h );
159 
160  mItemLabel =
161  new QLabel( fontMetrics().elidedText( item->label(), Qt::ElideRight, MAX_LABEL_WIDTH ), h );
162  h->layout()->addWidget( mItemLabel );
163  h->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
164 
165  mProgress = new QProgressBar( h );
166  mProgress->setMaximum( 100 );
167  mProgress->setValue( item->progress() );
168  h->layout()->addWidget( mProgress );
169 
170  if ( item->canBeCanceled() ) {
171  mCancelButton = new QPushButton( SmallIcon( QLatin1String("dialog-cancel") ), QString(), h );
172  mCancelButton->setToolTip( i18n( "Cancel this operation." ) );
173  connect ( mCancelButton, SIGNAL(clicked()),
174  this, SLOT(slotItemCanceled()));
175  h->layout()->addWidget( mCancelButton );
176  }
177 
178  h = new KHBox( this );
179  h->setSpacing( 5 );
180  h->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
181  layout()->addWidget( h );
182  mSSLLabel = new SSLLabel( h );
183  mSSLLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
184  h->layout()->addWidget( mSSLLabel );
185  mItemStatus = new QLabel( h );
186  mItemStatus->setTextFormat( Qt::RichText );
187  mItemStatus->setText(
188  fontMetrics().elidedText( item->status(), Qt::ElideRight, MAX_LABEL_WIDTH ) );
189  h->layout()->addWidget( mItemStatus );
190  setCrypto( item->usesCrypto() );
191  if ( first ) {
192  hideHLine();
193  }
194 }
195 
196 TransactionItem::~TransactionItem()
197 {
198 }
199 
200 void TransactionItem::hideHLine()
201 {
202  mFrame->hide();
203 }
204 
205 void TransactionItem::setProgress( int progress )
206 {
207  mProgress->setValue( progress );
208 }
209 
210 void TransactionItem::setLabel( const QString &label )
211 {
212  mItemLabel->setText( fontMetrics().elidedText( label, Qt::ElideRight, MAX_LABEL_WIDTH ) );
213 }
214 
215 void TransactionItem::setStatus( const QString &status )
216 {
217  mItemStatus->setText( fontMetrics().elidedText( status, Qt::ElideRight, MAX_LABEL_WIDTH ) );
218 }
219 
220 void TransactionItem::setCrypto( bool on )
221 {
222  if ( on ) {
223  mSSLLabel->setEncrypted( true );
224  } else {
225  mSSLLabel->setEncrypted( false );
226  }
227 
228  mSSLLabel->setState( mSSLLabel->lastState() );
229 }
230 
231 void TransactionItem::setTotalSteps( int totalSteps )
232 {
233  mProgress->setMaximum( totalSteps );
234 }
235 
236 void TransactionItem::slotItemCanceled()
237 {
238  if ( mItem ) {
239  mItem->cancel();
240  }
241 }
242 
243 void TransactionItem::addSubTransaction( ProgressItem *item )
244 {
245  Q_UNUSED( item );
246 }
247 
248 // ---------------------------------------------------------------------------
249 
250 ProgressDialog::ProgressDialog( QWidget *alignWidget, QWidget *parent, const char *name )
251  : OverlayWidget( alignWidget, parent, name ), mWasLastShown( false )
252 {
253  setFrameStyle( QFrame::Panel | QFrame::Sunken ); // QFrame
254 
255  setAutoFillBackground( true );
256 
257  mScrollView = new TransactionItemView( this, "ProgressScrollView" );
258  layout()->addWidget( mScrollView );
259 
260  // No more close button for now, since there is no more autoshow
261  /*
262  QVBox* rightBox = new QVBox( this );
263  QToolButton* pbClose = new QToolButton( rightBox );
264  pbClose->setAutoRaise(true);
265  pbClose->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
266  pbClose->setFixedSize( 16, 16 );
267  pbClose->setIcon( KIconLoader::global()->loadIconSet( "window-close", KIconLoader::Small, 14 ) );
268  pbClose->setToolTip( i18n( "Hide detailed progress window" ) );
269  connect(pbClose, SIGNAL(clicked()), this, SLOT(slotClose()));
270  QWidget* spacer = new QWidget( rightBox ); // don't let the close button take up all the height
271  rightBox->setStretchFactor( spacer, 100 );
272  */
273 
274  /*
275  * Get the singleton ProgressManager item which will inform us of
276  * appearing and vanishing items.
277  */
278  ProgressManager *pm = ProgressManager::instance();
279  connect ( pm, SIGNAL(progressItemAdded(KPIM::ProgressItem*)),
280  this, SLOT(slotTransactionAdded(KPIM::ProgressItem*)) );
281  connect ( pm, SIGNAL(progressItemCompleted(KPIM::ProgressItem*)),
282  this, SLOT(slotTransactionCompleted(KPIM::ProgressItem*)) );
283  connect ( pm, SIGNAL(progressItemProgress(KPIM::ProgressItem*,uint)),
284  this, SLOT(slotTransactionProgress(KPIM::ProgressItem*,uint)) );
285  connect ( pm, SIGNAL(progressItemStatus(KPIM::ProgressItem*,QString)),
286  this, SLOT(slotTransactionStatus(KPIM::ProgressItem*,QString)) );
287  connect ( pm, SIGNAL(progressItemLabel(KPIM::ProgressItem*,QString)),
288  this, SLOT(slotTransactionLabel(KPIM::ProgressItem*,QString)) );
289  connect ( pm, SIGNAL(progressItemUsesCrypto(KPIM::ProgressItem*,bool)),
290  this, SLOT(slotTransactionUsesCrypto(KPIM::ProgressItem*,bool)) );
291  connect ( pm, SIGNAL(progressItemUsesBusyIndicator(KPIM::ProgressItem*,bool)),
292  this, SLOT(slotTransactionUsesBusyIndicator(KPIM::ProgressItem*,bool)) );
293  connect ( pm, SIGNAL(showProgressDialog()),
294  this, SLOT(slotShow()) );
295 }
296 
297 void ProgressDialog::closeEvent( QCloseEvent *e )
298 {
299  e->accept();
300  hide();
301 }
302 
303 /*
304  * Destructor
305  */
306 ProgressDialog::~ProgressDialog()
307 {
308  // no need to delete child widgets.
309 }
310 
311 void ProgressDialog::slotTransactionAdded( ProgressItem *item )
312 {
313  if ( item->parent() ) {
314  if ( mTransactionsToListviewItems.contains( item->parent() ) ) {
315  TransactionItem * parent = mTransactionsToListviewItems[ item->parent() ];
316  parent->addSubTransaction( item );
317  }
318  } else {
319  const bool first = mTransactionsToListviewItems.empty();
320  TransactionItem *ti = mScrollView->addTransactionItem( item, first );
321  if ( ti ) {
322  mTransactionsToListviewItems.insert( item, ti );
323  }
324  if ( first && mWasLastShown ) {
325  QTimer::singleShot( 1000, this, SLOT(slotShow()) );
326  }
327 
328  }
329 }
330 
331 void ProgressDialog::slotTransactionCompleted( ProgressItem *item )
332 {
333  if ( mTransactionsToListviewItems.contains( item ) ) {
334  TransactionItem *ti = mTransactionsToListviewItems[ item ];
335  mTransactionsToListviewItems.remove( item );
336  ti->setItemComplete();
337  QTimer::singleShot( 3000, ti, SLOT(deleteLater()) );
338  // see the slot for comments as to why that works
339  connect ( ti, SIGNAL(destroyed()),
340  mScrollView, SLOT(slotLayoutFirstItem()) );
341  }
342  // This was the last item, hide.
343  if ( mTransactionsToListviewItems.empty() ) {
344  QTimer::singleShot( 3000, this, SLOT(slotHide()) );
345  }
346 }
347 
348 void ProgressDialog::slotTransactionCanceled( ProgressItem * )
349 {
350 }
351 
352 void ProgressDialog::slotTransactionProgress( ProgressItem *item,
353  unsigned int progress )
354 {
355  if ( mTransactionsToListviewItems.contains( item ) ) {
356  TransactionItem *ti = mTransactionsToListviewItems[ item ];
357  ti->setProgress( progress );
358  }
359 }
360 
361 void ProgressDialog::slotTransactionStatus( ProgressItem *item,
362  const QString &status )
363 {
364  if ( mTransactionsToListviewItems.contains( item ) ) {
365  TransactionItem *ti = mTransactionsToListviewItems[ item ];
366  ti->setStatus( status );
367  }
368 }
369 
370 void ProgressDialog::slotTransactionLabel( ProgressItem *item,
371  const QString &label )
372 {
373  if ( mTransactionsToListviewItems.contains( item ) ) {
374  TransactionItem *ti = mTransactionsToListviewItems[ item ];
375  ti->setLabel( label );
376  }
377 }
378 
379 void ProgressDialog::slotTransactionUsesCrypto( ProgressItem *item,
380  bool value )
381 {
382  if ( mTransactionsToListviewItems.contains( item ) ) {
383  TransactionItem *ti = mTransactionsToListviewItems[ item ];
384  ti->setCrypto( value );
385  }
386 }
387 
388 void ProgressDialog::slotTransactionUsesBusyIndicator( KPIM::ProgressItem *item, bool value )
389 {
390  if ( mTransactionsToListviewItems.contains( item ) ) {
391  TransactionItem *ti = mTransactionsToListviewItems[ item ];
392  if ( value ) {
393  ti->setTotalSteps( 0 );
394  } else {
395  ti->setTotalSteps( 100 );
396  }
397  }
398 }
399 
400 void ProgressDialog::slotShow()
401 {
402  setVisible( true );
403 }
404 
405 void ProgressDialog::slotHide()
406 {
407  // check if a new item showed up since we started the timer. If not, hide
408  if ( mTransactionsToListviewItems.isEmpty() ) {
409  setVisible( false );
410  }
411 }
412 
413 void ProgressDialog::slotClose()
414 {
415  mWasLastShown = false;
416  setVisible( false );
417 }
418 
419 void ProgressDialog::setVisible( bool b )
420 {
421  OverlayWidget::setVisible( b );
422  emit visibilityChanged( b );
423 }
424 
425 void ProgressDialog::slotToggleVisibility()
426 {
427  /* Since we are only hiding with a timeout, there is a short period of
428  * time where the last item is still visible, but clicking on it in
429  * the statusbarwidget should not display the dialog, because there
430  * are no items to be shown anymore. Guard against that.
431  */
432  mWasLastShown = isHidden();
433  if ( !isHidden() || !mTransactionsToListviewItems.isEmpty() ) {
434  setVisible( isHidden() );
435  }
436 }
437 
438 }
439 
440 #include "progressdialog.moc"
KPIM::TransactionItem::addSubTransaction
void addSubTransaction(ProgressItem *item)
Definition: progressdialog.cpp:243
KPIM::TransactionItem::setProgress
void setProgress(int progress)
Definition: progressdialog.cpp:205
KPIM::ProgressManager::instance
static ProgressManager * instance()
Definition: progressmanager.cpp:159
KPIM::TransactionItem::setItemComplete
void setItemComplete()
Definition: progressdialog.h:101
KPIM::SSLLabel
Definition: ssllabel.h:39
KVBox
KPIM::SSLLabel::setState
void setState(State state)
Definition: ssllabel.cpp:62
KPIM::ProgressDialog::mWasLastShown
bool mWasLastShown
Definition: progressdialog.h:149
KPIM::ProgressDialog::slotTransactionUsesCrypto
void slotTransactionUsesCrypto(KPIM::ProgressItem *item, bool)
Definition: progressdialog.cpp:379
KPIM::ProgressDialog::slotToggleVisibility
void slotToggleVisibility()
Definition: progressdialog.cpp:425
QWidget
ssllabel.h
KPIM::ProgressDialog::~ProgressDialog
~ProgressDialog()
Definition: progressdialog.cpp:306
KPIM::TransactionItem::setTotalSteps
void setTotalSteps(int totalSteps)
Definition: progressdialog.cpp:231
KPIM::TransactionItem::TransactionItem
TransactionItem(QWidget *parent, ProgressItem *item, bool first)
Definition: progressdialog.cpp:140
KPIM::ProgressDialog::slotShow
void slotShow()
Definition: progressdialog.cpp:400
KPIM::ProgressItem::canBeCanceled
bool canBeCanceled() const
Definition: progressmanager.h:86
KPIM::ProgressItem::parent
ProgressItem * parent() const
Definition: progressmanager.h:61
QScrollArea
KPIM::ProgressDialog::slotTransactionAdded
void slotTransactionAdded(KPIM::ProgressItem *item)
Definition: progressdialog.cpp:311
KPIM::TransactionItemView::minimumSizeHint
QSize minimumSizeHint() const
Definition: progressdialog.cpp:103
KPIM::TransactionItem::setCrypto
void setCrypto(bool)
Definition: progressdialog.cpp:220
KPIM::TransactionItem::mItem
ProgressItem * mItem
Definition: progressdialog.h:113
KPIM::ProgressItem::label
const QString & label() const
Definition: progressmanager.h:66
KPIM::TransactionItem::mFrame
QFrame * mFrame
Definition: progressdialog.h:111
KPIM::TransactionItem
Definition: progressdialog.h:75
KPIM::TransactionItemView::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
Definition: progressdialog.cpp:81
KPIM::ProgressDialog::visibilityChanged
void visibilityChanged(bool)
KPIM::TransactionItem::hideHLine
void hideHLine()
Definition: progressdialog.cpp:200
KPIM::TransactionItemView::TransactionItemView
TransactionItemView(QWidget *parent=0, const char *name=0)
Definition: progressdialog.cpp:60
KPIM::TransactionItem::~TransactionItem
~TransactionItem()
Definition: progressdialog.cpp:196
KPIM::TransactionItem::mProgress
QProgressBar * mProgress
Definition: progressdialog.h:107
KPIM::MAX_LABEL_WIDTH
static const int MAX_LABEL_WIDTH
Definition: progressdialog.cpp:56
KPIM::TransactionItem::mItemStatus
QLabel * mItemStatus
Definition: progressdialog.h:110
KPIM::ProgressDialog::ProgressDialog
ProgressDialog(QWidget *alignWidget, QWidget *parent, const char *name=0)
Definition: progressdialog.cpp:250
KPIM::TransactionItem::setStatus
void setStatus(const QString &)
Definition: progressdialog.cpp:215
KPIM::TransactionItemView::addTransactionItem
TransactionItem * addTransactionItem(ProgressItem *item, bool first)
Definition: progressdialog.cpp:71
KPIM::ProgressManager
The ProgressManager singleton keeps track of all ongoing transactions and notifies observers (progres...
Definition: progressmanager.h:278
KPIM::ProgressDialog::closeEvent
virtual void closeEvent(QCloseEvent *)
Definition: progressdialog.cpp:297
KPIM::SSLLabel::lastState
State lastState() const
Definition: ssllabel.cpp:57
KPIM::ProgressDialog::slotTransactionUsesBusyIndicator
void slotTransactionUsesBusyIndicator(KPIM::ProgressItem *, bool)
Definition: progressdialog.cpp:388
progressmanager.h
KPIM::TransactionItemView
Definition: progressdialog.h:53
KPIM::ProgressDialog::mTransactionsToListviewItems
QMap< const ProgressItem *, TransactionItem * > mTransactionsToListviewItems
Definition: progressdialog.h:148
KPIM::ProgressItem::usesCrypto
bool usesCrypto() const
Definition: progressmanager.h:92
KPIM::TransactionItem::slotItemCanceled
void slotItemCanceled()
Definition: progressdialog.cpp:236
KPIM::ProgressDialog::slotTransactionLabel
void slotTransactionLabel(KPIM::ProgressItem *item, const QString &)
Definition: progressdialog.cpp:370
KPIM::ProgressDialog::mScrollView
TransactionItemView * mScrollView
Definition: progressdialog.h:147
KPIM::TransactionItem::setLabel
void setLabel(const QString &)
Definition: progressdialog.cpp:210
KPIM::ProgressItem::cancel
void cancel()
Definition: progressmanager.cpp:90
KPIM::ProgressDialog::slotTransactionStatus
void slotTransactionStatus(KPIM::ProgressItem *item, const QString &)
Definition: progressdialog.cpp:361
KPIM::TransactionItem::mItemLabel
QLabel * mItemLabel
Definition: progressdialog.h:109
KPIM::ProgressDialog::slotClose
void slotClose()
Definition: progressdialog.cpp:413
KPIM::ProgressItem::progress
unsigned int progress() const
Definition: progressmanager.h:116
KPIM::ProgressDialog::slotHide
void slotHide()
Definition: progressdialog.cpp:405
KPIM::ProgressDialog::setVisible
void setVisible(bool b)
Definition: progressdialog.cpp:419
KPIM::ProgressDialog::slotTransactionCanceled
void slotTransactionCanceled(KPIM::ProgressItem *item)
Definition: progressdialog.cpp:348
KPIM::ProgressDialog::slotTransactionCompleted
void slotTransactionCompleted(KPIM::ProgressItem *item)
Definition: progressdialog.cpp:331
KPIM::ProgressDialog::slotTransactionProgress
void slotTransactionProgress(KPIM::ProgressItem *item, unsigned int progress)
Definition: progressdialog.cpp:352
KPIM::TransactionItemView::sizeHint
QSize sizeHint() const
Definition: progressdialog.cpp:98
QLabel
KPIM::ProgressItem
Definition: progressmanager.h:45
KPIM::TransactionItem::mSSLLabel
SSLLabel * mSSLLabel
Definition: progressdialog.h:112
KPIM::SSLLabel::setEncrypted
void setEncrypted(bool enc=true)
Definition: ssllabel.cpp:48
KPIM::ProgressItem::status
const QString & status() const
Definition: progressmanager.h:76
KPIM::TransactionItem::mCancelButton
QPushButton * mCancelButton
Definition: progressdialog.h:108
KHBox
progressdialog.h
KPIM::OverlayWidget
This is a widget that can align itself with another one, without using a layout, so that it can actua...
Definition: overlaywidget.h:49
QFrame
KPIM::TransactionItemView::slotLayoutFirstItem
void slotLayoutFirstItem()
Definition: progressdialog.cpp:116
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:03 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkdepim

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

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