From b81281e5165aeeacbab6a5e0df4dd0168cd791f8 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Thu, 13 Dec 2018 13:13:28 -0500
Subject: [PATCH] settings: inject settings widget dynamically into nav stack
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: Ifc07bff44ff3811971941751ef610ba2f9b12f24
Reviewed-by: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
---
 callwidget.cpp     |  10 +++-
 callwidget.h       |   3 +-
 callwidget.ui      | 123 ++++++++++++++++++++++++++++++++-------------
 mainwindow.cpp     |  87 ++++++++++++++++++++++++--------
 mainwindow.h       |   4 ++
 mainwindow.ui      |   6 ---
 settingswidget.cpp |   6 +--
 settingswidget.ui  |   4 +-
 8 files changed, 172 insertions(+), 71 deletions(-)

diff --git a/callwidget.cpp b/callwidget.cpp
index cd0283b..6d72b73 100644
--- a/callwidget.cpp
+++ b/callwidget.cpp
@@ -193,7 +193,8 @@ CallWidget::CallWidget(QWidget* parent) :
     // chat view
     ui->messageView->buildView();
 
-    emit setLeftSizeWidget(ui->currentAccountComboBox->width());
+    // hide the call stack
+    ui->callStackWidget->hide();
 }
 
 CallWidget::~CallWidget()
@@ -202,6 +203,12 @@ CallWidget::~CallWidget()
     delete menu_;
 }
 
+int
+CallWidget::getLeftPanelWidth()
+{
+    return ui->currentAccountComboBox->width();
+}
+
 void
 CallWidget::onIncomingMessage(const std::string& convUid,
                               uint64_t interactionId,
@@ -510,7 +517,6 @@ CallWidget::invitationsButtonClicked()
 void
 CallWidget::settingsButtonClicked()
 {
-    emit setLeftSizeWidget(ui->currentAccountComboBox->width());
     emit NavigationRequested(ScreenEnum::SetttingsScreen);
 }
 
diff --git a/callwidget.h b/callwidget.h
index 1501074..8e96b1c 100644
--- a/callwidget.h
+++ b/callwidget.h
@@ -64,8 +64,7 @@ public:
     explicit CallWidget(QWidget* parent = 0);
     ~CallWidget();
 
-signals:
-    void setLeftSizeWidget(int size);
+    int getLeftPanelWidth();
 
 public slots:
     void on_ringContactLineEdit_returnPressed();
diff --git a/callwidget.ui b/callwidget.ui
index 36c4cda..3ff6412 100644
--- a/callwidget.ui
+++ b/callwidget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1250</width>
-    <height>729</height>
+    <width>1230</width>
+    <height>657</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -332,6 +332,12 @@
                  </property>
                  <item>
                   <widget class="SmartListView" name="smartList">
+                   <property name="sizePolicy">
+                    <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
+                     <horstretch>0</horstretch>
+                     <verstretch>0</verstretch>
+                    </sizepolicy>
+                   </property>
                    <property name="autoScrollMargin">
                     <number>16</number>
                    </property>
@@ -430,6 +436,12 @@
                <number>0</number>
               </property>
               <widget class="QWidget" name="welcomePage">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
                <layout class="QVBoxLayout" name="verticalLayout_15">
                 <property name="spacing">
                  <number>0</number>
@@ -488,7 +500,7 @@
                 <item>
                  <widget class="QLabel" name="ringLogo">
                   <property name="sizePolicy">
-                   <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+                   <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum">
                     <horstretch>0</horstretch>
                     <verstretch>0</verstretch>
                    </sizepolicy>
@@ -519,39 +531,73 @@
                   </property>
                  </widget>
                 </item>
-                <item alignment="Qt::AlignHCenter">
-                 <widget class="QLabel" name="descLabel">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="font">
-                   <font>
-                    <pointsize>11</pointsize>
-                    <weight>50</weight>
-                    <bold>false</bold>
-                   </font>
-                  </property>
-                  <property name="styleSheet">
-                   <string notr="true"/>
-                  </property>
-                  <property name="text">
-                   <string>Jami is free software for universal communication which respects the freedoms and privacy of its users.</string>
+                <item>
+                 <layout class="QGridLayout" name="gridLayout_3">
+                  <property name="leftMargin">
+                   <number>10</number>
                   </property>
-                  <property name="textFormat">
-                   <enum>Qt::PlainText</enum>
+                  <property name="topMargin">
+                   <number>0</number>
                   </property>
-                  <property name="alignment">
-                   <set>Qt::AlignCenter</set>
+                  <property name="rightMargin">
+                   <number>10</number>
                   </property>
-                  <property name="wordWrap">
-                   <bool>true</bool>
+                  <property name="spacing">
+                   <number>0</number>
                   </property>
-                 </widget>
+                  <item row="0" column="0">
+                   <widget class="QLabel" name="descLabel">
+                    <property name="sizePolicy">
+                     <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                      <horstretch>0</horstretch>
+                      <verstretch>0</verstretch>
+                     </sizepolicy>
+                    </property>
+                    <property name="minimumSize">
+                     <size>
+                      <width>400</width>
+                      <height>0</height>
+                     </size>
+                    </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>400</width>
+                      <height>16777215</height>
+                     </size>
+                    </property>
+                    <property name="baseSize">
+                     <size>
+                      <width>400</width>
+                      <height>0</height>
+                     </size>
+                    </property>
+                    <property name="font">
+                     <font>
+                      <pointsize>11</pointsize>
+                      <weight>50</weight>
+                      <bold>false</bold>
+                     </font>
+                    </property>
+                    <property name="styleSheet">
+                     <string notr="true"/>
+                    </property>
+                    <property name="text">
+                     <string>Jami is free software for universal communication which respects the freedoms and privacy of its users.</string>
+                    </property>
+                    <property name="textFormat">
+                     <enum>Qt::PlainText</enum>
+                    </property>
+                    <property name="alignment">
+                     <set>Qt::AlignCenter</set>
+                    </property>
+                    <property name="wordWrap">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
                 </item>
-                <item alignment="Qt::AlignHCenter|Qt::AlignVCenter">
+                <item>
                  <widget class="QLabel" name="thisIsYourLabel">
                   <property name="sizePolicy">
                    <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
@@ -561,7 +607,7 @@
                   </property>
                   <property name="minimumSize">
                    <size>
-                    <width>400</width>
+                    <width>0</width>
                     <height>50</height>
                    </size>
                   </property>
@@ -827,14 +873,23 @@ Copy and share it with your friends!
                   </property>
                  </spacer>
                 </item>
-                <item alignment="Qt::AlignHCenter">
+                <item>
                  <widget class="QLabel" name="qrLabel">
+                  <property name="sizePolicy">
+                   <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+                    <horstretch>0</horstretch>
+                    <verstretch>0</verstretch>
+                   </sizepolicy>
+                  </property>
                   <property name="styleSheet">
                    <string notr="true">color: #aeaeae</string>
                   </property>
                   <property name="text">
                    <string>Error while generating QR Code</string>
                   </property>
+                  <property name="alignment">
+                   <set>Qt::AlignCenter</set>
+                  </property>
                  </widget>
                 </item>
                 <item>
@@ -897,7 +952,7 @@ Copy and share it with your friends!
                     </sizepolicy>
                    </property>
                    <property name="currentIndex">
-                    <number>1</number>
+                    <number>0</number>
                    </property>
                    <widget class="QWidget" name="videoPage">
                     <property name="sizePolicy">
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 434b98b..42b2240 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -39,7 +39,6 @@
 #include "utils.h"
 #include "wizarddialog.h"
 #include "version.h"
-#include "settingswidget.h"
 
 MainWindow::MainWindow(QWidget* parent) :
     QMainWindow(parent),
@@ -50,27 +49,22 @@ MainWindow::MainWindow(QWidget* parent) :
 
     connect(ui->wizardwidget, &WizardWidget::NavigationRequested,
         [this](ScreenEnum scr) {
-            Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
+            int index = scr;
+            if (scr == ScreenEnum::SetttingsScreen) {
+                index = addSettingsWidget();
+            }
+            Utils::setStackWidget(ui->navStack, ui->navStack->widget(index));
         });
 
     connect(ui->callwidget, &CallWidget::NavigationRequested,
-            [this](ScreenEnum scr) {
-            Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
-        });
-
-    connect(ui->settingswidget, &SettingsWidget::NavigationRequested,
-            [this](ScreenEnum scr) {
-            Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
-            if (scr == ScreenEnum::CallScreen) {
-                ui->callwidget->update();
+        [this](ScreenEnum scr) {
+            int index = scr;
+            if (scr == ScreenEnum::SetttingsScreen) {
+                index = addSettingsWidget();
             }
+            Utils::setStackWidget(ui->navStack, ui->navStack->widget(index));
         });
 
-    connect(ui->callwidget, &CallWidget::setLeftSizeWidget, [=](int size) {
-            ui->settingswidget->updateSettings(size);
-        }
-    );
-
     QIcon icon(":images/jami.png");
 
     this->setWindowIcon(icon);
@@ -80,13 +74,24 @@ MainWindow::MainWindow(QWidget* parent) :
 
     QMenu* menu = new QMenu();
 
-    auto configAction = new QAction(tr("Configuration"), this);
+    auto configAction = new QAction(tr("Settings"), this);
+    connect(configAction, &QAction::triggered,
+        [this]() {
+            if (auto settingsWidget = getSettingsWidget()) {
+                Utils::setStackWidget(ui->navStack, settingsWidget);
+            } else {
+                auto index = addSettingsWidget();
+                Utils::setStackWidget(ui->navStack, ui->navStack->widget(index));
+            }
+            setWindowState(Qt::WindowActive);
+        });
     menu->addAction(configAction);
 
     auto exitAction = new QAction(tr("Exit"), this);
-    connect(exitAction, &QAction::triggered, [this](){
-        QCoreApplication::exit();
-    });
+    connect(exitAction, &QAction::triggered,
+        [this]() {
+            QCoreApplication::exit();
+        });
     menu->addAction(exitAction);
 
     sysIcon.setContextMenu(menu);
@@ -154,6 +159,41 @@ MainWindow::~MainWindow()
     delete ui;
 }
 
+int
+MainWindow::addSettingsWidget()
+{
+    int index = -1;
+    if (ui->navStack->count() < ScreenEnum::SetttingsScreen + 1) {
+        auto settingsWidget = new SettingsWidget(this);
+        settingsWidget->updateSettings(ui->callwidget->getLeftPanelWidth());
+        index = ui->navStack->addWidget(settingsWidget);
+        connect(settingsWidget, &SettingsWidget::NavigationRequested,
+            [this](ScreenEnum scr) {
+                Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
+                removeSettingsWidget();
+                if (scr == ScreenEnum::CallScreen) {
+                    ui->callwidget->update();
+                }
+            });
+    }
+    return index;
+}
+
+void
+MainWindow::removeSettingsWidget()
+{
+    if (auto settingsWidget = getSettingsWidget()) {
+        ui->navStack->removeWidget(settingsWidget);
+        settingsWidget->deleteLater();
+    }
+}
+
+SettingsWidget*
+MainWindow::getSettingsWidget()
+{
+    return qobject_cast<SettingsWidget*>(ui->navStack->widget(ScreenEnum::SetttingsScreen));
+}
+
 void
 MainWindow::onRingEvent(const QString& uri)
 {
@@ -223,7 +263,12 @@ MainWindow::createThumbBar()
     settings->setIcon(icon);
     settings->setDismissOnClick(true);
     connect(settings, &QWinThumbnailToolButton::clicked, [this]() {
-        Utils::setStackWidget(ui->navStack, ui->settingswidget);
+        if (auto settingsWidget = getSettingsWidget()) {
+            Utils::setStackWidget(ui->navStack, settingsWidget);
+        } else {
+            auto index = addSettingsWidget();
+            Utils::setStackWidget(ui->navStack, ui->navStack->widget(index));
+        }
     });
 
     thumbbar->addButton(settings);
diff --git a/mainwindow.h b/mainwindow.h
index fc8a71f..2795f91 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -25,6 +25,7 @@
 #include <QNetworkConfigurationManager>
 
 #include "navwidget.h"
+#include "settingswidget.h"
 
 // LRC
 #include "call.h"
@@ -65,6 +66,9 @@ private:
     ~MainWindow();
 
     void readSettingsFromRegistry();
+    void removeSettingsWidget();
+    int addSettingsWidget();
+    SettingsWidget* getSettingsWidget();
 
     Ui::MainWindow* ui;
     QNetworkConfigurationManager netManager_;
diff --git a/mainwindow.ui b/mainwindow.ui
index eaf362f..0d49bd9 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -465,7 +465,6 @@
      <widget class="QStackedWidget" name="navStack">
       <widget class="WizardWidget" name="wizardwidget"/>
       <widget class="CallWidget" name="callwidget"/>
-      <widget class="SettingsWidget" name="settingswidget"/>
      </widget>
     </item>
    </layout>
@@ -485,11 +484,6 @@
    <header>wizardwidget.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>SettingsWidget</class>
-   <extends>QWidget</extends>
-   <header>settingswidget.h</header>
-  </customwidget>
  </customwidgets>
  <resources>
   <include location="ressources.qrc"/>
diff --git a/settingswidget.cpp b/settingswidget.cpp
index d8638f8..5eb000b 100644
--- a/settingswidget.cpp
+++ b/settingswidget.cpp
@@ -67,7 +67,7 @@
 SettingsWidget::SettingsWidget(QWidget* parent)
     : NavWidget(parent),
     ui(new Ui::SettingsWidget),
-    scrollArea_(new QScrollArea),
+    scrollArea_(new QScrollArea(this)),
     deviceModel_(&Video::DeviceModel::instance()),
     gif(new QMovie(":/images/ajax-loader.gif"))
 {
@@ -148,8 +148,6 @@ SettingsWidget::leaveSettingsSlot()
 
 SettingsWidget::~SettingsWidget()
 {
-    delete advancedSettingsWidget_;
-    delete scrollArea_;
     delete ui;
 }
 
@@ -276,7 +274,7 @@ SettingsWidget::toggleAdvancedSettings()
     }
     else { // will show advanced settings next
         ui->advancedAccountSettingsPButton->setIcon(QPixmap(":/images/icons/round-arrow_drop_up-24px.svg"));
-        advancedSettingsWidget_ = new AdvancedSettingsWidget(ui->scrollAreaWidgetContents);
+        advancedSettingsWidget_ = new AdvancedSettingsWidget(this);
         advancedSettingsWidget_->setMaximumWidth(ui->scrollAreaWidgetContents->width() - 10);
         ui->currentAccountSettingsScrollLayout->addWidget(advancedSettingsWidget_);
         ui->advancedSettingsOffsetLabel->show();
diff --git a/settingswidget.ui b/settingswidget.ui
index 9180149..704cc4f 100644
--- a/settingswidget.ui
+++ b/settingswidget.ui
@@ -1039,8 +1039,8 @@ QPushButton:pressed {background: rgb(230,230, 230);  border: 0px; border-radius:
               <rect>
                <x>0</x>
                <y>0</y>
-               <width>642</width>
-               <height>883</height>
+               <width>649</width>
+               <height>908</height>
               </rect>
              </property>
              <property name="styleSheet">
-- 
GitLab