[FEATURE] Make symbol levels dialog a style dock panel widget

This commit is contained in:
nirvn 2017-09-13 11:05:49 +07:00
parent 5e7dadd575
commit fe8b751eb5
6 changed files with 142 additions and 96 deletions

View File

@ -9,31 +9,40 @@
class QgsSymbolLevelsDialog : QDialog
class QgsSymbolLevelsWidget : QgsPanelWidget
{
%Docstring
A widget which allows the user to modify the rendering order of symbol layers.
.. seealso:: QgsSymbolLevelsDialog
.. versionadded:: 3.0
%End
%TypeHeaderCode
#include "qgssymbollevelsdialog.h"
%End
public:
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = 0 );
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
%Docstring
Constructor for QgsSymbolLevelsDialog
Constructor for QgsSymbolLevelsWidget
%End
~QgsSymbolLevelsDialog();
bool usingLevels() const;
%Docstring
Returns whether the level ordering is enabled
:rtype: bool
%End
void setForceOrderingEnabled( bool enabled );
%Docstring
Sets whether the level ordering is always forced on and hide the checkbox (used by rule-based renderer)
\param enabled toggle level ordering
%End
public slots:
void updateUi();
void renderingPassChanged( int row, int column );
void apply();
%Docstring
Apply button
%End
protected:
@ -41,7 +50,28 @@ Constructor for QgsSymbolLevelsDialog
private:
QgsSymbolLevelsDialog();
QgsSymbolLevelsWidget();
};
class QgsSymbolLevelsDialog : QDialog
{
%Docstring
A dialog which allows the user to modify the rendering order of symbol layers.
.. seealso:: QgsSymbolLevelsWidget
%End
%TypeHeaderCode
#include "qgssymbollevelsdialog.h"
%End
public:
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
%Docstring
Constructor for QgsSymbolLevelsDialog.
%End
void setForceOrderingEnabled( bool enabled );
};

View File

@ -251,7 +251,18 @@ void QgsRendererWidget::changeSymbolAngle()
void QgsRendererWidget::showSymbolLevelsDialog( QgsFeatureRenderer *r )
{
QgsSymbolLevelsDialog dlg( r, r->usingSymbolLevels(), this );
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
if ( panel && panel->dockMode() )
{
QgsSymbolLevelsWidget *widget = new QgsSymbolLevelsWidget( r, r->usingSymbolLevels(), panel );
widget->setPanelTitle( tr( "Symbol Levels" ) );
connect( widget, &QgsPanelWidget::widgetChanged, widget, &QgsSymbolLevelsWidget::apply );
connect( widget, &QgsPanelWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
panel->openPanel( widget );
return;
}
QgsSymbolLevelsDialog dlg( r, r->usingSymbolLevels(), panel );
if ( dlg.exec() )
{
emit widgetChanged();

View File

@ -396,7 +396,19 @@ void QgsRuleBasedRendererWidget::keyPressEvent( QKeyEvent *event )
void QgsRuleBasedRendererWidget::setRenderingOrder()
{
QgsSymbolLevelsDialog dlg( mRenderer, true, this );
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
if ( panel && panel->dockMode() )
{
QgsSymbolLevelsWidget *widget = new QgsSymbolLevelsWidget( mRenderer, true, panel );
widget->setForceOrderingEnabled( true );
widget->setPanelTitle( tr( "Symbol Levels" ) );
connect( widget, &QgsPanelWidget::widgetChanged, widget, &QgsSymbolLevelsWidget::apply );
connect( widget, &QgsPanelWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
panel->openPanel( widget );
return;
}
QgsSymbolLevelsDialog dlg( mRenderer, true, panel );
dlg.setForceOrderingEnabled( true );
if ( dlg.exec() )
{

View File

@ -23,28 +23,23 @@
#include <QTableWidgetItem>
#include <QItemDelegate>
#include <QSpinBox>
#include <QDialogButtonBox>
////////////////
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
: QDialog( parent )
QgsSymbolLevelsWidget::QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
: QgsPanelWidget( parent )
, mRenderer( renderer )
, mForceOrderingEnabled( false )
{
setupUi( this );
QgsSettings settings;
restoreGeometry( settings.value( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ) ).toByteArray() );
tableLevels->setItemDelegate( new SpinBoxDelegate( this ) );
chkEnable->setChecked( usingSymbolLevels );
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsDialog::updateUi );
connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsSymbolLevelsDialog::apply );
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsSymbolLevelsDialog::showHelp );
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsWidget::updateUi );
if ( mRenderer )
{
@ -89,16 +84,10 @@ QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool
populateTable();
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsDialog::renderingPassChanged );
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsWidget::renderingPassChanged );
}
QgsSymbolLevelsDialog::~QgsSymbolLevelsDialog()
{
QgsSettings settings;
settings.setValue( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ), saveGeometry() );
}
void QgsSymbolLevelsDialog::populateTable()
void QgsSymbolLevelsWidget::populateTable()
{
for ( int row = 0; row < mList.count(); row++ )
{
@ -128,12 +117,13 @@ void QgsSymbolLevelsDialog::populateTable()
}
void QgsSymbolLevelsDialog::updateUi()
void QgsSymbolLevelsWidget::updateUi()
{
tableLevels->setEnabled( chkEnable->isChecked() );
emit widgetChanged();
}
void QgsSymbolLevelsDialog::apply()
void QgsSymbolLevelsWidget::apply()
{
for ( int i = 0; i < mList.count(); i++ )
{
@ -147,7 +137,7 @@ void QgsSymbolLevelsDialog::apply()
mRenderer->setUsingSymbolLevels( usingLevels() );
}
void QgsSymbolLevelsDialog::setDefaultLevels()
void QgsSymbolLevelsWidget::setDefaultLevels()
{
for ( int i = 0; i < mList.count(); i++ )
{
@ -159,12 +149,12 @@ void QgsSymbolLevelsDialog::setDefaultLevels()
}
}
bool QgsSymbolLevelsDialog::usingLevels() const
bool QgsSymbolLevelsWidget::usingLevels() const
{
return chkEnable->isChecked();
}
void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column )
void QgsSymbolLevelsWidget::renderingPassChanged( int row, int column )
{
if ( row < 0 || row >= mList.count() )
return;
@ -172,9 +162,11 @@ void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column )
if ( column < 0 || column > sym->symbolLayerCount() )
return;
sym->symbolLayer( column - 1 )->setRenderingPass( tableLevels->item( row, column )->text().toInt() );
emit widgetChanged();
}
void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
void QgsSymbolLevelsWidget::setForceOrderingEnabled( bool enabled )
{
mForceOrderingEnabled = enabled;
if ( enabled )
@ -186,11 +178,24 @@ void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
chkEnable->show();
}
void QgsSymbolLevelsDialog::showHelp()
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
: QDialog( parent )
{
QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#symbols-levels" ) );
QVBoxLayout *vLayout = new QVBoxLayout();
mWidget = new QgsSymbolLevelsWidget( renderer, usingSymbolLevels );
vLayout->addWidget( mWidget );
QDialogButtonBox *bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
connect( bbox, &QDialogButtonBox::accepted, mWidget, &QgsSymbolLevelsWidget::apply );
connect( bbox, &QDialogButtonBox::accepted, this, &QgsSymbolLevelsDialog::accept );
connect( bbox, &QDialogButtonBox::rejected, this, &QgsSymbolLevelsDialog::reject );
vLayout->addWidget( bbox );
setLayout( vLayout );
}
void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
{
mWidget->setForceOrderingEnabled( enabled );
}
/// @cond PRIVATE

View File

@ -21,38 +21,41 @@
#include <QItemDelegate>
#include "qgshelp.h"
#include "qgspanelwidget.h"
#include "qgsrenderer.h"
#include "ui_qgssymbollevelsdialogbase.h"
#include "qgis_gui.h"
/** \ingroup gui
* \class QgsSymbolLevelsDialog
/** \class QgsSymbolLevelsWidget
* \ingroup gui
* A widget which allows the user to modify the rendering order of symbol layers.
* \see QgsSymbolLevelsDialog
* \since QGIS 3.0
*/
class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLevelsDialogBase
class GUI_EXPORT QgsSymbolLevelsWidget : public QgsPanelWidget, private Ui::QgsSymbolLevelsDialogBase
{
Q_OBJECT
public:
//! Constructor for QgsSymbolLevelsDialog
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = nullptr );
~QgsSymbolLevelsDialog();
//! Constructor for QgsSymbolLevelsWidget
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
//! Returns whether the level ordering is enabled
bool usingLevels() const;
// used by rule-based renderer (to hide checkbox to enable/disable ordering)
/** Sets whether the level ordering is always forced on and hide the checkbox (used by rule-based renderer)
* \param enabled toggle level ordering
*/
void setForceOrderingEnabled( bool enabled );
public slots:
void updateUi();
void renderingPassChanged( int row, int column );
private slots:
//! Apply button
void apply();
void showHelp();
private slots:
void updateUi();
void renderingPassChanged( int row, int column );
protected:
//! \note not available in Python bindings
@ -71,11 +74,33 @@ class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLe
private:
#ifdef SIP_RUN
QgsSymbolLevelsDialog();
QgsSymbolLevelsWidget();
#endif
};
/** \class QgsSymbolLevelsDialog
* \ingroup gui
* A dialog which allows the user to modify the rendering order of symbol layers.
* \see QgsSymbolLevelsWidget
*/
class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog
{
Q_OBJECT
public:
//! Constructor for QgsSymbolLevelsDialog.
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
// used by rule-based renderer (to hide checkbox to enable/disable ordering)
void setForceOrderingEnabled( bool enabled );
private:
QgsSymbolLevelsWidget *mWidget = nullptr;
};
#ifndef SIP_RUN
///@cond PRIVATE

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsSymbolLevelsDialogBase</class>
<widget class="QDialog" name="QgsSymbolLevelsDialogBase">
<widget class="QgsPanelWidget" name="QgsSymbolLevelsDialogBase">
<property name="geometry">
<rect>
<x>0</x>
@ -41,51 +41,14 @@
</attribute>
</widget>
</item>
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsPanelWidget</class>
<extends>QWidget</extends>
<header>qgspanelwidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>QgsSymbolLevelsDialogBase</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>QgsSymbolLevelsDialogBase</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>