8#include "ui_sequencewindow.h"
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)");
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");
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);
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()));
48 prevCurrentIndex = -1;
51 headers <<
"Sequence" <<
"Timing";
54 headers1 <<
"Sequence";
56 for(
int i=0;i<jointCount;i++){
57 headers << QString(
"Joint %1").arg(i);
58 headers1 << QString(
"Joint %1").arg(i);
62 ui->treePositions->setHeaderLabels(headers);
63 ui->treeSpeed->setHeaderLabels(headers1);
66 this,SLOT(onDoubleClickPositions(QTreeWidgetItem*,
int)));
69 this,SLOT(onDoubleClickSpeed(QTreeWidgetItem*,
int)));
71 connect(ui->treePositions,
SIGNAL(deletedItem(
int)),
this,SLOT(onDeletePosition(
int)));
72 connect(ui->treePositions,
SIGNAL(moveItem(
int,
int)),
this,SLOT(onMovePositions(
int,
int)));
80 for(
int i=0; i<jointCount;i++){
84 auto* itemPos =
new QTreeWidgetItem(ss);
85 ui->treePositions->addTopLevelItem(itemPos);
87 auto* itemSpeed =
new QTreeWidgetItem(ss1);
88 ui->treeSpeed->addTopLevelItem(itemSpeed);
97void SequenceWindow::onMovePositions(
int index,
int dragIndex)
99 QTreeWidgetItem * it = ui->treeSpeed->takeTopLevelItem(dragIndex);
101 ui->treeSpeed->insertTopLevelItem(index ,it);
105 for(
int i=0;i<ui->treeSpeed->topLevelItemCount();i++){
106 ui->treeSpeed->topLevelItem(i)->setText(0,QString(
"%1").arg(i));
110void SequenceWindow::onDeletePosition(
int index)
112 delete ui->treeSpeed->takeTopLevelItem(index);
115 for(
int i=0;i<ui->treeSpeed->topLevelItemCount();i++){
116 ui->treeSpeed->topLevelItem(i)->setText(0,QString(
"%1").arg(i));
123 QMainWindow::closeEvent(event);
133void SequenceWindow::onDoubleClickSpeed(QTreeWidgetItem *item,
int column)
138 item->setFlags(item->flags() | Qt::ItemIsEditable);
141 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
150void SequenceWindow::onDoubleClickPositions(QTreeWidgetItem *item,
int column)
154 item->setFlags(item->flags() | Qt::ItemIsEditable);
157 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
163 if(item != ui->treePositions->topLevelItem(ui->treePositions->topLevelItemCount()-1)){
170 ss << QString(
"%1").arg(ui->treePositions->topLevelItemCount()) <<
"-0.1";
173 ss1 << QString(
"%1").arg(ui->treePositions->topLevelItemCount());
175 for(
int i=0; i<jointCount;i++){
178 auto* newItem =
new QTreeWidgetItem(ss);
179 item->setFlags(newItem->flags() & ~Qt::ItemIsEditable);
180 ui->treePositions->addTopLevelItem(newItem);
182 auto* newItem1 =
new QTreeWidgetItem(ss1);
183 ui->treeSpeed->addTopLevelItem(newItem1);
193 for(
int i=0;i<values.count();i++){
194 ui->treePositions->topLevelItem(sequenceNum)->setText(i+2,QString(
"%1").arg(values.at(i)));
196 ui->treeSpeed->topLevelItem(sequenceNum)->setText(i+1,QString(
"%1").arg(speeds.at(i)));
203 if(ui->treePositions->currentItem() ==
nullptr){
206 int index = ui->treePositions->currentIndex().row();
207 double timing = ui->treePositions->topLevelItem(index)->text(1).toDouble();
217void SequenceWindow::onGo()
219 double timing = -0.1;
223 if(ui->treePositions->currentItem() !=
nullptr){
224 int index = ui->treePositions->currentIndex().row();
225 timing = ui->treePositions->topLevelItem(index)->text(1).toDouble();
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();
243void SequenceWindow::onRunTime()
245 emit
runTime(getValuesFromList());
250 QList <SequenceItem> seq = getValuesFromList();
251 if(seq.count() <= 0){
256 for(
int i=0;i<seq.count();i++){
273 QList <SequenceItem> seq = getValuesFromList();
274 if(seq.count() <= 0){
279 for(
int i=0;i<seq.count();i++){
296 QList <SequenceItem> seq = getValuesFromList();
297 if(seq.count() <= 0){
302 for(
int i=0;i<seq.count();i++){
320 QList <SequenceItem> seq = getValuesFromList();
321 if(seq.count() <= 0){
326 for(
int i=0;i<seq.count();i++){
342void SequenceWindow::onCycle()
344 emit
cycle(getValuesFromList());
347void SequenceWindow::onStopSequence()
352void SequenceWindow::onCycleTime()
357void SequenceWindow::onOpen()
368void SequenceWindow::onSave()
375 ui->treePositions->clear();
380 ui->treePositions->clear();
381 ui->treeSpeed->clear();
383 for(
int i=0; i<sequence.count();i++){
387 ss.append(QString(
"%1").arg(seq.
getTiming()));
396 for(
int i=0;i<seq.
getSpeeds().count();i++){
397 ss1.append(QString(
"%1").arg(seq.
getSpeeds().at(i)));
400 auto* newItem =
new QTreeWidgetItem(ss);
401 ui->treePositions->addTopLevelItem(newItem);
404 auto* newItem1 =
new QTreeWidgetItem(ss1);
405 ui->treeSpeed->addTopLevelItem(newItem1);
412QList <SequenceItem> SequenceWindow::getValuesFromList()
414 QList <SequenceItem> valuesList;
416 for(
int i=0;i<ui->treePositions->topLevelItemCount();i++){
417 QTreeWidgetItem *item = ui->treePositions->topLevelItem(i);
418 QTreeWidgetItem *item1 = ui->treeSpeed->topLevelItem(i);
420 double timing = item->text(1).toDouble();
426 for(
int j=2;j<item->columnCount();j++){
427 sequenceitem.
addValue(item->text(j).toDouble(),item1->text(j-1).toDouble());
429 valuesList.append(sequenceitem);
434void SequenceWindow::onRunTimeSequence()
436 runTimeAction->setEnabled(
true);
437 cycleAllAction->setEnabled(
false);
438 cycleTimeAction->setEnabled(
false);
439 goAction->setEnabled(
false);
440 saveAction->setEnabled(
false);
441 openAction->setEnabled(
false);
445void SequenceWindow::onCycleTimeSequence()
447 runTimeAction->setEnabled(
false);
448 cycleAllAction->setEnabled(
false);
449 cycleTimeAction->setEnabled(
true);
450 goAction->setEnabled(
false);
451 saveAction->setEnabled(
false);
452 openAction->setEnabled(
false);
456void SequenceWindow::onCycleSequence()
458 runTimeAction->setEnabled(
false);
459 cycleAllAction->setEnabled(
true);
460 cycleTimeAction->setEnabled(
false);
461 goAction->setEnabled(
false);
462 saveAction->setEnabled(
false);
463 openAction->setEnabled(
false);
466void SequenceWindow::onStoppedSequence()
468 runTimeAction->setEnabled(
true);
469 cycleAllAction->setEnabled(
true);
470 cycleTimeAction->setEnabled(
true);
471 goAction->setEnabled(
true);
472 saveAction->setEnabled(
true);
473 openAction->setEnabled(
true);
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));
480 ui->treePositions->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
482 for(
int i=0;i<ui->treeSpeed->columnCount();i++){
483 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
485 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
487 prevCurrentIndex = -1;
492void SequenceWindow::onSetCurrentSequenceIndex(
int index)
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));
498 ui->treePositions->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
500 for(
int i=0;i<ui->treeSpeed->columnCount();i++){
501 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setBackground(i,QColor(0,0,0,0));
503 ui->treeSpeed->topLevelItem(prevCurrentIndex)->setIcon(0,QIcon());
507 for(
int i=0;i<ui->treePositions->columnCount();i++){
508 ui->treePositions->topLevelItem(index)->setBackground(i,QColor(0,255,0,120));
511 ui->treePositions->topLevelItem(index)->setIcon(0,QIcon(
":/play.svg"));
513 for(
int i=0;i<ui->treeSpeed->columnCount();i++){
514 ui->treeSpeed->topLevelItem(index)->setBackground(i,QColor(0,255,0,120));
517 ui->treeSpeed->topLevelItem(index)->setIcon(0,QIcon(
":/play.svg"));
518 prevCurrentIndex = index;
526 connect(
this,
SIGNAL(customContextMenuRequested(QPoint)),
this,SLOT(onContextMenuRequested(QPoint)));
532 QTreeWidgetItem *item = itemAt(event->pos());
533 QList<QTreeWidgetItem*> dragItems = selectedItems();
535 if(!item || dragItems.isEmpty()){
538 int index = indexOfTopLevelItem(item);
540 QTreeWidgetItem *dragIt = dragItems.at(0);
541 int dragIndex = indexOfTopLevelItem(dragIt);
542 QTreeWidgetItem * it = takeTopLevelItem(dragIndex);
544 insertTopLevelItem(index ,it);
550 for(
int i=0;i<topLevelItemCount();i++){
551 topLevelItem(i)->setText(0,QString(
"%1").arg(i));
555void SequenceTreeWidget::onContextMenuRequested(QPoint point)
558 QTreeWidgetItem *item = itemAt(p);
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");
570 if(copyValues.isEmpty()){
571 pasteAction->setEnabled(
false);
574 p.setY(point.y() + header()->height());
575 QAction *
ret = menu.exec(mapToGlobal(p));
577 if (
ret == clipboardAction)
579 QClipboard *clipboard = QApplication::clipboard();
581 QString selected_test;
583 for (
int i = 2; i<columnCount(); i++)
585 selected_test = selected_test + item->text(i);
586 selected_test = selected_test + QString(
"\t");
588 clipboard->setText(selected_test);
591 if(
ret == copyAction)
594 for(
int i=1; i<columnCount(); i++){
595 copyValues.append(item->text(i));
599 if(
ret == pasteAction){
600 for(
int i=1; i<columnCount(); i++){
601 item->setText(i,copyValues.at(i-1));
605 if(
ret == deleteAction){
606 QList<QTreeWidgetItem*> deleteItems = selectedItems();
607 if(deleteItems.isEmpty() || topLevelItemCount() <= 1){
611 int index = indexOfTopLevelItem(deleteItems.at(0));
612 delete takeTopLevelItem(index);
616 for(
int i=0;i<topLevelItemCount();i++){
617 topLevelItem(i)->setText(0,QString(
"%1").arg(i));
int SIGNAL(int pid, int signum)
void addValue(double pos, double speed)
void setSequenceNumber(int index)
void setTiming(double timing)
QList< double > getPositions()
QList< double > getSpeeds()
SequenceWindow(QString partName, int count, QWidget *parent=0)
void goToPosition(SequenceItem)
bool checkAndCycleTimeSeq()
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 >)