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