All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DataSetTreeView.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/dataset/explorer/DataSetTreeView.cpp
22 
23  \brief A tree view for datasets of a data source.
24 */
25 
26 // TerraLib
27 #include "../../datasource/explorer/DataSetGroupItem.h"
28 #include "../../datasource/explorer/DataSetCategoryGroupItem.h"
29 #include "../../datasource/explorer/DataSetItem.h"
30 //#include "DataSetTreeModel.h"
31 #include "DataSetCategoryModel.h"
32 #include "DataSetTreeModel.h"
33 #include "DataSetTreeView.h"
34 
35 // STL
36 #include <memory>
37 
38 // Qt
39 #include <QMenu>
40 
42  : QTreeView(parent),
43  m_categoryModel(0),
44  m_treeModel(0),
45  m_ds(te::da::DataSourceInfoPtr()),
46  m_isCategoryModel(true),
47  m_useCheckableItems(true)
48 {
49  this->setContextMenuPolicy(Qt::CustomContextMenu);
50 
51  connect(this, SIGNAL(activated(const QModelIndex&)), this, SLOT(onItemActivated(const QModelIndex&)));
52  connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onItemClicked(const QModelIndex&)));
53  connect(this, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(onItemDoubleClicked(const QModelIndex&)));
54  connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(onItemEntered(const QModelIndex&)));
55  connect(this, SIGNAL(pressed(const QModelIndex&)), this, SLOT(onItemPressed(const QModelIndex&)));
56  connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(customContextMenu(const QPoint&)));
57 }
58 
60 {
61 }
62 
64 {
65  m_ds = ds;
66 
67  m_treeModel.reset(new DataSetTreeModel(ds, this));
68  m_categoryModel.reset(new DataSetCategoryModel(ds, this));
69 
70  m_useCheckableItems = useCheckableItems;
71 
72  m_treeModel->setCheckable(m_useCheckableItems);
73  m_categoryModel->setCheckable(m_useCheckableItems);
74 
75  this->setModel(m_treeModel.get());
76 
77  m_isCategoryModel = true;
78 }
79 
80 std::list<te::qt::widgets::DataSetItem*> te::qt::widgets::DataSetTreeView::getSelectedDataSets() const
81 {
82  std::list<DataSetItem*> ditems;
83 
84  QModelIndexList items = selectedIndexes();
85 
86  for(QModelIndexList::iterator it = items.begin(); it != items.end(); ++it)
87  {
88  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(it->internalPointer());
89 
90  if(item == 0)
91  continue;
92 
93  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
94 
95  if(ditem)
96  ditems.push_back(ditem);
97  }
98 
99  return ditems;
100 }
101 
103 {
104  QModelIndexList items = selectedIndexes();
105 
106  for(QModelIndexList::iterator it = items.begin(); it != items.end(); ++it)
107  {
108  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(it->internalPointer());
109 
110  if(item == 0)
111  continue;
112 
113  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
114 
115  if(ditem)
116  return true;
117  }
118 
119  return false;
120 }
121 
123 {
124  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(index.internalPointer());
125 
126  if(item == 0)
127  return;
128 
129  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
130 
131  if(ditem != 0)
132  {
133  emit activated(ditem);
134  return;
135  }
136 
137  DataSetCategoryGroupItem* categoryItem = dynamic_cast<DataSetCategoryGroupItem*>(item);
138 
139  if(categoryItem != 0)
140  {
141  emit activated(categoryItem);
142  return;
143  }
144 
145  DataSetGroupItem* groupItem = dynamic_cast<DataSetGroupItem*>(item);
146 
147  if(groupItem != 0)
148  emit activated(groupItem);
149 }
150 
151 void te::qt::widgets::DataSetTreeView::onItemClicked(const QModelIndex & index)
152 {
153  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(index.internalPointer());
154 
155  if(item == 0)
156  return;
157 
158  QAbstractItemModel* model = this->model();
159 
160  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
161 
162  if(ditem != 0)
163  {
164  emit clicked(ditem);
165 
166  if(model && !m_useCheckableItems)
167  return;
168 
169  QVariant value = item->data(0, Qt::CheckStateRole);
170 
171  if(value.isNull())
172  return;
173 
174  emit toggled(ditem);
175 
176  return;
177  }
178 
179  DataSetCategoryGroupItem* categoryItem = dynamic_cast<DataSetCategoryGroupItem*>(item);
180 
181  if(categoryItem != 0)
182  {
183  emit clicked(categoryItem);
184 
185  if(model && !m_useCheckableItems)
186  return;
187 
188  if(model && !m_useCheckableItems)
189  return;
190 
191  QVariant value = item->data(0, Qt::CheckStateRole);
192 
193  if(value.isNull())
194  return;
195 
196  emit toggled(categoryItem);
197 
198  return;
199  }
200 
201  DataSetGroupItem* groupItem = dynamic_cast<DataSetGroupItem*>(item);
202 
203  if(groupItem != 0)
204  {
205  emit clicked(groupItem);
206 
207  if(model && !m_useCheckableItems)
208  return;
209 
210  if(model && !m_useCheckableItems)
211  return;
212 
213  QVariant value = item->data(0, Qt::CheckStateRole);
214 
215  if(value.isNull())
216  return;
217 
218  emit toggled(groupItem);
219 
220  return;
221  }
222 }
223 
225 {
226  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(index.internalPointer());
227 
228  if(item == 0)
229  return;
230 
231  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
232 
233  if(ditem != 0)
234  {
235  emit doubleClicked(ditem);
236  return;
237  }
238 
239  DataSetCategoryGroupItem* categoryItem = dynamic_cast<DataSetCategoryGroupItem*>(item);
240 
241  if(categoryItem != 0)
242  {
243  emit doubleClicked(categoryItem);
244  return;
245  }
246 
247  DataSetGroupItem* groupItem = dynamic_cast<DataSetGroupItem*>(item);
248 
249  if(groupItem != 0)
250  emit doubleClicked(groupItem);
251 }
252 
253 void te::qt::widgets::DataSetTreeView::onItemEntered(const QModelIndex & index)
254 {
255  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(index.internalPointer());
256 
257  if(item == 0)
258  return;
259 
260  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
261 
262  if(ditem != 0)
263  {
264  emit entered(ditem);
265  return;
266  }
267 
268  DataSetCategoryGroupItem* categoryItem = dynamic_cast<DataSetCategoryGroupItem*>(item);
269 
270  if(categoryItem != 0)
271  {
272  emit entered(categoryItem);
273  return;
274  }
275 
276  DataSetGroupItem* groupItem = dynamic_cast<DataSetGroupItem*>(item);
277 
278  if(groupItem != 0)
279  emit entered(groupItem);
280 }
281 
282 void te::qt::widgets::DataSetTreeView::onItemPressed(const QModelIndex & index)
283 {
284  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(index.internalPointer());
285 
286  if(item == 0)
287  return;
288 
289  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
290 
291  if(ditem != 0)
292  {
293  emit pressed(ditem);
294  return;
295  }
296 
297  DataSetCategoryGroupItem* categoryItem = dynamic_cast<DataSetCategoryGroupItem*>(item);
298 
299  if(categoryItem != 0)
300  {
301  emit pressed(categoryItem);
302  return;
303  }
304 
305  DataSetGroupItem* groupItem = dynamic_cast<DataSetGroupItem*>(item);
306 
307  if(groupItem != 0)
308  emit pressed(groupItem);
309 }
310 
312 {
313  QMenu *menu = new QMenu("", this);
314 
315  QAction * organize = new QAction(tr("Organize by category"), menu);
316  organize->setCheckable(true);
317 
318  if(m_isCategoryModel)
319  organize->setChecked(true);
320 
321  connect(organize, SIGNAL(toggled(bool)), this, SLOT(onModelToggled(bool)));
322  menu->addAction(organize);
323  menu->exec(QCursor::pos());
324 }
325 
327 {
328  if(checked)
329  this->setModel(m_categoryModel.get());
330  else
331  this->setModel(m_treeModel.get());
332 
333  m_isCategoryModel = checked;
334 
335  QAbstractItemModel* nmodel = model();
336 
337  QModelIndex idx = nmodel->index(0, 0);
338 
339  expand(idx);
340 
341  if(m_isCategoryModel)
342  {
343  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(idx.internalPointer());
344 
345  for(int i = 0; i < item->children().size(); i++)
346  {
347  QModelIndex idxChild = nmodel->index(i, 0, idx);
348  expand(idxChild);
349  }
350  }
351 }
void pressed(DataSetItem *item)
A tree view for datasets of a data source.
void onItemDoubleClicked(const QModelIndex &index)
void onItemEntered(const QModelIndex &index)
void onItemActivated(const QModelIndex &index)
A simple model for datasets belonging to a data source.
void entered(DataSetItem *item)
void clicked(DataSetItem *item)
void customContextMenu(const QPoint &point)
void doubleClicked(DataSetItem *item)
void onItemClicked(const QModelIndex &index)
void set(const te::da::DataSourceInfoPtr &ds, bool useCheckableItems=false)
void onItemPressed(const QModelIndex &index)
void activated(DataSetItem *item)
virtual QVariant data(int column, int role) const =0
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
std::list< DataSetItem * > getSelectedDataSets() const