[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

@ -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 %TypeHeaderCode
#include "qgssymbollevelsdialog.h" #include "qgssymbollevelsdialog.h"
%End %End
public: public:
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = 0 ); QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
%Docstring %Docstring
Constructor for QgsSymbolLevelsDialog Constructor for QgsSymbolLevelsWidget
%End %End
~QgsSymbolLevelsDialog();
bool usingLevels() const; bool usingLevels() const;
%Docstring %Docstring
Returns whether the level ordering is enabled
:rtype: bool :rtype: bool
%End %End
void setForceOrderingEnabled( bool enabled ); 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: public slots:
void updateUi(); void apply();
%Docstring
void renderingPassChanged( int row, int column ); Apply button
%End
protected: protected:
@ -41,7 +50,28 @@ Constructor for QgsSymbolLevelsDialog
private: 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 );
}; };

@ -251,7 +251,18 @@ void QgsRendererWidget::changeSymbolAngle()
void QgsRendererWidget::showSymbolLevelsDialog( QgsFeatureRenderer *r ) 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() ) if ( dlg.exec() )
{ {
emit widgetChanged(); emit widgetChanged();

@ -396,7 +396,19 @@ void QgsRuleBasedRendererWidget::keyPressEvent( QKeyEvent *event )
void QgsRuleBasedRendererWidget::setRenderingOrder() 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 ); dlg.setForceOrderingEnabled( true );
if ( dlg.exec() ) if ( dlg.exec() )
{ {

@ -23,28 +23,23 @@
#include <QTableWidgetItem> #include <QTableWidgetItem>
#include <QItemDelegate> #include <QItemDelegate>
#include <QSpinBox> #include <QSpinBox>
#include <QDialogButtonBox>
//////////////// ////////////////
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent ) QgsSymbolLevelsWidget::QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
: QDialog( parent ) : QgsPanelWidget( parent )
, mRenderer( renderer ) , mRenderer( renderer )
, mForceOrderingEnabled( false ) , mForceOrderingEnabled( false )
{ {
setupUi( this ); setupUi( this );
QgsSettings settings;
restoreGeometry( settings.value( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ) ).toByteArray() );
tableLevels->setItemDelegate( new SpinBoxDelegate( this ) ); tableLevels->setItemDelegate( new SpinBoxDelegate( this ) );
chkEnable->setChecked( usingSymbolLevels ); chkEnable->setChecked( usingSymbolLevels );
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsDialog::updateUi ); connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsWidget::updateUi );
connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsSymbolLevelsDialog::apply );
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsSymbolLevelsDialog::showHelp );
if ( mRenderer ) if ( mRenderer )
{ {
@ -89,16 +84,10 @@ QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool
populateTable(); populateTable();
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsDialog::renderingPassChanged ); connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsWidget::renderingPassChanged );
} }
QgsSymbolLevelsDialog::~QgsSymbolLevelsDialog() void QgsSymbolLevelsWidget::populateTable()
{
QgsSettings settings;
settings.setValue( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ), saveGeometry() );
}
void QgsSymbolLevelsDialog::populateTable()
{ {
for ( int row = 0; row < mList.count(); row++ ) 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() ); tableLevels->setEnabled( chkEnable->isChecked() );
emit widgetChanged();
} }
void QgsSymbolLevelsDialog::apply() void QgsSymbolLevelsWidget::apply()
{ {
for ( int i = 0; i < mList.count(); i++ ) for ( int i = 0; i < mList.count(); i++ )
{ {
@ -147,7 +137,7 @@ void QgsSymbolLevelsDialog::apply()
mRenderer->setUsingSymbolLevels( usingLevels() ); mRenderer->setUsingSymbolLevels( usingLevels() );
} }
void QgsSymbolLevelsDialog::setDefaultLevels() void QgsSymbolLevelsWidget::setDefaultLevels()
{ {
for ( int i = 0; i < mList.count(); i++ ) 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(); return chkEnable->isChecked();
} }
void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column ) void QgsSymbolLevelsWidget::renderingPassChanged( int row, int column )
{ {
if ( row < 0 || row >= mList.count() ) if ( row < 0 || row >= mList.count() )
return; return;
@ -172,9 +162,11 @@ void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column )
if ( column < 0 || column > sym->symbolLayerCount() ) if ( column < 0 || column > sym->symbolLayerCount() )
return; return;
sym->symbolLayer( column - 1 )->setRenderingPass( tableLevels->item( row, column )->text().toInt() ); 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; mForceOrderingEnabled = enabled;
if ( enabled ) if ( enabled )
@ -186,11 +178,24 @@ void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
chkEnable->show(); 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 /// @cond PRIVATE

@ -21,38 +21,41 @@
#include <QItemDelegate> #include <QItemDelegate>
#include "qgshelp.h" #include "qgshelp.h"
#include "qgspanelwidget.h"
#include "qgsrenderer.h" #include "qgsrenderer.h"
#include "ui_qgssymbollevelsdialogbase.h" #include "ui_qgssymbollevelsdialogbase.h"
#include "qgis_gui.h" #include "qgis_gui.h"
/** \ingroup gui /** \class QgsSymbolLevelsWidget
* \class QgsSymbolLevelsDialog * \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 Q_OBJECT
public: public:
//! Constructor for QgsSymbolLevelsDialog //! Constructor for QgsSymbolLevelsWidget
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = nullptr ); QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
~QgsSymbolLevelsDialog();
//! Returns whether the level ordering is enabled
bool usingLevels() const; 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 ); void setForceOrderingEnabled( bool enabled );
public slots: public slots:
void updateUi();
void renderingPassChanged( int row, int column );
private slots:
//! Apply button //! Apply button
void apply(); void apply();
void showHelp(); private slots:
void updateUi();
void renderingPassChanged( int row, int column );
protected: protected:
//! \note not available in Python bindings //! \note not available in Python bindings
@ -71,11 +74,33 @@ class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLe
private: private:
#ifdef SIP_RUN #ifdef SIP_RUN
QgsSymbolLevelsDialog(); QgsSymbolLevelsWidget();
#endif #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 #ifndef SIP_RUN
///@cond PRIVATE ///@cond PRIVATE

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>QgsSymbolLevelsDialogBase</class> <class>QgsSymbolLevelsDialogBase</class>
<widget class="QDialog" name="QgsSymbolLevelsDialogBase"> <widget class="QgsPanelWidget" name="QgsSymbolLevelsDialogBase">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -41,51 +41,14 @@
</attribute> </attribute>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>QgsPanelWidget</class>
<extends>QWidget</extends>
<header>qgspanelwidget.h</header>
</customwidget>
</customwidgets>
<resources/> <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> </ui>