DoubleListWidget.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/utils/DoubleListWidget.cpp
22 
23  \brief ...
24 */
25 
26 // TerraLib
27 #include "ui_DoubleListWidgetForm.h"
28 #include "DoubleListWidget.h"
29 
30 // Qt
31 #include <QIcon>
32 
33 
35  : QWidget(parent, f),
36  m_ui(new Ui::DoubleListWidgetForm)
37 {
38  m_ui->setupUi(this);
39 
40 // set icons
41  m_ui->m_addToolButton->setIcon(QIcon::fromTheme("go-next"));
42  m_ui->m_addAllToolButton->setIcon(QIcon::fromTheme("go-last"));
43  m_ui->m_removeToolButton->setIcon(QIcon::fromTheme("go-previous"));
44  m_ui->m_removeAllToolButton->setIcon(QIcon::fromTheme("go-first"));
45  m_ui->m_upToolButton->setIcon(QIcon::fromTheme("go-up"));
46  m_ui->m_downToolButton->setIcon(QIcon::fromTheme("go-down"));
47 
48 // set selection mode
49  m_ui->m_leftListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
50  m_ui->m_rightListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
51 
52 // connect signals and slots
53  connect(m_ui->m_addToolButton, SIGNAL(pressed()), this, SLOT(onAddToolButtonPressed()));
54  connect(m_ui->m_addAllToolButton, SIGNAL(pressed()), this, SLOT(onAddAllToolButtonPressed()));
55  connect(m_ui->m_removeToolButton, SIGNAL(pressed()), this, SLOT(onRemoveToolButtonPressed()));
56  connect(m_ui->m_removeAllToolButton, SIGNAL(pressed()), this, SLOT(onRemoveAllToolButtonPressed()));
57  connect(m_ui->m_leftListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onLeftListItemSelectionChanged()));
58  connect(m_ui->m_rightListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onRightListItemSelectionChanged()));
59  connect(m_ui->m_upToolButton, SIGNAL(pressed()), this, SLOT(onUpToolButtonPressed()));
60  connect(m_ui->m_downToolButton, SIGNAL(pressed()), this, SLOT(onDownToolButtonPressed()));
61 }
62 
64 
65 Ui::DoubleListWidgetForm* te::qt::widgets::DoubleListWidget::getForm() const
66 {
67  return m_ui.get();
68 }
69 
70 void te::qt::widgets::DoubleListWidget::setInputValues(std::vector<std::string> values)
71 {
72  m_ui->m_leftListWidget->clear();
73 
74  if(values.empty() == false)
75  m_ui->m_addAllToolButton->setEnabled(true);
76  else
77  m_ui->m_addAllToolButton->setEnabled(false);
78 
79  for(size_t i = 0; i < values.size(); ++i)
80  {
81  m_ui->m_leftListWidget->addItem(QString::fromUtf8(values[i].c_str()));
82  }
83 }
84 
85 void te::qt::widgets::DoubleListWidget::setInputDataValues(std::vector<std::string> values, std::vector<int> ids)
86 {
87  m_ui->m_leftListWidget->clear();
88 
89  if (values.size() != ids.size())
90  return;
91 
92  if (values.empty() == false)
93  m_ui->m_addAllToolButton->setEnabled(true);
94  else
95  m_ui->m_addAllToolButton->setEnabled(false);
96 
97  for (size_t i = 0; i < values.size(); ++i)
98  {
99  QListWidgetItem* item = new QListWidgetItem(m_ui->m_leftListWidget);
100  item->setText(QString::fromUtf8(values[i].c_str()));
101  item->setData(Qt::UserRole, QVariant(ids[i]));
102 
103  m_ui->m_leftListWidget->addItem(item);
104  }
105 }
106 
107 void te::qt::widgets::DoubleListWidget::setOutputValues(std::vector<std::string> values)
108 {
109  m_ui->m_rightListWidget->clear();
110 
111  if(values.empty() == false)
112  m_ui->m_removeAllToolButton->setEnabled(true);
113  else
114  m_ui->m_removeAllToolButton->setEnabled(false);
115 
116  for(size_t i = 0; i < values.size(); ++i)
117  {
118  m_ui->m_rightListWidget->addItem(QString::fromUtf8(values[i].c_str()));
119  }
120 }
121 
122 void te::qt::widgets::DoubleListWidget::setOutputDataValues(std::vector<std::string> values, std::vector<int> ids)
123 {
124  m_ui->m_rightListWidget->clear();
125 
126  if (values.size() != ids.size())
127  return;
128 
129  if (values.empty() == false)
130  m_ui->m_removeAllToolButton->setEnabled(true);
131  else
132  m_ui->m_removeAllToolButton->setEnabled(false);
133 
134  for (size_t i = 0; i < values.size(); ++i)
135  {
136  QListWidgetItem* item = new QListWidgetItem(m_ui->m_rightListWidget);
137  item->setText(QString::fromUtf8(values[i].c_str()));
138  item->setData(Qt::UserRole, QVariant(ids[i]));
139 
140  m_ui->m_rightListWidget->addItem(item);
141  }
142 }
143 
144 void te::qt::widgets::DoubleListWidget::setFixedOutputValues(std::vector<std::string> values, std::string iconName)
145 {
146  for(size_t i = 0; i < values.size(); ++i)
147  {
148  QListWidgetItem* item = new QListWidgetItem(m_ui->m_rightListWidget);
149  item->setText(QString::fromUtf8(values[i].c_str()));
150  item->setFlags(Qt::ItemIsEnabled);
151  item->setIcon(QIcon::fromTheme(iconName.c_str()));
152  }
153 }
154 
156 {
157  m_ui->m_leftItemsLabel->setText(value);
158 }
159 
161 {
162  m_ui->m_rightItemsLabel->setText(value);
163 }
164 
166 {
167  std::vector<std::string> vec;
168 
169  int count = m_ui->m_rightListWidget->count();
170 
171  for(int i = 0; i < count; ++i)
172  {
173  vec.push_back(m_ui->m_rightListWidget->item(i)->text().toUtf8().data());
174  }
175 
176  return vec;
177 }
178 
180 {
181  std::vector<int> vec;
182 
183  int count = m_ui->m_rightListWidget->count();
184 
185  for (int i = 0; i < count; ++i)
186  {
187  QVariant v = m_ui->m_rightListWidget->item(i)->data(Qt::UserRole);
188 
189  if (v.isValid())
190  vec.push_back(v.toInt());
191  }
192 
193  return vec;
194 }
195 
197 {
198  m_ui->m_leftListWidget->clear();
199 
200  m_ui->m_addToolButton->setEnabled(false);
201  m_ui->m_addAllToolButton->setEnabled(false);
202 }
203 
205 {
206  m_ui->m_rightListWidget->clear();
207 
208  m_ui->m_removeToolButton->setEnabled(false);
209  m_ui->m_removeAllToolButton->setEnabled(false);
210 }
211 
213 {
214  m_ui->m_upToolButton->setVisible(state);
215  m_ui->m_downToolButton->setVisible(state);
216 }
217 
218 void te::qt::widgets::DoubleListWidget::addItems(QList<QListWidgetItem*> list)
219 {
220  std::vector<int> itemList;
221 
222  for (int i = 0; i < list.size(); ++i)
223  {
224  int row = m_ui->m_leftListWidget->row(list[i]);
225 
226  QListWidgetItem* item = m_ui->m_leftListWidget->takeItem(row);
227 
228  m_ui->m_rightListWidget->addItem(item);
229 
230  QVariant v = item->data(Qt::UserRole);
231 
232  if (v.isValid())
233  itemList.push_back(v.toInt());
234  }
235 
236  m_ui->m_addToolButton->setEnabled(false);
237  m_ui->m_addAllToolButton->setEnabled(m_ui->m_leftListWidget->count() != 0);
238 
239  emit itemAdded(itemList);
240  emit itemChanged();
241 }
242 
244 {
245  QList<QListWidgetItem*> listItem;
246 
247  for (std::size_t i = 0; i < ids.size(); ++i)
248  {
249  QListWidgetItem* item = getItemFromId(ids[(int)i]);
250 
251  if (item != nullptr)
252  listItem.push_back(item);
253  }
254 
255  if (!listItem.isEmpty())
256  addItems(listItem);
257 }
258 
259 void te::qt::widgets::DoubleListWidget::removeItems(QList<QListWidgetItem*> list)
260 {
261  std::vector<int> itemList;
262 
263  for (int i = 0; i < list.size(); ++i)
264  {
265  int row = m_ui->m_rightListWidget->row(list[i]);
266 
267  QListWidgetItem* item = m_ui->m_rightListWidget->takeItem(row);
268 
269  m_ui->m_leftListWidget->addItem(item);
270 
271  QVariant v = item->data(Qt::UserRole);
272 
273  if (v.isValid())
274  itemList.push_back(v.toInt());
275  }
276 
277  m_ui->m_removeToolButton->setEnabled(false);
278  m_ui->m_removeAllToolButton->setEnabled(m_ui->m_rightListWidget->count() != 0);
279  m_ui->m_upToolButton->setEnabled(m_ui->m_rightListWidget->count() != 0);
280  m_ui->m_downToolButton->setEnabled(m_ui->m_rightListWidget->count() != 0);
281 
282  emit itemRemoved(itemList);
283  emit itemChanged();
284 }
285 
287 {
288  QList<QListWidgetItem*> listItem;
289 
290  for (std::size_t i = 0; i < ids.size(); ++i)
291  {
292  QListWidgetItem* item = getItemFromId(ids[(int)i]);
293 
294  if (item != nullptr)
295  listItem.push_back(item);
296  }
297 
298  if (!listItem.isEmpty())
299  removeItems(listItem);
300 }
301 
303 {
304  QList<QListWidgetItem*> list = m_ui->m_leftListWidget->selectedItems();
305 
306  if(list.empty() == false)
307  m_ui->m_removeAllToolButton->setEnabled(true);
308 
309  addItems(list);
310 }
311 
313 {
314  m_ui->m_leftListWidget->selectAll();
315 
316  QList<QListWidgetItem*> list = m_ui->m_leftListWidget->selectedItems();
317 
318  if(list.empty() == false)
319  m_ui->m_removeAllToolButton->setEnabled(true);
320 
321  addItems(list);
322 }
323 
325 {
326  QList<QListWidgetItem*> list = m_ui->m_rightListWidget->selectedItems();
327 
328  if(list.empty() == false)
329  m_ui->m_addAllToolButton->setEnabled(true);
330 
331  removeItems(list);
332 }
333 
335 {
336  m_ui->m_rightListWidget->selectAll();
337 
338  QList<QListWidgetItem*> list = m_ui->m_rightListWidget->selectedItems();
339 
340  if(list.empty() == false)
341  m_ui->m_addAllToolButton->setEnabled(true);
342 
343  removeItems(list);
344 }
345 
347 {
348  int count = m_ui->m_rightListWidget->count();
349 
350  if(count == m_ui->m_rightListWidget->selectedItems().size())
351  return;
352 
353  for(int i = count-1; i >= 0; --i)
354  {
355  QListWidgetItem* currentItem = m_ui->m_rightListWidget->item(i);
356 
357  if(i == count-1)
358  continue;
359 
360  if(currentItem->isSelected())
361  {
362  QListWidgetItem* itemAfter = m_ui->m_rightListWidget->item(i+1);
363 
364  bool wasSelected = itemAfter->isSelected();
365 
366  m_ui->m_rightListWidget->takeItem(i);
367  m_ui->m_rightListWidget->takeItem(i);
368 
369  m_ui->m_rightListWidget->insertItem(i, itemAfter);
370  m_ui->m_rightListWidget->insertItem(i+1, currentItem);
371 
372  currentItem->setSelected(true);
373 
374  if(wasSelected)
375  itemAfter->setSelected(true);
376  }
377  }
378 }
379 
381 {
382  int count = m_ui->m_rightListWidget->count();
383 
384  if(count == m_ui->m_rightListWidget->selectedItems().size())
385  return;
386 
387  for(int i = 0; i < count; ++i)
388  {
389  QListWidgetItem* currentItem = m_ui->m_rightListWidget->item(i);
390 
391  if(i == 0)
392  continue;
393 
394  if(currentItem->isSelected())
395  {
396  QListWidgetItem* itemBefore = m_ui->m_rightListWidget->item(i-1);
397 
398  bool wasSelected = itemBefore->isSelected();
399 
400  m_ui->m_rightListWidget->takeItem(i);
401  m_ui->m_rightListWidget->takeItem(i-1);
402 
403  m_ui->m_rightListWidget->insertItem(i-1, currentItem);
404  m_ui->m_rightListWidget->insertItem(i, itemBefore);
405 
406  currentItem->setSelected(true);
407 
408  if(wasSelected)
409  itemBefore->setSelected(true);
410  }
411  }
412 }
413 
415 {
416  if(m_ui->m_leftListWidget->selectedItems().size() > 0)
417  {
418  m_ui->m_addToolButton->setEnabled(true);
419  m_ui->m_addAllToolButton->setEnabled(true);
420  }
421  else
422  {
423  m_ui->m_addToolButton->setEnabled(false);
424  }
425 }
426 
428 {
429  if(m_ui->m_rightListWidget->selectedItems().size() > 0)
430  {
431  m_ui->m_removeToolButton->setEnabled(true);
432  m_ui->m_removeAllToolButton->setEnabled(true);
433  m_ui->m_upToolButton->setEnabled(true);
434  m_ui->m_downToolButton->setEnabled(true);
435  }
436  else
437  {
438  m_ui->m_removeToolButton->setEnabled(false);
439  m_ui->m_upToolButton->setEnabled(false);
440  m_ui->m_downToolButton->setEnabled(false);
441  }
442 }
443 
444 
445 
447 {
448  int count = m_ui->m_leftListWidget->count();
449 
450  for (int i = 0; i < count; ++i)
451  {
452  QVariant v = m_ui->m_leftListWidget->item(i)->data(Qt::UserRole);
453  if (!v.isValid())
454  continue;
455 
456  if (v.toInt() == id)
457  return m_ui->m_leftListWidget->item(i);
458  }
459 
460  count = m_ui->m_rightListWidget->count();
461 
462  for (int i = 0; i < count; ++i)
463  {
464  QVariant v = m_ui->m_rightListWidget->item(i)->data(Qt::UserRole);
465  if (!v.isValid())
466  continue;
467 
468  if (v.toInt() == id)
469  return m_ui->m_rightListWidget->item(i);
470  }
471 
472  return nullptr;
473 }
void setRightLabel(const QString &value)
void setLeftLabel(const QString &value)
void setOutputDataValues(std::vector< std::string > values, std::vector< int > ids)
void setInputDataValues(std::vector< std::string > values, std::vector< int > ids)
void removeItems(QList< QListWidgetItem * > list)
void itemAdded(std::vector< int > ids)
std::vector< std::string > getOutputValues()
void setInputValues(std::vector< std::string > values)
std::unique_ptr< Ui::DoubleListWidgetForm > m_ui
void addItems(QList< QListWidgetItem * > list)
std::vector< int > getOutputDataValues()
QListWidgetItem * getItemFromId(const int &id)
Ui::DoubleListWidgetForm * getForm() const
void setFixedOutputValues(std::vector< std::string > values, std::string iconName)
void setOutputValues(std::vector< std::string > values)
DoubleListWidget(QWidget *parent=0, Qt::WindowFlags f=0)
void itemRemoved(std::vector< int > ids)