187 changes: 75 additions & 112 deletions src/gui/qgsmessagebar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,19 @@
***************************************************************************/

#include "qgsmessagebar.h"
#include "qgsmessagebaritem.h"
#include "qgsapplication.h"

#include <QWidget>
#include <QPalette>
#include <QStackedWidget>
#include <QLabel>
#include <QProgressBar>
#include <QToolButton>
#include <QTimer>
#include <QGridLayout>
#include <QMenu>
#include <QMouseEvent>
#include <QTextEdit>

#include <QLabel>

QgsMessageBar::QgsMessageBar( QWidget *parent )
: QFrame( parent ), mCurrentItem( NULL )
Expand Down Expand Up @@ -91,8 +90,8 @@ QgsMessageBar::QgsMessageBar( QWidget *parent )
mCountdownTimer->setInterval( 1000 );
connect( mCountdownTimer, SIGNAL( timeout() ), this, SLOT( updateCountdown() ) );

connect( this, SIGNAL( widgetAdded( QWidget* ) ), this, SLOT( updateItemCount() ) );
connect( this, SIGNAL( widgetRemoved( QWidget* ) ), this, SLOT( updateItemCount() ) );
connect( this, SIGNAL( widgetAdded( QgsMessageBarItem* ) ), this, SLOT( updateItemCount() ) );
connect( this, SIGNAL( widgetRemoved( QgsMessageBarItem* ) ), this, SLOT( updateItemCount() ) );

// start hidden
setVisible( false );
Expand Down Expand Up @@ -123,26 +122,24 @@ void QgsMessageBar::popItem( QgsMessageBarItem *item )
{
Q_ASSERT( item );

if ( item != mCurrentItem && !mList.contains( item ) )
if ( item != mCurrentItem && !mItems.contains( item ) )
return;

if ( item == mCurrentItem )
{
if ( mCurrentItem )
{
mLayout->removeWidget( mCurrentItem->widget() );
mCurrentItem->widget()->hide();
if ( mCurrentItem->widget()->parent() == this )
{
delete mCurrentItem->widget();
}
QWidget *widget = dynamic_cast<QWidget*>( mCurrentItem );
mLayout->removeWidget( widget );
mCurrentItem->hide();
disconnect( mCurrentItem, SIGNAL( styleChanged( QString ) ), this, SLOT( setStyleSheet( QString ) ) );
delete mCurrentItem;
mCurrentItem = 0;
}

if ( !mList.isEmpty() )
if ( !mItems.isEmpty() )
{
pushItem( mList.first() );
showItem( mItems.first() );
}
else
{
Expand All @@ -151,33 +148,29 @@ void QgsMessageBar::popItem( QgsMessageBarItem *item )
}
else
{
mList.removeOne( item );
mItems.removeOne( item );
}

emit widgetRemoved( item->widget() );
emit widgetRemoved( item );
}

bool QgsMessageBar::popWidget( QWidget *widget )
bool QgsMessageBar::popWidget( QgsMessageBarItem *item )
{
if ( !widget || !mCurrentItem )
if ( !item || !mCurrentItem )
return false;

if ( widget == mCurrentItem->widget() )
if ( item == mCurrentItem )
{
popItem( mCurrentItem );
return true;
}

foreach ( QgsMessageBarItem *item, mList )
foreach ( QgsMessageBarItem *existingItem, mItems )
{
if ( item->widget() == widget )
if ( existingItem == item )
{
mList.removeOne( item );
if ( item->widget()->parent() == this )
{
delete item->widget();
}
delete item;
mItems.removeOne( existingItem );
delete existingItem;
return true;
}
}
Expand All @@ -200,38 +193,41 @@ bool QgsMessageBar::popWidget()

bool QgsMessageBar::clearWidgets()
{
if ( !mCurrentItem && mList.empty() )
if ( !mCurrentItem && mItems.empty() )
return true;

while ( mList.count() > 0 )
while ( mItems.count() > 0 )
{
popWidget();
}
popWidget();

return !mCurrentItem && mList.empty();
return !mCurrentItem && mItems.empty();
}

void QgsMessageBar::pushItem( QgsMessageBarItem *item )
void QgsMessageBar::showItem( QgsMessageBarItem *item )
{
Q_ASSERT( item );

if ( mCurrentItem != 0 )
disconnect( mCurrentItem, SIGNAL( styleChanged( QString ) ), this, SLOT( setStyleSheet( QString ) ) );

if ( item == mCurrentItem )
return;

if ( mList.contains( item ) )
mList.removeOne( item );
if ( mItems.contains( item ) )
mItems.removeOne( item );

if ( mCurrentItem )
{
mList.prepend( mCurrentItem );
mLayout->removeWidget( mCurrentItem->widget() );
mCurrentItem->widget()->hide();
mItems.prepend( mCurrentItem );
mLayout->removeWidget( mCurrentItem );
mCurrentItem->hide();
}

mCurrentItem = item;
mLayout->addWidget( item->widget(), 0, 1, 1, 1 );
mCurrentItem->widget()->show();
mLayout->addWidget( item, 0, 1, 1, 1 );
mCurrentItem->show();

if ( item->duration() > 0 )
{
Expand All @@ -241,102 +237,69 @@ void QgsMessageBar::pushItem( QgsMessageBarItem *item )
mCountdownTimer->start();
}

setStyleSheet( item->styleSheet() );
connect( mCurrentItem, SIGNAL( styleChanged( QString ) ), this, SLOT( setStyleSheet( QString ) ) );
setStyleSheet( item->getStyleSheet() );
show();

emit widgetAdded( item->widget() );
emit widgetAdded( item );
}

void QgsMessageBar::pushWidget( QWidget *widget, MessageLevel level, int duration )
void QgsMessageBar::pushItem( QgsMessageBarItem *item )
{
resetCountdown();
// avoid duplicated widget
popWidget( item );
showItem( item );
}

QString stylesheet;
if ( level >= CRITICAL )
{
stylesheet = "QgsMessageBar { background-color: #d65253; border: 1px solid #9b3d3d; } "
"QLabel,QTextEdit { color: white; } ";
}
else if ( level == WARNING )
QgsMessageBarItem* QgsMessageBar::pushWidget( QWidget *widget , QgsMessageBar::MessageLevel level, int duration )
{
QgsMessageBarItem *item;
item = dynamic_cast<QgsMessageBarItem*>( widget );
if ( item )
{
stylesheet = "QgsMessageBar { background-color: #ffc800; border: 1px solid #e0aa00; } "
"QLabel,QTextEdit { color: black; } ";
item->setLevel( level )->setDuration( duration );
}
else if ( level <= INFO )
else
{
stylesheet = "QgsMessageBar { background-color: #e7f5fe; border: 1px solid #b9cfe4; } "
"QLabel,QTextEdit { color: #2554a1; } ";
item = new QgsMessageBarItem( widget, level, duration );
}
stylesheet += "QLabel#mItemCount { font-style: italic; }";
pushWidget( widget, stylesheet, duration );
pushItem( item );
return item;
}

void QgsMessageBar::pushWidget( QWidget *widget, const QString &styleSheet, int duration )
QString QgsMessageBar::pushMessage( const QString &title, const QString &text, QgsMessageBar::MessageLevel level, int duration )
{
if ( !widget )
return;

// avoid duplicated widget
popWidget( widget );

pushItem( new QgsMessageBarItem( widget, styleSheet, duration ) );
QgsMessageBarItem *item = new QgsMessageBarItem( title, text, level, duration );
pushItem( item );
return item->id();
}

QWidget* QgsMessageBar::createMessage( const QString &title, const QString &text, const QIcon &icon, QWidget *parent )
QgsMessageBarItem* QgsMessageBar::createMessage( const QString &text, QWidget *parent )
{
QWidget *widget = new QWidget( parent );

QHBoxLayout *layout = new QHBoxLayout( widget );
layout->setContentsMargins( 0, 0, 0, 0 );
QgsMessageBarItem* item = new QgsMessageBarItem( text, INFO, 0, parent );
return item;
}

if ( !icon.isNull() )
{
QLabel *lblIcon = new QLabel( widget );
lblIcon->setPixmap( icon.pixmap( 24 ) );
layout->addWidget( lblIcon );
}
QgsMessageBarItem* QgsMessageBar::createMessage( const QString &title, const QString &text, QWidget *parent )
{
return new QgsMessageBarItem( title, text, QgsMessageBar::INFO, 0, parent );
}

QTextEdit *msgText = new QTextEdit( widget );
msgText->setObjectName( "mMsgText" );
QString content = text;
if ( !title.isEmpty() )
{
// add ':' to end of title
QString t = title.trimmed();
if ( !t.endsWith( ":" ) )
t += ": ";
content.prepend( QString( "<b>" ) + t + "</b>" );
}
msgText->setText( content );
msgText->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum );
msgText->setReadOnly( true );
msgText->setFrameShape( QFrame::NoFrame );
// stylesheet set here so Qt-style substitued scrollbar arrows can show within limited height
// adjusts to height of font set in app options
msgText->setStyleSheet( "* { background-color: rgba(0,0,0,0); margin-top: 0.25em; max-height: 1.75em; min-height: 1.75em; } "
"QScrollBar::add-page,QScrollBar::sub-page,QScrollBar::handle { background-color: rgba(0,0,0,0); color: rgba(0,0,0,0); }" );
layout->addWidget( msgText );

return widget;
QgsMessageBarItem* QgsMessageBar::createMessage( QWidget *widget, QWidget *parent )
{
return new QgsMessageBarItem( widget, INFO, 0, parent );
}

void QgsMessageBar::pushMessage( const QString &title, const QString &text, MessageLevel level, int duration )
QgsMessageBarItem* QgsMessageBar::itemAtId( QString uuid )
{
QString msgIcon( "/mIconInfo.png" );
switch ( level )
{
case QgsMessageBar::CRITICAL:
msgIcon = QString( "/mIconCritical.png" );
break;
case QgsMessageBar::WARNING:
msgIcon = QString( "/mIconWarn.png" );
break;
default:
break;
}
if ( mCurrentItem->id() == uuid )
return mCurrentItem;

QWidget *msg = QgsMessageBar::createMessage( title, text, QgsApplication::getThemeIcon( msgIcon ), this );
pushWidget( msg, level, duration );
foreach ( QgsMessageBarItem *item, mItems )
if ( item->id() == uuid )
return item;
return 0;
}

void QgsMessageBar::updateCountdown()
Expand Down Expand Up @@ -367,5 +330,5 @@ void QgsMessageBar::resetCountdown()

void QgsMessageBar::updateItemCount()
{
mItemCount->setText( mList.count() > 0 ? tr( "%n more", "unread messages", mList.count() ) : QString( "" ) );
mItemCount->setText( mItems.count() > 0 ? tr( "%n more", "unread messages", mItems.count() ) : QString( "" ) );
}
69 changes: 29 additions & 40 deletions src/gui/qgsmessagebar.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class QLabel;
class QAction;
class QTimer;

class QgsMessageBarItem;

/** \ingroup gui
* A bar for displaying non-blocking messages to the user.
* \note added in 1.9
Expand All @@ -53,41 +55,48 @@ class GUI_EXPORT QgsMessageBar: public QFrame
QgsMessageBar( QWidget *parent = 0 );
~QgsMessageBar();

/*! display a widget on the bar after hiding the currently visible one
* and putting it in a stack
* @param widget widget to add
/*! display a message item on the bar after hiding the currently visible one
* and putting it in a stack.
* @param item item to display
*/
void pushItem( QgsMessageBarItem *item );

/*! display a widget as a message on the bar after hiding the currently visible one
* and putting it in a stack.
* @param widget message widget to display
* @param level is QgsMessageBar::INFO, WARNING or CRITICAL
* @param duration timeout duration of message in seconds, 0 value indicates no timeout
*/
void pushWidget( QWidget *widget, MessageLevel level = INFO, int duration = 0 );
QgsMessageBarItem *pushWidget( QWidget *widget, MessageLevel level = INFO, int duration = 0 );

/*! remove the passed widget from the bar (if previously added),
* then display the next one in the stack if any or hide the bar
* @param widget widget to remove
* @param item item to remove
* @return true if the widget was removed, false otherwise
*/
bool popWidget( QWidget *widget );
bool popWidget( QgsMessageBarItem *item );

//! make out a widget containing a message to be displayed on the bar
static QWidget* createMessage( const QString &text, QWidget *parent = 0 ) { return createMessage( QString::null, text, QIcon(), parent ); }
//! make out a widget containing icon and message to be displayed on the bar
static QWidget* createMessage( const QString &text, const QIcon &icon, QWidget *parent = 0 ) { return createMessage( QString::null, text, icon, parent ); }
static QgsMessageBarItem* createMessage( const QString &text, QWidget *parent = 0 );
//! make out a widget containing title and message to be displayed on the bar
static QgsMessageBarItem* createMessage( const QString &title, const QString &text, QWidget *parent = 0 );
//! make out a widget containing title and message to be displayed on the bar
static QWidget* createMessage( const QString &title, const QString &text, QWidget *parent = 0 ) { return createMessage( title, text, QIcon(), parent ); }
//! make out a widget containing icon, title and message to be displayed on the bar
static QWidget* createMessage( const QString &title, const QString &text, const QIcon &icon, QWidget *parent = 0 );
static QgsMessageBarItem* createMessage( QWidget *widget, QWidget *parent = 0 );

//! convenience method for pushing a message to the bar
QString pushMessage( const QString &text, MessageLevel level = INFO, int duration = 0 ) { return pushMessage( QString::null, text, level, duration ); }
//! convenience method for pushing a message with title to the bar
QString pushMessage( const QString &title, const QString &text, MessageLevel level = INFO, int duration = 0 );

//! convenience method for pushing a non-widget-based message to the bar
void pushMessage( const QString &text, MessageLevel level = INFO, int duration = 0 ) { pushMessage( QString::null, text, level, duration ); }
//! convenience method for pushing a non-widget-based message with title to the bar
void pushMessage( const QString &title, const QString &text, MessageLevel level = INFO, int duration = 0 );
//! return the item for given uuid if the item still exists, 0 otherwise
QgsMessageBarItem* itemAtId( QString uuid );

signals:
//! emitted when a message widget is added to the bar
void widgetAdded( QWidget *widget );
void widgetAdded( QgsMessageBarItem *item );

//! emitted when a message widget was removed from the bar
void widgetRemoved( QWidget *widget );
void widgetRemoved( QgsMessageBarItem *item );

public slots:
/*! remove the currently displayed widget from the bar and
Expand All @@ -105,30 +114,10 @@ class GUI_EXPORT QgsMessageBar: public QFrame
void mousePressEvent( QMouseEvent * e );

private:
class QgsMessageBarItem
{
public:
QgsMessageBarItem( QWidget *widget, const QString &styleSheet, int duration = 0 ):
mWidget( widget ), mStyleSheet( styleSheet ), mDuration( duration ) {}
~QgsMessageBarItem() {}

QWidget* widget() const { return mWidget; }
QString styleSheet() const { return mStyleSheet; }
int duration() const { return mDuration; }

private:
QWidget *mWidget;
QString mStyleSheet;
int mDuration; // 0 value indicates no timeout duration
};

void pushWidget( QWidget *widget, const QString &styleSheet, int duration = 0 );

void popItem( QgsMessageBarItem *item );
void pushItem( QgsMessageBarItem *item );

void showItem( QgsMessageBarItem *item );
QgsMessageBarItem *mCurrentItem;
QList<QgsMessageBarItem *> mList;
QList<QgsMessageBarItem *> mItems;
QMenu *mCloseMenu;
QToolButton *mCloseBtn;
QGridLayout *mLayout;
Expand Down
245 changes: 245 additions & 0 deletions src/gui/qgsmessagebaritem.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
/***************************************************************************
qgsmessagebaritem.h - description
-------------------
begin : August 2013
copyright : (C) 2013 by Denis Rouzaud
email : denis.rouzaud@gmail.com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsapplication.h"
#include "qgsmessagebaritem.h"
#include "qgsmessagebar.h"

#include <QHBoxLayout>
#include <QLabel>
#include <QTextEdit>
#include <QUuid>

QgsMessageBarItem::QgsMessageBarItem( const QString &text, QgsMessageBar::MessageLevel level, int duration, QWidget *parent ) :
QWidget( parent )
, mUuid( QUuid::createUuid().toString() )
, mTitle( "" )
, mText( text )
, mLevel( level )
, mDuration( duration )
, mWidget( 0 )
, mUserIcon( QIcon() )
, mLayout( 0 )
{
writeContent();
}

QgsMessageBarItem::QgsMessageBarItem(const QString &title, const QString &text, QgsMessageBar::MessageLevel level, int duration , QWidget *parent ) :
QWidget( parent )
, mUuid( QUuid::createUuid().toString() )
, mTitle( title )
, mText( text )
, mLevel( level )
, mDuration( duration )
, mWidget( 0 )
, mUserIcon( QIcon() )
, mLayout( 0 )
{
writeContent();
}

QgsMessageBarItem::QgsMessageBarItem( const QString &title, const QString &text, QWidget *widget, QgsMessageBar::MessageLevel level, int duration, QWidget *parent ) :
QWidget( parent )
, mUuid( QUuid::createUuid().toString() )
, mTitle( title )
, mText( text )
, mLevel( level )
, mDuration( duration )
, mWidget( widget )
, mUserIcon( QIcon() )
, mLayout( 0 )
{
writeContent();
}

QgsMessageBarItem::QgsMessageBarItem( QWidget *widget, QgsMessageBar::MessageLevel level, int duration, QWidget *parent ) :
QWidget( parent )
, mUuid( QUuid::createUuid().toString() )
, mTitle( "" )
, mText( "" )
, mLevel( level )
, mDuration( duration )
, mWidget( widget )
, mUserIcon( QIcon() )
, mLayout( 0 )
{
writeContent();
}

void QgsMessageBarItem::writeContent()
{
if ( mLayout == 0 )
{
mLayout = new QHBoxLayout( this );
mLayout->setContentsMargins( 0, 0, 0, 0 );
mTextEdit = 0;
mLblIcon = 0;
}

// TITLE AND TEXT
if ( mTitle.isEmpty() && mText.isEmpty() )
{
if ( mTextEdit != 0 )
{
delete mTextEdit;
mTextEdit = 0;
}
}
else
{
if ( mTextEdit == 0 )
{
mTextEdit = new QTextEdit( this );
mTextEdit->setObjectName( "textEdit" );
mTextEdit->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum );
mTextEdit->setReadOnly( true );
mTextEdit->setFrameShape( QFrame::NoFrame );
// stylesheet set here so Qt-style substitued scrollbar arrows can show within limited height
// adjusts to height of font set in app options
mTextEdit->setStyleSheet( "* { background-color: rgba(0,0,0,0); margin-top: 0.25em; max-height: 1.75em; min-height: 1.75em; } "
"QScrollBar::add-page,QScrollBar::sub-page,QScrollBar::handle { background-color: rgba(0,0,0,0); color: rgba(0,0,0,0); }" );
mLayout->addWidget( mTextEdit );
}
QString content = mText;
if ( !mTitle.isEmpty() )
{
// add ':' to end of title
QString t = mTitle.trimmed();
if ( !t.endsWith( ":" ) && !content.isEmpty() )
t += ": ";
content.prepend( QString( "<b>" ) + t + "</b>" );
}
mTextEdit->setText( content );
}

// WIDGET
if ( mWidget != 0 )
{
int idx = 0;
if ( mTextEdit != 0 )
idx = 1;

QLayoutItem *item = mLayout->itemAt( idx );
if ( !item || item->widget() != mWidget )
{
mLayout->insertWidget( idx, mWidget );
}
}

// ICON
if ( mLblIcon == 0 )
{
mLblIcon = new QLabel( this );
mLayout->addWidget( mLblIcon );
}
QIcon icon;
if ( !mUserIcon.isNull() )
{
icon = mUserIcon;
}
else
{
QString msgIcon( "/mIconInfo.png" );
switch ( mLevel )
{
case QgsMessageBar::CRITICAL:
msgIcon = QString( "/mIconCritical.png" );
break;
case QgsMessageBar::WARNING:
msgIcon = QString( "/mIconWarn.png" );
break;
default:
break;
}
icon = QgsApplication::getThemeIcon( msgIcon );
}
mLblIcon->setPixmap( icon.pixmap( 24 ) );


// STYLESHEET
if ( mLevel >= QgsMessageBar::CRITICAL )
{
mStyleSheet = "QgsMessageBar { background-color: #d65253; border: 1px solid #9b3d3d; } "
"QLabel,QTextEdit { color: white; } ";
}
else if ( mLevel == QgsMessageBar::WARNING )
{
mStyleSheet = "QgsMessageBar { background-color: #ffc800; border: 1px solid #e0aa00; } "
"QLabel,QTextEdit { color: black; } ";
}
else if ( mLevel <= QgsMessageBar::INFO )
{
mStyleSheet = "QgsMessageBar { background-color: #e7f5fe; border: 1px solid #b9cfe4; } "
"QLabel,QTextEdit { color: #2554a1; } ";
}
mStyleSheet += "QLabel#mItemCount { font-style: italic; }";
}

QgsMessageBarItem* QgsMessageBarItem::setText( QString text )
{
mText = text;
writeContent();
return this;
}

QgsMessageBarItem *QgsMessageBarItem::setTitle( QString title )
{
mTitle = title;
writeContent();
return this;
}

QgsMessageBarItem *QgsMessageBarItem::setLevel( QgsMessageBar::MessageLevel level )
{
mLevel = level;
writeContent();
emit styleChanged( mStyleSheet );
return this;
}

QgsMessageBarItem *QgsMessageBarItem::setWidget( QWidget *widget )
{
if ( mWidget != 0 )
{
QLayoutItem *item;
int idx = 0;
if ( mTextEdit != 0 )
idx = 1;
item = mLayout->itemAt( idx );
if ( item->widget() == mWidget )
{
delete item->widget();
}
}
mWidget = widget;
writeContent();
return this;
}

QgsMessageBarItem* QgsMessageBarItem::setIcon( const QIcon &icon )
{
mUserIcon = icon;
return this;
}


QgsMessageBarItem* QgsMessageBarItem::setDuration( int duration )
{
mDuration = duration;
return this;
}

90 changes: 90 additions & 0 deletions src/gui/qgsmessagebaritem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/***************************************************************************
qgsmessagebaritem.h - description
-------------------
begin : August 2013
copyright : (C) 2013 by Denis Rouzaud
email : denis.rouzaud@gmail.com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef qgsmessagebaritem_H
#define qgsmessagebaritem_H

#include <qgsmessagebaritem.h>
#include <qgsmessagebar.h>

#include <QWidget>
#include <QIcon>
#include <QTextEdit>
#include <QHBoxLayout>


class QgsMessageBarItem : public QWidget
{
Q_OBJECT
public:
//! make out a widget containing a message to be displayed on the bar
QgsMessageBarItem( const QString &text, QgsMessageBar::MessageLevel level = QgsMessageBar::INFO, int duration = 0, QWidget *parent = 0 );

//! make out a widget containing title and message to be displayed on the bar
QgsMessageBarItem( const QString &title, const QString &text, QgsMessageBar::MessageLevel level = QgsMessageBar::INFO, int duration = 0, QWidget *parent = 0 );

//! make out a widget containing title, message and widget to be displayed on the bar
QgsMessageBarItem( const QString &title, const QString &text, QWidget *widget, QgsMessageBar::MessageLevel level = QgsMessageBar::INFO, int duration = 0, QWidget *parent = 0 );

//! make out a widget containing a widget to be displayed on the bar
QgsMessageBarItem( QWidget *widget, QgsMessageBar::MessageLevel level = QgsMessageBar::INFO, int duration = 0, QWidget *parent = 0 );

QgsMessageBarItem *setText( QString text );

QgsMessageBarItem *setTitle( QString title );

QgsMessageBarItem *setLevel( QgsMessageBar::MessageLevel level );

QgsMessageBarItem *setWidget( QWidget *widget );

QgsMessageBarItem *setIcon( const QIcon &icon );

QgsMessageBarItem *setDuration( int duration );

//! returns the duration in second of the message
int duration() const { return mDuration; }

//! get the uuid of this message
QString id() { return mUuid; }

//! returns the level
QgsMessageBar::MessageLevel level() { return mLevel; }

//! returns the styleSheet
QString getStyleSheet() { return mStyleSheet; }

signals:
//! emitted when the message level has changed
void styleChanged( QString styleSheet );


private:
void writeContent();

QString mUuid;
QString mTitle;
QString mText;
QgsMessageBar::MessageLevel mLevel;
int mDuration;
QWidget *mWidget;
QIcon mUserIcon;
QHBoxLayout *mLayout;
QLabel *mLblIcon;
QString mStyleSheet;
QTextEdit *mTextEdit;
};

#endif // qgsmessagebaritem_H