Skip to content

Commit 424cccf

Browse files
author
mhugent
committed
Legend: apply overview and editing icons also to QgsLegendLayer if it has only one file. QgsOgrProvider: if a vector type is not known (e.g. for the ogr GML driver), examine the first layer feature to find out the wkb type
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5634 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent b6444ad commit 424cccf

10 files changed

+166
-8
lines changed

src/gui/qgsmaplayer.h

-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,6 @@ class QgsMapLayer : public QObject
308308
*/
309309
virtual QString errorString();
310310

311-
312311
public slots:
313312
/** \brief Mutator for transparency level. Should be between 0 and 255 */
314313
virtual void setTransparency(unsigned int)=0;

src/gui/qgsvectorlayer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ void QgsVectorLayer::draw(QPainter * p,
889889
// only show selections of the current layer
890890
bool sel;
891891
if (
892-
(mLegend->currentLayer() == this) &&
892+
(mLegend && mLegend->currentLayer() == this) &&
893893
(mSelectedFeatureIds.find(fet->featureId()) != mSelectedFeatureIds.end())
894894
)
895895
{

src/legend/qgslegend.cpp

+23-2
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,6 @@ void QgsLegend::legendLayerAddToOverview()
652652
(*it)->inOverview(true);
653653
}
654654
}
655-
656655
mMapCanvas->updateOverview();
657656
}
658657

@@ -673,7 +672,6 @@ void QgsLegend::legendLayerRemoveFromOverview()
673672
(*it)->inOverview(false); //else
674673
}
675674
}
676-
677675
mMapCanvas->updateOverview();
678676
}
679677

@@ -1064,6 +1062,7 @@ void QgsLegend::storeInitialPosition(QTreeWidgetItem* li)
10641062

10651063
void QgsLegend::resetToInitialPosition(QTreeWidgetItem* li)
10661064
{
1065+
QgsLegendItem* formerParent = dynamic_cast<QgsLegendItem*>(li->parent()); //todo: make sure legend layers are updated
10671066
if(mRestoreInformation == FIRST_ITEM)
10681067
{
10691068
#ifdef QGISDEBUG
@@ -1078,14 +1077,27 @@ void QgsLegend::resetToInitialPosition(QTreeWidgetItem* li)
10781077
qWarning("FIRST_CHILD");
10791078
#endif
10801079
removeItem(li);
1080+
if(formerParent)
1081+
{
1082+
formerParent->release((QgsLegendItem*)li);
1083+
}
10811084
mRestoreItem->insertChild(0, li);
1085+
((QgsLegendItem*)mRestoreItem)->receive((QgsLegendItem*)li);
10821086
}
10831087
else if(mRestoreInformation == YOUNGER_SIBLING)
10841088
{
10851089
#ifdef QGISDEBUG
10861090
qWarning("YOUNGER_SIBLING");
10871091
#endif
1092+
if(formerParent)
1093+
{
1094+
formerParent->release((QgsLegendItem*)li);
1095+
}
10881096
dynamic_cast<QgsLegendItem*>(li)->moveItem(dynamic_cast<QgsLegendItem*>(mRestoreItem));
1097+
if(mRestoreItem->parent())
1098+
{
1099+
((QgsLegendItem*)(mRestoreItem->parent()))->receive((QgsLegendItem*)li);
1100+
}
10891101
}
10901102
}
10911103

@@ -1253,14 +1265,23 @@ QDomNode QgsLegend::nextDomNode(const QDomNode& theNode)
12531265

12541266
void QgsLegend::insertItem(QTreeWidgetItem* move, QTreeWidgetItem* into)
12551267
{
1268+
#ifdef QGISDEBUG
1269+
qWarning("entering QgsLegend::insertItem");
1270+
#endif
12561271
QgsLegendItem* movedItem = dynamic_cast<QgsLegendItem*>(move);
12571272
QgsLegendItem* intoItem = dynamic_cast<QgsLegendItem*>(into);
12581273

12591274
if(movedItem && intoItem)
12601275
{
1276+
QgsLegendItem* parentItem = dynamic_cast<QgsLegendItem*>(movedItem->parent());
12611277
movedItem->storeAppearanceSettings();//store settings in the moved item and its children
12621278
removeItem(movedItem);
12631279
intoItem->insert(movedItem);
1280+
if(parentItem)
1281+
{
1282+
parentItem->release(movedItem); //give the former parent item the possibility to do cleanups
1283+
}
1284+
intoItem->receive(movedItem);
12641285
movedItem->restoreAppearanceSettings();//apply the settings again
12651286
}
12661287
}

src/legend/qgslegenditem.h

+4
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ class QgsLegendItem : public QTreeWidgetItem
9898
void restoreAppearanceSettings();
9999
/**Returns a pointer to the legend widget*/
100100
QgsLegend* legend() const;
101+
/**Do preparations after a new child was inserted (default empty)*/
102+
virtual void receive(QgsLegendItem* newChild){}
103+
/**Do cleanups after a child item leaves (default empty)*/
104+
virtual void release(QgsLegendItem* formerChild){}
101105
protected:
102106
bool mLeafNodeFlag;
103107
LEGEND_ITEM_TYPE mType;

src/legend/qgslegendlayer.cpp

+57-3
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
* Free Software Foundation, Inc., *
1818
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
1919
***************************************************************************/
20+
21+
#include "qgsapplication.h"
2022
#include "qgslegendlayer.h"
2123
#include "qgslegendlayerfile.h"
2224
#include "qgslegendlayerfilegroup.h"
2325
#include "qgsmaplayer.h"
2426
#include <iostream>
2527
#include <QCoreApplication>
2628
#include <QIcon>
29+
#include <QPainter>
2730

2831
QgsLegendLayer::QgsLegendLayer(QTreeWidgetItem* parent,QString name)
2932
: QgsLegendItem(parent, name)
@@ -57,7 +60,7 @@ QgsLegendLayer::~QgsLegendLayer()
5760

5861
void QgsLegendLayer::setLayerTypeIcon()
5962
{
60-
QgsMapLayer* firstLayer = firstMapLayer();
63+
/*QgsMapLayer* firstLayer = firstMapLayer();
6164
if(firstLayer)
6265
{
6366
QFileInfo file(firstLayer->layerTypeIconPath());
@@ -66,7 +69,9 @@ void QgsLegendLayer::setLayerTypeIcon()
6669
QIcon myIcon(file.absoluteFilePath());
6770
setIcon(0, myIcon);
6871
}
69-
}
72+
}*/
73+
QIcon myIcon(getOriginalPixmap());
74+
setIcon(0, myIcon);
7075
}
7176

7277
bool QgsLegendLayer::isLeafNode()
@@ -110,7 +115,7 @@ QgsLegendItem::DRAG_ACTION QgsLegendLayer::accept(const QgsLegendItem* li) const
110115
return NO_ACTION;
111116
}
112117

113-
QgsMapLayer* QgsLegendLayer::firstMapLayer()
118+
QgsMapLayer* QgsLegendLayer::firstMapLayer() const
114119
{
115120
//first find the legend layer file group
116121
QgsLegendLayerFileGroup* llfg = 0;
@@ -228,3 +233,52 @@ void QgsLegendLayer::updateCheckState()
228233
treeWidget()->blockSignals(false);
229234
}
230235
}
236+
237+
void QgsLegendLayer::updateIcon()
238+
{
239+
QPixmap newIcon(getOriginalPixmap());
240+
241+
QgsMapLayer* theLayer = firstMapLayer();
242+
243+
if(mapLayers().size() == 1)
244+
{
245+
246+
//overview
247+
if(theLayer->showInOverviewStatus())
248+
{
249+
// Overlay the overview icon on the default icon
250+
QPixmap myPixmap(QgsApplication::themePath()+"mIconOverview.png");
251+
QPainter p(&newIcon);
252+
p.drawPixmap(0,0,myPixmap);
253+
p.end();
254+
}
255+
256+
//editable
257+
if(theLayer->isEditable())
258+
{
259+
// Overlay the editable icon on the default icon
260+
QPixmap myPixmap(QgsApplication::themePath()+"mIconEditable.png");
261+
QPainter p(&newIcon);
262+
p.drawPixmap(0,0,myPixmap);
263+
p.end();
264+
}
265+
}
266+
267+
QIcon theIcon(newIcon);
268+
setIcon(0, theIcon);
269+
}
270+
271+
QPixmap QgsLegendLayer::getOriginalPixmap() const
272+
{
273+
QgsMapLayer* firstLayer = firstMapLayer();
274+
if(firstLayer)
275+
{
276+
QFileInfo file(firstLayer->layerTypeIconPath());
277+
if(file.exists())
278+
{
279+
return QPixmap(file.absoluteFilePath());
280+
}
281+
}
282+
QPixmap emptyPixmap;
283+
return emptyPixmap;
284+
}

src/legend/qgslegendlayer.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class QgsLegendLayer : public QgsLegendItem
5050
QgsLegendItem::DRAG_ACTION accept(const QgsLegendItem* li) const;
5151
/**Returns the map layer associated with the first QgsLegendLayerFile or 0 if
5252
there is no QgsLegendLayerFile*/
53-
QgsMapLayer* firstMapLayer();
53+
QgsMapLayer* firstMapLayer() const;
5454
/**Returns the map layers associated with the QgsLegendLayerFiles*/
5555
std::list<QgsMapLayer*> mapLayers();
5656
/**Returns the legend layer file items associated with this legend layer*/
@@ -61,6 +61,11 @@ class QgsLegendLayer : public QgsLegendItem
6161
void updateLayerSymbologySettings(const QgsMapLayer* mapLayer);
6262
/**Goes through all the legendlayerfiles and sets check state to checked/partially checked/unchecked*/
6363
void updateCheckState();
64+
/**Goes through all the legendlayerfiles and adds editing/overview pixmaps to the icon. If not all layer files
65+
have the same editing/overview state, a tristate is applied*/
66+
void updateIcon();
67+
protected:
68+
QPixmap getOriginalPixmap() const;
6469
};
6570

6671
#endif

src/legend/qgslegendlayerfile.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
***************************************************************************/
2020
#include "qgsapplication.h"
2121
#include "qgslegend.h"
22+
#include "qgslegendlayer.h"
2223
#include "qgslegendlayerfile.h"
2324
#include "qgsmaplayer.h"
2425
#include <QCoreApplication>
@@ -121,6 +122,9 @@ void QgsLegendLayerFile::setIconAppearance(bool inOverview,
121122

122123
QIcon theIcon(newIcon);
123124
setIcon(0, theIcon);
125+
126+
//also update the icon of the legend layer
127+
((QgsLegendLayer*)(parent()->parent()))->updateIcon();
124128
}
125129

126130
void QgsLegendLayerFile::toggleCheckBox(bool state)

src/legend/qgslegendlayerfilegroup.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* *
1616
***************************************************************************/
1717

18+
#include "qgslegendlayer.h"
1819
#include "qgslegendlayerfilegroup.h"
1920
#include "qgslegendlayerfile.h"
2021
#include "qgslegendsymbologygroup.h"
@@ -72,12 +73,23 @@ QgsLegendItem::DRAG_ACTION QgsLegendLayerFileGroup::accept(const QgsLegendItem*
7273

7374
bool QgsLegendLayerFileGroup::insert(QgsLegendItem* newItem)
7475
{
76+
#ifdef QGISDEBUG
77+
qWarning("In QgsLegendLayerFileGroup::insert");
78+
#endif
7579
if ( newItem->type() == LEGEND_LAYER_FILE )
7680
{
7781
QgsLegendItem* oldItem = firstChild();
82+
//QgsLegendLayer* parentLegendLayer = dynamic_cast<QgsLegendLayer*>(parent());
83+
7884
if(!oldItem)//this item is the first child
7985
{
8086
insertChild(0, newItem);
87+
//update the icon and the check state of the new and the former legend layer
88+
//if(parentLegendLayer)
89+
//{
90+
// parentLegendLayer->updateIcon();
91+
// parentLegendLayer->updateCheckState();
92+
//}
8193
return true;
8294
}
8395
//there are already legend layer files
@@ -102,6 +114,12 @@ bool QgsLegendLayerFileGroup::insert(QgsLegendItem* newItem)
102114
if(newLayer->isSymbologyCompatible(*thelayer))
103115
{
104116
insertChild(childCount(), newItem);
117+
//update the icon and the check state of the new and the former legend layer
118+
//if(parentLegendLayer)
119+
//{
120+
// parentLegendLayer->updateIcon();
121+
// parentLegendLayer->updateCheckState();
122+
//}
105123
return true;
106124
}
107125
else
@@ -128,3 +146,32 @@ bool QgsLegendLayerFileGroup::containsLegendLayerFile(const QgsLegendLayerFile*
128146
}
129147
return result;
130148
}
149+
150+
void QgsLegendLayerFileGroup::receive(QgsLegendItem* newChild)
151+
{
152+
if(newChild->type() == LEGEND_LAYER_FILE)
153+
{
154+
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(parent());
155+
if(ll)
156+
{
157+
ll->updateIcon();
158+
ll->updateCheckState();
159+
}
160+
}
161+
}
162+
163+
void QgsLegendLayerFileGroup::release(QgsLegendItem* formerChild)
164+
{
165+
#ifdef QGISDEBUG
166+
qWarning("In QgsLegendLayerFileGroup::release");
167+
#endif
168+
if(formerChild->type() == LEGEND_LAYER_FILE)
169+
{
170+
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(parent());
171+
if(ll)
172+
{
173+
ll->updateIcon();
174+
ll->updateCheckState();
175+
}
176+
}
177+
}

src/legend/qgslegendlayerfilegroup.h

+6
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,10 @@ class QgsLegendLayerFileGroup: public QgsLegendItem
2929
bool insert(QgsLegendItem* theItem);
3030
/**Returns true if llf is a childelement*/
3131
bool containsLegendLayerFile(const QgsLegendLayerFile* llf) const;
32+
/**Makes the parent QgsLegendLayer update the checkState and the icon after a new
33+
QgsLegendLayerFile was inserted*/
34+
void receive(QgsLegendItem* newChild);
35+
/**Cleanups when after a child QgsLegendLayerFile item has left. Tells the parent QgsLegendLayer to
36+
refresh the checkState and the icon*/
37+
void release(QgsLegendItem* formerChild);
3238
};

src/providers/ogr/qgsogrprovider.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,24 @@ void QgsOgrProvider::loadFields()
186186
if(fdef)
187187
{
188188
geomType = fdef->GetGeomType();
189+
190+
//Some ogr drivers (e.g. GML) are not able to determine the geometry type of a layer like this.
191+
//In such cases, we examine the first feature
192+
if(geomType == wkbUnknown)
193+
{
194+
ogrLayer->ResetReading();
195+
OGRFeature* firstFeature = ogrLayer->GetNextFeature();
196+
if(firstFeature)
197+
{
198+
OGRGeometry* firstGeometry = firstFeature->GetGeometryRef();
199+
if(firstGeometry)
200+
{
201+
geomType = firstGeometry->getGeometryType();
202+
}
203+
}
204+
ogrLayer->ResetReading();
205+
}
206+
189207
for(int i=0;i<fdef->GetFieldCount();++i)
190208
{
191209
OGRFieldDefn *fldDef = fdef->GetFieldDefn(i);

0 commit comments

Comments
 (0)