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*/
23
24#include <iostream>
25
27
28namespace 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
uint8_t index
std::shared_ptr< TransitionTab > TransitionTabPtr
void retranslateGui()
Retranslates the guiTransitionTab.
void changedInterpolation(int index, int it)
Notifies other controllers about changes of the interpolation type of the given transition.
void selectedTransitionChanged(int index)
void updateSelectedTransition(int index)
Updates the currently selected transition.
void changedDuration(int transition, double duration)
Notifies other controllers about changes of the duration of the given transition.
void removeTransition(int index)
Removes the transition at a given index from the list widget.
void addTransition(int index, double duration, double start, int interpolation)
Adds a new transition to the list widget.
TransitionTabPtr getGuiTransitionTab()
Getter for the TransitionTab pointer to guiTransitionTab.
TransitionController(TransitionTabPtr guiTransitionTab)
Creates a new TransitionController and assigns a TransitionTab to handle.
void setGuiTransitionTab(TransitionTabPtr guiTransitionTab)
Setter for the TransitionTab pointer to guiTransitionTab.
void clearTransitionList()
Removes all items of the transition list.
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.
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
This file offers overloads of toIce() and fromIce() functions for STL container types.
struct armarx::GuiTransition GuiTransition
Struct defining a transition which can be stored as QVariant in a QListWidgetItem.
Struct defining a transition which can be stored as QVariant in a QListWidgetItem.
bool isValid()
Checks whether all values of a transition are greater than or equal to zero.