From ce1efbf39ac639b87ce3d1c8d736cd2bf4acb440 Mon Sep 17 00:00:00 2001
From: Bert <bertrand.provot@insa-rennes.fr>
Date: Tue, 26 Jun 2018 11:28:08 +0200
Subject: [PATCH] update filter part1: interface

---
 app/Widgets/FilterChoice.cpp | 336 +++++++++++++++++++++++------------
 app/Widgets/FilterChoice.h   |  12 ++
 2 files changed, 238 insertions(+), 110 deletions(-)

diff --git a/app/Widgets/FilterChoice.cpp b/app/Widgets/FilterChoice.cpp
index 35738f0..531d486 100644
--- a/app/Widgets/FilterChoice.cpp
+++ b/app/Widgets/FilterChoice.cpp
@@ -39,6 +39,7 @@
 #include <QPushButton>
 #include <QSpinBox>
 #include <QTableView>
+#include <QTextEdit>
 
 #include <QFile>
 #include <QDomDocument>
@@ -79,18 +80,58 @@ void FilterChoice::initUI()
     QWidget* leftWidget = new QWidget();
     QLayout* leftLayout = new QVBoxLayout(leftWidget);
 
+
+    QGroupBox* stdOrCustomBox = new QGroupBox(tr("Select custom or standard filter"));
+    _stdButton = new QRadioButton(tr("Standard filter"));
+    _customButton = new QRadioButton(tr("Custom filter"));
+    QHBoxLayout* hbox = new QHBoxLayout();
+
+    _stdButton->setChecked(true);
+
+    hbox->addWidget(_stdButton);
+    hbox->addWidget(_customButton);
+    stdOrCustomBox->setLayout(hbox);
+
     QGroupBox* confBox = new QGroupBox(tr("Filter configuration"));
     QFormLayout* confLayout = new QFormLayout(confBox);
+
+    /* CUSTOM FILTER */
+
+    //gère l'appel du custom filter
+    //TODO
+
+    _labelCustom = new QLabel(this);
+    _labelCustom->setText(tr("Path to custom filter:"));
+    _filterPath = new QTextEdit("/");
+    _filterPath->setMaximumWidth(200);
+    _filterPath->setReadOnly(true);
+    _filterPathSelect = new QPushButton("...");
+    _filterPathSelect->setFixedWidth(40);
+    _filterPath->setMaximumHeight(25);
+    _pathLayout = new QHBoxLayout();
+    _pathLayout->addWidget(_filterPath);
+    _pathLayout->addWidget(_filterPathSelect);
+    _labelCustom->setVisible(false);
+    _filterPath->setVisible(false);
+    _filterPathSelect->setVisible(false);
+    confLayout->addRow(_labelCustom, _pathLayout);
+
     /* FILTER CHOICE */
-    QLabel* label = new QLabel(this);
-    label->setText(tr("Filter:"));
-    _blurChoices = new QComboBox(this);
-    QStringList blurs = initFilters();
-    _blurChoices->addItems(blurs);
+
+    _label = new QLabel(this);
+    _label->setText(tr("Filter:"));
+    if(_a){
+        _blurChoices = new QComboBox(this);
+        QStringList blurs = initFilters();
+        _blurChoices->addItems(blurs);
+        _a=false;
+    }
+    QObject::connect(_customButton, SIGNAL(toggled(bool)), this, SLOT(updateBlur(bool)));
     QObject::connect(_blurChoices, SIGNAL(currentIndexChanged(int)), this, SLOT(currentBlurChanged(int)));
-    confLayout->addRow(label, _blurChoices);
+    confLayout->addRow(_label, _blurChoices);
 
     /* POLICIES CHOICE */
+
     QLabel* label_2 = new QLabel(this);
     label_2->setText(tr("Edge policy: "));
     _policyChoices = new QComboBox(this);
@@ -122,12 +163,14 @@ void FilterChoice::initUI()
     radioBox->layout()->addWidget(_stdResButton);
     radioBox->layout()->addWidget(_dblResButton);
 
+    leftLayout->addWidget(stdOrCustomBox);
     leftLayout->addWidget(confBox);
     leftLayout->addWidget(radioBox);
 
 
     mainLayout->addWidget(leftWidget);
 
+    QObject::connect(_customButton, SIGNAL(toggled(bool)), this, SLOT(showCustom(bool)));
     QObject::connect(_number, SIGNAL(valueChanged(const QString&)), this, SLOT(dataChanged(const QString&)));
     QObject::connect(_stdDevBox, SIGNAL(valueChanged(const QString&)), this, SLOT(dataChanged(const QString&)));
 
@@ -168,16 +211,6 @@ void FilterChoice::initUI()
     QObject::connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
     QObject::connect(_deleteButton, SIGNAL(clicked()), this, SLOT(deleteFilter()));
 
-//    QLayoutItem* spaceItem = new QSpacerItem(512, 512);
-//    leftLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
-//    leftLayout->setItem(2, QFormLayout::SpanningRole, spaceItem);
-//    QWidget* spacerWidget = new QWidget();
-//    spacerWidget->setFixedSize(32, 32);
-//    spacerWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-//    leftWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
-//    leftLayout->addRow(spacerWidget);
-//    leftLayout->addRow(buttonBox);
-
     mainLayout->addWidget(rightWidget);
     layout->addWidget(buttonBox);
 
@@ -189,80 +222,142 @@ void FilterChoice::initUI()
  * @return QStringList
  */
 QStringList FilterChoice::initFilters() {
-
   QStringList blurs = QStringList();
-  blurs << tr("Uniform") << tr("Gaussian") << tr("Prewitt") << tr("Roberts") << tr("Sobel") << tr("SquareLaplacien");
-
-  _filters.push_back(Filter::uniform(3));
-  _filters.push_back(Filter::gaussian(3, 1.));
-  _filters.push_back(Filter::prewitt(3));
-  _filters.push_back(Filter::roberts());
-  _filters.push_back(Filter::sobel());
-  _filters.push_back(Filter::squareLaplacien());
-
-  //Personal filters
-  QFile file("filters.xml");
-  if(file.exists())
-  {
-    QDomDocument doc("");
-    file.open(QIODevice::ReadOnly);
-      doc.setContent(&file);
-      file.close();
-
-    QDomElement root = doc.documentElement();
-    QDomNode child = root.firstChild();
-      while(!child.isNull())
+  std::cout << "------\n";
+  std::cout << "IN INITFILTER\n";
+  std::cout << "is custom button checked ?" << _customButton->isChecked() << "\n";
+
+  if(!_customButton->isChecked()){
+      std::cout << "not checked\n";
+      blurs << tr("Uniform") << tr("Gaussian") << tr("Prewitt") << tr("Roberts") << tr("Sobel") << tr("SquareLaplacien");
+      _filters.push_back(Filter::uniform(3));
+      _filters.push_back(Filter::gaussian(3, 1.));
+      _filters.push_back(Filter::prewitt(3));
+      _filters.push_back(Filter::roberts());
+      _filters.push_back(Filter::sobel());
+      _filters.push_back(Filter::squareLaplacien());
+      std::cout << "filters size : " << _filters.size() << "\n";
+  }
+  else{
+      std::cout << "definitely checked\n";
+      //Personal filters
+      QFile file("filters.xml");
+      if(file.exists())
       {
-      QDomElement e = child.toElement();
-        // We know how to treat appearance and geometry
-      blurs.push_back(e.attribute("name"));
+        QDomDocument doc("");
+        file.open(QIODevice::ReadOnly);
+          doc.setContent(&file);
+          file.close();
+
+        QDomElement root = doc.documentElement();
+        QDomNode child = root.firstChild();
+          while(!child.isNull())
+          {
+          QDomElement e = child.toElement();
+            // We know how to treat appearance and geometry
+          blurs.push_back(e.attribute("name"));
 
-      int nbFilters = e.attribute("nbFilters").toInt();
+          int nbFilters = e.attribute("nbFilters").toInt();
 
-      std::vector<Filter*> temp;
-      QDomNode grandChild = e.firstChild();
-      for(int i = 0; i < nbFilters && !grandChild.isNull(); i++)
-      {
-        QDomElement grandChildElement = grandChild.toElement();
-        if(!grandChildElement.isNull())
-        {
-          Filter* f = new Filter(grandChildElement.attribute("width").toInt(), grandChildElement.attribute("height").toInt());
-          // We know how to treat color
-          if (grandChildElement.tagName() == "values")
+          std::vector<Filter*> temp;
+          QDomNode grandChild = e.firstChild();
+          for(int i = 0; i < nbFilters && !grandChild.isNull(); i++)
           {
-            std::string str = grandChildElement.text().toStdString();
-            std::string word;
-            std::stringstream stream(str);
-            unsigned int w = 0, h = 0;
-            while(getline(stream, word, ' '))
+            QDomElement grandChildElement = grandChild.toElement();
+            if(!grandChildElement.isNull())
             {
-//              (*f)[w][h] = QString::fromStdString(word).toInt();
-                f->setPixelAt(w, h, QString::fromStdString(word).toDouble());
-
-              if(w == f->getWidth() - 1)
+              Filter* f = new Filter(grandChildElement.attribute("width").toInt(), grandChildElement.attribute("height").toInt());
+              // We know how to treat color
+              if (grandChildElement.tagName() == "values")
               {
-                w = 0;
-                h++;
+                std::string str = grandChildElement.text().toStdString();
+                std::string word;
+                std::stringstream stream(str);
+                unsigned int w = 0, h = 0;
+                while(getline(stream, word, ' '))
+                {
+                    f->setPixelAt(w, h, QString::fromStdString(word).toDouble());
+
+                  if(w == f->getWidth() - 1)
+                  {
+                    w = 0;
+                    h++;
+                  }
+                  else
+                    w++;
+                }
               }
-              else
-                w++;
+              temp.push_back(f);
             }
+            grandChild = grandChild.nextSibling();
           }
-          temp.push_back(f);
-        }
-        grandChild = grandChild.nextSibling();
-      }
-      _filters.push_back(temp);
+          _filters.push_back(temp);
 
-      child = child.nextSibling();
+          child = child.nextSibling();
+          }
       }
   }
   return blurs;
 }
+/**
+ * @brief FilterChoice::updateBlur
+ * @param z
+ */
+void FilterChoice::updateBlur(bool){
+    std::cout << "#########\n";
+    std::cout << "IN UPDATE BLUR \n";
+    std::cout << "filters size:" << _filters.size() << "\n";
+    _filters.clear();
+    std::cout << "filters size after clearance:" << _filters.size() << "\n";
+    std::cout << "blur choices count:" << _blurChoices->count() <<"\n";
+ /*   while(_blurChoices->count()!=0){
+        std::cout << "inwhile\n";
+        _blurChoices->removeItem((_blurChoices->count()));
+        std::cout << "blur choice count:" << _blurChoices->count() << "\n";
+        std::cout << "outwhile\n";
+
+
+}*/
+  /*  if(_blurChoices->count()!=0){
+       _blurChoices = new QComboBox(this);
+   }*/
+    if(_blurChoices->count()!=0){
+        _blurChoices->clear();
+    }
+    QStringList blurs = initFilters();
+    _blurChoices->addItems(blurs);
+    std::cout << "filters size when exiting updateblur:" << _filters.size() << "\n";
+    std::cout << "current index : " << _blurChoices->currentIndex() << "\n";
+    std::cout << "OUT UPDATE BLUR \n";
+    std::cout << "#-#-#-#-#\n";
+}
+
+/**
+ * @brief FilterChoice::showCustom()
+ *
+ * @param a selects whether or not the custom filter are enabled
+ */
+void FilterChoice::showCustom(bool a){
+    std::cout << "in showcustom\n";
+    if(a){
+        _labelCustom->setVisible(true);
+        _filterPath->setVisible(true);
+        _filterPathSelect->setVisible(true);
+    }
+
+    else{
+        _labelCustom->setVisible(false);
+        _filterPath->setVisible(false);
+        _filterPathSelect->setVisible(false);
+    }
+    std::cout << "out showcustom \n";
+    _a=false;
+}
 
 /**
  * @brief
  *
+ *
  * @param int
  */
 void FilterChoice::currentBlurChanged(int)
@@ -295,7 +390,6 @@ void FilterChoice::validate()
       break;
     case 1:
       _filtering = new Filtering(Filtering::gaussianBlur(num, _stdDevBox->value()));
-//      _filtering = new Filtering(_filters[_blurChoices->currentIndex()]);
       break;
     case 2:
       _filtering = new Filtering(Filtering::prewitt(num));
@@ -384,43 +478,66 @@ void FilterChoice::deleteFilter()
  */
 void FilterChoice::updateDisplay()
 {
-  std::vector<Filter*> filters;
-  int num = _number->value();
-  switch(_blurChoices->currentIndex())
-  {
-    case 0:
-      filters = Filter::uniform(num);
-      _number->show();
-      _labelNumber->show();
-      _stdDevBox->hide();
-      _stdDevLabel->hide();
-      break;
-    case 1:
-      filters = Filter::gaussian(num, _stdDevBox->value());
-      _number->show();
-      _labelNumber->show();
-      _stdDevBox->show();
-      _stdDevLabel->show();
-      break;
-    case 2:
-      filters = Filter::prewitt(num);
-      _number->show();
-      _labelNumber->show();
-      _stdDevBox->hide();
-      _stdDevLabel->hide();
-      break;
-    default:
-      filters = _filters[_blurChoices->currentIndex()];
-      _number->hide();
-      _labelNumber->hide();
-      _stdDevBox->hide();
-      _stdDevLabel->hide();
-  }
-  
-  if(_blurChoices->currentIndex() > 5)
-    _deleteButton->setEnabled(true);
-  else
-    _deleteButton->setEnabled(false);
+      std::cout << "we are in the switch\n";
+      std::vector<Filter*> filters;
+      _deleteButton->setEnabled(false);
+      int num = _number->value();
+      if(_blurChoices->currentIndex()!=-1){
+          if(!_customButton->isChecked()){
+                switch(_blurChoices->currentIndex())
+                {
+                    case 0:
+                        std::cout << "past case0\n";
+                        filters = Filter::uniform(num);
+                        _number->show();
+                        _labelNumber->show();
+                        _stdDevBox->hide();
+                        _stdDevLabel->hide();
+                break;
+                    case 1:
+                        std::cout << "past case1\n";
+                        filters = Filter::gaussian(num, _stdDevBox->value());
+                        _number->show();
+                        _labelNumber->show();
+                        _stdDevBox->show();
+                        _stdDevLabel->show();
+                break;
+                    case 2:
+                        std::cout << "past case2\n";
+                        filters = Filter::prewitt(num);
+                        _number->show();
+                        _labelNumber->show();
+                        _stdDevBox->hide();
+                        _stdDevLabel->hide();
+                break;
+                    default:
+                        std::cout << "past default\n";
+                        std::cout << filters.size();
+                        std::cout << _filters.size();
+                        filters = _filters[_blurChoices->currentIndex()];
+                        _number->hide();
+                        _labelNumber->hide();
+                        _stdDevBox->hide();
+                        _stdDevLabel->hide();
+                        std::cout << "outt default\n";
+                }
+            }else{
+              filters = _filters[_blurChoices->currentIndex()];
+              _number->hide();
+              _labelNumber->hide();
+              _stdDevBox->hide();
+              _stdDevLabel->hide();
+          }
+        }else{
+            _number->hide();
+            _labelNumber->hide();
+            _stdDevBox->hide();
+            _stdDevLabel->hide();
+        }
+
+    if(_customButton->isChecked()){
+        _deleteButton->setEnabled(true);
+    }
   
   unsigned int height(0), width(0);
   
@@ -451,7 +568,6 @@ void FilterChoice::updateDisplay()
     {
       for(unsigned int k = 0; k < filters[i]->getWidth(); k++)
       {
-//        int value = (*filters[i])[j - height][k];
         double value = filters[i]->getPixelAt(k, j);
         QTableWidgetItem* item = new QTableWidgetItem(QString::number(value));
         item->setTextAlignment(Qt::AlignHCenter);
diff --git a/app/Widgets/FilterChoice.h b/app/Widgets/FilterChoice.h
index ad2e74c..ada33ff 100644
--- a/app/Widgets/FilterChoice.h
+++ b/app/Widgets/FilterChoice.h
@@ -36,6 +36,7 @@
 #include <QStringList>
 #include <Algorithm/Filtering.h>
 #include <QRadioButton>
+#include <QTextEdit>
 
 namespace filtrme
 {
@@ -63,8 +64,11 @@ namespace filtrme
     void validate();
     void cancel();
     void deleteFilter();
+    void showCustom(bool);
+    void updateBlur(bool);
 
   private:
+    bool _a = true;
     void initUI();
     void updateDisplay();
     QStringList initFilters();
@@ -73,6 +77,14 @@ namespace filtrme
     
     QComboBox* _blurChoices;
     QComboBox* _policyChoices;
+
+    QLabel* _label;
+    QTextEdit* _filterPath;
+    QPushButton* _filterPathSelect;
+    QLabel* _labelCustom;
+    QRadioButton* _stdButton;
+    QRadioButton* _customButton;
+    QHBoxLayout* _pathLayout;
     
     QLabel* _labelNumber;
     QSpinBox* _number;
-- 
GitLab