From 9e7b2a02297a6eb2fbb5f71824404c73e09c982b Mon Sep 17 00:00:00 2001 From: roangel <roangel@student.ethz.ch> Date: Fri, 26 May 2017 11:41:56 +0200 Subject: [PATCH] Rework in CFZones. When we remove now, everything OK, we unlink perfectly, we dont change the names... Getting some crashes when we close tabs. Need to fix --- .../GUI_Qt/CrazyFlyGUI/include/CFLinker.h | 7 +- .../CrazyFlyGUI/include/mainguiwindow.h | 5 ++ .../CrazyFlyGUI/include/myGraphicsScene.h | 1 - .../GUI_Qt/CrazyFlyGUI/src/CFLinker.cpp | 26 +++++- .../GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp | 87 ++++++++++++++++--- .../CrazyFlyGUI/src/myGraphicsScene.cpp | 66 +++++++++----- 6 files changed, 151 insertions(+), 41 deletions(-) diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/CFLinker.h b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/CFLinker.h index bc15520d..9c2c9673 100644 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/CFLinker.h +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/CFLinker.h @@ -26,13 +26,16 @@ public: ~CFLinker(); void link(); - void unlink(); + void unlink_selection(); + void unlink_cf_zone(int cf_zone_index); std::vector<struct link> links; bool isStudentIDLinked(int student_id); bool isCFZoneLinked(int cf_zone_index); bool isCFLinked(std::string cf_name); + int getCFZoneIndexFromName(QString name); + int getCFIndexFromName(std::string name); signals: void updateComboBoxes(); @@ -45,8 +48,6 @@ private: std::vector<crazyFly*>* m_crazyflies_vector; std::vector<crazyFlyZone*>* m_crazyfly_zones; - int getCFZoneIndexFromName(QString name); - int getCFIndexFromName(std::string name); void addNewRow(int student_id, std::string crazyfly_name, int cf_zone_index); }; diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h index f3421018..c7a1beba 100755 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h @@ -115,6 +115,9 @@ private slots: void updateComboBoxes(); + void setTabIndex(int index); + void doTabClosed(int tab_index); + private: Ui::MainGUIWindow *ui; @@ -133,6 +136,8 @@ private: void updateComboBoxesCFZones(); + int getTabIndexFromName(QString name); + }; diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/myGraphicsScene.h b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/myGraphicsScene.h index ac2e8dd3..2418484d 100755 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/myGraphicsScene.h +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/myGraphicsScene.h @@ -72,7 +72,6 @@ private: void addCrazyFlyZoneToVector(crazyFlyZone* rect); void addTablePieceToVector(tablePiece* rect); int checkSelectedCrazyFlyZone(); - void updateIndexesAndLabelsCrazyFlyZones(); void removeTablePiece(int index); QPen* pen; diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/CFLinker.cpp b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/CFLinker.cpp index 545a0bb2..5c80c475 100644 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/CFLinker.cpp +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/CFLinker.cpp @@ -123,7 +123,31 @@ void CFLinker::link() // ui->comboBox->setItemData(index, 33, Qt::UserRole - 1); } -void CFLinker::unlink() +void CFLinker::unlink_cf_zone(int cf_zone_index) +{ + for(int i = 0; i < links.size(); i++) + { + if(links[i].cf_zone_index == cf_zone_index) + { + links.erase(links.begin() + i); + break; + } + } + // remove them graphically + for(int i = 0; i < m_ui->table_links->rowCount(); i++) + { + QString name = m_ui->table_links->item(i, 2)->text(); //2 because cf zone + if(getCFZoneIndexFromName(name) == cf_zone_index) + { + m_ui->table_links->removeRow(i); + break; + } + } + // update combo boxes + emit updateComboBoxes(); +} + +void CFLinker::unlink_selection() { QModelIndexList selection = m_ui->table_links->selectionModel()->selectedRows(); diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp index 486e736e..601d24db 100755 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp @@ -41,19 +41,64 @@ MainGUIWindow::~MainGUIWindow() delete ui; } +int MainGUIWindow::getTabIndexFromName(QString name) +{ + int found_name = -1; + for(int i = 0; i < ui->tabWidget->count(); i++) + { + qDebug("name: %s", name.toStdString().c_str()); + qDebug("tabText: %s", ui->tabWidget->tabText(i).toStdString().c_str()); + if(name == ui->tabWidget->tabText(i)) + { + found_name = i; + } + } + return found_name; +} void MainGUIWindow::doNumCrazyFlyZonesChanged(int n) { // tabs number management, maybe do it in a different way so we dont have to remove and add everything? - ui->tabWidget->clear(); - for (int i = 0; i < n; i++) + // first check if size of tabs is greater than size of vector or viceversa. Have we removed or added a zone? + qDebug("tabWidgetCount : %d", ui->tabWidget->count()); + if(ui->tabWidget->count() > scene->crazyfly_zones.size()) + { + // we removed one crazyfly_zone, n means index of the one we removed. Look for that index tab and remove it + QString qstr = "CrazyFly "; + qstr.append(QString::number(n+1)); + if(scene->crazyfly_zones.size() == 0) + { + ui->tabWidget->clear(); + } + int found_index = getTabIndexFromName(qstr); + if(found_index != -1) + { + ui->tabWidget->removeTab(found_index); + } + + // now unlink it from table also: + if(cf_linker->isCFZoneLinked(n)) + { + cf_linker->unlink_cf_zone(n); + } + } + else if(ui->tabWidget->count() < scene->crazyfly_zones.size()) { + // we added one crazyfly_zone, n means index of the new one. New tab will be labeld index + 1 QString qstr = "CrazyFly "; - qstr.append(QString::number(i+1)); - crazyFlyZoneTab* widget = new crazyFlyZoneTab(i); - ui->tabWidget->addTab(widget, qstr); + qstr.append(QString::number(n+1)); + crazyFlyZoneTab* widget = new crazyFlyZoneTab(n); + ui->tabWidget->insertTab(n, widget, qstr); connect(widget, SIGNAL(centerButtonClickedSignal(int)), this, SLOT(centerViewIndex(int))); } + // for (int i = 0; i < n; i++) + // { + // QString qstr = "CrazyFly "; + // qstr.append(QString::number(i+1)); + // crazyFlyZoneTab* widget = new crazyFlyZoneTab(i); + // ui->tabWidget->addTab(widget, qstr); + // connect(widget, SIGNAL(centerButtonClickedSignal(int)), this, SLOT(centerViewIndex(int))); + // } updateComboBoxesCFZones(); } @@ -122,10 +167,9 @@ void MainGUIWindow::_init() cf_linker = new CFLinker(ui, &crazyflies_vector, &scene->crazyfly_zones); #endif // connections - QObject::connect(ui->tabWidget, SIGNAL(tabCloseRequested(int)), scene, SLOT(removeCrazyFlyZone(int))); + QObject::connect(ui->tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(doTabClosed(int))); QObject::connect(scene, SIGNAL(numCrazyFlyZonesChanged(int)), this, SLOT(doNumCrazyFlyZonesChanged(int))); - QObject::connect(ui->tabWidget, SIGNAL(currentChanged(int)), scene, SLOT(setSelectedCrazyFlyZone(int))); - QObject::connect(scene, SIGNAL(crazyFlyZoneSelected(int)), ui->tabWidget, SLOT(setCurrentIndex(int))); + QObject::connect(scene, SIGNAL(crazyFlyZoneSelected(int)), this, SLOT(setTabIndex(int))); QObject::connect(scene, SIGNAL(modeChanged(int)), this, SLOT(transitionToMode(int))); QObject::connect(scene, SIGNAL(numTablePiecesChanged(int)), this, SLOT(handleTablePiecesNumChanged(int))); @@ -139,6 +183,20 @@ void MainGUIWindow::_init() #endif } +void MainGUIWindow::doTabClosed(int tab_index) +{ + QString name = ui->tabWidget->tabText(tab_index); + int cf_index = cf_linker->getCFZoneIndexFromName(name); + scene->removeCrazyFlyZone(cf_index); +} + +void MainGUIWindow::setTabIndex(int index) +{ + QString qstr = "CrazyFly "; + qstr.append(QString::number(index + 1)); + ui->tabWidget->setCurrentIndex(getTabIndexFromName(qstr)); +} + void MainGUIWindow::updateComboBoxes() { updateComboBoxesCFs(); @@ -167,8 +225,9 @@ void MainGUIWindow::updateComboBoxesCFZones() { if(!cf_linker->isCFZoneLinked(scene->crazyfly_zones[i]->getIndex())) { + int cf_zone_index = scene->crazyfly_zones[i]->getIndex(); QString qstr = "CrazyFlyZone "; - qstr.append(QString::number(i+1)); + qstr.append(QString::number(cf_zone_index + 1)); ui->comboBoxCFZones->addItem(qstr); } } @@ -421,10 +480,10 @@ void MainGUIWindow::on_checkBox_crazyfly_zones_toggled(bool checked) void MainGUIWindow::on_tabWidget_currentChanged(int index) { - if(index >= 0) - { - scene->setSelectedCrazyFlyZone(index); - } + // this index is tab index. Need to go to cf index + QString name = ui->tabWidget->tabText(index); + int cf_index = cf_linker->getCFZoneIndexFromName(name); + scene->setSelectedCrazyFlyZone(cf_index); } void MainGUIWindow::centerViewIndex(int index) @@ -621,6 +680,6 @@ void MainGUIWindow::on_link_button_clicked() void MainGUIWindow::on_unlink_button_clicked() { #ifdef CATKIN_MAKE - cf_linker->unlink(); + cf_linker->unlink_selection(); #endif } diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/myGraphicsScene.cpp b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/myGraphicsScene.cpp index 389f8298..4cf079ff 100755 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/myGraphicsScene.cpp +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/src/myGraphicsScene.cpp @@ -71,10 +71,13 @@ void myGraphicsScene::setSelectedCrazyFlyZone(int index) { for(unsigned int i = 0; i < crazyfly_zones.size(); i++) { + qDebug("index: %d", index); + qDebug("i: %d", i); + qDebug("getIndex: %d", crazyfly_zones[i]->getIndex()); crazyfly_zones[i]->setSelected(false); - if(index == i) + if(index == crazyfly_zones[i]->getIndex()) { - crazyfly_zones[index]->setSelected(true); + crazyfly_zones[i]->setSelected(true); } } } @@ -85,8 +88,8 @@ int myGraphicsScene::checkSelectedCrazyFlyZone() { if(crazyfly_zones[i]->isSelected()) { - qDebug("rectangle selected index = %d", i); - return i; + qDebug("rectangle selected index = %d", crazyfly_zones[i]->getIndex()); + return crazyfly_zones[i]->getIndex(); } } return -1; @@ -115,8 +118,38 @@ void myGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) startedRect = true; p1 = new QPointF(mouseEvent->scenePos()); tmp_rect = new QRectF(*p1, *p1); - int index = crazyfly_zones.size(); - tmp_crazyfly_zone_item = new crazyFlyZone(*tmp_rect, index); + // look for first available index here + bool first_available_value_found = false; + int first_available_value = 0; + while(!first_available_value_found) + { + if(crazyfly_zones.size() == 0) + { + first_available_value_found = true; + break; + } + else // we enter the for loop for sure + { + bool index_is_present = false; + for(int i = 0; i < crazyfly_zones.size(); i++) + { + if(crazyfly_zones[i]->getIndex() == first_available_value) + { + index_is_present = true; + break; // break because we finish searching here + } + } + if(!index_is_present) + { + first_available_value_found = true; // finish loop here, found value + break; + } + } + + first_available_value++; //first iteration 0 + } + qDebug("---------------------------first available value: %d", first_available_value); + tmp_crazyfly_zone_item = new crazyFlyZone(*tmp_rect, first_available_value); addItem(tmp_crazyfly_zone_item); break; } @@ -163,7 +196,7 @@ void myGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) void myGraphicsScene::addCrazyFlyZoneToVector(crazyFlyZone* rect) { crazyfly_zones.push_back(rect); - emit numCrazyFlyZonesChanged(crazyfly_zones.size()); + emit numCrazyFlyZonesChanged(rect->getIndex()); } void myGraphicsScene::addTablePieceToVector(tablePiece* rect) @@ -172,18 +205,6 @@ void myGraphicsScene::addTablePieceToVector(tablePiece* rect) emit numTablePiecesChanged(table_pieces.size()); } -void myGraphicsScene::updateIndexesAndLabelsCrazyFlyZones() -{ - for(int i = 0; i < crazyfly_zones.size(); i++) - { - crazyfly_zones[i]->setIndex(i); - std::string str = std::to_string(i + 1); - crazyfly_zones[i]->updateLabel(str.c_str()); - qDebug("reset Index %d and update label",i); - - } -} - void myGraphicsScene::changeModeTo(int next_mode) { mode = next_mode; @@ -302,11 +323,11 @@ QRectF myGraphicsScene::getRectFCrazyFlyZone(int index) void myGraphicsScene::removeCrazyFlyZone(int index) { + int n = crazyfly_zones[index]->getIndex(); this->removeItem(crazyfly_zones[index]); crazyfly_zones.erase(crazyfly_zones.begin() + index); qDebug("removed CFzone %d", index); - updateIndexesAndLabelsCrazyFlyZones(); - emit numCrazyFlyZonesChanged(crazyfly_zones.size()); // for tab managing + emit numCrazyFlyZonesChanged(n); // for tab managing } void myGraphicsScene::removeTable() @@ -386,7 +407,8 @@ void myGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { tmp_crazyfly_zone_item->setRect(tmp_crazyfly_zone_item->rect().normalized()); addCrazyFlyZoneToVector(tmp_crazyfly_zone_item); - std::string str = std::to_string(crazyfly_zones.size()); + // TODO: set first available number, not size of vector. Index + 1 + std::string str = std::to_string(tmp_crazyfly_zone_item->getIndex() + 1); tmp_crazyfly_zone_item->setLabel(str.c_str()); setSelectedCrazyFlyZone(crazyfly_zones.size() - 1); //select just created rectangle tmp_rect = 0; -- GitLab