From 0b3e0b661e8486d81d38a70ff6be7c105069a26f Mon Sep 17 00:00:00 2001
From: Mirko Waechter <mirko.waechter@kit.edu>
Date: Thu, 11 Aug 2016 18:21:05 +0200
Subject: [PATCH] widget name popup only appears if the name is already taken +
 widget name can be edited

---
 .../ArmarXGui/ArmarXMainWindow.cpp            | 21 ++++++----
 .../ArmarXGui/Widgets/TitlebarWidget.cpp      | 39 ++++++++++++++++---
 .../ArmarXGui/Widgets/TitlebarWidget.h        |  7 +++-
 .../ArmarXGui/Widgets/WidgetNameDialog.cpp    | 14 +++++--
 .../ArmarXGui/Widgets/WidgetNameDialog.h      |  7 +++-
 5 files changed, 69 insertions(+), 19 deletions(-)

diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp
index c4a5f114..4d908824 100644
--- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp
+++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp
@@ -847,7 +847,7 @@ void ArmarXMainWindow::saveGuiConfig()
 
     for (; it != listOpenWidgets.end(); it++)
     {
-        QString prefix = it.value().first->windowTitle();
+        QString prefix = it.value().first->objectName();
         ARMARX_VERBOSE << "Saving widget: " << prefix.toStdString();
         settings.beginGroup(prefix);
         ArmarXWidgetControllerPtr w = ArmarXWidgetControllerPtr::dynamicCast(it.value().second);
@@ -991,8 +991,8 @@ ArmarXWidgetControllerPtr ArmarXMainWindow::addArmarXWidget(ArmarXWidgetControll
     connect(dockWidget, SIGNAL(destroyed(QObject*)), this, SLOT(removeArmarXWidget(QObject*)));
 
     dockWidget->setArmarXWidget(newWidgetController->getWidget());
-    dockWidget->setObjectName("Dock" + customInstanceName);
-    StatusDockWidgetTitleBar* customTitlebar = new StatusDockWidgetTitleBar(dockWidget);
+    dockWidget->setObjectName(customInstanceName);
+    StatusDockWidgetTitleBar* customTitlebar = new StatusDockWidgetTitleBar(dockWidget, this);
     dockWidget->setTitleBarWidget(customTitlebar);
     customTitlebar->addCustomWidget(newWidgetController->getCustomTitlebarWidget(dockWidget));
 
@@ -1319,7 +1319,7 @@ void ArmarXMainWindow::updateOpenWidgetList()
     for (; it != listOpenWidgets.end(); it++)
     {
         QDockWidget* dockWidget = it.value().first;
-        QAction* action = new QAction(dockWidget ->windowTitle(), ui->menuWindows);
+        QAction* action = new QAction(dockWidget ->objectName(), ui->menuWindows);
         action->setCheckable(true);
         action->setChecked(!dockWidget ->isHidden());
 
@@ -1399,7 +1399,7 @@ AddArmarXWidgetAction::AddArmarXWidgetAction(QString widgetName, QObject* parent
     : QAction(widgetName, parent),
       mainGui(mainGui)
 {
-    dialog = new WidgetNameDialog(mainGui);
+    dialog = new WidgetNameDialog(widgetName, mainGui);
     connect(dialog, SIGNAL(accepted()), this, SLOT(dialogAccepted()));
 }
 
@@ -1433,8 +1433,15 @@ void AddArmarXWidgetAction::addArmarXWidget()
     dialog->editWidgetName->setText("");// reset so that TextChanged is called for sure
     dialog->editWidgetName->setText(this->text());
 
-    dialog->setModal(true);
-    dialog->show();
+    if (!dialog->checkWidgetName(this->text()))
+    {
+        dialog->setModal(true);
+        dialog->show();
+    }
+    else
+    {
+        dialogAccepted();
+    }
 
 }
 
diff --git a/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.cpp b/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.cpp
index a16a67e7..4571b1e9 100644
--- a/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.cpp
+++ b/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.cpp
@@ -21,6 +21,7 @@
 */
 
 #include "TitlebarWidget.h"
+#include "WidgetNameDialog.h"
 
 
 #include <QGridLayout>
@@ -29,18 +30,22 @@
 #include <QToolButton>
 #include <QLabel>
 #include <QSpacerItem>
+#include <QToolBar>
+
+#include <ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h>
 
 using namespace armarx;
 
 
-StatusDockWidgetTitleBar::StatusDockWidgetTitleBar(QWidget* parent) :
+StatusDockWidgetTitleBar::StatusDockWidgetTitleBar(QWidget* parent, ArmarXMainWindow* mainWindow) :
     QWidget(parent),
+    mainWindow(mainWindow),
     imageOffline(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/network-offline.png")))),
     imageIdle(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/network-idle.png"))))
 {
 
     this->setContentsMargins(1, 1, 1, 1);
-    QDockWidget* dockWidget = qobject_cast<QDockWidget*>(parentWidget());
+    dockWidget = qobject_cast<QDockWidget*>(parentWidget());
     layout = new QGridLayout(this);
     layout->setMargin(2);
     layout->setSpacing(2);
@@ -54,8 +59,18 @@ StatusDockWidgetTitleBar::StatusDockWidgetTitleBar(QWidget* parent) :
     title = new QLabel(dockWidget->windowTitle(), this);
     layout->addWidget(title, 0, 1);
 
+    editTitleBar = new QToolBar(this);
+    editTitleBar->setIconSize(QSize(16, 16));
+    QIcon icon3;
+    icon3.addFile(QString::fromUtf8(":/icons/accessories-text-editor-6.ico"), QSize(16, 16));
+    QAction* editTitleAction = editTitleBar->addAction(icon3, "");
+    editTitleAction->setToolTip("Change the name of this widget instance");
+    connect(editTitleAction, SIGNAL(triggered(bool)), this, SLOT(openChangeTitleDialog(bool)));
+
+    layout->addWidget(editTitleBar, 0, 2);
+
     QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);
-    layout->addItem(spacer, 0, 3);
+    layout->addItem(spacer, 0, 4);
 
 
     undockButton = new QToolButton(this);
@@ -66,7 +81,7 @@ StatusDockWidgetTitleBar::StatusDockWidgetTitleBar(QWidget* parent) :
     undockButton->setIconSize(QSize(10, 10));
     //    undockButton->setCheckable(true);
     undockButton->setToolTip("Toggle the floating status of the widget");
-    layout->addWidget(undockButton, 0 , 4);
+    layout->addWidget(undockButton, 0 , 5);
     closeButton = new QToolButton(this);
     closeButton->setObjectName(QString::fromUtf8("btnClose"));
     QIcon icon1;
@@ -75,7 +90,7 @@ StatusDockWidgetTitleBar::StatusDockWidgetTitleBar(QWidget* parent) :
     closeButton->setIconSize(QSize(10, 10));
     closeButton->setToolTip("Close the widget");
 
-    layout->addWidget(closeButton, 0, 5);
+    layout->addWidget(closeButton, 0, 6);
 
 
 
@@ -95,7 +110,7 @@ void StatusDockWidgetTitleBar::addCustomWidget(QWidget* widget)
         widget->setParent(this);
     }
 
-    layout->addWidget(widget, 0, 2);
+    layout->addWidget(widget, 0, 3);
 
 }
 
@@ -247,3 +262,15 @@ void StatusDockWidgetTitleBar::changeStatus(ManagedIceObjectState state, QString
         break;
     }
 }
+
+void StatusDockWidgetTitleBar::openChangeTitleDialog(bool)
+{
+    WidgetNameDialog d(dockWidget->objectName(), mainWindow);
+
+    if (d.exec() == QDialog::Accepted)
+    {
+        dockWidget->setWindowTitle(d.getWidgetName());
+        dockWidget->setObjectName(d.getWidgetName());
+        title->setText(d.getWidgetName());
+    }
+}
diff --git a/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.h b/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.h
index 3b6663bf..20d1d7b4 100644
--- a/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.h
+++ b/source/ArmarXGui/applications/ArmarXGui/Widgets/TitlebarWidget.h
@@ -41,6 +41,7 @@ class QGridLayout;
 
 namespace armarx
 {
+    class ArmarXMainWindow;
     /**
      * \brief The StatusDockWidgetTitleBar class
      */
@@ -49,7 +50,7 @@ namespace armarx
     {
         Q_OBJECT
     public:
-        StatusDockWidgetTitleBar(QWidget* parent = 0);
+        StatusDockWidgetTitleBar(QWidget* parent = 0, ArmarXMainWindow* mainWindow = 0);
 
 
 
@@ -66,9 +67,13 @@ namespace armarx
     public slots:
         void changeFloatingStatus();
         void changeStatus(ManagedIceObjectState state, QStringList dependencies);
+        void openChangeTitleDialog(bool);
     private:
+        QDockWidget* dockWidget;
+        ArmarXMainWindow* mainWindow;
         QGridLayout* layout;
         QLabel* title;
+        QToolBar* editTitleBar;
         QToolButton* closeButton;
         QToolButton* undockButton;
         QToolButton* hideButton;
diff --git a/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.cpp b/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.cpp
index c8bb2c09..ebae72a6 100644
--- a/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.cpp
+++ b/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.cpp
@@ -33,14 +33,14 @@
 using namespace armarx;
 
 
-WidgetNameDialog::WidgetNameDialog(ArmarXMainWindow* parent) :
+WidgetNameDialog::WidgetNameDialog(QString widgetName, ArmarXMainWindow* parent) :
     QDialog(parent),
     parent(parent)
 {
     setWindowTitle("Insert new widget name");
     layout = new QGridLayout(this);
     labelWidgetName = new QLabel("Name of new widget: ", this);
-    editWidgetName = new QLineEdit(this);
+    editWidgetName = new QLineEdit(widgetName, this);
     layout->addWidget(labelWidgetName, 0 , 0);
     layout->addWidget(editWidgetName, 0 , 1);
     buttonBox = new QDialogButtonBox(this);
@@ -55,7 +55,12 @@ WidgetNameDialog::WidgetNameDialog(ArmarXMainWindow* parent) :
 
 }
 
-void WidgetNameDialog::checkWidgetName(QString name)
+QString WidgetNameDialog::getWidgetName() const
+{
+    return editWidgetName->text();
+}
+
+bool WidgetNameDialog::checkWidgetName(QString name)
 {
     if (parent)
     {
@@ -66,6 +71,7 @@ void WidgetNameDialog::checkWidgetName(QString name)
             p.setColor(QPalette::Base, QColor::fromRgb(255, 120, 120));
             editWidgetName->setPalette(p);
             buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
+            return false;
         }
         else
         {
@@ -74,7 +80,9 @@ void WidgetNameDialog::checkWidgetName(QString name)
             p.setBrush(QPalette::Base, p.light());
             editWidgetName->setPalette(p);
             buttonBox->button(QDialogButtonBox::Ok)->setDisabled(false);
+            return true;
         }
 
     }
+    return false;
 }
diff --git a/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.h b/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.h
index 1e45bf03..18166eb1 100644
--- a/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.h
+++ b/source/ArmarXGui/applications/ArmarXGui/Widgets/WidgetNameDialog.h
@@ -44,14 +44,17 @@ namespace armarx
     {
         Q_OBJECT
     public:
-        WidgetNameDialog(ArmarXMainWindow* parent = 0);
+        WidgetNameDialog(QString widgetName, ArmarXMainWindow* parent = 0);
+
+        QString getWidgetName() const;
+
         ArmarXMainWindow* parent;
         QGridLayout* layout;
         QLabel* labelWidgetName;
         QLineEdit* editWidgetName;
         QDialogButtonBox* buttonBox;
     public slots:
-        void checkWidgetName(QString name);
+        bool checkWidgetName(QString name);
     private:
 
     } ;
-- 
GitLab