Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #5180 from nirvn/fix_levels
  • Loading branch information
nirvn committed Sep 13, 2017
2 parents 5796783 + fe8b751 commit df94b50
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 97 deletions.
52 changes: 45 additions & 7 deletions python/gui/symbology/qgssymbollevelsdialog.sip
Expand Up @@ -8,33 +8,71 @@



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();
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
%Docstring
Constructor for QgsSymbolLevelsWidget
%End

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:




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 );

};


Expand Down
13 changes: 11 additions & 2 deletions src/gui/symbology/qgsrendererwidget.cpp
Expand Up @@ -251,11 +251,20 @@ void QgsRendererWidget::changeSymbolAngle()

void QgsRendererWidget::showSymbolLevelsDialog( QgsFeatureRenderer *r )
{
QgsSymbolLevelsDialog dlg( r->legendSymbolItems(), 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() )
{
r->setUsingSymbolLevels( dlg.usingLevels() );
emit widgetChanged();
}
}
Expand Down
20 changes: 17 additions & 3 deletions src/gui/symbology/qgsrulebasedrendererwidget.cpp
Expand Up @@ -396,10 +396,24 @@ void QgsRuleBasedRendererWidget::keyPressEvent( QKeyEvent *event )

void QgsRuleBasedRendererWidget::setRenderingOrder()
{
QgsSymbolLevelsDialog dlg( mRenderer->legendSymbolItems(), true, this );
dlg.setForceOrderingEnabled( true );
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;
}

dlg.exec();
QgsSymbolLevelsDialog dlg( mRenderer, true, panel );
dlg.setForceOrderingEnabled( true );
if ( dlg.exec() )
{
emit widgetChanged();
}
}

void QgsRuleBasedRendererWidget::saveSectionWidth( int section, int oldSize, int newSize )
Expand Down
78 changes: 51 additions & 27 deletions src/gui/symbology/qgssymbollevelsdialog.cpp
Expand Up @@ -23,32 +23,32 @@
#include <QTableWidgetItem>
#include <QItemDelegate>
#include <QSpinBox>

#include <QDialogButtonBox>


////////////////

QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, 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::helpRequested, this, &QgsSymbolLevelsDialog::showHelp );
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsWidget::updateUi );

// only consider entries with symbols
Q_FOREACH ( const QgsLegendSymbolItem &item, list )
if ( mRenderer )
{
if ( item.symbol() )
mList << item;
// only consider entries with symbols
Q_FOREACH ( const QgsLegendSymbolItem &item, mRenderer->legendSymbolItems() )
{
if ( item.symbol() )
mList << item;
}
}

int maxLayers = 0;
Expand Down Expand Up @@ -84,16 +84,10 @@ QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, b

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++ )
{
Expand Down Expand Up @@ -123,12 +117,27 @@ void QgsSymbolLevelsDialog::populateTable()

}

void QgsSymbolLevelsDialog::updateUi()
void QgsSymbolLevelsWidget::updateUi()
{
tableLevels->setEnabled( chkEnable->isChecked() );
emit widgetChanged();
}

void QgsSymbolLevelsDialog::setDefaultLevels()
void QgsSymbolLevelsWidget::apply()
{
for ( int i = 0; i < mList.count(); i++ )
{
QgsSymbol *sym = mList.at( i ).symbol();
for ( int layer = 0; layer < sym->symbolLayerCount(); layer++ )
{
mRenderer->setLegendSymbolItem( mList.at( i ).ruleKey(), sym->clone() );
}
}

mRenderer->setUsingSymbolLevels( usingLevels() );
}

void QgsSymbolLevelsWidget::setDefaultLevels()
{
for ( int i = 0; i < mList.count(); i++ )
{
Expand All @@ -140,22 +149,24 @@ 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;
QgsSymbol *sym = mList.at( row ).symbol();
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 )
Expand All @@ -167,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

Expand Down
59 changes: 46 additions & 13 deletions src/gui/symbology/qgssymbollevelsdialog.h
Expand Up @@ -20,36 +20,43 @@
#include <QList>
#include <QItemDelegate>

#include "qgsrenderer.h"
#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:
//! \note not available in Python bindings
QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, bool usingSymbolLevels, QWidget *parent = nullptr ) SIP_SKIP;

~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:
//! Apply button
void apply();

private slots:
void updateUi();

void renderingPassChanged( int row, int column );

private slots:
void showHelp();

protected:
//! \note not available in Python bindings
void populateTable() SIP_SKIP;
Expand All @@ -58,16 +65,42 @@ class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLe

//! maximal number of layers from all symbols
int mMaxLayers;

QgsFeatureRenderer *mRenderer;
QgsLegendSymbolList mList;

//! whether symbol layers always should be used (default false)
bool mForceOrderingEnabled;

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

Expand Down

0 comments on commit df94b50

Please sign in to comment.