All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
StyleExplorer.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2011-2012 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/StyleExplorer.cpp
22 
23  \brief A widget used to explore a style.
24 */
25 
26 // TerraLib
27 #include "../../../se/Style.h"
28 #include "../../../se/Symbolizer.h"
29 #include "../../../se/Rule.h"
30 #include "StyleExplorer.h"
31 #include "SymbologyPreview.h"
32 
33 // STL
34 #include <cassert>
35 #include <vector>
36 
38  : QTreeWidget(parent)
39 {
40  // Setup
41  setAlternatingRowColors(true);
42  setSelectionMode(QAbstractItemView::SingleSelection);
43  setHeaderHidden(true);
44  setIconSize(QSize(16, 16));
45 
46  m_symbolizerNames["PolygonSymbolizer"] = tr("Polygon Symbol");
47  m_symbolizerNames["LineSymbolizer"] = tr("Line Symbol");
48  m_symbolizerNames["PointSymbolizer"] = tr("Point Symbol");
49  m_symbolizerNames["RasterSymbolizer"] = tr("Raster Symbol");
50 
51  // Signals & slots
52  connect(this, SIGNAL(itemClicked(QTreeWidgetItem*, int)), SLOT(onItemClicked(QTreeWidgetItem*, int)));
53 }
54 
56 {
57 }
58 
60 {
61  assert(style);
62 
63  m_style = style;
64 
65  updateStyleTree();
66 }
67 
69 {
70  clear();
71 
72  QTreeWidgetItem* root = new QTreeWidgetItem(this, STYLE);
73  root->setText(0, tr("Style"));
74 
75  std::size_t nRules = m_style->getRules().size();
76 
77  for(std::size_t i = 0; i < nRules; ++i) // for each rule
78  {
79  const te::se::Rule* rule = m_style->getRule(i);
80  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
81 
82  QTreeWidgetItem* ruleItem = new QTreeWidgetItem(root, RULE);
83  ruleItem->setText(0, tr("Rule"));
84  ruleItem->setData(0, Qt::UserRole, (int)i);
85  ruleItem->setIcon(0, QIcon(SymbologyPreview::build(symbs, iconSize())));
86 
87  for(std::size_t j = 0; j < symbs.size(); ++j) // for each symbolizer
88  {
89  QTreeWidgetItem* symbItem = new QTreeWidgetItem(ruleItem, SYMBOLIZER);
90 
91  QString symbTypeName = tr("Unknown Symbol");
92 
93  std::map<QString, QString>::iterator it = m_symbolizerNames.find(symbs[j]->getType().c_str());
94  if(it != m_symbolizerNames.end())
95  symbTypeName = it->second;
96 
97  QString count;
98  count.setNum(j);
99 
100  symbTypeName.append(" " + count);
101 
102  symbItem->setText(0, symbTypeName);
103  symbItem->setData(0, Qt::UserRole, static_cast<int>(j));
104  symbItem->setIcon(0, QIcon(SymbologyPreview::build(symbs[j], iconSize())));
105 
106  if(j == 0)
107  {
108  setCurrentItem(symbItem);
109  emit symbolizerClicked(symbs[j]);
110  }
111  }
112  }
113 
114  expandAll();
115 }
116 
118 {
119  QTreeWidgetItem* selectedItem = getSelectedItem();
120 
121  if(selectedItem == 0)
122  return 0;
123 
124  if(selectedItem->type() == RULE)
125  return getRule(selectedItem);
126 
127  if(selectedItem->type() == SYMBOLIZER)
128  return getRule(selectedItem->parent());
129 
130  return 0;
131 }
132 
134 {
135  QTreeWidgetItem* selectedItem = getSelectedItem();
136 
137  if(selectedItem != 0 && selectedItem->type() == SYMBOLIZER)
138  return getSymbolizer(selectedItem);
139 
140  return 0;
141 }
142 
144 {
145  QTreeWidgetItem* currentItem = getSelectedItem();
146 
147  if(currentItem == 0 || currentItem->type() != SYMBOLIZER)
148  return;
149 
150  // Gets the symbolizer index
151  std::size_t index = currentItem->data(0, Qt::UserRole).toUInt();
152 
153  // Checks if the current symbolizer is the first
154  if(index == 0)
155  return;
156 
157  te::se::Rule* rule = getCurrentRule();
158  assert(rule);
159 
160  swapSymbolizers(rule, index, index - 1);
161 
162  updateStyleTree();
163 }
164 
166 {
167  QTreeWidgetItem* currentItem = getSelectedItem();
168 
169  if(currentItem == 0 || currentItem->type() != SYMBOLIZER)
170  return;
171 
172  te::se::Rule* rule = getCurrentRule();
173  assert(rule);
174 
175  // Gets the symbolizer index
176  std::size_t index = currentItem->data(0, Qt::UserRole).toUInt();
177 
178  // Checks if the current symbolizer is the last
179  if(index == rule->getSymbolizers().size() - 1)
180  return;
181 
182  swapSymbolizers(rule, index, index + 1);
183 
184  updateStyleTree();
185 }
186 
188 {
189  setIconSize(QSize(size, size));
190 
191  updateStyleTree();
192 }
193 
195 {
196  QTreeWidgetItem* symbolizerItem = getSelectedItem();
197 
198  // Updating item
199  symbolizerItem->setIcon(0, QIcon(SymbologyPreview::build(symb, iconSize())));
200 
201  te::se::Rule* rule = getCurrentRule();
202  QTreeWidgetItem* ruleItem = symbolizerItem->parent();
203 
204  if(rule && ruleItem)
205  {
206  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
207  ruleItem->setIcon(0, QIcon(SymbologyPreview::build(symbs, iconSize())));
208  }
209 }
210 
212 {
213  assert(item && item->type() == RULE);
214 
215  // Gets the Rule index
216  std::size_t index = item->data(0, Qt::UserRole).toUInt();
217  assert((index >= 0) && (index < m_style->getRules().size()));
218 
219  return m_style->getRule(index);
220 }
221 
223 {
224  assert(item && item->type() == SYMBOLIZER);
225 
226  // Gets the rule associated with the symbolizer
227  QTreeWidgetItem* parent = item->parent();
228  assert(parent);
229 
230  const te::se::Rule* rule = getRule(parent);
231  assert(rule);
232 
233  // Gets the rule symbolizers
234  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
235 
236  // Gets the Symbolizer index
237  std::size_t index = item->data(0, Qt::UserRole).toUInt();
238  assert(index >= 0 && index < symbs.size());
239 
240  return symbs[index];
241 }
242 
244 {
245  QList<QTreeWidgetItem*> selected = selectedItems();
246 
247  if(selected.empty())
248  return 0;
249 
250  return selected.at(0);
251 }
252 
253 void te::qt::widgets::StyleExplorer::swapSymbolizers(te::se::Rule* r, int indexFirst, int indexSecond)
254 {
255  assert(r);
256 
257  // Copy the symbolizers
258  te::se::Symbolizer* first = r->getSymbolizer(indexFirst)->clone();
259  te::se::Symbolizer* second = r->getSymbolizer(indexSecond)->clone();
260 
261  // Swap symbolizers
262  r->setSymbolizer(indexFirst, second);
263  r->setSymbolizer(indexSecond, first);
264 }
265 
266 void te::qt::widgets::StyleExplorer::onItemClicked(QTreeWidgetItem* item, int /*column*/)
267 {
268  switch(item->type())
269  {
270  case STYLE:
271  break;
272 
273  case RULE:
274  emit ruleClicked(getRule(item));
275  break;
276 
277  case SYMBOLIZER:
278  emit symbolizerClicked(getSymbolizer(item));
279  break;
280  }
281 }
static QPixmap build(const te::se::Symbolizer *symb, const QSize &size)
Generates the preview of given symbolizer element.
void swapSymbolizers(te::se::Rule *r, int indexFirst, int indexSecond)
std::map< QString, QString > m_symbolizerNames
A map of symbolizers names to user interface names.
te::se::Rule * getCurrentRule()
Gets the current rule.
const Symbolizer * getSymbolizer(std::size_t i) const
Definition: Rule.cpp:157
void setStyle(te::se::Style *style)
Sets a style element to this widget.
A Symbolizer describes how a feature is to appear on a map.
Definition: Symbolizer.h:80
const std::vector< Symbolizer * > & getSymbolizers() const
Definition: Rule.cpp:152
te::se::Symbolizer * getCurrentSymbolizer()
Gets the current symbolizer.
A widget used to explore a style.
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:78
virtual Symbolizer * clone() const =0
It creates a new copy of this object.
void onSymbolizerChanged(te::se::Symbolizer *symb)
StyleExplorer(QWidget *parent=0)
Constructs a style explorer widget which is a child of parent.
te::se::Rule * getRule(QTreeWidgetItem *item) const
Auxiliary internal method to retrieve a rule from a QTreeWidgetItem.
void onItemClicked(QTreeWidgetItem *item, int column)
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
void updateStyleTree()
This method updates the Style Explorer.
QTreeWidgetItem * getSelectedItem() const
Auxiliary internal method to retrieve the selected item on Style Explorer.
Static class used to generate preview of Symbology elements.
void setSymbolizer(std::size_t i, Symbolizer *s)
Definition: Rule.cpp:144
te::se::Symbolizer * getSymbolizer(QTreeWidgetItem *item) const
Auxiliary internal method to retrieve a symbolizer from a QTreeWidgetItem.