1 /***************************************************************************
2                          qgsstatusbar.cpp
3                          ----------------
4     begin                : May 2017
5     copyright            : (C) 2017 by Nyall Dawson
6     email                : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgsstatusbar.h"
19 #include <QLayout>
20 #include <QLineEdit>
21 #include <QPalette>
22 #include <QTimer>
23 #include <QEvent>
24 #include <QStatusBar>
25 
QgsStatusBar(QWidget * parent)26 QgsStatusBar::QgsStatusBar( QWidget *parent )
27   : QWidget( parent )
28 {
29   mLayout = new QHBoxLayout();
30   mLayout->setContentsMargins( 2, 0, 2, 0 );
31   mLayout->setSpacing( 6 );
32 
33   mLineEdit = new QLineEdit( QString() );
34   mLineEdit->setDisabled( true );
35   mLineEdit->setFrame( false );
36   mLineEdit->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
37   QPalette palette = mLineEdit->palette();
38   palette.setColor( QPalette::Disabled, QPalette::Text, QPalette::WindowText );
39   mLineEdit->setPalette( palette );
40   mLineEdit->setStyleSheet( QStringLiteral( "* { border: 0; background-color: rgba(0, 0, 0, 0); }" ) );
41   mLayout->addWidget( mLineEdit, 10 );
42   setLayout( mLayout );
43 }
44 
addPermanentWidget(QWidget * widget,int stretch,Anchor anchor)45 void QgsStatusBar::addPermanentWidget( QWidget *widget, int stretch, Anchor anchor )
46 {
47   switch ( anchor )
48   {
49     case AnchorLeft:
50       mLayout->insertWidget( 0, widget, stretch, Qt::AlignLeft );
51       break;
52 
53     case AnchorRight:
54       mLayout->addWidget( widget, stretch, Qt::AlignLeft );
55       break;
56   }
57 }
58 
removeWidget(QWidget * widget)59 void QgsStatusBar::removeWidget( QWidget *widget )
60 {
61   mLayout->removeWidget( widget );
62 }
63 
currentMessage() const64 QString QgsStatusBar::currentMessage() const
65 {
66   return mLineEdit->text();
67 }
68 
showMessage(const QString & text,int timeout)69 void QgsStatusBar::showMessage( const QString &text, int timeout )
70 {
71   mLineEdit->setText( text );
72   mLineEdit->setCursorPosition( 0 );
73   if ( timeout > 0 )
74   {
75     if ( !mTempMessageTimer )
76     {
77       mTempMessageTimer = new QTimer( this );
78       connect( mTempMessageTimer, &QTimer::timeout, this, &QgsStatusBar::clearMessage );
79       mTempMessageTimer->setSingleShot( true );
80     }
81     mTempMessageTimer->start( timeout );
82   }
83   else if ( mTempMessageTimer )
84   {
85     delete mTempMessageTimer;
86     mTempMessageTimer = nullptr;
87   }
88 }
89 
clearMessage()90 void QgsStatusBar::clearMessage()
91 {
92   mLineEdit->setText( QString() );
93 }
94 
setParentStatusBar(QStatusBar * statusBar)95 void QgsStatusBar::setParentStatusBar( QStatusBar *statusBar )
96 {
97   if ( mParentStatusBar )
98     mParentStatusBar->disconnect( mShowMessageConnection );
99 
100   mParentStatusBar = statusBar;
101 
102   if ( mParentStatusBar )
103     mShowMessageConnection = connect( mParentStatusBar, &QStatusBar::messageChanged, this, [this]( const QString & message ) { showMessage( message ); } );
104 }
105 
changeEvent(QEvent * event)106 void QgsStatusBar::changeEvent( QEvent *event )
107 {
108   QWidget::changeEvent( event );
109 
110   if ( event->type() == QEvent::FontChange )
111   {
112     mLineEdit->setFont( font() );
113   }
114 }
115