StyleDockWidget.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/widgets/se/StyleDockWidget.cpp
22 
23  \brief A dock widget used control the geographic data style using SE elements and a property browser to show its properties.
24 */
25 
26 // TerraLib
27 #include "../../../dataaccess/utils/Utils.h"
28 #include "../../../maptools/AbstractLayer.h"
29 #include "../../../maptools/RasterContrast.h"
30 #include "../../../maptools/Utils.h"
31 #include "../../../raster/RasterProperty.h"
32 #include "../../../raster/BandProperty.h"
34 #include "LineSymbolizerProperty.h"
36 #include "RasterSymbolizerWidget.h"
37 #include "TextSymbolizerProperty.h"
38 #include "RuleProperty.h"
39 #include "StyleControllerWidget.h"
40 #include "StyleExplorer.h"
41 #include "StyleDockWidget.h"
42 
43 // Qt
44 #include <QLayout>
45 #include <QScrollArea>
46 
48  : QDockWidget("Style Explorer", parent, flags),
49  m_currentLayer(nullptr),
50  m_selColor("")
51 {
52  // Build form
53  this->setWidget(buildUi());
54 }
55 
57 
58 void te::qt::widgets::StyleDockWidget::setLayer(te::map::AbstractLayer* layer, std::string selColor, te::se::Rule* currentRule)
59 {
60  m_selColor = selColor;
61  m_currentLayer = layer;
62  m_styleController->setLayer(layer, selColor, currentRule);
63 }
64 
66 {
67  m_rasterWidget->setMapDisplay(display);
68 }
69 
71 {
72  return m_currentLayer;
73 }
74 
76 {
77  m_currentLayer = nullptr;
78  m_selColor = "";
79 
80  setTabStatus(false);
81 
83 }
84 
86 {
87  m_tabWidget->setTabEnabled(0, status); // Rules
88  m_tabWidget->setTabEnabled(1, status); // Polygons
89  m_tabWidget->setTabEnabled(2, status); // Lines
90  m_tabWidget->setTabEnabled(3, status); // Points
91  m_tabWidget->setTabEnabled(4, status); // Raster
92  m_tabWidget->setTabEnabled(5, status); // Text
93 }
94 
96  te::map::AbstractLayerPtr /*layer*/)
97 {
98 
99 }
100 
102  te::map::AbstractLayerPtr /*layer*/)
103 {
104 
105 }
106 
108 {
109  if (m_currentLayer == layer)
110  {
111  m_currentLayer = nullptr;
112 
114 
115  setTabStatus(false);
116  }
117 }
118 
120 {
121 }
122 
124 {
125  // The result widget
126  QWidget* w = new QWidget(this);
127 
128  QGridLayout* layout = new QGridLayout(w);
129 
130  // StyleExplorer
132  layout->addWidget(m_styleController, 0, 0);
133  m_styleController->setMaximumHeight(300);
134 
135  connect(m_styleController, SIGNAL(mapRefresh()), this, SLOT(onMapRefresh()));
136  connect(m_styleController, SIGNAL(updateLayer()), this, SLOT(onUpdateLayer()));
137  connect(m_styleController->getStyleExplorer(), SIGNAL(symbolizerClicked(te::se::Symbolizer*)), this, SLOT(onSymbolizerSelected(te::se::Symbolizer*)));
138  connect(m_styleController->getStyleExplorer(), SIGNAL(ruleClicked(te::se::Rule*)), this, SLOT(onRuleSelected(te::se::Rule*)));
139  connect(m_styleController->getStyleExplorer(), SIGNAL(styleImported(te::se::Style*, bool)), this, SLOT(onStyleImported(te::se::Style*, bool)));
140  connect(this, SIGNAL(symbolizerChanged(te::se::Symbolizer*)), m_styleController->getStyleExplorer(), SLOT(onSymbolizerChanged(te::se::Symbolizer*)));
141 
142  // Tab widget
143  m_tabWidget = new QTabWidget(w);
144  m_tabWidget->setTabPosition(QTabWidget::South);
145  m_tabWidget->setMinimumWidth(360);
146 
147  QScrollArea* sa = new QScrollArea;
148  sa->setWidgetResizable(true);
149  sa->setWidget(m_tabWidget);
150 
151  layout->addWidget(sa, 1, 0);
152 
153  //Rule Property
154  m_ruleWidget = new te::qt::widgets::RuleProperty(m_tabWidget);
155  m_tabWidget->addTab(m_ruleWidget, tr("Rule"));
156 
157  // PolygonSymbolizer Property
159  m_tabWidget->addTab(m_polyWidget, tr("Polygons"));
160  connect(m_polyWidget, SIGNAL(symbolizerChanged()), this, SLOT(onPolygonSymbolizerChanged()));
161 
162  // LineSymbolizer Property
164  m_tabWidget->addTab(m_lineWidget, tr("Lines"));
165  connect(m_lineWidget, SIGNAL(symbolizerChanged()), this, SLOT(onLineSymbolizerChanged()));
166 
167  // Point Symbolizer Widget
169  m_tabWidget->addTab(m_pointWidget, tr("Points"));
170  connect(m_pointWidget, SIGNAL(symbolizerChanged()), this, SLOT(onPointSymbolizerChanged()));
171 
172  // RasterSymbolizer Property Widget
174  m_tabWidget->addTab(m_rasterWidget, tr("Raster"));
175  connect(m_rasterWidget, SIGNAL(symbolizerChanged()), this, SLOT(onRasterSymbolizerChanged()));
176  connect(m_rasterWidget, SIGNAL(contrastChanged(bool)), this, SLOT(onRasterContrastChanged(bool)));
177  connect(m_rasterWidget, SIGNAL(mapRefresh()), this, SLOT(onMapRefresh()));
178 
179  // Text Symbolizer Widget
181  m_tabWidget->addTab(m_textWidget, tr("Text"));
182  connect(m_textWidget, SIGNAL(symbolizerChanged()), this, SLOT(onTextSymbolizerChanged()));
183 
184  setTabStatus(false);
185 
186  return w;
187 }
188 
190 {
191  setTabStatus(false);
192 
193  m_tabWidget->setCurrentIndex(0);
194  m_tabWidget->setTabEnabled(0, true);
195 
196  m_ruleWidget->setRule(r);
197 }
198 
200 {
201  setTabStatus(false);
202 
203  if(s->getType() == "PolygonSymbolizer")
204  {
205  m_tabWidget->setCurrentWidget(m_polyWidget);
206  m_tabWidget->setTabEnabled(1, true);
207  m_polyWidget->setSymbolizer(dynamic_cast<te::se::PolygonSymbolizer*>(s));
208  }
209  else if(s->getType() == "LineSymbolizer")
210  {
211  m_tabWidget->setCurrentWidget(m_lineWidget);
212  m_tabWidget->setTabEnabled(2, true);
213  m_lineWidget->setSymbolizer(dynamic_cast<te::se::LineSymbolizer*>(s));
214  }
215  else if(s->getType() == "PointSymbolizer")
216  {
217  m_tabWidget->setCurrentWidget(m_pointWidget);
218  m_tabWidget->setTabEnabled(3, true);
219  m_pointWidget->setSymbolizer(dynamic_cast<te::se::PointSymbolizer*>(s));
220  }
221  else if(s->getType() == "RasterSymbolizer")
222  {
223  std::unique_ptr<te::map::LayerSchema> lschema = m_currentLayer->getSchema();
224 
225  if (lschema.get())
226  {
227  te::rst::RasterProperty* prop = static_cast<te::rst::RasterProperty*>(lschema->findFirstPropertyOfType(te::dt::RASTER_TYPE));
228 
229  if (prop)
230  {
231  m_tabWidget->setCurrentIndex(4);
232  m_tabWidget->setTabEnabled(4, true);
233 
234  const std::vector<te::rst::BandProperty*>& bprops = prop->getBandProperties();
235 
237 
239 
240  m_rasterWidget->setRasterSymbolizer(dynamic_cast<te::se::RasterSymbolizer*>(s));
241 
244  }
245  }
246  }
247  else if (s->getType() == "TextSymbolizer")
248  {
249  std::vector<std::string> propNames;
250 
251  std::unique_ptr<te::da::DataSetType> dsType = m_currentLayer->getSchema();
252 
253  for (std::size_t t = 0; t < dsType->getProperties().size(); ++t)
254  {
255  if (dsType->getProperty(t)->getType() != te::dt::GEOMETRY_TYPE)
256  propNames.push_back(dsType->getProperty(t)->getName());
257  }
258 
259  m_tabWidget->setCurrentWidget(m_textWidget);
260  m_tabWidget->setTabEnabled(5, true);
261 
262  m_textWidget->setLabels(propNames);
263 
264  te::se::TextSymbolizer* symbText = dynamic_cast<te::se::TextSymbolizer*>(s);
265 
266  if (symbText)
267  {
268  if (!symbText->getLabel() || te::se::GetString(symbText->getLabel()) == "")
269  {
270  if (!propNames.empty())
271  symbText->setLabel(new te::se::ParameterValue(propNames[0]));
272  }
273 
274  m_textWidget->setSymbolizer(symbText);
275  }
276  }
277 }
278 
280 {
281  if (!m_currentLayer)
282  return;
283 
284  if (isVisual)
285  m_currentLayer->setStyle(style);
286  else
288 
290 
292 }
293 
295 {
297  emit symbolizerChanged(s);
298 
300 }
301 
303 {
305  emit symbolizerChanged(s);
306 
308 }
309 
311 {
313  emit symbolizerChanged(s);
314 
316 }
317 
319 {
321  emit symbolizerChanged(s);
322 
324 }
325 
327 {
328  if (!remove)
329  {
331 
333  }
334  else
335  {
337  }
338 }
339 
341 {
343  emit symbolizerChanged(s);
344 
346 }
347 
349 {
350  emit repaintMapDisplay();
351 }
352 
354 {
355  if (m_currentLayer)
357 }
A TextSymbolizer is used to render text labels according to various graphical parameters.
te::se::Symbolizer * getSymbolizer() const
Gets the configured polygon symbolizer element.
void setSymbolizer(te::se::PolygonSymbolizer *symb)
Sets a polygon symbolizer element to this widget.
StyleDockWidget(QWidget *parent=0, Qt::WindowFlags flags=0)
Constructs a StyleDockWidget.
te::map::AbstractLayer * m_currentLayer
Current Layer pointer (used for raster symbolizer information)
A widget used to define the text symbolizer properties, such as:
void setSymbolizer(te::se::TextSymbolizer *symb)
Sets a text symbolizer element to this widget.
virtual void layerAdded(te::map::AbstractLayerPtr layer)
This method is used to add a new layer.
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
This is the base class for layers.
Definition: AbstractLayer.h:77
void setRule(te::se::Rule *rule)
Sets a polygon symbolizer element to this widget.
void setLayer(te::map::AbstractLayer *layer, std::string selColor, te::se::Rule *currentRule)
virtual void setRasterContrast(te::map::RasterContrast *contrast)
It sets the raster contrast associated to the Layer.
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
A widget used to define the rule properties, such as:
void symbolizerChanged(te::se::Symbolizer *s)
A dock widget used control the geographic data style using SE elements and a property browser to show...
A widget used to configure a Raster Symbolizer SE element.
te::se::RasterSymbolizer * getRasterSymbolizer()
A widget used to define the point symbolizer properties, such as:
A widget to control the display of a set of layers.
void setMapDisplay(te::qt::widgets::MapDisplay *display)
void symbolChanged(te::map::AbstractLayer *l)
te::qt::widgets::PointSymbolizerProperty * m_pointWidget
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
void setLayer(te::map::AbstractLayer *layer)
Raster property.
A widget used to define the line symbolizer properties, such as:
virtual void layerSelected(te::map::AbstractLayerPtr layer)
This method is used to set current layer.
void onSymbolizerSelected(te::se::Symbolizer *s)
void setLabels(std::vector< std::string > names)
Used to set all properties names to use as label.
A widget used to explore a style.
virtual void layerRemoved(te::map::AbstractLayerPtr layer)
This method is used to remove a layer.
A widget used to controll the style se element.
te::qt::widgets::RasterSymbolizerWidget * m_rasterWidget
A widget used to controll the style se element.
virtual std::unique_ptr< LayerSchema > getSchema() const =0
It returns the layer schema.
A widget used to configure a Raster Symbolizer SE element.
A widget used to define the rule properties, such as:
Definition: RuleProperty.h:61
void setSymbolizer(te::se::LineSymbolizer *symb)
Sets a line symbolizer element to this widget.
te::se::Symbolizer * getSymbolizer() const
Gets the configured point symbolizer element.
void setLayer(te::map::AbstractLayer *layer, std::string selColor, te::se::Rule *currentRule)
Sets a style element to this widget.
virtual void setSelectionStyle(te::se::Style *style)
It sets the selection Style associated to the layer.
void setSymbolizer(te::se::PointSymbolizer *symb)
Sets a point symbolizer element to this widget.
A widget used to define the point symbolizer properties, such as:
A widget used to define the polygon symbolizer properties, such as:
te::se::Symbolizer * getSymbolizer() const
Gets the configured line symbolizer element.
A widget used to define the polygon symbolizer properties, such as:
te::qt::widgets::StyleControllerWidget * m_styleController
virtual te::map::RasterContrast * getRasterContrast() const
It returns the raster contrast associated to the Layer.
te::qt::widgets::PolygonSymbolizerProperty * m_polyWidget
void setLabel(ParameterValue *l)
This class contains the parameters needed to apply dynamic contrast over a raster.
void setRasterSymbolizer(te::se::RasterSymbolizer *rs)
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:76
A widget used to define the text symbolizer properties, such as:
const ParameterValue * getLabel() const
void setMapDisplay(te::qt::widgets::MapDisplay *display)
virtual const std::string & getType() const =0
It returns the symbolizer type.
virtual void setStyle(te::se::Style *style)
It sets the Style associated to the layer.
void onRuleSelected(te::se::Rule *r)
std::vector< te::rst::BandProperty * > & getBandProperties()
Returns a reference to the list of bands definitions.
te::qt::widgets::LineSymbolizerProperty * m_lineWidget
te::qt::widgets::TextSymbolizerProperty * m_textWidget
te::map::AbstractLayer * getLayer()
te::se::Symbolizer * getSymbolizer() const
Gets the configured polygon symbolizer element.
te::qt::widgets::RuleProperty * m_ruleWidget
void setBandProperty(std::vector< te::rst::BandProperty * > bp)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
TESEEXPORT std::string GetString(const te::se::ParameterValue *param)
It gets the parameter value as a string.
A widget used to define the polygon symbolizer properties, such as:
void setRasterContrast(te::map::RasterContrast *contrast)
void onStyleImported(te::se::Style *style, bool isVisual)