TransitionController.cpp
Go to the documentation of this file.
1 /*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * \package RobotTrajectoryDesigner::gui-plugins::Controller::TransitionController
17 * \author Max Beddies
18 * \date 2018
19 * \copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22 #include "TransitionController.h"
23 
24 #include <iostream>
25 
26 #include "../Interpolation/InterpolationType.h"
27 
28 namespace armarx
29 {
30 
31  void
33  {
34  ARMARX_INFO << "RobotTrajectoryDesigner: TransitionController on init";
35 
36  // Fill interpolation combo box with items
37  initInterpolationComboBox();
38 
39  // Set single selection and clear transition list
40  this->guiTransitionTab->getTransitionTab()->transitionList->setSelectionMode(
41  QAbstractItemView::SingleSelection);
42  this->guiTransitionTab->getTransitionTab()->transitionList->clear();
43 
44  // Add double validator to duration line edit
45  QDoubleValidator* validator =
46  new QDoubleValidator(-1000.000, 1000.000, 3, guiTransitionTab.get());
47  validator->setNotation(QDoubleValidator::StandardNotation);
48  this->guiTransitionTab->getTransitionTab()->durationLineEdit->setValidator(validator);
49  }
50 
51  void
53  {
54  ARMARX_INFO << "RobotTrajectoryDesigner: TransitionController on connect";
55 
56  // Transition list: changed selected item
57  QObject::connect(guiTransitionTab->getTransitionTab()->transitionList,
58  SIGNAL(itemClicked(QListWidgetItem*)),
59  this,
60  SLOT(updateSelectedTransition(QListWidgetItem*)));
61 
62  // Transition duration: changed duration
63  QObject::connect(guiTransitionTab->getTransitionTab()->durationLineEdit,
64  SIGNAL(editingFinished()),
65  this,
66  SLOT(setDurationValue()));
67 
68  // Transition interpolation: changed interpolation
69  QObject::connect(guiTransitionTab->getTransitionTab()->interpolationComboBox,
70  SIGNAL(activated(int)),
71  this,
72  SLOT(setInterpolation(int)));
73  }
74 
75  void
77  {
78  ARMARX_INFO << "RobotTrajectoryDesigner: TransitionController on disconnect";
79  }
80 
81  void
83  {
84  ARMARX_INFO << "RobotTrajectoryDesigner: TransitionController on exit";
85  }
86 
88  guiTransitionTab(guiTransitionTab)
89  {
92  }
93 
96  {
97  return this->guiTransitionTab;
98  }
99 
100  void
102  {
103  if (guiTransitionTab != NULL)
104  {
105  this->guiTransitionTab = guiTransitionTab;
106  }
107  }
108 
109  void
110  TransitionController::addTransition(int index, double duration, double start, int interpolation)
111  {
112  // Create struct representing transition
113  struct GuiTransition transition;
114  transition.duration = duration;
115  transition.start = start;
116  transition.it = interpolation;
117 
118  if (transition.isValid())
119  {
120  // Create qvariant from struct
121  QVariant data;
122  data.setValue(transition);
123 
124  // add data to item and insert
125  QListWidgetItem* item =
126  new QListWidgetItem(QString(("Transition: " + std::to_string(index)).c_str()));
127  item->setData(Qt::UserRole, data);
128  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
129 
130  transitions->insertItem(index, item);
132  }
133  changeTextListWidgetItems();
134  }
135 
136  void
138  {
139  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
140 
141  // If index is within range, delete transition at index
142  if (transitions->count() > index)
143  {
144  delete transitions->takeItem(index);
145  }
146  changeTextListWidgetItems();
147  }
148 
149  void
151  {
152  GuiTransition transition = item->data(Qt::UserRole).value<GuiTransition>();
153 
154  // Duration line edit
155  guiTransitionTab->getTransitionTab()->durationLineEdit->setText(
156  QString::number(transition.duration));
157  // Start value label
158  guiTransitionTab->getTransitionTab()->startValueLabel->setText(
159  QString::number(transition.start));
160  // End value label
161  guiTransitionTab->getTransitionTab()->EndValueLabel->setText(
162  QString::number(transition.start + transition.duration));
163  // Interpolation combo box
164  guiTransitionTab->getTransitionTab()->interpolationComboBox->setCurrentIndex(transition.it);
165 
166  // Notify other controllers about changes of the selected transition
167  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
168  emit selectedTransitionChanged(transitions->currentIndex().row());
169  }
170 
171  void
173  {
174  GuiTransition transition = guiTransitionTab->getTransitionTab()
175  ->transitionList->item(index)
176  ->data(Qt::UserRole)
177  .value<GuiTransition>();
178 
179  // Duration line edit
180  guiTransitionTab->getTransitionTab()->durationLineEdit->setText(
181  QString::number(transition.duration));
182  // Start value label
183  guiTransitionTab->getTransitionTab()->startValueLabel->setText(
184  QString::number(transition.start));
185  // End value label
186  guiTransitionTab->getTransitionTab()->EndValueLabel->setText(
187  QString::number(transition.start + transition.duration));
188  // Interpolation combo box
189  guiTransitionTab->getTransitionTab()->interpolationComboBox->setCurrentIndex(transition.it);
190  }
191 
192  void
193  TransitionController::setDurationValue()
194  {
195  if (this->guiTransitionTab->getTransitionTab()->durationLineEdit->hasAcceptableInput())
196  {
197  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
198  QListWidgetItem* item = transitions->currentItem();
199 
200  // Check if list widget has any item
201  if (item != NULL)
202  {
203  GuiTransition transition = item->data(Qt::UserRole).value<GuiTransition>();
204  double dur =
205  this->guiTransitionTab->getTransitionTab()->durationLineEdit->text().toDouble();
206 
207  // Check if duration of item has changed
208  if ((dur >= 0) && (dur != transition.duration))
209  {
210  emit changedDuration(transitions->currentRow(), dur);
211  }
212  }
213  }
214  }
215 
216  void
217  TransitionController::setInterpolation(int index)
218  {
219  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
220  QListWidgetItem* item = transitions->currentItem();
221  // Check if list widget has any item
222  if (item != NULL)
223  {
224  GuiTransition transition = item->data(Qt::UserRole).value<GuiTransition>();
225 
226  // Check if interpolation of item has changed
227  if ((index >= 0) && (index != transition.it))
228  {
229  emit changedInterpolation(transitions->currentRow(), index);
230  }
231  }
232  }
233 
234  void
235  TransitionController::enableAll(bool enable)
236  {
237  this->guiTransitionTab->getTransitionTab()->durationLineEdit->setEnabled(enable);
238  this->guiTransitionTab->getTransitionTab()->interpolationComboBox->setEnabled(enable);
239  this->guiTransitionTab->getTransitionTab()->transitionList->setEnabled(enable);
240  }
241 
242  void
243  TransitionController::setTransitionData(int index, double duration, double start, int it)
244  {
245  // Create struct holding relevant data
246  struct GuiTransition transition;
247  transition.duration = duration;
248  transition.start = start;
249  transition.it = it;
250 
251  if (transition.isValid())
252  {
253  // Create QVariant from struct
254  QVariant data;
255  data.setValue(transition);
256 
257  QListWidget* transitions = guiTransitionTab->getTransitionTab()->transitionList;
258  QListWidgetItem* item = transitions->item(index);
259 
260  // Update data
261  item->setData(Qt::UserRole, data);
262  // Display updated data
263  if (transitions->currentRow() == index)
264  {
266  }
267  }
268  }
269 
270  void
272  {
273  throw("not yet implemented");
274  }
275 
276  void
278  {
279  // Clear transition list
280  this->guiTransitionTab->getTransitionTab()->transitionList->clear();
281  // Clear duration line edit
282  this->guiTransitionTab->getTransitionTab()->durationLineEdit->clear();
283  // Clear start and end label
284  this->guiTransitionTab->getTransitionTab()->startValueLabel->clear();
285  this->guiTransitionTab->getTransitionTab()->EndValueLabel->clear();
286  // Reset interpolation index
287  this->guiTransitionTab->getTransitionTab()->interpolationComboBox->setCurrentIndex(0);
288  }
289 
290  bool
291  TransitionController::contains(QListWidget* list, GuiTransition transition)
292  {
293  for (int i = 0; i < list->count(); i++)
294  {
295  if (list->item(i)->data(Qt::UserRole).value<GuiTransition>() == transition)
296  {
297  return true;
298  }
299  }
300  return false;
301  }
302 
303  void
304  TransitionController::initInterpolationComboBox()
305  {
306  QComboBox* interpolation = guiTransitionTab->getTransitionTab()->interpolationComboBox;
307 
308  // Set strong focus and add wheel event filter
309  interpolation->setFocusPolicy(Qt::StrongFocus);
310  interpolation->installEventFilter(new WheelEventFilter(this));
311 
312  // Clear combo box and insert items
313  interpolation->clear();
314  interpolation->addItem(QString::fromStdString("Linear Interpolation"));
315  interpolation->addItem(QString::fromStdString("Spline interpolation"));
316  interpolation->setEnabled(true);
317  interpolation->setCurrentIndex(0);
318  }
319 
320  void
321  TransitionController::changeTextListWidgetItems()
322  {
323  QListWidget* transitions = this->guiTransitionTab->getTransitionTab()->transitionList;
324  for (int i = 0; i < transitions->count(); i++)
325  {
326  transitions->item(i)->setText(
327  QString::fromStdString(("Transition: " + std::to_string(i))));
328  }
329  }
330 } // namespace armarx
armarx::GuiTransition::start
double start
Definition: TransitionController.h:42
armarx::GuiTransition
Struct defining a transition which can be stored as QVariant in a QListWidgetItem.
Definition: TransitionController.h:39
index
uint8_t index
Definition: EtherCATFrame.h:59
list
list(APPEND SOURCES ${QT_RESOURCES}) set(COMPONENT_LIBS ArmarXGui ArmarXCoreObservers ArmarXCoreEigen3Variants PlotterController $
Definition: CMakeLists.txt:49
armarx::GuiTransition::isValid
bool isValid()
Checks whether all values of a transition are greater than or equal to zero.
Definition: TransitionController.h:63
armarx::TransitionController::getGuiTransitionTab
TransitionTabPtr getGuiTransitionTab()
Getter for the TransitionTab pointer to guiTransitionTab.
Definition: TransitionController.cpp:95
armarx::TransitionController::addTransition
void addTransition(int index, double duration, double start, int interpolation)
Adds a new transition to the list widget.
Definition: TransitionController.cpp:110
armarx::armem::contains
bool contains(const MemoryID &general, const MemoryID &specific)
Indicates whether general is "less specific" than, or equal to, specific, i.e.
Definition: MemoryID.cpp:563
armarx::TransitionController::onDisconnectComponent
void onDisconnectComponent() override
Definition: TransitionController.cpp:76
armarx::TransitionController::onExitComponent
void onExitComponent() override
Definition: TransitionController.cpp:82
TransitionController.h
armarx::TransitionController::retranslateGui
void retranslateGui()
Retranslates the guiTransitionTab.
Definition: TransitionController.cpp:271
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::TransitionController::selectedTransitionChanged
void selectedTransitionChanged(int index)
TransitionTabPtr
std::shared_ptr< TransitionTab > TransitionTabPtr
Definition: TransitionTab.h:52
armarx::TransitionController::setGuiTransitionTab
void setGuiTransitionTab(TransitionTabPtr guiTransitionTab)
Setter for the TransitionTab pointer to guiTransitionTab.
Definition: TransitionController.cpp:101
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:41
armarx::TransitionController::clearTransitionList
void clearTransitionList()
Removes all items of the transition list.
Definition: TransitionController.cpp:277
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::TransitionController::TransitionController
TransitionController(TransitionTabPtr guiTransitionTab)
Creates a new TransitionController and assigns a TransitionTab to handle.
Definition: TransitionController.cpp:87
armarx::TransitionController::updateSelectedTransition
void updateSelectedTransition(int index)
Updates the currently selected transition.
Definition: TransitionController.cpp:172
armarx::TransitionController::onInitComponent
void onInitComponent() override
Definition: TransitionController.cpp:32
armarx::GuiTransition::duration
double duration
Definition: TransitionController.h:41
armarx::TransitionController::removeTransition
void removeTransition(int index)
Removes the transition at a given index from the list widget.
Definition: TransitionController.cpp:137
armarx::TransitionController::changedInterpolation
void changedInterpolation(int index, int it)
Notifies other controllers about changes of the interpolation type of the given transition.
armarx::TransitionController::setTransitionData
void setTransitionData(int index, double duration, double start, int it)
Connected with signals from other controllers, sets all values of the transition at a given index.
Definition: TransitionController.cpp:243
armarx::GuiTransition
struct armarx::GuiTransition GuiTransition
Struct defining a transition which can be stored as QVariant in a QListWidgetItem.
armarx::TransitionController::onConnectComponent
void onConnectComponent() override
Definition: TransitionController.cpp:52
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::GuiTransition::it
int it
Definition: TransitionController.h:43
armarx::TransitionController::changedDuration
void changedDuration(int transition, double duration)
Notifies other controllers about changes of the duration of the given transition.