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