[FEATURE] add QgisInterface::setActiveLayer()

also fixes #2167


git-svn-id: http://svn.osgeo.org/qgis/trunk@12358 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
jef 2009-12-07 18:59:25 +00:00
parent 43183fa5c7
commit 35e9935e8e
9 changed files with 171 additions and 128 deletions

View File

@ -52,6 +52,10 @@ class QgisInterface : QObject
//! Get pointer to the active layer (layer selected in the legend)
virtual QgsMapLayer *activeLayer()=0;
//! Get pointer to the active layer (layer selected in the legend)
//! added in 1.4
virtual bool setActiveLayer( QgsMapLayer * )=0;
//! Add an icon to the plugins toolbar
virtual int addToolBarIcon(QAction *qAction) =0;
//! Remove an action (icon) from the plugin toolbar

View File

@ -145,18 +145,16 @@ void QgsLegend::selectAll( bool select )
bool renderFlagState = mMapCanvas->renderFlag();
mMapCanvas->setRenderFlag( false );
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
QgsLegendItem* litem = dynamic_cast<QgsLegendItem *>( theItem );
if ( litem && litem->type() == QgsLegendItem::LEGEND_LAYER_FILE )
if ( litem && litem->type() == QgsLegendItem::LEGEND_LAYER )
{
theItem->setCheckState( 0, ( select ? Qt::Checked : Qt::Unchecked ) );
handleItemChange( theItem, 0 );
}
theItem = nextItem( theItem );
}
// Turn on rendering (if it was on previously)
mMapCanvas->setRenderFlag( renderFlagState );
}
@ -168,10 +166,9 @@ void QgsLegend::removeLayer( QString layer_key )
return;
}
QTreeWidgetItem* theItem = firstItem();
QgsDebugMsg( "called." );
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
QgsLegendItem *li = dynamic_cast<QgsLegendItem *>( theItem );
if ( li )
@ -188,7 +185,6 @@ void QgsLegend::removeLayer( QString layer_key )
}
}
theItem = nextItem( theItem );
}
updateMapCanvasLayerSet();
@ -468,16 +464,17 @@ void QgsLegend::initPixmaps()
int QgsLegend::getItemPos( QTreeWidgetItem* item )
{
int counter = 1;
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
if ( theItem == item )
{
return counter;
}
theItem = nextItem( theItem );
++counter;
}
return -1;
}
@ -568,6 +565,16 @@ QgsMapLayer* QgsLegend::currentLayer()
}
}
bool QgsLegend::setCurrentLayer( QgsMapLayer *layer )
{
QgsLegendLayer *ll = findLegendLayer( layer );
if ( !ll )
return false;
setCurrentItem( ll );
return true;
}
void QgsLegend::legendGroupRemove()
{
if ( !mMapCanvas || mMapCanvas->isDrawing() )
@ -755,21 +762,17 @@ void QgsLegend::legendLayerShowInOverview()
void QgsLegend::expandAll()
{
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
setExpanded( indexFromItem( theItem ), true );
theItem = nextItem( theItem );
}
}
void QgsLegend::collapseAll()
{
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
setExpanded( indexFromItem( theItem ), false );
theItem = nextItem( theItem );
}
}
@ -784,108 +787,106 @@ bool QgsLegend::writeXML( QDomNode & legendnode, QDomDocument & document )
QDomElement legendlayerfilenode;
Qt::CheckState cstate; //check state for legend layers and legend groups
QTreeWidgetItem* currentItem = firstItem();
while ( currentItem )
for ( QTreeWidgetItem* currentItem = firstItem(); currentItem; currentItem = nextItem( currentItem ) )
{
QgsLegendItem *item = dynamic_cast<QgsLegendItem *>( currentItem );
if ( item )
if ( !item )
continue;
switch ( item->type() )
{
switch ( item->type() )
{
case QgsLegendItem::LEGEND_GROUP:
//make sure the legendnode is 'legend' again after a legend group
if ( !( item->parent() ) )
{
legendnode = tmplegendnode;
}
legendgroupnode = document.createElement( "legendgroup" );
legendgroupnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendgroupnode.setAttribute( "name", item->text( 0 ) );
cstate = item->checkState( 0 );
if ( cstate == Qt::Checked )
{
legendgroupnode.setAttribute( "checked", "Qt::Checked" );
}
else if ( cstate == Qt::Unchecked )
{
legendgroupnode.setAttribute( "checked", "Qt::Unchecked" );
}
else if ( cstate == Qt::PartiallyChecked )
{
legendgroupnode.setAttribute( "checked", "Qt::PartiallyChecked" );
}
legendnode.appendChild( legendgroupnode );
tmplegendnode = legendnode;
legendnode = legendgroupnode;
break;
case QgsLegendItem::LEGEND_GROUP:
//make sure the legendnode is 'legend' again after a legend group
if ( !( item->parent() ) )
{
legendnode = tmplegendnode;
}
legendgroupnode = document.createElement( "legendgroup" );
legendgroupnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendgroupnode.setAttribute( "name", item->text( 0 ) );
cstate = item->checkState( 0 );
if ( cstate == Qt::Checked )
{
legendgroupnode.setAttribute( "checked", "Qt::Checked" );
}
else if ( cstate == Qt::Unchecked )
{
legendgroupnode.setAttribute( "checked", "Qt::Unchecked" );
}
else if ( cstate == Qt::PartiallyChecked )
{
legendgroupnode.setAttribute( "checked", "Qt::PartiallyChecked" );
}
legendnode.appendChild( legendgroupnode );
tmplegendnode = legendnode;
legendnode = legendgroupnode;
break;
case QgsLegendItem::LEGEND_LAYER:
//make sure the legendnode is 'legend' again after a legend group
if ( !( item->parent() ) )
{
legendnode = tmplegendnode;
}
legendlayernode = document.createElement( "legendlayer" );
legendlayernode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
cstate = item->checkState( 0 );
if ( cstate == Qt::Checked )
{
legendlayernode.setAttribute( "checked", "Qt::Checked" );
}
else if ( cstate == Qt::Unchecked )
{
legendlayernode.setAttribute( "checked", "Qt::Unchecked" );
}
else if ( cstate == Qt::PartiallyChecked )
{
legendlayernode.setAttribute( "checked", "Qt::PartiallyChecked" );
}
legendlayernode.setAttribute( "name", item->text( 0 ) );
legendnode.appendChild( legendlayernode );
case QgsLegendItem::LEGEND_LAYER:
//make sure the legendnode is 'legend' again after a legend group
if ( !( item->parent() ) )
{
legendnode = tmplegendnode;
}
legendlayernode = document.createElement( "legendlayer" );
legendlayernode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
cstate = item->checkState( 0 );
if ( cstate == Qt::Checked )
{
legendlayernode.setAttribute( "checked", "Qt::Checked" );
}
else if ( cstate == Qt::Unchecked )
{
legendlayernode.setAttribute( "checked", "Qt::Unchecked" );
}
else if ( cstate == Qt::PartiallyChecked )
{
legendlayernode.setAttribute( "checked", "Qt::PartiallyChecked" );
}
legendlayernode.setAttribute( "name", item->text( 0 ) );
legendnode.appendChild( legendlayernode );
// save the information about layer
// emulate a legend layer file group and a legend layer file
// to keep it compatible with older projects
{
QgsLegendLayer *ll = dynamic_cast<QgsLegendLayer *>( item );
QgsMapLayer* layer = ll->layer();
// save the information about layer
// emulate a legend layer file group and a legend layer file
// to keep it compatible with older projects
{
QgsLegendLayer *ll = dynamic_cast<QgsLegendLayer *>( item );
QgsMapLayer* layer = ll->layer();
layerfilegroupnode = document.createElement( "filegroup" );
layerfilegroupnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
layerfilegroupnode.setAttribute( "hidden", isItemHidden( item ) ? "true" : "false" );
legendlayernode.appendChild( layerfilegroupnode );
layerfilegroupnode = document.createElement( "filegroup" );
layerfilegroupnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
layerfilegroupnode.setAttribute( "hidden", isItemHidden( item ) ? "true" : "false" );
legendlayernode.appendChild( layerfilegroupnode );
legendlayerfilenode = document.createElement( "legendlayerfile" );
legendlayerfilenode = document.createElement( "legendlayerfile" );
// layer id
legendlayerfilenode.setAttribute( "layerid", layer->getLayerID() );
layerfilegroupnode.appendChild( legendlayerfilenode );
// layer id
legendlayerfilenode.setAttribute( "layerid", layer->getLayerID() );
layerfilegroupnode.appendChild( legendlayerfilenode );
// visible flag
legendlayerfilenode.setAttribute( "visible", ll->isVisible() );
// visible flag
legendlayerfilenode.setAttribute( "visible", ll->isVisible() );
// show in overview flag
legendlayerfilenode.setAttribute( "isInOverview", ll->isInOverview() );
}
break;
// show in overview flag
legendlayerfilenode.setAttribute( "isInOverview", ll->isInOverview() );
}
break;
case QgsLegendItem::LEGEND_PROPERTY_GROUP:
legendpropertynode = document.createElement( "propertygroup" );
legendpropertynode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendlayernode.appendChild( legendpropertynode );
break;
case QgsLegendItem::LEGEND_PROPERTY_GROUP:
legendpropertynode = document.createElement( "propertygroup" );
legendpropertynode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendlayernode.appendChild( legendpropertynode );
break;
case QgsLegendItem::LEGEND_SYMBOL_GROUP:
legendsymbolnode = document.createElement( "symbolgroup" );
legendsymbolnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendlayernode.appendChild( legendsymbolnode );
break;
case QgsLegendItem::LEGEND_SYMBOL_GROUP:
legendsymbolnode = document.createElement( "symbolgroup" );
legendsymbolnode.setAttribute( "open", isItemExpanded( item ) ? "true" : "false" );
legendlayernode.appendChild( legendsymbolnode );
break;
default: //do nothing for the leaf nodes
break;
}
default: //do nothing for the leaf nodes
break;
}
currentItem = nextItem( currentItem );
}
return true;
}
@ -1118,8 +1119,7 @@ void QgsLegend::resetToInitialPosition( QTreeWidgetItem* li )
QgsLegendLayer* QgsLegend::findLegendLayer( const QString& layerKey )
{
QgsLegendLayer* theLegendLayer = 0;
QTreeWidgetItem* theItem = firstItem();
do
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
theLegendLayer = dynamic_cast<QgsLegendLayer *>( theItem );
if ( theLegendLayer ) //item is a legend layer
@ -1130,10 +1130,29 @@ QgsLegendLayer* QgsLegend::findLegendLayer( const QString& layerKey )
}
}
}
while (( theItem = nextItem( theItem ) ) );
return 0;
}
QgsLegendLayer* QgsLegend::findLegendLayer( const QgsMapLayer *layer )
{
QgsLegendLayer* theLegendLayer = 0;
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
theLegendLayer = dynamic_cast<QgsLegendLayer *>( theItem );
if ( theLegendLayer ) //item is a legend layer
{
if ( theLegendLayer->layer() == layer )
{
return theLegendLayer;
}
}
}
return 0;
}
void QgsLegend::adjustIconSize()
{
if ( mPixmapWidthValues.size() > 0 && mPixmapHeightValues.size() > 0 )
@ -1338,17 +1357,15 @@ void QgsLegend::updateMapCanvasLayerSet()
QList<QgsMapCanvasLayer> layers;
// create list of the layers
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
QgsLegendItem *li = dynamic_cast<QgsLegendItem *>( theItem );
QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
QgsLegendLayer *ll = qobject_cast<QgsLegendLayer *>( li );
if ( ll )
{
QgsMapCanvasLayer& lyr = ll->canvasLayer();
layers.append( lyr );
}
theItem = nextItem( theItem );
}
// set layers in canvas
@ -1362,15 +1379,14 @@ void QgsLegend::updateOverview()
void QgsLegend::enableOverviewModeAllLayers( bool isInOverview )
{
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer *>( theItem );
if ( ll )
{
ll->setInOverview( isInOverview );
}
theItem = nextItem( theItem );
}
updateMapCanvasLayerSet();
updateOverview();
@ -1379,8 +1395,7 @@ void QgsLegend::enableOverviewModeAllLayers( bool isInOverview )
std::deque<QString> QgsLegend::layerIDs()
{
std::deque<QString> layers;
QTreeWidgetItem* theItem = firstItem();
while ( theItem )
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
{
QgsLegendItem *li = dynamic_cast<QgsLegendItem *>( theItem );
QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
@ -1389,7 +1404,6 @@ std::deque<QString> QgsLegend::layerIDs()
QgsMapLayer *lyr = ll->layer();
layers.push_front( lyr->getLayerID() );
}
theItem = nextItem( theItem );
}
#ifdef QGISDEBUG
@ -1581,7 +1595,7 @@ void QgsLegend::makeToTopLevelItem()
void QgsLegend::legendLayerZoom()
{
if(!mMapCanvas)
if ( !mMapCanvas )
{
return;
}
@ -1595,12 +1609,12 @@ void QgsLegend::legendLayerZoom()
QgsRectangle extent = theLayer->extent();
//transform extent if otf-projection is on
if(mMapCanvas->hasCrsTransformEnabled())
if ( mMapCanvas->hasCrsTransformEnabled() )
{
QgsMapRenderer* renderer = mMapCanvas->mapRenderer();
if(renderer)
if ( renderer )
{
extent = renderer->layerExtentToOutputExtent(theLayer, extent);
extent = renderer->layerExtentToOutputExtent( theLayer, extent );
}
}

View File

@ -103,6 +103,10 @@ class QgsLegend : public QTreeWidget
Else, 0 is returned.*/
QgsMapLayer* currentLayer();
/*!set the current layer
returns true if the layer exists, false otherwise*/
bool setCurrentLayer( QgsMapLayer *layer );
/**Writes the content of the legend to a project file*/
bool writeXML( QDomNode & layer_node, QDomDocument & document );
@ -285,9 +289,12 @@ class QgsLegend : public QTreeWidget
/**Moves an item back to the position where storeInitialPosition has been called*/
void resetToInitialPosition( QTreeWidgetItem* li );
/**Returns the legend layer to which a map layer gelongs*/
/**Returns the legend layer to which a map layer belongs to*/
QgsLegendLayer* findLegendLayer( const QString& layerKey );
/**Returns the legend layer to which a map layer belongs to*/
QgsLegendLayer* findLegendLayer( const QgsMapLayer *layer );
/**Checks mPixmapWidthValues and mPixmapHeightValues and sets a new icon size if necessary*/
void adjustIconSize();

View File

@ -52,9 +52,7 @@ class QgsLegendItem : public QTreeWidgetItem, public QObject
LEGEND_SYMBOL_GROUP,
LEGEND_SYMBOL_ITEM,
LEGEND_VECTOR_SYMBOL_ITEM,
LEGEND_LAYER_FILE_GROUP,
LEGEND_LAYER_FILE
} ;
};
/**Describes the action that will be done if the mouse button will be released after a drag*/
enum DRAG_ACTION

View File

@ -4567,7 +4567,13 @@ void QgisApp::openURL( QString url, bool useQgisDocDirectory )
/** Get a pointer to the currently selected map layer */
QgsMapLayer *QgisApp::activeLayer()
{
return ( mMapLegend->currentLayer() );
return mMapLegend->currentLayer();
}
/** set the current layer */
bool QgisApp::setActiveLayer( QgsMapLayer *layer )
{
return mMapLegend->setCurrentLayer( layer );
}
/** Add a vector layer directly without prompting user for location

View File

@ -474,6 +474,8 @@ class QgisApp : public QMainWindow
*/
//! Return pointer to the active layer
QgsMapLayer *activeLayer();
//! set the active layer
bool setActiveLayer( QgsMapLayer * );
//! Open the help contents in a browser
void helpContents();
//! Open the QGIS homepage in users browser

View File

@ -17,7 +17,6 @@
***************************************************************************/
/* $Id$ */
#include <iostream>
#include <QFileInfo>
#include <QString>
#include <QMenu>
@ -108,6 +107,11 @@ QgsMapLayer *QgisAppInterface::activeLayer()
return qgis->activeLayer();
}
bool QgisAppInterface::setActiveLayer( QgsMapLayer *layer )
{
return qgis->setActiveLayer( layer );
}
void QgisAppInterface::addPluginToMenu( QString name, QAction* action )
{
qgis->addPluginToMenu( name, action );

View File

@ -68,6 +68,9 @@ class QgisAppInterface : public QgisInterface
//! Get pointer to the active layer (layer selected in the legend)
QgsMapLayer *activeLayer();
//! set the active layer (layer selected in the legend)
bool setActiveLayer( QgsMapLayer *layer );
//! Add an icon to the plugins toolbar
int addToolBarIcon( QAction *qAction );
//! Remove an icon (action) from the plugin toolbar

View File

@ -95,6 +95,11 @@ class GUI_EXPORT QgisInterface : public QObject
//! Get pointer to the active layer (layer selected in the legend)
virtual QgsMapLayer *activeLayer() = 0;
//! Set the active layer (layer gets selected in the legend)
//! returns true if the layer exists, false otherwise
//! added in 1.4
virtual bool setActiveLayer( QgsMapLayer * ) = 0;
//! Add an icon to the plugins toolbar
virtual int addToolBarIcon( QAction *qAction ) = 0;