Skip to content

Commit c23da96

Browse files
manisandronyalldawson
authored andcommitted
[FEATURE] Make links in feature identify results clickable
1 parent d525512 commit c23da96

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

src/app/qgsidentifyresultsdialog.cpp

+34-5
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include <QDesktopServices>
5454
#include <QMessageBox>
5555
#include <QComboBox>
56+
#include <QTextDocument>
5657

5758
//graph
5859
#include <qwt_plot.h>
@@ -61,6 +62,27 @@
6162
#include <qwt_legend.h>
6263
#include "qgsvectorcolorrampv2.h" // for random colors
6364

65+
static QString& insertLinkAnchors( QString& value )
66+
{
67+
// http://alanstorm.com/url_regex_explained
68+
static QRegExp urlRegEx( "(\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~\\s]|/))))" );
69+
static QRegExp protoRegEx( "^(?:f|ht)tps?://" );
70+
71+
int offset = 0;
72+
while ( urlRegEx.indexIn( value, offset ) != -1 )
73+
{
74+
QString url = urlRegEx.cap( 1 );
75+
QString protoUrl = url;
76+
if ( protoRegEx.indexIn( protoUrl ) == -1 )
77+
{
78+
protoUrl.prepend( "http://" );
79+
}
80+
QString anchor = QString( "<a href=\"%1\">%2</a>" ).arg( Qt::escape( protoUrl ) ).arg( Qt::escape( url ) );
81+
value.replace( urlRegEx.pos( 1 ), url.length(), anchor );
82+
offset = urlRegEx.pos( 1 ) + anchor.length();
83+
}
84+
return value;
85+
}
6486

6587
QgsIdentifyResultsWebView::QgsIdentifyResultsWebView( QWidget *parent ) : QgsWebView( parent )
6688
{
@@ -471,12 +493,16 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat
471493
if ( i >= fields.count() )
472494
continue;
473495

496+
if ( vlayer->editorWidgetV2( i ) == "Hidden" )
497+
continue;
498+
474499
QString defVal;
475500
if ( fields.fieldOrigin( i ) == QgsFields::OriginProvider && vlayer->dataProvider() )
476501
defVal = vlayer->dataProvider()->defaultValue( fields.fieldOriginIndex( i ) ).toString();
477502

478503
QString value = defVal == attrs.at( i ) ? defVal : fields.at( i ).displayString( attrs.at( i ) );
479504
QTreeWidgetItem *attrItem = new QTreeWidgetItem( QStringList() << QString::number( i ) << value );
505+
featItem->addChild( attrItem );
480506

481507
attrItem->setData( 0, Qt::DisplayRole, vlayer->attributeDisplayName( i ) );
482508
attrItem->setData( 0, Qt::UserRole, fields[i].name() );
@@ -490,18 +516,19 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat
490516
continue;
491517
}
492518

493-
value = representValue( vlayer, fields[i].name(), attrs.at( i ) );
519+
value = representValue( vlayer, fields[i].name(), attrs[i] );
520+
QLabel* valueLabel = new QLabel( insertLinkAnchors( value ) );
521+
valueLabel->setOpenExternalLinks( true );
522+
attrItem->treeWidget()->setItemWidget( attrItem, 1, valueLabel );
494523

495-
attrItem->setData( 1, Qt::DisplayRole, value );
524+
attrItem->setData( 1, Qt::DisplayRole, QString() );
496525

497526
if ( fields[i].name() == vlayer->displayField() )
498527
{
499528
featItem->setText( 0, attrItem->text( 0 ) );
500529
featItem->setText( 1, attrItem->text( 1 ) );
501530
featureLabeled = true;
502531
}
503-
504-
featItem->addChild( attrItem );
505532
}
506533

507534
if ( !featureLabeled )
@@ -1480,7 +1507,9 @@ void QgsIdentifyResultsDialog::attributeValueChanged( QgsFeatureId fid, int idx,
14801507
if ( item->data( 0, Qt::UserRole + 1 ).toInt() == idx )
14811508
{
14821509
value = representValue( vlayer, fld.name(), val );
1483-
item->setData( 1, Qt::DisplayRole, value );
1510+
QLabel* valueLabel = new QLabel( insertLinkAnchors( value ) );
1511+
valueLabel->setOpenExternalLinks( true );
1512+
item->treeWidget()->setItemWidget( item, 1, valueLabel );
14841513
return;
14851514
}
14861515
}

0 commit comments

Comments
 (0)