Skip to content

Commit

Permalink
Allow dragging and dropping project layers to QgsExtentWidget to copy…
Browse files Browse the repository at this point in the history
… extent from layer
  • Loading branch information
nyalldawson committed Mar 25, 2020
1 parent 9e4e32f commit 945eb46
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 3 deletions.
9 changes: 9 additions & 0 deletions python/gui/auto_generated/qgsextentwidget.sip.in
Expand Up @@ -205,6 +205,15 @@ Emitted when the widget's extent is changed.
Emitted when the widget's validation state changes.
%End

protected:

virtual void dragEnterEvent( QDragEnterEvent *event );

virtual void dragLeaveEvent( QDragLeaveEvent *event );

virtual void dropEvent( QDropEvent *event );


};

/************************************************************************
Expand Down
13 changes: 11 additions & 2 deletions python/plugins/processing/ui/widgetBaseSelector.ui
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>249</width>
<height>23</height>
<height>27</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -17,7 +17,16 @@
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
Expand Down
78 changes: 78 additions & 0 deletions src/gui/qgsextentwidget.cpp
Expand Up @@ -38,6 +38,7 @@ QgsExtentWidget::QgsExtentWidget( QWidget *parent, WidgetStyle style )

mCondensedRe = QRegularExpression( QStringLiteral( "\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)\\s*(\\[.*?\\])" ) );
mCondensedLineEdit->setValidator( new QRegularExpressionValidator( mCondensedRe, this ) );
mCondensedLineEdit->setShowClearButton( false );

connect( mCondensedLineEdit, &QLineEdit::textEdited, this, &QgsExtentWidget::setOutputExtentFromCondensedLineEdit );

Expand Down Expand Up @@ -84,6 +85,8 @@ QgsExtentWidget::QgsExtentWidget( QWidget *parent, WidgetStyle style )
mCondensedFrame->hide();
break;
}

setAcceptDrops( true );
}

void QgsExtentWidget::setOriginalExtent( const QgsRectangle &originalExtent, const QgsCoordinateReferenceSystem &originalCrs )
Expand Down Expand Up @@ -295,6 +298,20 @@ void QgsExtentWidget::setExtentToLayerExtent( const QString &layerId )
setOutputExtentFromLayer( layer );
}

QgsMapLayer *QgsExtentWidget::mapLayerFromMimeData( const QMimeData *data ) const
{
const QgsMimeDataUtils::UriList uriList = QgsMimeDataUtils::decodeUriList( data );
for ( const QgsMimeDataUtils::Uri &u : uriList )
{
// is this uri from the current project?
if ( QgsMapLayer *layer = u.mapLayer() )
{
return layer;
}
}
return nullptr;
}

void QgsExtentWidget::setOutputExtentFromCurrent()
{
if ( mCanvas )
Expand Down Expand Up @@ -386,3 +403,64 @@ void QgsExtentWidget::setMapCanvas( QgsMapCanvas *canvas )
mMenu->removeAction( mDrawOnCanvasAction );
}
}

void QgsExtentWidget::dragEnterEvent( QDragEnterEvent *event )
{
if ( !( event->possibleActions() & Qt::CopyAction ) )
{
event->ignore();
return;
}

if ( mapLayerFromMimeData( event->mimeData() ) )
{
// dragged an acceptable layer, phew
event->setDropAction( Qt::CopyAction );
event->accept();
mCondensedLineEdit->setHighlighted( true );
update();
}
else
{
event->ignore();
}
}

void QgsExtentWidget::dragLeaveEvent( QDragLeaveEvent *event )
{
if ( mCondensedLineEdit->isHighlighted() )
{
event->accept();
mCondensedLineEdit->setHighlighted( false );
update();
}
else
{
event->ignore();
}
}

void QgsExtentWidget::dropEvent( QDropEvent *event )
{
if ( !( event->possibleActions() & Qt::CopyAction ) )
{
event->ignore();
return;
}

if ( QgsMapLayer *layer = mapLayerFromMimeData( event->mimeData() ) )
{
// dropped a map layer
setFocus( Qt::MouseFocusReason );
event->setDropAction( Qt::CopyAction );
event->accept();

setOutputExtentFromLayer( layer );
}
else
{
event->ignore();
}
mCondensedLineEdit->setHighlighted( false );
update();
}
9 changes: 9 additions & 0 deletions src/gui/qgsextentwidget.h
Expand Up @@ -212,6 +212,12 @@ class GUI_EXPORT QgsExtentWidget : public QWidget, private Ui::QgsExtentGroupBox
*/
void validationChanged( bool valid );

protected:

void dragEnterEvent( QDragEnterEvent *event ) override;
void dragLeaveEvent( QDragLeaveEvent *event ) override;
void dropEvent( QDropEvent *event ) override;

private slots:

void layerMenuAboutToShow();
Expand Down Expand Up @@ -257,6 +263,9 @@ class GUI_EXPORT QgsExtentWidget : public QWidget, private Ui::QgsExtentGroupBox

void setExtentToLayerExtent( const QString &layerId );

QgsMapLayer *mapLayerFromMimeData( const QMimeData *data ) const;


};

#endif // QGSEXTENTWIDGET_H
9 changes: 8 additions & 1 deletion src/ui/qgsextentgroupboxwidget.ui
Expand Up @@ -227,7 +227,7 @@
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="mCondensedLineEdit">
<widget class="QgsHighlightableLineEdit" name="mCondensedLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand All @@ -254,6 +254,13 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsHighlightableLineEdit</class>
<extends>QLineEdit</extends>
<header>qgshighlightablelineedit.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mYMaxLineEdit</tabstop>
<tabstop>mXMinLineEdit</tabstop>
Expand Down

0 comments on commit 945eb46

Please sign in to comment.