27 #include "../../../color/RGBAColor.h" 28 #include "../../../common/STLUtils.h" 29 #include "../../../dataaccess/utils/Utils.h" 30 #include "../../../dataaccess/query/OrderByItem.h" 31 #include "../../../maptools/Chart.h" 32 #include "../../../maptools/Enums.h" 33 #include "../../../maptools/QueryLayer.h" 34 #include "../utils/ColorPickerToolButton.h" 37 #include "ui_ChartLayerWidgetForm.h" 42 #include <QMessageBox> 43 #include <QPainterPath> 49 #include <boost/lexical_cast.hpp> 54 m_ui(new
Ui::ChartLayerWidgetForm)
59 QGridLayout* layout =
new QGridLayout(
m_ui->m_contourColorWidget);
60 layout->setContentsMargins(0, 0, 0, 0);
70 connect(
m_ui->m_contourWidthSpinBox, SIGNAL(valueChanged(
int)),
this, SLOT(
updateUi()));
71 connect(
m_ui->m_tableWidget, SIGNAL(cellClicked(
int,
int)),
this, SLOT(
onItemClicked(
int,
int)));
88 m_ui->m_summaryComboBox->clear();
92 m_ui->m_summaryComboBox->addItem(
"MIN");
93 m_ui->m_summaryComboBox->addItem(
"MAX");
94 m_ui->m_summaryComboBox->addItem(
"SUM");
95 m_ui->m_summaryComboBox->addItem(
"AVERAGE");
96 m_ui->m_summaryComboBox->addItem(
"MEDIAN");
97 m_ui->m_summaryComboBox->addItem(
"STDDEV");
98 m_ui->m_summaryComboBox->addItem(
"VARIANCE");
102 int index =
m_ui->m_summaryComboBox->findText(QString::fromUtf8(
m_layer->getChart()->getSummary().c_str()));
103 m_ui->m_summaryComboBox->setCurrentIndex(index);
106 m_ui->m_summaryComboBox->setEnabled(
true);
107 m_ui->m_summaryComboBox->show();
108 m_ui->m_summaryLabel->show();
112 m_ui->m_summaryComboBox->addItem(
"NONE");
113 m_ui->m_summaryComboBox->setEnabled(
false);
114 m_ui->m_summaryComboBox->hide();
115 m_ui->m_summaryLabel->hide();
123 QMessageBox::warning(
this, tr(
"Warning"), tr(
"No attribute selected."));
128 int index =
m_ui->m_typeComboBox->currentIndex();
129 int chartType =
m_ui->m_typeComboBox->itemData(index).toInt();
132 std::vector<std::string> attrs;
133 std::vector<te::color::RGBAColor> colors;
135 for(std::size_t t = 0; t <
m_chartVec.size(); ++t)
143 chart->
setHeight(static_cast<std::size_t>(
m_ui->m_sizeSpinBox->value()));
147 chart->
setSummary(
m_ui->m_summaryComboBox->currentText().toUtf8().data());
165 int type =
static_cast<int>(chart->
getType());
167 for(
int i = 0; i <
m_ui->m_typeComboBox->count(); ++i)
169 int t =
m_ui->m_typeComboBox->itemData(i).toInt();
173 m_ui->m_typeComboBox->setCurrentIndex(i);
178 m_ui->m_sizeSpinBox->setValue(static_cast<int>(chart->
getHeight()));
183 for(std::size_t t = 0; t < chart->
getProperties().size(); ++t)
187 std::pair<std::string, QColor> pair(value, c);
197 m_ui->m_typeComboBox->clear();
203 m_ui->m_addToolButton->setIcon(QIcon::fromTheme(
"list-add"));
204 m_ui->m_removeToolButton->setIcon(QIcon::fromTheme(
"list-remove"));
209 m_ui->m_tableWidget->setRowCount(0);
211 for(std::size_t t = 0; t <
m_chartVec.size(); ++t)
213 int newrow =
m_ui->m_tableWidget->rowCount();
214 m_ui->m_tableWidget->insertRow(newrow);
218 QTableWidgetItem* item =
new QTableWidgetItem(icon,
"");
219 item->setFlags(Qt::ItemIsEnabled);
220 m_ui->m_tableWidget->setItem(newrow, 0, item);
223 QTableWidgetItem* itemAttr =
new QTableWidgetItem(
m_chartVec[t].first.c_str());
224 itemAttr->setFlags(Qt::ItemIsEnabled);
225 m_ui->m_tableWidget->setItem(newrow, 1, itemAttr);
231 std::string value =
m_ui->m_attrComboBox->currentText().toUtf8().data();
235 for(std::size_t t = 0; t <
m_chartVec.size(); ++t)
246 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Attribute already selected."));
250 QColor c(rand() % 255,rand() % 255,rand() % 255);
252 std::pair<std::string, QColor> pair(value, c);
261 if(
m_ui->m_tableWidget->currentRow() == -1)
274 QColor curColor =
m_chartVec[
static_cast<size_t>(row)].second;
276 QColor c = QColorDialog::getColor(curColor,
this);
283 m_chartVec[
static_cast<size_t>(row)].second = curColor;
290 m_ui->m_attrComboBox->clear();
292 std::unique_ptr<te::map::LayerSchema> dsType(
m_layer->getSchema());
294 for(
size_t t = 0; t < dsType->getProperties().size(); ++t)
319 double maxValue = std::numeric_limits<double>::min();
322 const std::vector<std::string>& properties = chart->
getProperties();
324 std::unique_ptr<te::da::DataSetType> schema =
m_layer->getSchema();
328 std::unique_ptr<te::da::DataSet> dataset(
m_layer->getData());
329 std::vector<size_t> chartPropPos;
330 size_t csize = properties.size();
331 for(std::size_t i = 0; i < csize; ++i)
335 while(dataset->moveNext())
337 for(std::size_t i = 0; i < csize; ++i)
340 maxValue = std::max(maxValue, value);
348 std::vector<std::string> boid;
350 while(++pksize < props.size())
352 boid.push_back(props[pksize-1]->getName());
353 if(props[pksize-1]->getDatasetName() != props[pksize]->getDatasetName())
363 for(
size_t i = 0; i < pksize; ++i)
368 std::unique_ptr<te::da::DataSet> dataset(qlayer->
getData());
371 std::vector<std::string> pkdata(pksize), pkdataaux(pksize);
373 std::map<std::string, std::vector<double> > chartValues;
374 std::map<std::string, double> chartValue;
375 std::vector<size_t> chartPropPos;
376 size_t csize = properties.size();
377 for(std::size_t i = 0; i < csize; ++i)
379 std::vector<double> v;
380 chartValues[properties[i]] = v;
385 dataset->moveFirst();
390 for(i = 0; i < pksize; ++i)
391 pkdata[i] = dataset->getAsString(boid[i]);
393 for(i = 0; i < pksize; ++i)
395 if(dataset->isAtBegin())
396 pkdataaux[i] = dataset->getAsString(boid[i]);
399 if(pkdata[i] != pkdataaux[i])
409 for(std::size_t i = 0; i < csize; ++i)
420 for(std::size_t i = 0; i < csize; ++i)
424 for(std::size_t i = 0; i < csize; ++i)
425 chartValues[properties[i]].clear();
427 for(std::size_t i = 0; i < csize; ++i)
428 chartValues[properties[i]].push_back(boost::lexical_cast<double>(dataset->getAsString(properties[i])));
432 std::map<std::string, double>::iterator it = chartValue.begin();
433 while(it != chartValue.end())
435 maxValue = std::max(maxValue, it->second);
439 }
while(dataset->moveNext());
441 for(std::size_t i = 0; i < csize; ++i)
445 std::map<std::string, double>::iterator it = chartValue.begin();
446 while(it != chartValue.end())
448 maxValue = std::max(maxValue, it->second);
ChartType getType() const
const std::vector< std::string > & getProperties() const
void setContourColor(const te::color::RGBAColor &color)
std::string getSummary() const
It gets the grouping summary. It is used only in case 1 to n.
TEDATAACCESSEXPORT bool HasLinkedTable(te::da::DataSetType *type)
It checks if the datasettype has a linked table.
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
boost::ptr_vector< OrderByItem > OrderBy
A class that can be used to model an ORDER BY clause.
A layer resulting from a query.
void setHeight(std::size_t height)
TEDATAACCESSEXPORT double GetValueAsDouble(const te::da::DataSet *ds, const size_t pos)
It gets the value as double.
It models a property definition.
const std::vector< te::dt::Property * > & getProperties() const
It returns the properties that take part of the primary key.
void setSummary(const std::string &summary)
It gets the grouping summary. It is used only in case 1 to n.
void setAvoidConflicts(bool on)
const te::color::RGBAColor & getColor(std::size_t i) const
This class represents the informations needed to build map charts.
std::unique_ptr< te::da::DataSet > getData(te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess) const
It gets the dataset identified by the layer name.
std::size_t getHeight() const
TEDATAACCESSEXPORT double GetSummarizedValue(std::vector< double > &values, const std::string &summary)
It gets the summarized value.
te::da::Select * getQuery() const
Query * clone() const
It creates a new copy of this query.
void setOrderBy(OrderBy *o)
It sets the list of expressions used to sort the output result.
A Select models a query to be used when retrieving data from a DataSource.
void setPropertiesPos(const std::vector< size_t > &propPos)
int getType() const
It returns the property data type.
std::size_t getContourWidth() const
const te::color::RGBAColor & getContourColor() const
const std::vector< size_t > & getPropertiesPos() const
void setQuery(te::da::Select *s)
It describes a primary key (pk) constraint.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
bool getAvoidConflicts() const
void setMaxValue(double value)
A class that can be used in an ORDER BY clause to sort the items of a resulting query.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void setContourWidth(std::size_t width)
const std::string & getName() const
It returns the property name.