Skip to content

Commit dc7a4ce

Browse files
committedJan 21, 2019
Make URLS in message log clickable
1 parent 9da842d commit dc7a4ce

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed
 

‎python/gui/auto_generated/qgsmessagelogviewer.sip.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ Logs a ``message`` to the viewer.
3939

4040
virtual void reject();
4141

42+
virtual bool eventFilter( QObject *obj, QEvent *ev );
43+
4244

4345
};
4446

‎src/gui/qgsmessagelogviewer.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <QPlainTextEdit>
3131
#include <QScrollBar>
3232
#include <QDebug>
33+
#include <QDesktopServices>
3334

3435
QgsMessageLogViewer::QgsMessageLogViewer( QWidget *parent, Qt::WindowFlags fl )
3536
: QDialog( parent, fl )
@@ -70,6 +71,7 @@ void QgsMessageLogViewer::logMessage( const QString &message, const QString &tag
7071
{
7172
w = new QPlainTextEdit( this );
7273
w->setReadOnly( true );
74+
w->viewport()->installEventFilter( this );
7375
tabWidget->addTab( w, cleanedTag );
7476
tabWidget->setCurrentIndex( tabWidget->count() - 1 );
7577
}
@@ -116,3 +118,43 @@ void QgsMessageLogViewer::closeTab( int index )
116118
else
117119
tabWidget->removeTab( index );
118120
}
121+
122+
bool QgsMessageLogViewer::eventFilter( QObject *object, QEvent *event )
123+
{
124+
switch ( event->type() )
125+
{
126+
case QEvent::MouseButtonPress:
127+
{
128+
if ( QPlainTextEdit *te = qobject_cast<QPlainTextEdit *>( object->parent() ) )
129+
{
130+
QMouseEvent *me = static_cast< QMouseEvent *>( event );
131+
mClickedAnchor = ( me->button() & Qt::LeftButton ) ? te->anchorAt( me->pos() ) :
132+
QString();
133+
if ( !mClickedAnchor.isEmpty() )
134+
return true;
135+
}
136+
break;
137+
}
138+
139+
case QEvent::MouseButtonRelease:
140+
{
141+
if ( QPlainTextEdit *te = qobject_cast<QPlainTextEdit *>( object->parent() ) )
142+
{
143+
QMouseEvent *me = static_cast< QMouseEvent *>( event );
144+
QString clickedAnchor = ( me->button() & Qt::LeftButton ) ? te->anchorAt( me->pos() ) :
145+
QString();
146+
if ( !clickedAnchor.isEmpty() && clickedAnchor == mClickedAnchor )
147+
{
148+
QDesktopServices::openUrl( mClickedAnchor );
149+
return true;
150+
}
151+
}
152+
break;
153+
}
154+
155+
default:
156+
break;
157+
}
158+
159+
return QDialog::eventFilter( object, event );
160+
}

‎src/gui/qgsmessagelogviewer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,14 @@ class GUI_EXPORT QgsMessageLogViewer: public QDialog, private Ui::QgsMessageLogV
5353
protected:
5454
void closeEvent( QCloseEvent *e ) override;
5555
void reject() override;
56+
bool eventFilter( QObject *obj, QEvent *ev ) override;
5657

5758
private slots:
5859
void closeTab( int index );
60+
61+
private:
62+
63+
QString mClickedAnchor;
5964
};
6065

6166
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.