~ubuntu-branches/ubuntu/quantal/qgis/quantal

« back to all changes in this revision

Viewing changes to src/qgssimarenderer.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
                            qgssimarenderer.cpp 
 
3
                            Single marker renderer
 
4
                             -------------------
 
5
    begin                : March 2004
 
6
    copyright            : (C) 2004 by Marco Hugentobler
 
7
    email                : mhugent@geo.unizh.ch
 
8
***************************************************************************/
 
9
 
 
10
/***************************************************************************
 
11
 *                                                                         *
 
12
 *   This program is free software; you can redistribute it and/or modify  *
 
13
 *   it under the terms of the GNU General Public License as published by  *
 
14
 *   the Free Software Foundation; either version 2 of the License, or     *
 
15
 *   (at your option) any later version.                                   *
 
16
 *                                                                         *
 
17
 ***************************************************************************/
 
18
 /* $Id: qgssimarenderer.cpp,v 1.20 2004/11/27 12:41:02 mhugent Exp $ */
 
19
 
 
20
#include "qgssimarenderer.h"
 
21
#include "qgssimadialog.h"
 
22
#include "qgssvgcache.h"
 
23
#include "qgsdlgvectorlayerproperties.h"
 
24
#include "qgsvectorlayer.h"
 
25
#include "qgsmarkersymbol.h"
 
26
#include "qgssymbologyutils.h"
 
27
#include <qpainter.h>
 
28
#include <qdom.h>
 
29
 
 
30
void QgsSiMaRenderer::initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr)
 
31
{
 
32
    bool toproperties = false;    //if false: rendererDialog is associated with the vector layer and image is rendered, true: rendererDialog is associated with buffer dialog of vector layer properties and no image is rendered
 
33
    if (pr)
 
34
    {
 
35
        toproperties = true;
 
36
    }
 
37
    
 
38
    if (layer)
 
39
    {
 
40
        QgsMarkerSymbol* sy=new QgsMarkerSymbol();
 
41
        sy->brush().setStyle(Qt::NoBrush);
 
42
        sy->pen().setStyle(Qt::NoPen);
 
43
        sy->pen().setWidth(1);//set width 1 as default instead of width 0
 
44
 
 
45
        QgsRenderItem* ri = new QgsRenderItem();
 
46
        ri->setSymbol(sy);
 
47
        addItem(ri);
 
48
        
 
49
        //todo: add a pixmap for the legend
 
50
        
 
51
 
 
52
        QgsSiMaDialog *dialog = new QgsSiMaDialog(layer);
 
53
        if (toproperties)
 
54
        {
 
55
            pr->setBufferDialog(dialog);
 
56
        } 
 
57
        else
 
58
        {
 
59
            layer->setRendererDialog(dialog);
 
60
        }
 
61
    }
 
62
}
 
63
 
 
64
void QgsSiMaRenderer::renderFeature(QPainter* p, QgsFeature* f, QPicture* pic, double* scalefactor, bool selected)
 
65
{
 
66
    p->setPen(Qt::NoPen);
 
67
    p->setBrush(Qt::NoBrush);
 
68
 
 
69
    QgsMarkerSymbol* ms=dynamic_cast<QgsMarkerSymbol*>(mItem->getSymbol());
 
70
    if(ms&&pic)
 
71
    {
 
72
        QPainter painter(pic);
 
73
        QPixmap pm = QgsSVGCache::instance().getPixmap(ms->picture(), 
 
74
                                                       ms->scaleFactor());
 
75
        painter.drawPixmap(0, 0, pm);
 
76
        (*scalefactor) = 1;
 
77
 
 
78
        if(selected)
 
79
        {
 
80
          painter.setBrush(QColor(255,255,0));
 
81
          painter.drawRect(0,0,pm.width(),pm.height());
 
82
        }
 
83
    }
 
84
}
 
85
 
 
86
void QgsSiMaRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
 
87
{
 
88
    QgsMarkerSymbol* msy = new QgsMarkerSymbol();
 
89
    QPen pen;
 
90
    QBrush brush;
 
91
    QString svgpath;
 
92
    double scalefactor;
 
93
    QString value, label;
 
94
 
 
95
    QDomNode rinode = rnode.namedItem("renderitem");
 
96
    
 
97
    QDomNode vnode = rinode.namedItem("value");
 
98
    QDomElement velement = vnode.toElement();
 
99
    value = velement.text();
 
100
 
 
101
    QDomNode synode = rinode.namedItem("markersymbol");
 
102
                    
 
103
 
 
104
    QDomNode svgnode = synode.namedItem("svgpath");
 
105
    svgpath = svgnode.toElement().text();
 
106
 
 
107
    QDomNode scalenode = synode.namedItem("scalefactor");
 
108
    scalefactor = scalenode.toElement().text().toDouble();
 
109
 
 
110
    QDomNode outlcnode = synode.namedItem("outlinecolor");
 
111
    QDomElement oulcelement = outlcnode.toElement();
 
112
    int red = oulcelement.attribute("red").toInt();
 
113
    int green = oulcelement.attribute("green").toInt();
 
114
    int blue = oulcelement.attribute("blue").toInt();
 
115
    pen.setColor(QColor(red, green, blue));
 
116
 
 
117
    QDomNode outlstnode = synode.namedItem("outlinestyle");
 
118
    QDomElement outlstelement = outlstnode.toElement();
 
119
    pen.setStyle(QgsSymbologyUtils::qString2PenStyle(outlstelement.text()));
 
120
 
 
121
    QDomNode outlwnode = synode.namedItem("outlinewidth");
 
122
    QDomElement outlwelement = outlwnode.toElement();
 
123
    pen.setWidth(outlwelement.text().toInt());
 
124
 
 
125
    QDomNode fillcnode = synode.namedItem("fillcolor");
 
126
    QDomElement fillcelement = fillcnode.toElement();
 
127
    red = fillcelement.attribute("red").toInt();
 
128
    green = fillcelement.attribute("green").toInt();
 
129
    blue = fillcelement.attribute("blue").toInt();
 
130
    brush.setColor(QColor(red, green, blue));
 
131
 
 
132
    QDomNode fillpnode = synode.namedItem("fillpattern");
 
133
    QDomElement fillpelement = fillpnode.toElement();
 
134
    brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
 
135
 
 
136
    QDomNode lnode = rinode.namedItem("label");
 
137
    QDomElement lnodee = lnode.toElement();
 
138
    label = lnodee.text();
 
139
 
 
140
    //create a renderer and add it to the vector layer
 
141
    msy->setBrush(brush);
 
142
    msy->setPen(pen);
 
143
    msy->setPicture(svgpath);
 
144
#ifdef QGISDEBUG
 
145
    qWarning("the svgpath: "+svgpath);
 
146
#endif
 
147
    msy->setScaleFactor(scalefactor);
 
148
#ifdef QGISDEBUG
 
149
    qWarning("the scalefactor: "+QString::number(scalefactor,'f',2));
 
150
#endif
 
151
    QgsRenderItem* ri = new QgsRenderItem();
 
152
    ri->setSymbol(msy);
 
153
    ri->setLabel(label);
 
154
    ri->setValue(value);
 
155
 
 
156
    this->addItem(ri);
 
157
    vl.setRenderer(this);
 
158
    QgsSiMaDialog *smdialog = new QgsSiMaDialog(&vl);
 
159
    vl.setRendererDialog(smdialog);
 
160
 
 
161
    QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
 
162
    vl.setLayerProperties(properties);
 
163
    properties->setLegendType("Single Marker");
 
164
 
 
165
    smdialog->apply();
 
166
}
 
167
 
 
168
void QgsSiMaRenderer::writeXML(std::ostream& xml)
 
169
{
 
170
#ifdef QGISDEBUG
 
171
    qWarning("in QgsSiMaRenderer::writeXML");
 
172
    qWarning("label seems to make problems");
 
173
    qWarning(this->item()->label());
 
174
#endif
 
175
    xml << "\t\t<singlemarker>\n";
 
176
    xml << "\t\t\t<renderitem>\n";
 
177
    xml << "\t\t\t\t<value>" + this->item()->value() + "</value>\n";
 
178
 
 
179
    QgsMarkerSymbol *markersymbol = dynamic_cast<QgsMarkerSymbol*>(this->item()->getSymbol());
 
180
    if(markersymbol)
 
181
    {
 
182
        xml << "\t\t\t\t<markersymbol>\n";
 
183
        xml << "\t\t\t\t\t<svgpath>" << (const char *) markersymbol->picture() << "</svgpath>\n";
 
184
        xml << "\t\t\t\t\t<scalefactor>"  << markersymbol->scaleFactor() << "</scalefactor>\n";
 
185
        xml << "\t\t\t\t\t<outlinecolor red=\"" 
 
186
    << markersymbol->pen().color().red() 
 
187
    << "\" green=\"" 
 
188
          << markersymbol->pen().color().green() 
 
189
    << "\" blue=\"" 
 
190
    << markersymbol->pen().color().blue()
 
191
    << "\" />\n";
 
192
        xml << "\t\t\t\t\t<outlinestyle>" << (const char *) QgsSymbologyUtils::penStyle2QString(markersymbol->pen().style()) << "</outlinestyle>\n";
 
193
        xml << "\t\t\t\t\t<outlinewidth>" <<  markersymbol->pen().width() << "</outlinewidth>\n";
 
194
        xml << "\t\t\t\t\t<fillcolor red=\"" << markersymbol->brush().color().red() 
 
195
    << "\" green=\"" 
 
196
    << markersymbol->brush().color().green()
 
197
    << "\" blue=\"" 
 
198
    << markersymbol->brush().color().blue()
 
199
    << "\" />\n";
 
200
        xml << "\t\t\t\t\t<fillpattern>" 
 
201
    << (const char *)QgsSymbologyUtils::brushStyle2QString(markersymbol->brush().style())
 
202
          << "</fillpattern>\n";
 
203
          xml << "\t\t\t\t</markersymbol>\n";
 
204
          xml << "\t\t\t\t<label>" + this->item()->label() + "</label>\n";
 
205
        xml << "\t\t\t</renderitem>\n";
 
206
        xml << "\t\t</singlemarker>\n";
 
207
    }else
 
208
    {
 
209
        qWarning("warning, type cast failed in qgsprojectio.cpp line 715"); 
 
210
    }
 
211
}
 
212
 
 
213
std::list<int> QgsSiMaRenderer::classificationAttributes()
 
214
{
 
215
    std::list<int> list;
 
216
    return list;//return an empty list
 
217
}
 
218
 
 
219
QString QgsSiMaRenderer::name()
 
220
{
 
221
    return "Single Marker";
 
222
}