YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
sequencewindow.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7#include "sequencewindow.h"
8#include "ui_sequencewindow.h"
9#include <QMenu>
10#include <QDebug>
11#include <QClipboard>
12
13
14SequenceWindow::SequenceWindow(QString partName, int count,QWidget *parent) :
15 QMainWindow(parent),
16 ui(new Ui::SequenceWindow)
17{
18 ui->setupUi(this);
19
20 setWindowTitle(QString("Sequence Window for part: %1").arg(partName));
21 goAction = ui->toolBar->addAction(QIcon(":/play.svg"),"Run (use joint speeds from Speed tab)");
22 runTimeAction = ui->toolBar->addAction(QIcon(":/images/runSequenceTime.png"),"Run (ignore Speed tab, produce coordinated movement using Timing)");
23
24 saveAction = ui->toolBar->addAction(QIcon(":/file-save.svg"),"Save");
25 openAction = ui->toolBar->addAction(QIcon(":/file-open.svg"),"Open");
26 cycleAllAction = ui->toolBar->addAction(QIcon(":/images/cycleAllSequence.png"),"Cycle (use joint speeds from Speed tab)");
27 cycleTimeAction = ui->toolBar->addAction(QIcon(":/images/cycleAllSequenceTime.png"),"Cycle (ignore Speed tab, produce coordinated movement using Timing)");
28 stopAction = ui->toolBar->addAction(QIcon(":/stop.svg"),"Stop");
29
30 QMenu *menu = ui->menuBar->addMenu("Commands");
31 menu->addAction(goAction);
32 menu->addAction(runTimeAction);
33 menu->addAction(saveAction);
34 menu->addAction(openAction);
35 menu->addAction(cycleAllAction);
36 menu->addAction(cycleTimeAction);
37 menu->addAction(stopAction);
38
39 connect(goAction,SIGNAL(triggered()),this,SLOT(onGo()));
40 connect(runTimeAction,SIGNAL(triggered()),this,SLOT(onRunTime()));
41 connect(saveAction,SIGNAL(triggered()),this,SLOT(onSave()));
42 connect(openAction,SIGNAL(triggered()),this,SLOT(onOpen()));
43 connect(cycleAllAction,SIGNAL(triggered()),this,SLOT(onCycle()));
44 connect(cycleTimeAction,SIGNAL(triggered()),this,SLOT(onCycleTime()));
45 connect(stopAction,SIGNAL(triggered()),this,SLOT(onStopSequence()));
46
47 jointCount = count;
48 prevCurrentIndex = -1;
49
50 QStringList headers;
51 headers << "Sequence" << "Timing";
52
53 QStringList headers1;
54 headers1 << "Sequence";
55
56 for(int i=0;i<jointCount;i++){
57 headers << QString("Joint %1").arg(i);
58 headers1 << QString("Joint %1").arg(i);
59 }
60
61
62 ui->treePositions->setHeaderLabels(headers);
63 ui->treeSpeed->setHeaderLabels(headers1);
64
65 connect(ui->treePositions,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
66 this,SLOT(onDoubleClickPositions(QTreeWidgetItem*,int)));
67
68 connect(ui->treeSpeed,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
69 this,SLOT(onDoubleClickSpeed(QTreeWidgetItem*,int)));
70
71 connect(ui->treePositions,SIGNAL(deletedItem(int)),this,SLOT(onDeletePosition(int)));
72 connect(ui->treePositions,SIGNAL(moveItem(int,int)),this,SLOT(onMovePositions(int,int)));
73
74 QStringList ss;
75 ss << "0" << "-0.1";
76
77 QStringList ss1;
78 ss1 << "0";
79
80 for(int i=0; i<jointCount;i++){
81 ss << "0";
82 ss1 << "10";
83 }
84 auto* itemPos = new QTreeWidgetItem(ss);
85 ui->treePositions->addTopLevelItem(itemPos);
86
87 auto* itemSpeed = new QTreeWidgetItem(ss1);
88 ui->treeSpeed->addTopLevelItem(itemSpeed);
89}
90
92{
93 delete ui;
94}
95
96
97void SequenceWindow::onMovePositions(int index, int dragIndex)
98{
99 QTreeWidgetItem * it = ui->treeSpeed->takeTopLevelItem(dragIndex);
100
101 ui->treeSpeed->insertTopLevelItem(index ,it);
102
103
104 // Re-Assign sequential id
105 for(int i=0;i<ui->treeSpeed->topLevelItemCount();i++){
106 ui->treeSpeed->topLevelItem(i)->setText(0,QString("%1").arg(i));
107 }
108}
109
110void SequenceWindow::onDeletePosition(int index)
111{
112 delete ui->treeSpeed->takeTopLevelItem(index);
113
114 // Re-Assign sequential id
115 for(int i=0;i<ui->treeSpeed->topLevelItemCount();i++){
116 ui->treeSpeed->topLevelItem(i)->setText(0,QString("%1").arg(i));
117 }
118}
119
120void SequenceWindow::closeEvent(QCloseEvent *event)
121{
122 if(!isVisible()){
123 QMainWindow::closeEvent(event);
124 return;
125 }
126
127 event->ignore();
128 hide();
129
130}
131
132
133void SequenceWindow::onDoubleClickSpeed(QTreeWidgetItem *item,int column)
134{
135
136 if(column > 0){
137 //ui->treePositions->openPersistentEditor(item,column);
138 item->setFlags(item->flags() | Qt::ItemIsEditable);
139 return;
140 }else{
141 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
142 }
143
144
145
146}
147
148
149
150void SequenceWindow::onDoubleClickPositions(QTreeWidgetItem *item,int column)
151{
152
153 if(column >= 1){
154 item->setFlags(item->flags() | Qt::ItemIsEditable);
155 return;
156 }else{
157 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
158 }
159
160
161 emit itemDoubleClicked(item->text(0).toInt());
162
163 if(item != ui->treePositions->topLevelItem(ui->treePositions->topLevelItemCount()-1)){
164 return;
165 }
166
167
168
169 QStringList ss;
170 ss << QString("%1").arg(ui->treePositions->topLevelItemCount()) << "-0.1";
171
172 QStringList ss1;
173 ss1 << QString("%1").arg(ui->treePositions->topLevelItemCount());
174
175 for(int i=0; i<jointCount;i++){
176 ss << "0";
177 }
178 auto* newItem = new QTreeWidgetItem(ss);
179 item->setFlags(newItem->flags() & ~Qt::ItemIsEditable);
180 ui->treePositions->addTopLevelItem(newItem);
181
182 auto* newItem1 = new QTreeWidgetItem(ss1);
183 ui->treeSpeed->addTopLevelItem(newItem1);
184
185
186
187}
188
189
190
191void SequenceWindow::onReceiveValues(int sequenceNum, QList<double> values,QList<double> speeds)
192{
193 for(int i=0;i<values.count();i++){
194 ui->treePositions->topLevelItem(sequenceNum)->setText(i+2,QString("%1").arg(values.at(i)));
195 //ui->treePositions->topLevelItem(sequenceNum)->setData(i+2,Qt::UserRole,speeds.at(i));
196 ui->treeSpeed->topLevelItem(sequenceNum)->setText(i+1,QString("%1").arg(speeds.at(i)));
197 }
198}
199
200
202{
203 if(ui->treePositions->currentItem() == nullptr){
204 return false;
205 }
206 int index = ui->treePositions->currentIndex().row();
207 double timing = ui->treePositions->topLevelItem(index)->text(1).toDouble();
208
209 if(timing <= 0){
210 return false;
211 }
212
213 onGo();
214 return true;
215}
216
217void SequenceWindow::onGo()
218{
219 double timing = -0.1;
220
221 SequenceItem sequenceItem;
222
223 if(ui->treePositions->currentItem() != nullptr){
224 int index = ui->treePositions->currentIndex().row();
225 timing = ui->treePositions->topLevelItem(index)->text(1).toDouble();
226
227 sequenceItem.setSequenceNumber(index);
228 sequenceItem.setTiming(timing);
229
230 for(int i=0;i<ui->treePositions->columnCount() - 2;i++){
231 double pos = ui->treePositions->topLevelItem(index)->text(i+2).toDouble();
232 double speed = ui->treeSpeed->topLevelItem(index)->text(i+1).toDouble();
233 //double speed = ui->treePositions->topLevelItem(index)->data(i+2,Qt::UserRole).toDouble();
234
235 sequenceItem.addValue(pos,speed);
236
237 }
238 }
239
240 emit goToPosition(sequenceItem);
241}
242
243void SequenceWindow::onRunTime()
244{
245 emit runTime(getValuesFromList());
246}
247
249{
250 QList <SequenceItem> seq = getValuesFromList();
251 if(seq.count() <= 0){
252 return false;
253 }
254
255 int count = 0;
256 for(int i=0;i<seq.count();i++){
257 SequenceItem item = seq.at(i);
258 if(item.getTiming() > 0){
259 count++;
260 }else{
261 break;
262 }
263 }
264 if(count <= 1){
265 return false;
266 }
267 emit cycleTime(seq);
268 return true;
269}
270
272{
273 QList <SequenceItem> seq = getValuesFromList();
274 if(seq.count() <= 0){
275 return false;
276 }
277
278 int count = 0;
279 for(int i=0;i<seq.count();i++){
280 SequenceItem item = seq.at(i);
281 if(item.getTiming() > 0){
282 count++;
283 }else{
284 break;
285 }
286 }
287 if(count <= 1){
288 return false;
289 }
290 emit cycle(seq);
291 return true;
292}
293
295{
296 QList <SequenceItem> seq = getValuesFromList();
297 if(seq.count() <= 0){
298 return false;
299 }
300
301 int count = 0;
302 for(int i=0;i<seq.count();i++){
303 SequenceItem item = seq.at(i);
304 if(item.getTiming() > 0){
305 count++;
306 }else{
307 break;
308 }
309 }
310 if(count <= 1){
311 return false;
312 }
313 emit run(seq);
314 return true;
315
316}
317
319{
320 QList <SequenceItem> seq = getValuesFromList();
321 if(seq.count() <= 0){
322 return false;
323 }
324
325 int count = 0;
326 for(int i=0;i<seq.count();i++){
327 SequenceItem item = seq.at(i);
328 if(item.getTiming() > 0){
329 count++;
330 }else{
331 break;
332 }
333 }
334 if(count <= 1){
335 return false;
336 }
337 emit runTime(seq);
338 return true;
339
340}
341
342void SequenceWindow::onCycle()
343{
344 emit cycle(getValuesFromList());
345}
346
347void SequenceWindow::onStopSequence()
348{
349 emit stopSequence();
350}
351
352void SequenceWindow::onCycleTime()
353{
354 emit cycleTime(getValuesFromList());
355}
356
357void SequenceWindow::onOpen()
358{
359 emit openSequence();
360}
361
362void SequenceWindow::save(QString global_filename)
363{
364 emit saveSequence(getValuesFromList(),global_filename);
365}
366
367
368void SequenceWindow::onSave()
369{
370 save("");
371}
372
373void SequenceWindow::loadSequence(QList<SequenceItem> sequence)
374{
375 ui->treePositions->clear();
376
377 QStringList ss;
378 QStringList ss1;
379
380 ui->treePositions->clear();
381 ui->treeSpeed->clear();
382
383 for(int i=0; i<sequence.count();i++){
384 SequenceItem seq = sequence.at(i);
385
386 ss.append(QString("%1").arg(seq.getSequenceNumber()));
387 ss.append(QString("%1").arg(seq.getTiming()));
388
389 ss1.append(QString("%1").arg(seq.getSequenceNumber()));
390
391
392 for(int j=0;j<seq.getPositions().count();j++){
393 ss.append(QString("%1").arg(seq.getPositions().at(j)));
394 }
395
396 for(int i=0;i<seq.getSpeeds().count();i++){
397 ss1.append(QString("%1").arg(seq.getSpeeds().at(i)));
398 }
399
400 auto* newItem = new QTreeWidgetItem(ss);
401 ui->treePositions->addTopLevelItem(newItem);
402
403
404 auto* newItem1 = new QTreeWidgetItem(ss1);
405 ui->treeSpeed->addTopLevelItem(newItem1);
406
407 ss.clear();
408 ss1.clear();
409 }
410}
411
412QList <SequenceItem> SequenceWindow::getValuesFromList()
413{
414 QList <SequenceItem> valuesList;
415
416 for(int i=0;i<ui->treePositions->topLevelItemCount();i++){
417 QTreeWidgetItem *item = ui->treePositions->topLevelItem(i);
418 QTreeWidgetItem *item1 = ui->treeSpeed->topLevelItem(i);
419
420 double timing = item->text(1).toDouble();
421
422 SequenceItem sequenceitem;
423 sequenceitem.setSequenceNumber(i);
424 sequenceitem.setTiming(timing);
425
426 for(int j=2;j<item->columnCount();j++){
427 sequenceitem.addValue(item->text(j).toDouble(),item1->text(j-1).toDouble());
428 }
429 valuesList.append(sequenceitem);
430 }
431 return valuesList;
432}
433
434void SequenceWindow::onRunTimeSequence()
435{
436 runTimeAction->setEnabled(true);
437 cycleAllAction->setEnabled(false);
438 cycleTimeAction->setEnabled(false);
439 goAction->setEnabled(false);
440 saveAction->setEnabled(false);
441 openAction->setEnabled(false);
442
443}
444
445void SequenceWindow::onCycleTimeSequence()
446{
447 runTimeAction->setEnabled(false);
448 cycleAllAction->setEnabled(false);
449 cycleTimeAction->setEnabled(true);
450 goAction->setEnabled(false);
451 saveAction->setEnabled(false);
452 openAction->setEnabled(false);
453
454}
455
456void SequenceWindow::onCycleSequence()
457{
458 runTimeAction->setEnabled(false);
459 cycleAllAction->setEnabled(true);
460 cycleTimeAction->setEnabled(false);
461 goAction->setEnabled(false);
462 saveAction->setEnabled(false);
463 openAction->setEnabled(false);
464}
465
466void SequenceWindow::onStoppedSequence()
467{
468 runTimeAction->setEnabled(true);
469 cycleAllAction->setEnabled(true);
470 cycleTimeAction->setEnabled(true);
471 goAction->setEnabled(true);
472 saveAction->setEnabled(true);
473 openAction->setEnabled(true);
474
475
476 if(prevCurrentIndex >=0){
477 for(int i=0;i<ui->treePositions->columnCount();i++){
478 ui->treePositions->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
479 }
480 ui->treePositions->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
481
482 for(int i=0;i<ui->treeSpeed->columnCount();i++){
483 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
484 }
485 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
486
487 prevCurrentIndex = -1;
488
489 }
490}
491
492void SequenceWindow::onSetCurrentSequenceIndex(int index)
493{
494 if(prevCurrentIndex >=0){
495 for(int i=0;i<ui->treePositions->columnCount();i++){
496 ui->treePositions->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
497 }
498 ui->treePositions->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
499
500 for(int i=0;i<ui->treeSpeed->columnCount();i++){
501 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
502 }
503 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
504
505
506 }
507 for(int i=0;i<ui->treePositions->columnCount();i++){
508 ui->treePositions->topLevelItem(index)->setBackground(i,QColor(0,255,0,120));
509
510 }
511 ui->treePositions->topLevelItem(index)->setIcon(0,QIcon(":/play.svg"));
512
513 for(int i=0;i<ui->treeSpeed->columnCount();i++){
514 ui->treeSpeed->topLevelItem(index)->setBackground(i,QColor(0,255,0,120));
515
516 }
517 ui->treeSpeed->topLevelItem(index)->setIcon(0,QIcon(":/play.svg"));
518 prevCurrentIndex = index;
519}
520
521
522
523/**************************************************************************************/
524SequenceTreeWidget::SequenceTreeWidget(QWidget *parent) : QTreeWidget(parent)
525{
526 connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(onContextMenuRequested(QPoint)));
527}
528
529void SequenceTreeWidget::dropEvent(QDropEvent *event)
530{
531 event->ignore();
532 QTreeWidgetItem *item = itemAt(event->pos());
533 QList<QTreeWidgetItem*> dragItems = selectedItems();
534
535 if(!item || dragItems.isEmpty()){
536 return;
537 }
538 int index = indexOfTopLevelItem(item);
539
540 QTreeWidgetItem *dragIt = dragItems.at(0);
541 int dragIndex = indexOfTopLevelItem(dragIt);
542 QTreeWidgetItem * it = takeTopLevelItem(dragIndex);
543
544 insertTopLevelItem(index ,it);
545
546 emit moveItem(index,dragIndex);
547
548
549 // Re-Assign sequential id
550 for(int i=0;i<topLevelItemCount();i++){
551 topLevelItem(i)->setText(0,QString("%1").arg(i));
552 }
553}
554
555void SequenceTreeWidget::onContextMenuRequested(QPoint point)
556{
557 QPoint p = point;
558 QTreeWidgetItem *item = itemAt(p);
559
560 if(!item){
561 return;
562 }
563
564 QMenu menu;
565 QAction *copyAction = menu.addAction("Copy row");
566 QAction *pasteAction = menu.addAction("Paste row");
567 QAction *deleteAction = menu.addAction("Delete Row");
568 QAction *clipboardAction = menu.addAction("Copy to clipboard");
569
570 if(copyValues.isEmpty()){
571 pasteAction->setEnabled(false);
572 }
573
574 p.setY(point.y() + header()->height());
575 QAction *ret = menu.exec(mapToGlobal(p));
576
577 if (ret == clipboardAction)
578 {
579 QClipboard *clipboard = QApplication::clipboard();
580
581 QString selected_test;
582
583 for (int i = 2; i<columnCount(); i++)
584 {
585 selected_test = selected_test + item->text(i);
586 selected_test = selected_test + QString("\t");
587 }
588 clipboard->setText(selected_test);
589 }
590
591 if(ret == copyAction)
592 {
593 copyValues.clear();
594 for(int i=1; i<columnCount(); i++){
595 copyValues.append(item->text(i));
596 }
597 }
598
599 if(ret == pasteAction){
600 for(int i=1; i<columnCount(); i++){
601 item->setText(i,copyValues.at(i-1));
602 }
603 }
604
605 if(ret == deleteAction){
606 QList<QTreeWidgetItem*> deleteItems = selectedItems();
607 if(deleteItems.isEmpty() || topLevelItemCount() <= 1){
608 return;
609 }
610
611 int index = indexOfTopLevelItem(deleteItems.at(0));
612 delete takeTopLevelItem(index);
613
614 emit deletedItem(index);
615 // Re-Assign sequential id
616 for(int i=0;i<topLevelItemCount();i++){
617 topLevelItem(i)->setText(0,QString("%1").arg(i));
618 }
619 }
620}
bool ret
int SIGNAL(int pid, int signum)
void addValue(double pos, double speed)
int getSequenceNumber()
void setSequenceNumber(int index)
double getTiming()
void setTiming(double timing)
QList< double > getPositions()
QList< double > getSpeeds()
void deletedItem(int index)
void moveItem(int itemBefore, int item)
void dropEvent(QDropEvent *event) override
SequenceTreeWidget(QWidget *parent=0)
SequenceWindow(QString partName, int count, QWidget *parent=0)
void stopSequence()
void goToPosition(SequenceItem)
void run(QList< SequenceItem >)
void saveSequence(QList< SequenceItem >, QString)
void runTime(QList< SequenceItem >)
void cycleTime(QList< SequenceItem >)
void cycle(QList< SequenceItem >)
void onReceiveValues(int sequenceNum, QList< double >, QList< double > speeds)
void save(QString global_filename)
void closeEvent(QCloseEvent *event) override
void itemDoubleClicked(int sequenceNum)
void loadSequence(QList< SequenceItem >)
void openSequence()
Definition aboutdlg.h:11