diff --git a/src/qgscontcoldialog.cpp b/src/qgscontcoldialog.cpp index 84f5b541c45..7345b8d2fe9 100644 --- a/src/qgscontcoldialog.cpp +++ b/src/qgscontcoldialog.cpp @@ -48,6 +48,24 @@ QgsContColDialog::QgsContColDialog(QgsVectorLayer* layer): QgsContColDialogBase( qWarning("Warning, data provider is null in QgsContColDialog::QgsContColDialog(...)"); return; } + + //restore the correct colors for minimum and maximum values + QgsContinuousColRenderer* renderer=dynamic_cast(m_vectorlayer->renderer()); + if(renderer) + { + QgsRenderItem* minitem=renderer->minimumItem(); + QgsRenderItem* maxitem=renderer->maximumItem(); + if(m_vectorlayer->vectorType()==QGis::Line) + { + mincolorbutton->setPaletteBackgroundColor(minitem->getSymbol()->pen().color()); + maxcolorbutton->setPaletteBackgroundColor(maxitem->getSymbol()->pen().color()); + } + else + { + mincolorbutton->setPaletteBackgroundColor(minitem->getSymbol()->brush().color()); + maxcolorbutton->setPaletteBackgroundColor(maxitem->getSymbol()->brush().color()); + } + } } QgsContColDialog::QgsContColDialog() diff --git a/src/qgscontinuouscolrenderer.cpp b/src/qgscontinuouscolrenderer.cpp index ed7b907aa9b..a1d323ab484 100644 --- a/src/qgscontinuouscolrenderer.cpp +++ b/src/qgscontinuouscolrenderer.cpp @@ -193,9 +193,7 @@ void QgsContinuousColRenderer::renderFeature(QPainter* p, QgsFeature* f, QgsCoor char lsb; QgsPoint pt; QPointArray *pa; - //OGRFieldDefn *fldDef; - QString fld; - QString val; + switch (wkbType) { case QGis::WKBPoint: diff --git a/src/qgscontinuouscolrenderer.h b/src/qgscontinuouscolrenderer.h index 122d811c0e2..b75deaa4986 100644 --- a/src/qgscontinuouscolrenderer.h +++ b/src/qgscontinuouscolrenderer.h @@ -44,6 +44,10 @@ class QgsContinuousColRenderer: public QgsRenderer void setMinimumItem(QgsRenderItem* it); /**Sets the item for the maximum value. The item has to be created using the new operator and is automatically deleted when inserting a new item or when the instance is destroyed*/ void setMaximumItem(QgsRenderItem* it); + /**Returns the item for the minimum value*/ + QgsRenderItem* minimumItem(); + /**Returns the item for the maximum value*/ + QgsRenderItem* maximumItem(); /** Returns true*/ bool needsAttributes(); protected: @@ -65,6 +69,16 @@ inline void QgsContinuousColRenderer::setClassificationField(int id) m_classificationField=id; } +inline QgsRenderItem* QgsContinuousColRenderer::minimumItem() +{ + return m_minimumItem; +} + +inline QgsRenderItem* QgsContinuousColRenderer::maximumItem() +{ + return m_maximumItem; +} + inline bool QgsContinuousColRenderer::needsAttributes() { return true; diff --git a/src/qgsgraduatedsymrenderer.cpp b/src/qgsgraduatedsymrenderer.cpp index 2f7ddfb20d2..5fe33023425 100644 --- a/src/qgsgraduatedsymrenderer.cpp +++ b/src/qgsgraduatedsymrenderer.cpp @@ -92,9 +92,7 @@ void QgsGraduatedSymRenderer::renderFeature(QPainter* p, QgsFeature* f, QgsCoord char lsb; QgsPoint pt; QPointArray *pa; - //OGRFieldDefn *fldDef; - QString fld; - QString val; + switch (wkbType) { case QGis::WKBPoint: @@ -287,7 +285,7 @@ void QgsGraduatedSymRenderer::initializeSymbology(QgsVectorLayer* layer) p.setFont( f ); p.drawText(35,pixmap->height()-10,name); - QgsRangeRenderItem* ri = new QgsRangeRenderItem(sy,QString::number(DBL_MIN,'f',6),QString::number(DBL_MAX,'f',6),""); + QgsRangeRenderItem* ri = new QgsRangeRenderItem(sy,QString::number(-DBL_MAX,'f',6),QString::number(DBL_MAX,'f',6),""); addItem(ri); QgsGraSyDialog* dialog=new QgsGraSyDialog(layer); diff --git a/src/qgsgraduatedsymrenderer.h b/src/qgsgraduatedsymrenderer.h index c0d2d46d99f..20eb68f1b1b 100644 --- a/src/qgsgraduatedsymrenderer.h +++ b/src/qgsgraduatedsymrenderer.h @@ -50,6 +50,8 @@ class QgsGraduatedSymRenderer: public QgsRenderer \param field the number of the field to classify*/ void setClassificationField(int field); void initializeSymbology(QgsVectorLayer* layer); + /**Returns the list with the render items*/ + std::list& items(); /** Returns true*/ bool needsAttributes(); protected: @@ -80,6 +82,11 @@ inline void QgsGraduatedSymRenderer::setClassificationField(int field) m_classificationField=field; } +inline std::list& QgsGraduatedSymRenderer::items() +{ + return m_items; +} + inline bool QgsGraduatedSymRenderer::needsAttributes() { return true; diff --git a/src/qgsgrasydialog.cpp b/src/qgsgrasydialog.cpp index 65ea354f567..b3698f5f139 100644 --- a/src/qgsgrasydialog.cpp +++ b/src/qgsgrasydialog.cpp @@ -34,11 +34,6 @@ QgsGraSyDialog::QgsGraSyDialog(QgsVectorLayer* layer): QgsGraSyDialogBase(), ext(0), scv(0), m_vectorlayer(layer) { - QObject::connect(numberofclassesspinbox,SIGNAL(valueChanged(int)),this,SLOT(adjustNumberOfClasses())); - QObject::connect(classificationComboBox,SIGNAL(activated(int)),this,SLOT(adjustNumberOfClasses())); - QObject::connect(modeComboBox,SIGNAL(activated(int)),this,SLOT(adjustNumberOfClasses())); - QObject::connect(closebutton,SIGNAL(clicked()),this,SLOT(hide())); - QObject::connect(applybutton,SIGNAL(clicked()),this,SLOT(apply())); setOrientation(Qt::Vertical); //Set the initial display name @@ -74,6 +69,61 @@ QgsGraSyDialog::QgsGraSyDialog(QgsVectorLayer* layer): QgsGraSyDialogBase(), ext modeComboBox->insertItem("equal interval"); setSizeGripEnabled(true); + + //restore the correct settings + QgsGraduatedSymRenderer* renderer=dynamic_cast(m_vectorlayer->renderer()); + if(renderer) + { + std::list list=renderer->items(); + + ext=new QgsGraSyExtensionWidget(this,renderer->classificationField(),QgsGraSyDialog::EMPTY,list.size(),m_vectorlayer); + + + //todo:find out the fieldname for the classification field + classificationComboBox->setCurrentItem(renderer->classificationField()); + + //set the right colors and texts to the widgets + int number=0; + for(std::list::iterator it=list.begin();it!=list.end();++it) + { + qWarning("inside loop"); + ((QLineEdit*)(ext->getWidget(0,number)))->setText((*it)->value()); + ((QLineEdit*)ext->getWidget(1,number))->setText((*it)->upper_value()); + ((QLineEdit*)ext->getWidget(2,number))->setText((*it)->label()); + ((QPushButton*)ext->getWidget(3,number))->setPaletteBackgroundColor((*it)->getSymbol()->pen().color()); + ((QPushButton*)ext->getWidget(4,number))->setText(QgsSymbologyUtils::penStyle2QString((*it)->getSymbol()->pen().style())); + ((QSpinBox*)ext->getWidget(5,number))->setValue((*it)->getSymbol()->pen().width()); + ((QPushButton*)ext->getWidget(6,number))->setPaletteBackgroundColor((*it)->getSymbol()->brush().color()); + ((QPushButton*)ext->getWidget(7,number))->setText(QgsSymbologyUtils::brushStyle2QString((*it)->getSymbol()->brush().style())); + number++; + } + + if(scv) + { + QgsGraSyDialogBaseLayout->remove(scv); + delete scv; + } + + numberofclassesspinbox->setValue(list.size()); + + if(numberofclassesspinbox->value()==0) + { + scv=0; + return; + } + + scv=new QScrollView(this); + scv->addChild(ext); + QgsGraSyDialogBaseLayout->addMultiCellWidget(scv,5,5,0,3); + scv->show(); + + //do the necessary signal/slot connections + QObject::connect(numberofclassesspinbox,SIGNAL(valueChanged(int)),this,SLOT(adjustNumberOfClasses())); + QObject::connect(classificationComboBox,SIGNAL(activated(int)),this,SLOT(adjustNumberOfClasses())); + QObject::connect(modeComboBox,SIGNAL(activated(int)),this,SLOT(adjustNumberOfClasses())); + QObject::connect(closebutton,SIGNAL(clicked()),this,SLOT(hide())); + QObject::connect(applybutton,SIGNAL(clicked()),this,SLOT(apply())); + } } QgsGraSyDialog::QgsGraSyDialog() @@ -257,6 +307,7 @@ void QgsGraSyDialog::apply() const if(lbcontainsletter==false&&ubcontainsletter==false&&lower_bound.length()>0&&upper_bound.length()>0)//only add the item if the value bounds do not contain letters and are not null strings { + qWarning("adde ein renderitem"); QgsRangeRenderItem* item = new QgsRangeRenderItem(sy, lower_bound, upper_bound, ((QLineEdit*)(ext->getWidget(2,i)))->text()); renderer->addItem(item); diff --git a/src/qgsrasterlayer.h b/src/qgsrasterlayer.h index 8f9e4b2a676..ddbe5304768 100644 --- a/src/qgsrasterlayer.h +++ b/src/qgsrasterlayer.h @@ -384,10 +384,6 @@ private: double minGrayDouble; // maximum gray value - used in scaling procedure double maxGrayDouble; - - -signals: - void repaintRequested(); }; #endif diff --git a/src/qgssinglesymrenderer.cpp b/src/qgssinglesymrenderer.cpp index 5e1659d4c3c..c85cda074e5 100644 --- a/src/qgssinglesymrenderer.cpp +++ b/src/qgssinglesymrenderer.cpp @@ -63,9 +63,7 @@ void QgsSingleSymRenderer::renderFeature(QPainter* p, QgsFeature* f, QgsCoordina char lsb; QgsPoint pt; QPointArray *pa; - //OGRFieldDefn *fldDef; - QString fld; - QString val; + switch (wkbType) { case QGis::WKBPoint: diff --git a/src/qgssisydialog.cpp b/src/qgssisydialog.cpp index 4ebdb1d752e..65915bfd1fb 100644 --- a/src/qgssisydialog.cpp +++ b/src/qgssisydialog.cpp @@ -45,8 +45,12 @@ QgsSiSyDialog::QgsSiSyDialog(QgsVectorLayer* layer): QgsSiSyDialogBase(), m_vect displaynamefield->setText(m_vectorlayer->name()); outlinecolorbutton->setPaletteBackgroundColor(((QgsSingleSymRenderer*)(layer->renderer()))->item()->getSymbol()->pen().color()); stylebutton->setText(tr("SolidLine")); - outlinewidthspinbox->setValue(((QgsSingleSymRenderer*)(layer->renderer()))->item()->getSymbol()->pen().width()); - fillcolorbutton->setPaletteBackgroundColor(((QgsSingleSymRenderer*)(layer->renderer()))->item()->getSymbol()->brush().color()); + QgsSingleSymRenderer* renderer=dynamic_cast(layer->renderer()); + if(renderer) + { + outlinewidthspinbox->setValue(renderer->item()->getSymbol()->pen().width()); + fillcolorbutton->setPaletteBackgroundColor(renderer->item()->getSymbol()->brush().color()); + } patternbutton->setText(tr("SolidPattern")); if(m_vectorlayer&&m_vectorlayer->vectorType()==QGis::Line) diff --git a/src/qgsvectorlayer.cpp b/src/qgsvectorlayer.cpp index 3f402ab6943..3ba46039153 100644 --- a/src/qgsvectorlayer.cpp +++ b/src/qgsvectorlayer.cpp @@ -238,6 +238,21 @@ void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsCoordinateTrans QgsFeature *fet; unsigned char *feature; bool attributesneeded = m_renderer->needsAttributes(); + + double *x; + double *y; + int *nPoints; + int *numRings; + int *numPolygons; + int numPoints; + int numLineStrings; + int idx, jdx, kdx; + unsigned char *ptr; + char lsb; + QgsPoint pt; + QPointArray *pa; + int wkbType; + while ((fet = dataProvider->getNextFeature(attributesneeded))) {//true is necessary for graduated symbol if (fet == 0) { @@ -265,148 +280,141 @@ void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsCoordinateTrans // if (feature != 0) { // std::cout << featureCount << "'the feature is null\n"; - int wkbType = (int) feature[1]; + wkbType = (int) feature[1]; // std::cout << "Feature type: " << wkbType << std::endl; // read each feature based on its type - double *x; - double *y; - int *nPoints; - int *numRings; - int *numPolygons; - int numPoints; - int numLineStrings; - int idx, jdx, kdx; - unsigned char *ptr; - char lsb; - QgsPoint pt; - QPointArray *pa; - //OGRFieldDefn *fldDef; - QString fld; - QString val; + switch (wkbType) { case WKBPoint: - p->setBrush(*brush); - // fldDef = fet->GetFieldDefnRef(1); - // fld = fldDef->GetNameRef(); - //NEEDTHIS? val = fet->GetFieldAsString(1); - //std::cout << val << "\n"; - x = (double *) (feature + 5); - y = (double *) (feature + 5 + sizeof(double)); - // std::cout << "transforming point\n"; - pt = cXf->transform(*x, *y); - //std::cout << "drawing marker for feature " << featureCount << "\n"; - p->drawRect(pt.xToInt(), pt.yToInt(), 5, 5); - //std::cout << "marker draw complete\n"; - break; + p->setBrush(*brush); + // fldDef = fet->GetFieldDefnRef(1); + // fld = fldDef->GetNameRef(); + //NEEDTHIS? val = fet->GetFieldAsString(1); + //std::cout << val << "\n"; + + x = (double *) (feature + 5); + y = (double *) (feature + 5 + sizeof(double)); + // std::cout << "transforming point\n"; + pt = cXf->transform(*x, *y); + //std::cout << "drawing marker for feature " << featureCount << "\n"; + p->drawRect(pt.xToInt(), pt.yToInt(), 5, 5); + //std::cout << "marker draw complete\n"; + break; + case WKBLineString: - // get number of points in the line - ptr = feature + 5; + + // get number of points in the line + ptr = feature + 5; + nPoints = (int *) ptr; + ptr = feature + 1 + 2 * sizeof(int); + for (idx = 0; idx < *nPoints; idx++) { + x = (double *) ptr; + ptr += sizeof(double); + y = (double *) ptr; + ptr += sizeof(double); + // transform the point + pt = cXf->transform(*x, *y); + if (idx == 0) + p->moveTo(pt.xToInt(), pt.yToInt()); + else + p->lineTo(pt.xToInt(), pt.yToInt()); + } + break; + + case WKBMultiLineString: + + numLineStrings = (int) (feature[5]); + ptr = feature + 9; + for (jdx = 0; jdx < numLineStrings; jdx++) { + // each of these is a wbklinestring so must handle as such + lsb = *ptr; + ptr += 5; // skip type since we know its 2 nPoints = (int *) ptr; - ptr = feature + 1 + 2 * sizeof(int); + ptr += sizeof(int); for (idx = 0; idx < *nPoints; idx++) { + x = (double *) ptr; + ptr += sizeof(double); + y = (double *) ptr; + ptr += sizeof(double); + // transform the point + pt = cXf->transform(*x, *y); + if (idx == 0) + p->moveTo(pt.xToInt(), pt.yToInt()); + else + p->lineTo(pt.xToInt(), pt.yToInt()); + } + } + break; + + case WKBPolygon: + + p->setBrush(*brush); + // get number of rings in the polygon + numRings = (int *) (feature + 1 + sizeof(int)); + //std::cout << "Number of rings: " << *numRings << std::endl; + ptr = feature + 1 + 2 * sizeof(int); + for (idx = 0; idx < *numRings; idx++) { + // get number of points in the ring + nPoints = (int *) ptr; + //std::cout << "Number of points: " << *nPoints << std::endl; + ptr += 4; + pa = new QPointArray(*nPoints); + for (jdx = 0; jdx < *nPoints; jdx++) { + // add points to a point array for drawing the polygon + // std::cout << "Adding points to array\n"; + x = (double *) ptr; + ptr += sizeof(double); + y = (double *) ptr; + ptr += sizeof(double); + pt = cXf->transform(*x, *y); + pa->setPoint(jdx, pt.xToInt(), pt.yToInt()); + } + // draw the ring + //std::cout << "Drawing the polygon\n"; + p->drawPolygon(*pa); + + } + + break; + + case WKBMultiPolygon: + + p->setBrush(*brush); + // get the number of polygons + ptr = feature + 5; + numPolygons = (int *) ptr; + for (kdx = 0; kdx < *numPolygons; kdx++) { + //skip the endian and feature type info and + // get number of rings in the polygon + ptr = feature + 14; + numRings = (int *) ptr; + ptr += 4; + for (idx = 0; idx < *numRings; idx++) { + // get number of points in the ring + nPoints = (int *) ptr; + ptr += 4; + pa = new QPointArray(*nPoints); + for (jdx = 0; jdx < *nPoints; jdx++) { + // add points to a point array for drawing the polygon x = (double *) ptr; ptr += sizeof(double); y = (double *) ptr; ptr += sizeof(double); - // transform the point + // std::cout << "Transforming " << *x << "," << *y << " to "; + pt = cXf->transform(*x, *y); - if (idx == 0) - p->moveTo(pt.xToInt(), pt.yToInt()); - else - p->lineTo(pt.xToInt(), pt.yToInt()); + //std::cout << pt.xToInt() << "," << pt.yToInt() << std::endl; + pa->setPoint(jdx, pt.xToInt(), pt.yToInt()); + + } + // draw the ring + p->drawPolygon(*pa); + delete pa; } - break; - case WKBMultiLineString: + } + break; - numLineStrings = (int) (feature[5]); - ptr = feature + 9; - for (jdx = 0; jdx < numLineStrings; jdx++) { - // each of these is a wbklinestring so must handle as such - lsb = *ptr; - ptr += 5; // skip type since we know its 2 - nPoints = (int *) ptr; - ptr += sizeof(int); - for (idx = 0; idx < *nPoints; idx++) { - x = (double *) ptr; - ptr += sizeof(double); - y = (double *) ptr; - ptr += sizeof(double); - // transform the point - pt = cXf->transform(*x, *y); - if (idx == 0) - p->moveTo(pt.xToInt(), pt.yToInt()); - else - p->lineTo(pt.xToInt(), pt.yToInt()); - - } - } - break; - case WKBPolygon: - - p->setBrush(*brush); - // get number of rings in the polygon - numRings = (int *) (feature + 1 + sizeof(int)); - //std::cout << "Number of rings: " << *numRings << std::endl; - ptr = feature + 1 + 2 * sizeof(int); - for (idx = 0; idx < *numRings; idx++) { - // get number of points in the ring - nPoints = (int *) ptr; - //std::cout << "Number of points: " << *nPoints << std::endl; - ptr += 4; - pa = new QPointArray(*nPoints); - for (jdx = 0; jdx < *nPoints; jdx++) { - // add points to a point array for drawing the polygon - // std::cout << "Adding points to array\n"; - x = (double *) ptr; - ptr += sizeof(double); - y = (double *) ptr; - ptr += sizeof(double); - pt = cXf->transform(*x, *y); - pa->setPoint(jdx, pt.xToInt(), pt.yToInt()); - } - // draw the ring - //std::cout << "Drawing the polygon\n"; - p->drawPolygon(*pa); - - } - - break; - case WKBMultiPolygon: - p->setBrush(*brush); - // get the number of polygons - ptr = feature + 5; - numPolygons = (int *) ptr; - for (kdx = 0; kdx < *numPolygons; kdx++) { - //skip the endian and feature type info and - // get number of rings in the polygon - ptr = feature + 14; - numRings = (int *) ptr; - ptr += 4; - for (idx = 0; idx < *numRings; idx++) { - // get number of points in the ring - nPoints = (int *) ptr; - ptr += 4; - pa = new QPointArray(*nPoints); - for (jdx = 0; jdx < *nPoints; jdx++) { - // add points to a point array for drawing the polygon - x = (double *) ptr; - ptr += sizeof(double); - y = (double *) ptr; - ptr += sizeof(double); - // std::cout << "Transforming " << *x << "," << *y << " to "; - - pt = cXf->transform(*x, *y); - //std::cout << pt.xToInt() << "," << pt.yToInt() << std::endl; - pa->setPoint(jdx, pt.xToInt(), pt.yToInt()); - - } - // draw the ring - p->drawPolygon(*pa); - delete pa; - } - } - break; default: std::cout << "UNKNOWN WKBTYPE ENCOUNTERED\n"; break; @@ -719,26 +727,27 @@ QgsRect QgsVectorLayer::bBoxOfSelected() QgsFeature *fet; unsigned char *feature; + double *x; + double *y; + int *nPoints; + int *numRings; + int *numPolygons; + int numPoints; + int numLineStrings; + int idx, jdx, kdx; + unsigned char *ptr; + char lsb; + QgsPoint pt; + QPointArray *pa; + int wkbType; + while ((fet = dataProvider->getNextFeature(false))) { if(selected.find(fet->featureId())!=selected.end()) { feature = fet->getGeometry(); - int wkbType = (int) feature[1]; - double *x; - double *y; - int *nPoints; - int *numRings; - int *numPolygons; - int numPoints; - int numLineStrings; - int idx, jdx, kdx; - unsigned char *ptr; - char lsb; - QgsPoint pt; - QPointArray *pa; - QString fld; - QString val; + wkbType = (int) feature[1]; + switch (wkbType) { diff --git a/src/qgsvectorlayer.h b/src/qgsvectorlayer.h index b380b14d1e5..f607fca1f3e 100644 --- a/src/qgsvectorlayer.h +++ b/src/qgsvectorlayer.h @@ -137,7 +137,6 @@ class QgsVectorLayer:public QgsMapLayer }; private: // Private methods int endian(); - signals:void repaintRequested(); };