22
22
#include < QPalette>
23
23
#include < QStackedWidget>
24
24
#include < QLabel>
25
+ #include < QProgressBar>
25
26
#include < QToolButton>
27
+ #include < QTimer>
26
28
#include < QGridLayout>
27
29
#include < QMenu>
28
30
@@ -41,11 +43,28 @@ QgsMessageBar::QgsMessageBar( QWidget *parent )
41
43
mLayout ->setContentsMargins ( 9 , 1 , 9 , 1 );
42
44
setLayout ( mLayout );
43
45
46
+ mCountProgress = new QProgressBar ( this );
47
+
48
+ mCountProgress ->setStyleSheet ( " QProgressBar { border: 1px solid rgba(0, 0, 0, 75%);"
49
+ " border-radius: 2px; background: rgba(0, 0, 0, 0); }"
50
+ " QProgressBar::chunk { background-color: rgba(0, 0, 0, 50%); width: 5px; }" );
51
+ mCountProgress ->setObjectName ( " mCountdown" );
52
+ mCountProgress ->setToolTip ( tr ( " Countdown" ) );
53
+ mCountProgress ->setMinimumWidth ( 25 );
54
+ mCountProgress ->setMaximumWidth ( 25 );
55
+ mCountProgress ->setMinimumHeight ( 10 );
56
+ mCountProgress ->setMaximumHeight ( 10 );
57
+ mCountProgress ->setSizePolicy ( QSizePolicy::Fixed, QSizePolicy::Fixed );
58
+ mCountProgress ->setTextVisible ( false );
59
+ mCountProgress ->setRange ( 0 , 5 );
60
+ mCountProgress ->setHidden ( true );
61
+ mLayout ->addWidget ( mCountProgress , 0 , 0 , 1 , 1 );
62
+
44
63
mItemCount = new QLabel ( this );
45
64
mItemCount ->setObjectName ( " mItemCount" );
46
65
mItemCount ->setToolTip ( tr ( " Remaining messages" ) );
47
66
mItemCount ->setSizePolicy ( QSizePolicy::Maximum, QSizePolicy::Preferred );
48
- mLayout ->addWidget ( mItemCount , 0 , 1 , 1 , 1 );
67
+ mLayout ->addWidget ( mItemCount , 0 , 2 , 1 , 1 );
49
68
50
69
mCloseMenu = new QMenu ( this );
51
70
mCloseMenu ->setObjectName ( " mCloseMenu" );
@@ -64,7 +83,11 @@ QgsMessageBar::QgsMessageBar( QWidget *parent )
64
83
mCloseBtn ->setSizePolicy ( QSizePolicy::Maximum, QSizePolicy::Preferred );
65
84
mCloseBtn ->setMenu ( mCloseMenu );
66
85
connect ( mCloseBtn , SIGNAL ( clicked () ), this , SLOT ( popWidget () ) );
67
- mLayout ->addWidget ( mCloseBtn , 0 , 2 , 1 , 1 );
86
+ mLayout ->addWidget ( mCloseBtn , 0 , 3 , 1 , 1 );
87
+
88
+ mCountdownTimer = new QTimer ( this );
89
+ mCountdownTimer ->setInterval ( 1000 );
90
+ connect ( mCountdownTimer , SIGNAL ( timeout () ), this , SLOT ( updateCountdown () ) );
68
91
69
92
connect ( this , SIGNAL ( widgetAdded ( QWidget* ) ), this , SLOT ( updateItemCount () ) );
70
93
connect ( this , SIGNAL ( widgetRemoved ( QWidget* ) ), this , SLOT ( updateItemCount () ) );
@@ -148,6 +171,8 @@ bool QgsMessageBar::popWidget()
148
171
if ( !mCurrentItem )
149
172
return false ;
150
173
174
+ resetCountdown ();
175
+
151
176
QgsMessageBarItem *item = mCurrentItem ;
152
177
popItem ( item );
153
178
@@ -186,17 +211,27 @@ void QgsMessageBar::pushItem( QgsMessageBarItem *item )
186
211
}
187
212
188
213
mCurrentItem = item;
189
- mLayout ->addWidget ( item->widget (), 0 , 0 , 1 , 1 );
214
+ mLayout ->addWidget ( item->widget (), 0 , 1 , 1 , 1 );
190
215
mCurrentItem ->widget ()->show ();
191
216
217
+ if ( item->duration () > 0 )
218
+ {
219
+ mCountProgress ->setRange ( 0 , item->duration () );
220
+ mCountProgress ->setValue ( item->duration () );
221
+ mCountProgress ->setVisible ( true );
222
+ mCountdownTimer ->start ();
223
+ }
224
+
192
225
setStyleSheet ( item->styleSheet () );
193
226
show ();
194
227
195
228
emit widgetAdded ( item->widget () );
196
229
}
197
230
198
- void QgsMessageBar::pushWidget ( QWidget *widget, int level )
231
+ void QgsMessageBar::pushWidget ( QWidget *widget, int level, int duration )
199
232
{
233
+ resetCountdown ();
234
+
200
235
QString stylesheet;
201
236
if ( level >= 2 )
202
237
{
@@ -215,18 +250,18 @@ void QgsMessageBar::pushWidget( QWidget *widget, int level )
215
250
}
216
251
stylesheet += " QLabel#mMsgTitle { font-weight: bold; } "
217
252
" QLabel#mItemCount { font-style: italic; }" ;
218
- pushWidget ( widget, stylesheet );
253
+ pushWidget ( widget, stylesheet, duration );
219
254
}
220
255
221
- void QgsMessageBar::pushWidget ( QWidget *widget, const QString &styleSheet )
256
+ void QgsMessageBar::pushWidget ( QWidget *widget, const QString &styleSheet, int duration )
222
257
{
223
258
if ( !widget )
224
259
return ;
225
260
226
261
// avoid duplicated widget
227
262
popWidget ( widget );
228
263
229
- pushItem ( new QgsMessageBarItem ( widget, styleSheet ) );
264
+ pushItem ( new QgsMessageBarItem ( widget, styleSheet, duration ) );
230
265
}
231
266
232
267
QWidget* QgsMessageBar::createMessage ( const QString &title, const QString &text, const QIcon &icon, QWidget *parent )
@@ -259,6 +294,31 @@ QWidget* QgsMessageBar::createMessage( const QString &title, const QString &text
259
294
return widget;
260
295
}
261
296
297
+ void QgsMessageBar::updateCountdown ()
298
+ {
299
+ if ( !mCountdownTimer ->isActive () )
300
+ {
301
+ resetCountdown ();
302
+ return ;
303
+ }
304
+ if ( mCountProgress ->value () < 2 )
305
+ {
306
+ popWidget ();
307
+ }
308
+ else
309
+ {
310
+ mCountProgress ->setValue ( mCountProgress ->value () - 1 );
311
+ }
312
+ }
313
+
314
+ void QgsMessageBar::resetCountdown ()
315
+ {
316
+ if ( mCountdownTimer ->isActive () )
317
+ mCountdownTimer ->stop ();
318
+
319
+ mCountProgress ->setVisible ( false );
320
+ }
321
+
262
322
void QgsMessageBar::updateItemCount ()
263
323
{
264
324
mItemCount ->setText ( mList .count () > 0 ? QString::number ( mList .count () ) + QString ( " " ) + tr ( " more" ) : QString ( " " ) );
0 commit comments