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