~ubuntu-branches/ubuntu/dapper/qgis/dapper

« back to all changes in this revision

Viewing changes to src/qgsuniquevalrenderer.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Steve Halasz
  • Date: 2004-12-21 09:46:27 UTC
  • Revision ID: james.westby@ubuntu.com-20041221094627-r9lb6mlz2o3yp8gn
Tags: upstream-0.6.0
ImportĀ upstreamĀ versionĀ 0.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
                         qgsuniquevalrenderer.cpp  -  description
 
3
                             -------------------
 
4
    begin                : July 2004
 
5
    copyright            : (C) 2004 by Marco Hugentobler
 
6
    email                : marco.hugentobler@autoform.ch
 
7
 ***************************************************************************/
 
8
 
 
9
/***************************************************************************
 
10
 *                                                                         *
 
11
 *   This program is free software; you can redistribute it and/or modify  *
 
12
 *   it under the terms of the GNU General Public License as published by  *
 
13
 *   the Free Software Foundation; either version 2 of the License, or     *
 
14
 *   (at your option) any later version.                                   *
 
15
 *                                                                         *
 
16
 ***************************************************************************/
 
17
/* $Id: qgsuniquevalrenderer.cpp,v 1.11 2004/11/27 19:19:17 gsherman Exp $ */
 
18
#include "qgsdlgvectorlayerproperties.h"
 
19
#include "qgsuniquevalrenderer.h"
 
20
#include "qgsuvaldialog.h"
 
21
#include "qgsrenderitem.h"
 
22
#include "qgsfeatureattribute.h"
 
23
#include "qgsfeature.h"
 
24
#include "qgsvectorlayer.h"
 
25
#include "qgssymbologyutils.h"
 
26
#include "qgsuvaldialog.h"
 
27
#include <qdom.h>
 
28
#include <qpainter.h>
 
29
#include <vector>
 
30
 
 
31
QgsUniqueValRenderer::QgsUniqueValRenderer(): mClassificationField(0),mSelectionColor(QColor(255,255,0))
 
32
{
 
33
 
 
34
}
 
35
 
 
36
QgsUniqueValRenderer::~QgsUniqueValRenderer()
 
37
{
 
38
    for(std::map<QString,QgsRenderItem*>::iterator it=mEntries.begin();it!=mEntries.end();++it)
 
39
    {
 
40
        delete it->second;
 
41
    }
 
42
}
 
43
 
 
44
void QgsUniqueValRenderer::initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr)
 
45
{
 
46
    QgsUValDialog *dialog = new QgsUValDialog(layer);
 
47
 
 
48
        if (pr)
 
49
        {
 
50
            pr->setBufferDialog(dialog);
 
51
        } 
 
52
        else
 
53
        {
 
54
            layer->setRendererDialog(dialog);
 
55
        }
 
56
}
 
57
    
 
58
void QgsUniqueValRenderer::renderFeature(QPainter* p, QgsFeature* f,QPicture* pic, double* scalefactor, bool selected)
 
59
{
 
60
    std::vector < QgsFeatureAttribute > vec = f->attributeMap();
 
61
    QString value = vec[0].fieldValue();
 
62
    std::map<QString,QgsRenderItem*>::iterator it=mEntries.find(value);
 
63
    if(it!=mEntries.end())
 
64
    {
 
65
        QgsRenderItem* ritem=it->second;
 
66
        p->setPen(ritem->getSymbol()->pen());
 
67
        p->setBrush(ritem->getSymbol()->brush());
 
68
 
 
69
        if(selected)
 
70
        {
 
71
            QPen pen=ritem->getSymbol()->pen();
 
72
            pen.setColor(mSelectionColor);
 
73
            QBrush brush=ritem->getSymbol()->brush();
 
74
            brush.setColor(mSelectionColor);
 
75
            p->setPen(pen);
 
76
            p->setBrush(brush);
 
77
        }
 
78
    }
 
79
    else
 
80
    {
 
81
#ifdef QGISDEBUG
 
82
        qWarning("Warning, no render item found in QgsUniqueValRenderer::renderFeature");
 
83
#endif
 
84
    }
 
85
    
 
86
}
 
87
 
 
88
void QgsUniqueValRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
 
89
{
 
90
    QDomNode classnode = rnode.namedItem("classificationfield");
 
91
    int classificationfield = classnode.toElement().text().toInt();
 
92
    this->setClassificationField(classificationfield);
 
93
 
 
94
    QDomNode renderitemnode = rnode.namedItem("renderitem");
 
95
    while (!renderitemnode.isNull())
 
96
    {
 
97
        QDomNode valuenode = renderitemnode.namedItem("value");
 
98
        QString value = valuenode.toElement().text();
 
99
#ifdef QGISDEBUG
 
100
        qWarning("readXML, value is "+value);
 
101
#endif
 
102
        QgsSymbol* msy = new QgsSymbol();
 
103
        QPen pen;
 
104
        QBrush brush;
 
105
        QDomNode synode = renderitemnode.namedItem("symbol");
 
106
        QDomElement oulcelement = synode.namedItem("outlinecolor").toElement();
 
107
        int red = oulcelement.attribute("red").toInt();
 
108
        int green = oulcelement.attribute("green").toInt();
 
109
        int blue = oulcelement.attribute("blue").toInt();
 
110
        pen.setColor(QColor(red, green, blue));
 
111
 
 
112
        QDomElement oustelement = synode.namedItem("outlinestyle").toElement();
 
113
        pen.setStyle(QgsSymbologyUtils::qString2PenStyle(oustelement.text()));
 
114
 
 
115
        QDomElement oulwelement = synode.namedItem("outlinewidth").toElement();
 
116
        pen.setWidth(oulwelement.text().toInt());
 
117
 
 
118
        QDomElement fillcelement = synode.namedItem("fillcolor").toElement();
 
119
        red = fillcelement.attribute("red").toInt();
 
120
        green = fillcelement.attribute("green").toInt();
 
121
        blue = fillcelement.attribute("blue").toInt();
 
122
        brush.setColor(QColor(red, green, blue));
 
123
 
 
124
        QDomElement fillpelement = synode.namedItem("fillpattern").toElement();
 
125
        brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
 
126
 
 
127
        QDomElement labelelement = renderitemnode.namedItem("label").toElement();
 
128
        QString label = labelelement.text();
 
129
 
 
130
        //create a renderitem and add it to the renderer
 
131
        msy->setBrush(brush);
 
132
        msy->setPen(pen);
 
133
 
 
134
        QgsRenderItem *ri = new QgsRenderItem(msy, value, label);
 
135
        this->insertValue(value,ri);
 
136
 
 
137
        renderitemnode = renderitemnode.nextSibling();
 
138
    }
 
139
 
 
140
    vl.setRenderer(this);
 
141
    QgsUValDialog *uvaldialog = new QgsUValDialog(&vl);
 
142
    vl.setRendererDialog(uvaldialog);
 
143
 
 
144
    QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
 
145
    vl.setLayerProperties(properties);
 
146
    properties->setLegendType("Unique Value");
 
147
 
 
148
    uvaldialog->apply();
 
149
}
 
150
 
 
151
void QgsUniqueValRenderer::writeXML(std::ostream& xml)
 
152
{
 
153
#ifdef QGISDEBUG
 
154
    qWarning("in QgsUniqueValRenderer::writeXML");
 
155
#endif
 
156
    xml << "\t\t<uniquevalue>\n";
 
157
    xml << "\t\t\t<classificationfield>" << QString::number(this->classificationField()) << "</classificationfield>\n";
 
158
    for(std::map<QString,QgsRenderItem*>::iterator it=mEntries.begin();it!=mEntries.end();++it)
 
159
    {
 
160
        xml << "\t\t\t<renderitem>\n";
 
161
        xml << "\t\t\t\t<value>" << QString(it->first) << "</value>\n";
 
162
        xml << "\t\t\t\t<symbol>\n";
 
163
        QgsSymbol *symbol = (it->second)->getSymbol();
 
164
        xml << "\t\t\t\t\t<outlinecolor red=\"" << QString::number(symbol->pen().color().red()) << "\" green=\"" <<
 
165
            QString::number(symbol->pen().color().green()) << "\" blue=\"" << QString::number(symbol->pen().color().blue())  << 
 
166
            "\" />\n";
 
167
        xml << "\t\t\t\t\t<outlinestyle>" << QgsSymbologyUtils::penStyle2QString(symbol->pen().style())  << 
 
168
            "</outlinestyle>\n";
 
169
        xml << "\t\t\t\t\t<outlinewidth>" << QString::number(symbol->pen().width()) << "</outlinewidth>\n";
 
170
        xml << "\t\t\t\t\t<fillcolor red=\"" << QString::number(symbol->brush().color().red()) << "\" green=\""  << 
 
171
            QString::number(symbol->brush().color().green()) << "\" blue=\""  << 
 
172
            QString::number(symbol->brush().color().blue()) << "\" />\n";
 
173
        xml << "\t\t\t\t\t<fillpattern>" << QgsSymbologyUtils::brushStyle2QString(symbol->brush().style())  << 
 
174
            "</fillpattern>\n";
 
175
        xml << "\t\t\t\t</symbol>\n";
 
176
        xml << "\t\t\t\t<label>" << (it->second)->label() << "</label>\n";
 
177
#ifdef QGISDEBUG
 
178
        qWarning((it->second)->label());
 
179
#endif
 
180
        xml << "\t\t\t</renderitem>\n";
 
181
    }
 
182
    xml << "\t\t</uniquevalue>\n";
 
183
}
 
184
 
 
185
void QgsUniqueValRenderer::clearValues()
 
186
{
 
187
    for(std::map<QString,QgsRenderItem*>::iterator it=mEntries.begin();it!=mEntries.end();++it)
 
188
    {
 
189
        delete it->second;
 
190
    }
 
191
    mEntries.clear();
 
192
}
 
193
 
 
194
QString QgsUniqueValRenderer::name()
 
195
{
 
196
    return "Unique Value";
 
197
}
 
198
 
 
199
std::list<int> QgsUniqueValRenderer::classificationAttributes()
 
200
{
 
201
    std::list<int> list;
 
202
    list.push_back(mClassificationField);
 
203
    return list;
 
204
}
 
205
 
 
206
std::map<QString,QgsRenderItem*>& QgsUniqueValRenderer::items()
 
207
{
 
208
    return mEntries;
 
209
}