22 changes: 13 additions & 9 deletions src/app/legend/qgslayerorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ QgsLayerOrder::QgsLayerOrder( QgsLegend *legend, QWidget * parent, const char *n
this, SLOT( legendItemChanged( QTreeWidgetItem *, int ) ) );

// track if legend mode changes
connect( mLegend, SIGNAL( updateDrawingOrderChanged( bool ) ),
this, SLOT( updateDrawingOrderChanged( bool ) ) );
connect( mLegend, SIGNAL( updateDrawingOrderChecked( bool ) ),
this, SLOT( updateDrawingOrderChecked( bool ) ) );

connect( mLegend, SIGNAL( zOrderChanged() ),
this, SLOT( refreshLayerList() ) );
Expand All @@ -64,13 +64,13 @@ QgsLayerOrder::QgsLayerOrder( QgsLegend *legend, QWidget * parent, const char *n
setSelectionMode( QAbstractItemView::ExtendedSelection );
setDragEnabled( false );
setAutoScroll( true );
QFont f( "Arial", 12, QFont::Bold );
QFont f( "Arial", 11, QFont::Bold );
setFont( f );
QPalette palette;
palette.setColor( backgroundRole(), QColor( 192, 192, 192 ) );
setPalette( palette );

updateDrawingOrderChanged( mLegend->updateDrawingOrder() );
updateDrawingOrderChecked( mLegend->updateDrawingOrder() );
}

QgsLayerOrder::~QgsLayerOrder()
Expand All @@ -82,11 +82,12 @@ void QgsLayerOrder::refreshLayerList()
{
clear();

foreach( QgsMapLayer *layer, mLegend->layers() )
foreach( QgsLegendLayer *layer, mLegend->legendLayers() )
{
QListWidgetItem *item = new QListWidgetItem( layer->name() );
item->setData( Qt::UserRole, qVariantFromValue( qobject_cast<QObject*>( layer ) ) );
item->setCheckState( mLegend->layerCheckState( layer ) );
QListWidgetItem *item = new QListWidgetItem( layer->layer()->name() );
item->setData( 1, QString::number( layer->drawingOrder() ) );
item->setData( Qt::UserRole, qVariantFromValue( qobject_cast<QObject*>( layer->layer() ) ) );
item->setCheckState( layer->isVisible() ? Qt::Checked : Qt::Unchecked );
QgsDebugMsg( QString( "add item=%1 at %2" ).arg( item ? item->text() : "(null item)" ).arg( count() ) );
addItem( item );
}
Expand Down Expand Up @@ -189,16 +190,19 @@ void QgsLayerOrder::mouseMoveEvent( QMouseEvent * e )
{
mInsertRow = row( rowItem );
QgsDebugMsg( QString( "Move to row %1" ).arg( mInsertRow ) );
scrollToItem( rowItem );
}
else if ( e->pos().y() < visualItemRect( item( 0 ) ).bottom() )
{
mInsertRow = 0;
QgsDebugMsg( QString( "Insert top row %1" ).arg( mInsertRow ) );
scrollToTop();
}
else
{
mInsertRow = count();
QgsDebugMsg( QString( "Append bottom row %1" ).arg( mInsertRow ) );
scrollToBottom();
}

int y;
Expand Down Expand Up @@ -269,7 +273,7 @@ void QgsLayerOrder::hideLine()
mInsertionLine->setGeometry( 0, -100, 1, 1 );
}

void QgsLayerOrder::updateDrawingOrderChanged( bool enabled )
void QgsLayerOrder::updateDrawingOrderChecked( bool enabled )
{
setDisabled( enabled );
}
2 changes: 1 addition & 1 deletion src/app/legend/qgslayerorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class QgsLayerOrder : public QListWidget
void mouseReleaseEvent( QMouseEvent * e );

private slots:
void updateDrawingOrderChanged( bool );
void updateDrawingOrderChecked( bool );
void itemChanged( QListWidgetItem * );
void legendItemChanged( QTreeWidgetItem *, int );
void refreshLayerList();
Expand Down
6 changes: 4 additions & 2 deletions src/app/legend/qgslegend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1403,7 +1403,8 @@ bool QgsLegend::readXML( QDomNode& legendnode )
clear(); //remove all items first
mEmbeddedGroups.clear();
mUpdateDrawingOrder = legendnode.toElement().attribute( "updateDrawingOrder", "true" ) == "true";
emit updateDrawingOrderChanged( mUpdateDrawingOrder );
emit updateDrawingOrderChecked( mUpdateDrawingOrder );
emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
return readXML( 0, legendnode );
}

Expand Down Expand Up @@ -2356,7 +2357,8 @@ void QgsLegend::setUpdateDrawingOrder( bool updateDrawingOrder )

updateMapCanvasLayerSet();

emit updateDrawingOrderChanged( mUpdateDrawingOrder );
emit updateDrawingOrderChecked( mUpdateDrawingOrder );
emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
}

bool QgsLegend::updateDrawingOrder()
Expand Down
10 changes: 8 additions & 2 deletions src/app/legend/qgslegend.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ class QgsLegend : public QTreeWidget
Else, an empty list is returned.*/
QList<QgsMapLayer *> layers();

//!Return all layers in drawing order
QList<QgsLegendLayer *> legendLayers();

void setDrawingOrder( QList<QgsMapLayer *> );

/*!set the current layer
Expand Down Expand Up @@ -307,6 +310,9 @@ class QgsLegend : public QTreeWidget
/** Update drawing order */
void setUpdateDrawingOrder( bool updateDrawingOrder );

/** Update drawing order */
void unsetUpdateDrawingOrder( bool dontUpdateDrawingOrder ) { setUpdateDrawingOrder( !dontUpdateDrawingOrder ); }

protected:

/*!Event handler for mouse movements.
Expand Down Expand Up @@ -432,7 +438,6 @@ class QgsLegend : public QTreeWidget
bool writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDocument &document );

QList<QgsMapCanvasLayer> canvasLayers();
QList<QgsLegendLayer *> legendLayers();

/*! Prevent the copying of QgsLegends
* @todo See if this is really required - we may want multiple map, canvas and
Expand Down Expand Up @@ -511,7 +516,8 @@ class QgsLegend : public QTreeWidget

void zOrderChanged();

void updateDrawingOrderChanged( bool );
void updateDrawingOrderChecked( bool );
void updateDrawingOrderUnchecked( bool );

//! Emitted whenever current (selected) layer changes
// the pointer to layer can be null if no layer is selected
Expand Down
32 changes: 29 additions & 3 deletions src/app/qgisapp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1716,19 +1716,45 @@ void QgisApp::initLegend()
mLegendDock = new QDockWidget( tr( "Layers" ), this );
mLegendDock->setObjectName( "Legend" );
mLegendDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
mLegendDock->setWidget( mMapLegend );

QCheckBox *legendCb = new QCheckBox( tr( "Control rendering order" ) );
legendCb->setChecked( true );

QCheckBox *orderCb = new QCheckBox( tr( "Control rendering order" ) );
orderCb->setChecked( false );

connect( legendCb, SIGNAL( toggled( bool ) ), mMapLegend, SLOT( setUpdateDrawingOrder( bool ) ) );
connect( orderCb, SIGNAL( toggled( bool ) ), mMapLegend, SLOT( unsetUpdateDrawingOrder( bool ) ) );
connect( mMapLegend, SIGNAL( updateDrawingOrderChecked( bool ) ), legendCb, SLOT( setChecked( bool ) ) );
connect( mMapLegend, SIGNAL( updateDrawingOrderUnchecked( bool ) ), orderCb, SLOT( setChecked( bool ) ) );

QWidget *w = new QWidget( this );
QLayout *l = new QVBoxLayout;
l->addWidget( mMapLegend );
l->addWidget( legendCb );
w->setLayout( l );
mLegendDock->setWidget( w );
addDockWidget( Qt::LeftDockWidgetArea, mLegendDock );

// add to the Panel submenu
mPanelMenu->addAction( mLegendDock->toggleViewAction() );

mMapLayerOrder->setWhatsThis( tr( "Map layer list that displays all layers in drawing order." ) );
mLayerOrderDock = new QDockWidget( tr( "Layerorder" ), this );
mLayerOrderDock = new QDockWidget( tr( "Layer order" ), this );
mLayerOrderDock->setObjectName( "Legend" );
mLayerOrderDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
mLayerOrderDock->setWidget( mMapLayerOrder );

w = new QWidget( this );
l = new QVBoxLayout;
l->addWidget( mMapLayerOrder );
l->addWidget( orderCb );
w->setLayout( l );
mLayerOrderDock->setWidget( w );
addDockWidget( Qt::LeftDockWidgetArea, mLayerOrderDock );

// add to the Panel submenu
mPanelMenu->addAction( mLayerOrderDock->toggleViewAction() );

return;
}

Expand Down
31 changes: 29 additions & 2 deletions src/core/qgsdatasourceuri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,20 @@
#include <QStringList>
#include <QRegExp>

QgsDataSourceURI::QgsDataSourceURI() : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
QgsDataSourceURI::QgsDataSourceURI()
: mSSLmode( SSLprefer )
, mKeyColumn( "" )
, mUseEstimatedMetadata( false )
, mSelectAtIdDisabled( false )
{
// do nothing
}

QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
QgsDataSourceURI::QgsDataSourceURI( QString uri )
: mSSLmode( SSLprefer )
, mKeyColumn( "" )
, mUseEstimatedMetadata( false )
, mSelectAtIdDisabled( false )
{
int i = 0;
while ( i < uri.length() )
Expand Down Expand Up @@ -115,6 +123,10 @@ QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyC
{
mUseEstimatedMetadata = pval == "true";
}
else if ( pname == "selectatid" )
{
mSelectAtIdDisabled = pval == "false";
}
else if ( pname == "service" )
{
mService = pval;
Expand Down Expand Up @@ -309,6 +321,16 @@ bool QgsDataSourceURI::useEstimatedMetadata() const
return mUseEstimatedMetadata;
}

void QgsDataSourceURI::disableSelectAtId( bool theFlag )
{
mSelectAtIdDisabled = theFlag;
}

bool QgsDataSourceURI::selectAtIdDisabled() const
{
return mSelectAtIdDisabled;
}

void QgsDataSourceURI::setSql( QString sql )
{
mSql = sql;
Expand Down Expand Up @@ -461,6 +483,11 @@ QString QgsDataSourceURI::uri() const
theUri += QString( " estimatedmetadata=true" );
}

if ( mSelectAtIdDisabled )
{
theUri += QString( " selectatid=false" );
}

theUri += QString( " table=%1%2 sql=%3" )
.arg( quotedTablename() )
.arg( mGeometryColumn.isNull() ? QString() : QString( " (%1)" ).arg( mGeometryColumn ) )
Expand Down
5 changes: 5 additions & 0 deletions src/core/qgsdatasourceuri.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ class CORE_EXPORT QgsDataSourceURI
void setUseEstimatedMetadata( bool theFlag );
bool useEstimatedMetadata() const;

void disableSelectAtId( bool theFlag );
bool selectAtIdDisabled() const;

void clearSchema();
void setSql( QString sql );

Expand Down Expand Up @@ -147,6 +150,8 @@ class CORE_EXPORT QgsDataSourceURI
QString mKeyColumn;
//Use estimated metadata flag
bool mUseEstimatedMetadata;
//Disable SelectAtId capability (eg. to trigger the attribute table memory model for expensive views)
bool mSelectAtIdDisabled;
};

#endif //QGSDATASOURCEURI_H
Expand Down
12 changes: 12 additions & 0 deletions src/core/qgsdbtablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ QgsDbTableModel::QgsDbTableModel(): QStandardItemModel(), mTableCount( 0 )
headerLabels << tr( "Type" );
headerLabels << tr( "Geometry column" );
headerLabels << tr( "Primary key column" );
headerLabels << tr( "Select at id" );
headerLabels << tr( "Sql" );
setHorizontalHeaderLabels( headerLabels );
}
Expand Down Expand Up @@ -60,17 +61,27 @@ void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString t
QIcon iconFile = iconForType( wkbType );

QList<QStandardItem*> childItemList;

QStandardItem* schemaNameItem = new QStandardItem( schemaName );
schemaNameItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );

QStandardItem* typeItem = new QStandardItem( QIcon( iconFile ), type );
typeItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );

QStandardItem* tableItem = new QStandardItem( tableName );
tableItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );

QStandardItem* geomItem = new QStandardItem( geometryColName );
geomItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );

QStandardItem* pkItem = new QStandardItem( "" );
pkItem->setData( pkCols );
pkItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );

QStandardItem* selItem = new QStandardItem( "" );
selItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
selItem->setCheckState( Qt::Checked );

QStandardItem* sqlItem = new QStandardItem( sql );
sqlItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );

Expand All @@ -79,6 +90,7 @@ void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString t
childItemList.push_back( typeItem );
childItemList.push_back( geomItem );
childItemList.push_back( pkItem );
childItemList.push_back( selItem );
childItemList.push_back( sqlItem );

schemaItem->appendRow( childItemList );
Expand Down
8 changes: 7 additions & 1 deletion src/core/qgsdbtablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,19 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel
public:
QgsDbTableModel();
~QgsDbTableModel();

/**Adds entry for one database table to the model*/
void addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, const QStringList &pkCols, QString Sql );

/**Sets an sql statement that belongs to a cell specified by a model index*/
void setSql( const QModelIndex& index, const QString& sql );

/**Sets one or more geometry types to a row. In case of several types, additional rows are inserted.
This is for tables where the type is dectected later by thread*/
void setGeometryTypesForTable( const QString& schema, const QString& table, const QString& attribute, const QString& type );

/**Returns the number of tables in the model*/
int tableCount() const {return mTableCount;}
int tableCount() const { return mTableCount; }

enum columns
{
Expand All @@ -45,6 +49,7 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel
dbtmType,
dbtmGeomCol,
dbtmPkCol,
dbtmSelectAtId,
dbtmSql,
dbtmColumns
};
Expand All @@ -55,6 +60,7 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel

QIcon iconForType( QGis::WkbType type ) const;
QString displayStringForType( QGis::WkbType type ) const;

/**Returns qgis wkbtype from database typename*/
QGis::WkbType qgisTypeFromDbType( const QString& dbType ) const;
};
Expand Down
Loading