diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp index 6dafc432110193f761fd8d85982c793646fa5c89..e0b2e18a031cd3f52f776d4d61f0e2d9027c265f 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp @@ -134,14 +134,15 @@ ArmarXMainWindow::ArmarXMainWindow(const armarx::ManagedIceObjectRegistryInterfa tipDialog->setBlackListedStrings(mainSettings.value(CONFIG_BLACKLISTED_TIPS).toStringList()); ui->actionLoadLastConfig->setChecked(mainSettings.value(CONFIG_LOAD_LAST_CONFIG).toBool()); + addWidgetAction = new AddArmarXWidgetAction("", this, this); + connect(addWidgetAction, SIGNAL(clicked(QString, QString)), this, SLOT(createArmarXWidget(QString, QString)), Qt::UniqueConnection); + connect(ui->actionLoadPlugin, SIGNAL(triggered()), this, SLOT(pluginDialog())); connect(ui->actionSave_Gui, SIGNAL(triggered()), this, SLOT(saveGuiConfig())); connect(ui->actionLoad_Gui_Config, SIGNAL(triggered()), this, SLOT(loadGuiConfig())); connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(close())); connect(ui->actionSave_Gui_as, SIGNAL(triggered()), this, SLOT(saveGuiConfigAs())); - // connect(ui->actionClear_tip_blacklist, SIGNAL(triggered()), this, SLOT(on_actionClear_tip_blacklist_triggered())); - // connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(on_actionAbout_triggered())); // EmergencyStop @@ -1090,7 +1091,7 @@ void ArmarXMainWindow::updateAvailableWidgetList() { ui->menuAdd_Widget->clear(); - QLineEdit* searchField = new QLineEdit(ui->menuAdd_Widget); + searchField = new QLineEdit(ui->menuAdd_Widget); searchField->setToolTip("Search and add a new widget from all loaded ArmarX Gui Plugins"); searchField->setMaximumWidth(250); searchField->setPlaceholderText("Widget Search"); @@ -1163,6 +1164,15 @@ void ArmarXMainWindow::updateAvailableWidgetList() ui->toolBar->addSeparator(); ui->toolBar->addWidget(searchField); + QIcon icon; + icon.addFile(QString::fromUtf8("://icons/edit-add.ico"), QSize(), QIcon::Normal, QIcon::Off); + openWidgetButton = new QToolButton(this); + openWidgetButton->setEnabled(false); + openWidgetButton->setIcon(icon); + openWidgetButton->setToolTip("Open selected widget"); + connect(openWidgetButton, SIGNAL(clicked()), this, SLOT(openWidgetButtonClicked()), Qt::UniqueConnection); + ui->toolBar->addWidget(openWidgetButton); + connect(searchField, SIGNAL(textChanged(QString)), this, SLOT(updateOpenWidgetButtonStatus(QString)), Qt::UniqueConnection); auto favoriteWidgetNames = getFavoriteWidgets(); @@ -1173,8 +1183,6 @@ void ArmarXMainWindow::updateAvailableWidgetList() label->setToolTip("The favorites are generated from the usage frequency over the last X widget creations."); ui->toolBar->addWidget(label); } - - for (auto widgetName : favoriteWidgetNames) { if (actionList.contains(widgetName)) @@ -1437,13 +1445,17 @@ void armarx::ArmarXMainWindow::on_actionOpen_Use_Case_triggered() } - -// Emergency Stop - - - - void armarx::ArmarXMainWindow::on_actionClear_plugin_cache_triggered() { pluginCache.clearCacheFile(); } + +void ArmarXMainWindow::updateOpenWidgetButtonStatus(QString widgetName) +{ + openWidgetButton->setEnabled(pluginCache.getAvailableWidgetNames().contains(widgetName)); +} + +void ArmarXMainWindow::openWidgetButtonClicked() +{ + addWidgetAction->triggered(searchField->text()); +} diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h index e04ad8bbd18d4b9c9fdb644620b4b827e51697d3..180a6c93de5fcd88e0ae292cda23723b0b1ee901 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h @@ -54,6 +54,7 @@ class QScrollArea; class QSignalMapper; class QListWidgetItem; class QActionGroup; +class QLineEdit; namespace Ui { @@ -64,6 +65,7 @@ namespace Ui namespace armarx { class GuiUseCaseSelector; + class AddArmarXWidgetAction; class ArmarXDockWidget; @@ -161,6 +163,10 @@ namespace armarx void on_actionClear_plugin_cache_triggered(); + void updateOpenWidgetButtonStatus(QString widgetName); + + void openWidgetButtonClicked(); + private: /** * @brief updates the menu entry with the available widgets. @@ -231,7 +237,9 @@ namespace armarx QString splashscreenPrefix; GuiUseCaseSelector* guiUseCaseSelector; QStringList mainWidgets; - + QToolButton* openWidgetButton; + QLineEdit* searchField; + AddArmarXWidgetAction* addWidgetAction; boost::shared_ptr<boost::recursive_mutex> mutex3d; friend class WidgetNameDialog; diff --git a/source/ArmarXGui/applications/ArmarXGui/Widgets/EmergencyStopWidget.h b/source/ArmarXGui/applications/ArmarXGui/Widgets/EmergencyStopWidget.h index da42677ec7b587a7c52701eab049e2178ac93ab5..0cc489653c6a03f341cda9817981e0f8229288fe 100644 --- a/source/ArmarXGui/applications/ArmarXGui/Widgets/EmergencyStopWidget.h +++ b/source/ArmarXGui/applications/ArmarXGui/Widgets/EmergencyStopWidget.h @@ -41,7 +41,7 @@ namespace armarx class ArmarXMainWindow; class EmergencyStopWidget : - public armarx::ArmarXComponentWidgetController, + public ArmarXComponentWidgetControllerTemplate<EmergencyStopWidget>, public armarx::EmergencyStopListener { Q_OBJECT @@ -71,13 +71,8 @@ namespace armarx EmergencyStopMasterInterfacePrx emergencyStopMasterPrx; - // ArmarXWidgetController interface public: - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "EmergencyStopWidget"; @@ -89,13 +84,6 @@ namespace armarx public: void reportEmergencyStopState(EmergencyStopState, const Ice::Current&); }; - typedef IceInternal::Handle <EmergencyStopWidget> EmergencyStopWidgetPtr; } - - - - - - #endif diff --git a/source/ArmarXGui/gui-plugins/ClockPlugin/ClockWidgetController.h b/source/ArmarXGui/gui-plugins/ClockPlugin/ClockWidgetController.h index b4e2c49e91ee25559d779b6c1cdb8a960a30721f..84b3847e5d12f97844b8012cbe01db91c1201da4 100644 --- a/source/ArmarXGui/gui-plugins/ClockPlugin/ClockWidgetController.h +++ b/source/ArmarXGui/gui-plugins/ClockPlugin/ClockWidgetController.h @@ -59,7 +59,7 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT ClockWidgetController: - public armarx::ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<ClockWidgetController> { Q_OBJECT @@ -88,10 +88,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this class. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Clock"; @@ -141,10 +137,6 @@ namespace armarx // ArmarXWidgetController interface public: - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QIcon GetWidgetIcon() { return QIcon(":icons/Time-And-Date-Clock-icon.png"); diff --git a/source/ArmarXGui/gui-plugins/ConditionViewerPlugin/ConditionViewerWidgetController.h b/source/ArmarXGui/gui-plugins/ConditionViewerPlugin/ConditionViewerWidgetController.h index 1202697de01371e6974a69cef4b8cfd4895ef6de..7f49241e85e68740bb115101f2d157f5ce39962b 100644 --- a/source/ArmarXGui/gui-plugins/ConditionViewerPlugin/ConditionViewerWidgetController.h +++ b/source/ArmarXGui/gui-plugins/ConditionViewerPlugin/ConditionViewerWidgetController.h @@ -51,7 +51,7 @@ namespace armarx * \see ConditionViewerGuiPlugin */ class ARMARXCOMPONENT_IMPORT_EXPORT ConditionViewerWidgetController : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<ConditionViewerWidgetController> { Q_OBJECT public: @@ -65,10 +65,6 @@ namespace armarx // inherited from ArmarXWidget QPointer<QWidget> getWidget(); - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Observers.ConditionViewer"; diff --git a/source/ArmarXGui/gui-plugins/IceProxy/IceProxyWidgetController.h b/source/ArmarXGui/gui-plugins/IceProxy/IceProxyWidgetController.h index 10f250de1cba6e1e7e66fe47c8b1f94ee030a3db..c31101cc2e097e17593c48037420fea9fb3233ae 100644 --- a/source/ArmarXGui/gui-plugins/IceProxy/IceProxyWidgetController.h +++ b/source/ArmarXGui/gui-plugins/IceProxy/IceProxyWidgetController.h @@ -54,7 +54,7 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT IceProxyWidgetController: - public armarx::ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<IceProxyWidgetController> { Q_OBJECT @@ -72,21 +72,17 @@ namespace armarx /** * @see ArmarXWidgetController::loadSettings() */ - virtual void loadSettings(QSettings* settings){} + virtual void loadSettings(QSettings* settings) {} /** * @see ArmarXWidgetController::saveSettings() */ - virtual void saveSettings(QSettings* settings){} + virtual void saveSettings(QSettings* settings) {} /** * Returns the Widget name displayed in the ArmarXGui to create an * instance of this class. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Meta.IceProxy"; @@ -100,15 +96,15 @@ namespace armarx /** * \see armarx::Component::onConnectComponent() */ - virtual void onConnectComponent(){} + virtual void onConnectComponent() {} - void loadProxy(Ice::ObjectPrx prx); + void loadProxy(Ice::ObjectPrx prx); - private slots: - void on_pushButtonFinder_clicked(); - void on_pushButtonString_clicked(); + private slots: + void on_pushButtonFinder_clicked(); + void on_pushButtonString_clicked(); - private: + private: /** * Widget Form */ diff --git a/source/ArmarXGui/gui-plugins/LoggingPlugin/ArmarXLogViewer/LogViewer.h b/source/ArmarXGui/gui-plugins/LoggingPlugin/ArmarXLogViewer/LogViewer.h index da2f5a09568585eaa13b6553b88f49d8effc7166..718adf3c05e484d864b0f101625c2daea59c793d 100644 --- a/source/ArmarXGui/gui-plugins/LoggingPlugin/ArmarXLogViewer/LogViewer.h +++ b/source/ArmarXGui/gui-plugins/LoggingPlugin/ArmarXLogViewer/LogViewer.h @@ -51,7 +51,7 @@ namespace armarx \see LoggingPlugin */ class ARMARXCOMPONENT_IMPORT_EXPORT LogViewer : - public ArmarXComponentWidgetController, + public ArmarXComponentWidgetControllerTemplate<LogViewer>, public Log { Q_OBJECT @@ -62,18 +62,6 @@ namespace armarx void loadSettings(QSettings* settings); void saveSettings(QSettings* settings); - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } - virtual QIcon getWidgetCategoryIcon() const override - { - return GetWidgetCategoryIcon(); - } static QString GetWidgetName() { return "Meta.LogViewer"; diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverItemModel.cpp b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverItemModel.cpp index 89ccb6f59eacb2af5c10905875e6793596e0bf14..0b40d3072739a11e79144df2bb004426ed3b2c42 100644 --- a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverItemModel.cpp +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverItemModel.cpp @@ -102,7 +102,7 @@ QWidget* ObserverItemModel::getPropertiesWidget(const QModelIndex& index, QWidge // create widget DatafieldRefPtr ref = DatafieldRefPtr::dynamicCast(entry.identifier); - if (info && !entry.value->data || entry.value->data->ice_id() == "::armarx::VariantData") + if (info && (!entry.value->data || entry.value->data->ice_id() == "::armarx::VariantData")) { ARMARX_INFO << "Variant Factory for " << entry.typeName << " is missing - trying to load lib now"; auto lib = info->loadLibraryOfVariant(entry.typeName); diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverWidgetController.h b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverWidgetController.h index 321521904518d7dbe7e79b4bcbfd41040ea63b70..041c05d21fbd0441ca114cd07afd671047e1f250 100644 --- a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverWidgetController.h +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ObserverWidgetController.h @@ -48,7 +48,7 @@ namespace armarx * Channels show their offered datafields with their type, current value and an live plot. * It is also possible to install filters for each datafield by right-clicking on the datafield and selecting * the desired filter. - * \see \ref Observers + * \see \ref Observers * \see \ref ObserverWidgetController */ @@ -56,7 +56,7 @@ namespace armarx * \class ObserverWidgetController */ class ARMARXCOMPONENT_IMPORT_EXPORT ObserverWidgetController : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<ObserverWidgetController> { Q_OBJECT public: @@ -69,18 +69,6 @@ namespace armarx // inherited from ArmarXWidget QPointer<QWidget> getWidget(); - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } - virtual QIcon getWidgetCategoryIcon() const override - { - return GetWidgetCategoryIcon(); - } static QString GetWidgetName() { return "Observers.ObserverView"; diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/VariantWidget.cpp b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/VariantWidget.cpp index 75bc6bf5f59286859e5a65adb05a31fe88657a4f..6f028ca3b9be8b05b84cfb1a459cfcc8e912f990 100644 --- a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/VariantWidget.cpp +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/VariantWidget.cpp @@ -44,12 +44,10 @@ void VariantWidget::setValue(const VariantPtr& variant) { VariantTypeId type = variant->getType(); QString valueString; - int valueEditWidth; if (variant->getInitialized()) { if (type == VariantType::Bool) { - valueEditWidth = 60; QString value("%1"); value = value.arg((variant->getBool() == 1)); valueString = value; @@ -57,7 +55,6 @@ void VariantWidget::setValue(const VariantPtr& variant) else if (type == VariantType::Float) { - valueEditWidth = 200; QString value("%1"); value = value.arg(variant->getFloat(), 0 , 'f', 2); valueString = value; @@ -65,7 +62,6 @@ void VariantWidget::setValue(const VariantPtr& variant) else if (type == VariantType::Double) { - valueEditWidth = 200; QString value("%1"); value = value.arg(variant->getDouble(), 0 , 'f', 2); valueString = value; @@ -73,7 +69,6 @@ void VariantWidget::setValue(const VariantPtr& variant) else if (type == VariantType::Int) { - valueEditWidth = 60; QString value("%1"); value = value.arg(variant->getInt()); valueString = value; @@ -81,7 +76,6 @@ void VariantWidget::setValue(const VariantPtr& variant) else if (type == VariantType::String) { - valueEditWidth = 200; QString value(variant->getString().c_str()); valueString = value; } diff --git a/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.cpp b/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.cpp index 57e253421f7eb6f107a4110425b1e33ed920d4f9..d156d3dfec696e6a7ffa552f719df72667e132e6 100644 --- a/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.cpp +++ b/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.cpp @@ -50,13 +50,9 @@ using namespace std; namespace armarx { - ArmarXPlotter::ArmarXPlotter() : - ArmarXComponentWidgetController(), startUpTime(QDateTime::currentDateTime()) { - - plotterController = QSharedPointer<PlotterController>::create(); setTag("Plotter"); ui.setupUi(getWidget()); @@ -66,7 +62,6 @@ namespace armarx plotterController->setGraphStyle(ui.CBgraphStyle->currentIndex()); ui.verticalLayout->insertWidget(0, plotterController->getPlotterWidget()); - } ArmarXPlotter::~ArmarXPlotter() @@ -74,19 +69,9 @@ namespace armarx // if(dialog && this->getState() == eManagedIceObjectInitialized) // getArmarXManager()->removeObjectNonBlocking(dialog); // delete dialog; - } - - - - - - - void ArmarXPlotter::onInitComponent() - { - - } + void ArmarXPlotter::onInitComponent() {} void ArmarXPlotter::onConnectComponent() { @@ -108,16 +93,12 @@ namespace armarx ARMARX_WARNING << "Failed to invoke setupCurves"; } - usingTopic("TopicReplayerListener"); - } - void ArmarXPlotter::onExitComponent() { // unsubscribeFromTopic("TopicReplayerListener"); - plotterController.clear(); } @@ -216,7 +197,7 @@ namespace armarx csvHeader = plotterController->getSelectedDatafieldsKeys(); logstream << "Timestamp"; - for (const auto & s : csvHeader) + for (const auto& s : csvHeader) { logstream << "," << s; } @@ -265,8 +246,6 @@ namespace armarx } } - - void ArmarXPlotter::saveSettings(QSettings* settings) { ScopedLock lock(dataMutex); @@ -292,8 +271,6 @@ namespace armarx ARMARX_VERBOSE << "Settings loaded"; } - - void ArmarXPlotter::logToFile(long timestamp, const std::map<std::string, VariantPtr>& dataMaptoAppend) { std::lock_guard<std::mutex> lock(fileMutex); @@ -313,10 +290,6 @@ namespace armarx logstream << dataMaptoAppend.at(f)->Variant::getOutputValueOnly(); } } - logstream << std::endl; } - - - } diff --git a/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.h b/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.h index 0a4c57a045b067b05f70988f4ea297a235389a07..450b57a008fa72a2498b46932551328ca8421714 100644 --- a/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.h +++ b/source/ArmarXGui/gui-plugins/PlotterPlugin/ArmarXPlotter.h @@ -61,9 +61,6 @@ class QwtPlotMarker; namespace armarx { - - - class ArmarXPlotterDialog; /*! * \page ArmarXGui-GuiPlugins-PlotterPlugin Live Plotter @@ -73,14 +70,12 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT ArmarXPlotter: - public ArmarXComponentWidgetController, + public ArmarXComponentWidgetControllerTemplate<ArmarXPlotter>, public TopicReplayerListenerInterface { Q_OBJECT public: - - void onStartReplay(const std::string& filename, const Ice::Current& c = Ice::Current()) { if (!syncDataLogging) @@ -116,7 +111,6 @@ namespace armarx } } - Ui::ArmarXPlotter ui; QPointer<ArmarXPlotterDialog> dialog; QTimer* timer; @@ -127,14 +121,6 @@ namespace armarx explicit ArmarXPlotter(); ~ArmarXPlotter(); //inherited from ArmarXWidget - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QString GetWidgetName() { return "Observers.LivePlotter"; @@ -147,14 +133,11 @@ namespace armarx void saveSettings(QSettings* settings); //for AbstractFactoryMethod class - // inherited from Component virtual void onInitComponent(); virtual void onConnectComponent(); virtual void onExitComponent(); - - /** * emits the closeRequest signal */ @@ -182,8 +165,6 @@ namespace armarx bool __plottingPaused; JSONObjectPtr json; - - Mutex dataMutex; bool syncDataLogging; std::vector<std::string> csvHeader; @@ -193,14 +174,9 @@ namespace armarx std::mutex mutex; - std::mutex fileMutex; QSharedPointer<PlotterController> plotterController; - - }; - } - #endif diff --git a/source/ArmarXGui/gui-plugins/PlotterPlugin/StaticPlotterWidgetController.h b/source/ArmarXGui/gui-plugins/PlotterPlugin/StaticPlotterWidgetController.h index 2ea7be5eeeff6ec26b02bc95f6965b7323349381..727cedc2373900e3ac60e9d2aa7df1997c35ef1b 100644 --- a/source/ArmarXGui/gui-plugins/PlotterPlugin/StaticPlotterWidgetController.h +++ b/source/ArmarXGui/gui-plugins/PlotterPlugin/StaticPlotterWidgetController.h @@ -37,7 +37,7 @@ namespace armarx The GUI needs to be running before the plot is sent. */ class StaticPlotterWidgetController : - public ArmarXComponentWidgetController, + public ArmarXComponentWidgetControllerTemplate<StaticPlotterWidgetController>, public StaticPlotterInterface { Q_OBJECT @@ -59,10 +59,6 @@ namespace armarx void showCurve(QwtPlotItem* item, bool on); void clearPlots(); public: - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Util.Plotter"; @@ -74,15 +70,14 @@ namespace armarx private: QwtPlotCurve* createCurve(const QString& label, QColor color); - Ui::StaticPlotterWidget ui; QPointer<QwtPlot> plotter; std::map<QString, StringVector2fSeqDict > plotsMap; Mutex dataMutex; QToolBar* customToolbar; -// StaticPlotterInterfacePrx topicPrx ; -// armarx::SimpleRunningTask<>::pointer_type task; + // StaticPlotterInterfacePrx topicPrx ; + // armarx::SimpleRunningTask<>::pointer_type task; // StaticPlotterInterface interface public: diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h index 291ee81f50b8042b2de1557e5bcc97548f8d081c..31217d321180a8108f1848a455867f3ed3ee56f7 100644 --- a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h +++ b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h @@ -61,7 +61,7 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT ScenarioManagerWidgetController: - public armarx::ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<ScenarioManagerWidgetController> { Q_OBJECT @@ -90,10 +90,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this class. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Meta.ScenarioManager"; @@ -150,10 +146,6 @@ namespace armarx QPointer<QWidget> getCustomTitlebarWidget(QWidget* parent); // ArmarXWidgetController interface public: - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QIcon GetWidgetIcon() { return QIcon(":icons/ArmarX_Play_Store.svg"); diff --git a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StateEditorController.cpp b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StateEditorController.cpp index ede3272af674e378303519f37d9e05b4aa7a4590..e61f8e18fc0e20d4499611615e5b15cb18941e2c 100644 --- a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StateEditorController.cpp +++ b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StateEditorController.cpp @@ -242,7 +242,7 @@ namespace armarx detach->setEnabled(false); } - QAction* setSupportPoint; + QAction* setSupportPoint {nullptr}; std::map<QAction*, int> bendMap; if (transition->sourceState && transition->destinationState) diff --git a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.h b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.h index 9ec7e2e2ef6b220c27a6c239a95ec12f1ce6377f..f3cb92bd14c224e7d91d4b09602f250f0c6bdfe2 100644 --- a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.h +++ b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.h @@ -131,7 +131,7 @@ namespace armarx \brief The StatechartEditorController class is the controller of the main widget of the Statechart Editor. */ class StatechartEditorController : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<StatechartEditorController> { Q_OBJECT @@ -167,22 +167,10 @@ namespace armarx void onExitComponent(); // inherited of ArmarXWidget - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Statecharts.StatechartEditor"; } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } - virtual QIcon getWidgetCategoryIcon() const override - { - return GetWidgetCategoryIcon(); - } static QIcon GetWidgetIcon() { return QIcon(":/statechart-editor/states.svg"); diff --git a/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.cpp b/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.cpp index 3e6273297a04cca58b4888e68204977bec62c278..f981676c39ffba882d8a6e0b57115edbfceb4a4a 100644 --- a/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.cpp +++ b/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.cpp @@ -32,7 +32,6 @@ using namespace armarx; EventSenderOverview::EventSenderOverview() : - ArmarXComponentWidgetController(), ui(new Ui::EventSenderOverview()) { @@ -47,8 +46,6 @@ EventSenderOverview::~EventSenderOverview() delete ui; } - - void EventSenderOverview::loadSettings(QSettings* settings) { int size = settings->beginReadArray("EventSender"); @@ -86,10 +83,8 @@ void EventSenderOverview::saveSettings(QSettings* settings) } settings->endArray(); - } - void EventSenderOverview::onInitComponent() { int size = ui->scrollAreaWidgetContents->children().size(); @@ -187,10 +182,4 @@ void EventSenderOverview::sendEvent(const EventSenderConfig& config) { ARMARX_WARNING << "Cannot send event - caught exception:\n" << e.what(); } - - } - - - - diff --git a/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.h b/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.h index 29fba0d8b52c66f95bbc6bca4cd977b27fd988e3..e345a9a2365639d7c44ccf4a6626470aa091a95d 100644 --- a/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.h +++ b/source/ArmarXGui/gui-plugins/StatechartEventSenderPlugin/EventSenderOverview.h @@ -127,7 +127,7 @@ namespace armarx * \see StatechartEventSenderPlugin */ class EventSenderOverview : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<EventSenderOverview> { Q_OBJECT @@ -138,10 +138,6 @@ namespace armarx ~EventSenderOverview(); //inherited from ArmarXWidget - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Statecharts.EventSender"; @@ -151,7 +147,7 @@ namespace armarx void saveSettings(QSettings* settings); // inherited from Component virtual void onInitComponent(); - virtual void onConnectComponent() {}; + virtual void onConnectComponent() {} // end of inherited from Component // end of inherited from Component EventSenderComponent* addEventSender(const EventSenderConfig& config); diff --git a/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/IceStateConverter.h b/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/IceStateConverter.h index 731e8d4a7ef8309b513171f64c6b69ed14f48c08..dfa31c683a3b1715c5451a06308d140cd6cc12ca 100644 --- a/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/IceStateConverter.h +++ b/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/IceStateConverter.h @@ -45,7 +45,7 @@ namespace armarx ~IceStateConverter(); /** - * @brief convert Converts the given ice model into a statechartmodel. This is then accesible via + * @brief Converts the given ice model into a statechartmodel. This is then accesible via * getTopState(). * @param iceBase The StateIceBase that is the top state of the ice model that shall be converted */ diff --git a/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/StatechartViewerController.h b/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/StatechartViewerController.h index 4ede8ccef58c9b6c8282cd645e963007f5865c49..c6a3c2c3d527639fb46d83631bffbf76d6c8471b 100644 --- a/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/StatechartViewerController.h +++ b/source/ArmarXGui/gui-plugins/StatechartViewerPlugin/StatechartViewerController.h @@ -54,7 +54,7 @@ namespace armarx \see StatechartViewerGuiPlugin */ class StatechartViewerController : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<StatechartViewerController> { Q_OBJECT @@ -68,14 +68,6 @@ namespace armarx void onExitComponent(); // inherited of ArmarXWidget - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QString GetWidgetName() { return "Statecharts.StatechartViewer"; diff --git a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/IceGridViewer/IceGridViewer.h b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/IceGridViewer/IceGridViewer.h index a3bff244e3d77c3fb6dc6548d076ccb67ee578ab..bf5116f7fdcf9ae627d8539b68f37d6372fe52c0 100644 --- a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/IceGridViewer/IceGridViewer.h +++ b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/IceGridViewer/IceGridViewer.h @@ -56,7 +56,7 @@ namespace armarx * \class IceGridViewer */ class IceGridViewer : - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<IceGridViewer> { Q_OBJECT @@ -78,10 +78,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Meta.IceGridViewer"; diff --git a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/SystemStateMonitorWidget.h b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/SystemStateMonitorWidget.h index 977615937163997be95d18fae012baa8166d3c63..a2fc22f6b6258f572f09822fdae8b52ab814f975 100644 --- a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/SystemStateMonitorWidget.h +++ b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/SystemStateMonitorWidget.h @@ -67,7 +67,7 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT SystemStateMonitorWidget: - public ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<SystemStateMonitorWidget> { Q_OBJECT @@ -100,10 +100,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Meta.SystemStateMonitor"; @@ -200,10 +196,6 @@ namespace armarx // ArmarXWidgetController interface public: - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QIcon GetWidgetIcon() { return QIcon(":icons/activity_monitor.png"); diff --git a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ThreadViewer/ThreadViewer.h b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ThreadViewer/ThreadViewer.h index 6760e9cab85d61b6be64d70a0dd6d1f8ca5657ac..2c9a1f4c50f81da3288afd639688df8b5b1d4af4 100644 --- a/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ThreadViewer/ThreadViewer.h +++ b/source/ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ThreadViewer/ThreadViewer.h @@ -54,7 +54,7 @@ namespace armarx * \class ThreadViewer * \brief The ThreadViewer displays all threads of an ArmarX application. */ - class ThreadViewer : public ArmarXComponentWidgetController + class ThreadViewer : public ArmarXComponentWidgetControllerTemplate<ThreadViewer> { Q_OBJECT @@ -76,14 +76,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } - virtual QIcon getWidgetIcon() const override - { - return GetWidgetIcon(); - } static QString GetWidgetName() { return "Meta.ThreadViewer"; diff --git a/source/ArmarXGui/gui-plugins/TopicReplayerPlugin/TopicReplayerWidgetController.h b/source/ArmarXGui/gui-plugins/TopicReplayerPlugin/TopicReplayerWidgetController.h index 0021176bbc829142a8d56f271a6b29797db7a744..e3cf83dbd7ea7932181a92cc9bf8c5e435fbac3f 100644 --- a/source/ArmarXGui/gui-plugins/TopicReplayerPlugin/TopicReplayerWidgetController.h +++ b/source/ArmarXGui/gui-plugins/TopicReplayerPlugin/TopicReplayerWidgetController.h @@ -62,7 +62,7 @@ namespace armarx */ class ARMARXCOMPONENT_IMPORT_EXPORT TopicReplayerWidgetController: - public armarx::ArmarXComponentWidgetController + public ArmarXComponentWidgetControllerTemplate<TopicReplayerWidgetController> { Q_OBJECT @@ -91,10 +91,6 @@ namespace armarx * Returns the Widget name displayed in the ArmarXGui to create an * instance of this class. */ - virtual QString getWidgetName() const override - { - return GetWidgetName(); - } static QString GetWidgetName() { return "Meta.TopicReplayer"; @@ -110,7 +106,6 @@ namespace armarx */ virtual void onConnectComponent(); - public slots: /* QT slot declarations */ diff --git a/source/ArmarXGui/interface/WidgetDescription.ice b/source/ArmarXGui/interface/WidgetDescription.ice index 72d8f650ff323557d0b10c73715a690083709728..c1797d8eb93a37c7943c320763ff6e8ee51729e5 100644 --- a/source/ArmarXGui/interface/WidgetDescription.ice +++ b/source/ArmarXGui/interface/WidgetDescription.ice @@ -31,6 +31,7 @@ module armarx { class Widget { + bool framed = false; }; sequence<Widget> WidgetSeq; dictionary<string,Widget> StringWidgetDictionary; @@ -38,15 +39,29 @@ module armarx //Layouts class HBoxLayout extends Widget { - WidgetSeq widgets; + WidgetSeq children; }; class VBoxLayout extends Widget { - WidgetSeq widgets; + WidgetSeq children; }; + class FormLayoutElement extends Widget + { + string label; + Widget labelWidget; + Widget child; + bool childIsSpanning = false; + }; + sequence<FormLayoutElement> FormLayoutElementSeq; + class FormLayout extends Widget { - StringWidgetDictionary widgets; + FormLayoutElementSeq children; + }; + class GroupBox extends Widget + { + string label; + Widget child; }; //static elements class HSpacer extends Widget @@ -55,6 +70,12 @@ module armarx class VSpacer extends Widget { }; + class HLine extends Widget + { + }; + class VLine extends Widget + { + }; class Label extends Widget { string text; @@ -103,15 +124,17 @@ module armarx { float min=0; float max=0; - double steps = 100; float defaultValue=0; + int steps = 100; + int decimals = 3; }; class DoubleSpinBox extends ConfigWidget { double min=0; double max=0; double defaultValue=0; - double steps = 100; + int steps = 100; + int decimals = 3; }; class IntSlider extends ConfigWidget { diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h b/source/ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h index a7cd1ecef784a5b002823f3ba2267524edf0cfe7..47bed73d958bc607015f79c15b6077a8e208c72b 100644 --- a/source/ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h @@ -63,6 +63,25 @@ namespace armarx std::string uuid; }; typedef IceUtil::Handle<ArmarXComponentWidgetController> ArmarXComponentWidgetControllerPtr; + + template<class Derived> + class ArmarXComponentWidgetControllerTemplate: + public ArmarXComponentWidgetController + { + public: + virtual QString getWidgetName() const final + { + return Derived::GetWidgetName(); + } + virtual QIcon getWidgetIcon() const final + { + return Derived::GetWidgetIcon(); + } + virtual QIcon getWidgetCategoryIcon() const final + { + return Derived::GetWidgetCategoryIcon(); + } + }; } #endif diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt b/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt index 5b09eedb90c4e6ccbe04682911e0ea85005fb322..781109b98237d4b387f520d1a31c7763adc91e77 100644 --- a/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt @@ -32,6 +32,7 @@ set(LIB_FILES ArmarXWidgetController.cpp widgets/IceProxyFinder.cpp widgets/VariantItem.cpp widgets/JoystickControlWidget.cpp + widgets/EnhancedGraphicsView.cpp widgets/EnhancedTreeWidget.cpp widgets/FilterableTreeView.cpp widgets/MarkdownEditor.cpp @@ -46,13 +47,16 @@ set(LIB_FILES ArmarXWidgetController.cpp set(LIB_HEADERS ArmarXGuiInterface.h ArmarXGuiPlugin.h ArmarXWidgetController.h - PluginCache.h + PluginCache.h + ToQString.h + widgets/CoinViewer.h ArmarXComponentWidgetController.h widgets/editorfileopener.h widgets/IceProxyFinder.h widgets/VariantItem.h widgets/JoystickControlWidget.h + widgets/EnhancedGraphicsView.h widgets/EnhancedTreeWidget.h widgets/FilterableTreeView.h widgets/MarkdownEditor.h @@ -82,6 +86,7 @@ qt4_wrap_cpp(LIB_FILES widgets/FilterableTreeView.h widgets/IceProxyFinder.h widgets/JoystickControlWidget.h + widgets/EnhancedGraphicsView.h widgets/EnhancedTreeWidget.h widgets/MarkdownEditor.h widgets/TipDialog.h diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/ToQString.h b/source/ArmarXGui/libraries/ArmarXGuiBase/ToQString.h new file mode 100644 index 0000000000000000000000000000000000000000..fb725249c4f61d3eb954c0cd325af2c1a44b122f --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/ToQString.h @@ -0,0 +1,157 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package ArmarXGui::ArmarXGuiBase + * @author Raphael Grimm ( raphael dot grimm at student dot kit dot edu ) + * @date 2017 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ +#ifndef _ARMARX_ArmarXGuiBase_ToQString_H +#define _ARMARX_ArmarXGuiBase_ToQString_H + +#include <string> +#include <sstream> +#include <vector> + +#include <QString> + +//#include <ArmarXCore/core/util/TemplateMetaProgramming.h> + +namespace armarx +{ + inline QString ToQString(const char* str) + { + return {str}; + } + + inline QString ToQString(const std::string& s) + { + return QString::fromStdString(s); + } + + inline QString ToQString(float v) + { + return QString::number(v); + } + + inline QString ToQString(double v) + { + return QString::number(v); + } + + inline QString ToQString(char v) + { + return QString::number(v); + } + + inline QString ToQString(std::uint8_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::uint16_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::uint32_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::uint64_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::int8_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::int16_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::int32_t v) + { + return QString::number(v); + } + + inline QString ToQString(std::int64_t v) + { + return QString::number(v); + } + + inline QString ToQString(const std::stringstream& str) + { + return ToQString(str.str()); + } + + inline QString ToQString(bool b) + { + return b ? "true" : "false"; + } + + template<class T> + inline QString ToQString(const std::vector<T>& v) + { + if (v.empty()) + { + return ""; + } + std::stringstream str; + str << v.front(); + for (std::size_t i = 1; i < v.size(); ++i) + { + str << " " << v.at(i); + } + return ToQString(str); + } + + template<class T> + inline QString ToQString(const std::vector<std::vector<T>>& v) + { + if (v.empty()) + { + return ""; + } + std::stringstream str; + str << ToQString(v.front()).toStdString(); + for (std::size_t i = 1; i < v.size(); ++i) + { + str << "\n" << ToQString(v.at(i)).toStdString(); + } + return ToQString(str); + } + + // template<class T> + // inline QString ToQString(const T& t) + // // inline typename std::enable_if<meta::HasToString<T>::value, QString>::type ToQString(const T& t) + // { + // return ToQString(std::to_string(t)); + // } + + // template<class T> + // inline QString ToQString(const T& t) + // { + // std::stringstream str; + // str << t; + // return ToQString(str); + // } +} +#endif diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/armarxicons.qrc b/source/ArmarXGui/libraries/ArmarXGuiBase/armarxicons.qrc index 5bb083d7e51060316401458678a4fa0ce16d75dd..8a36debba9a3fb679e018184f4689023797f0a34 100644 --- a/source/ArmarXGui/libraries/ArmarXGuiBase/armarxicons.qrc +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/armarxicons.qrc @@ -76,5 +76,12 @@ <file>icons/monitor.svg</file> <file>icons/server.svg</file> <file>icons/eye.svg</file> + <file>icons/monitor_and_remote.svg</file> + <file>icons/traffic_light_all_off.svg</file> + <file>icons/traffic_light_all_on.svg</file> + <file>icons/traffic_light_green.svg</file> + <file>icons/traffic_light_red.svg</file> + <file>icons/traffic_light_red_yellow.svg</file> + <file>icons/traffic_light_yellow.svg</file> </qresource> </RCC> diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/monitor_and_remote.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/monitor_and_remote.svg new file mode 100644 index 0000000000000000000000000000000000000000..2b0e3fababab2340c7dbe6206dd5f2382999aed8 --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/monitor_and_remote.svg @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 512 512" + height="512px" + id="Layer_1" + version="1.1" + viewBox="0 0 512 512" + width="512px" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="monitor_and_remote.svg"><metadata + id="metadata9"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs + id="defs7" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview5" + showgrid="false" + inkscape:zoom="1.3037281" + inkscape:cx="476.49348" + inkscape:cy="142.76077" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="g3785" /><path + d="M480,0H32C14.328,0,0,14.312,0,32v352c0,17.688,14.328,32,32,32h192v32h-96c-17.672,0-32,14.312-32,32v32h320v-32 c0-17.688-14.328-32-32-32h-96v-32h192c17.672,0,32-14.312,32-32V32C512,14.312,497.672,0,480,0z M448,352H64V64h384V352z" + id="path3" /><g + id="g3831" + transform="translate(121.13934,-11.273622)"><g + id="g3826" + transform="matrix(1.8617936,0,0,1.6531137,-341.75851,-157.48854)"><g + id="g3785"><g + id="g3805" + transform="matrix(0.74133042,-0.75586125,0.5959152,0.74133042,-68.385757,279.15927)"><rect + style="fill:#ffffff;stroke:none" + id="rect3851" + width="69.825142" + height="193.5741" + x="221.08743" + y="206.47925" + ry="12.795576" /><g + transform="matrix(0.53792037,0,0,0.60582445,490.10868,96.134099)" + id="g3793"><rect + style="fill:#000000;stroke:#000000;stroke-width:3.55005264;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect2986" + width="106.28555" + height="226.69232" + x="-488.35342" + y="264.23019" + ry="27.089022" /><g + id="g3771" + transform="translate(-690.66827,86.141336)"><path + transform="matrix(1.1133791,0,0,0.89070325,639.22655,98.511594)" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + sodipodi:ry="10.847458" + sodipodi:rx="8.6779661" + sodipodi:cy="176.81355" + sodipodi:cx="-323.25424" + id="path3756" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3769" + sodipodi:cx="-323.25424" + sodipodi:cy="176.81355" + sodipodi:rx="8.6779661" + sodipodi:ry="10.847458" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + transform="matrix(1.1133791,0,0,0.89070325,592.58248,98.511594)" /></g><g + id="g3775" + transform="translate(-690.66827,132.06223)"><path + sodipodi:type="arc" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3777" + sodipodi:cx="-323.25424" + sodipodi:cy="176.81355" + sodipodi:rx="8.6779661" + sodipodi:ry="10.847458" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + transform="matrix(1.1133791,0,0,0.89070325,639.22655,98.511594)" /><path + transform="matrix(1.1133791,0,0,0.89070325,592.58248,98.511594)" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + sodipodi:ry="10.847458" + sodipodi:rx="8.6779661" + sodipodi:cy="176.81355" + sodipodi:cx="-323.25424" + id="path3779" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g><g + id="g3781" + transform="translate(-692.29539,177.98314)"><path + transform="matrix(1.1133791,0,0,0.89070325,639.22655,98.511594)" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + sodipodi:ry="10.847458" + sodipodi:rx="8.6779661" + sodipodi:cy="176.81355" + sodipodi:cx="-323.25424" + id="path3783" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3785" + sodipodi:cx="-323.25424" + sodipodi:cy="176.81355" + sodipodi:rx="8.6779661" + sodipodi:ry="10.847458" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + transform="matrix(1.1133791,0,0,0.89070325,592.58248,98.511594)" /></g><g + id="g3787" + transform="translate(-690.1259,40.220436)"><path + sodipodi:type="arc" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3789" + sodipodi:cx="-323.25424" + sodipodi:cy="176.81355" + sodipodi:rx="8.6779661" + sodipodi:ry="10.847458" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + transform="matrix(1.1133791,0,0,0.89070325,639.22655,98.511594)" /><path + transform="matrix(1.1133791,0,0,0.89070325,592.58248,98.511594)" + d="m -314.57628,176.81355 c 0,5.99089 -3.88525,10.84746 -8.67796,10.84746 -4.79271,0 -8.67797,-4.85657 -8.67797,-10.84746 0,-5.99088 3.88526,-10.84746 8.67797,-10.84746 4.79271,0 8.67796,4.85658 8.67796,10.84746 z" + sodipodi:ry="10.847458" + sodipodi:rx="8.6779661" + sodipodi:cy="176.81355" + sodipodi:cx="-323.25424" + id="path3791" + style="fill:#ffffff;stroke:#ffffff;stroke-width:5.69999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g></g><path + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:25.32207108;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3816" + sodipodi:cx="-418.79898" + sodipodi:cy="232.80069" + sodipodi:rx="134.99747" + sodipodi:ry="105.85029" + d="m -535.71022,179.87555 c 37.27852,-50.62741 119.84168,-67.97365 184.40997,-38.7439 20.52221,9.2903 37.564,22.65262 49.4125,38.74389" + sodipodi:start="3.6651914" + sodipodi:end="5.7595865" + sodipodi:open="true" + transform="matrix(0.42963432,0,0,0.47176785,435.93042,122.31526)" /><path + transform="matrix(0.41388369,0,0,0.81049941,429.33407,103.51927)" + sodipodi:open="true" + sodipodi:end="5.4105207" + sodipodi:start="4.0142573" + d="m -505.57368,151.71466 c 50.18619,-33.01901 123.36322,-33.01901 173.5494,1e-5" + sodipodi:ry="105.85029" + sodipodi:rx="134.99747" + sodipodi:cy="232.80069" + sodipodi:cx="-418.79898" + id="path3822" + style="fill:none;stroke:#000000;stroke-width:19.68327522;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:14.87527752;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3824" + sodipodi:cx="-418.79898" + sodipodi:cy="232.80069" + sodipodi:rx="134.99747" + sodipodi:ry="105.85029" + d="m -464.97084,133.33396 c 29.82421,-8.51141 62.5195,-8.51141 92.34371,-1e-5" + sodipodi:start="4.3633231" + sodipodi:end="5.0614548" + sodipodi:open="true" + transform="matrix(0.4427729,0,0,1.5148524,441.43285,40.407859)" /></g></g></g></g></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_off.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_off.svg new file mode 100644 index 0000000000000000000000000000000000000000..49101de0736a732bbcc0367b38cbf20a913a8c13 --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_off.svg @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light_all_off.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="41.7193" + inkscape:cx="31.52936" + inkscape:cy="29.058165" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29" + style="fill:#808080"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" + style="fill:#808080" /></g><g + id="g33" + style="fill:#808080"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" + style="fill:#808080" /></g><g + id="g37" + style="fill:#808080"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" + style="fill:#808080" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_on.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_on.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ee57b04984d78771ef6c4ccc5f6f030698e81cf --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_all_on.svg @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="7.375" + inkscape:cx="25.645583" + inkscape:cy="34.533064" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="g5" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" /></g><g + id="g33"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" /></g><g + id="g37"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_green.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_green.svg new file mode 100644 index 0000000000000000000000000000000000000000..c46d0f3c48240399324a9b5dc8ae9c6af84ddda8 --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_green.svg @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light_red.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="41.7193" + inkscape:cx="31.52936" + inkscape:cy="40.563632" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29" + style="fill:#808080"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" + style="fill:#808080" /></g><g + id="g33" + style="fill:#808080"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" + style="fill:#808080" /></g><g + id="g37"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red.svg new file mode 100644 index 0000000000000000000000000000000000000000..dbfa277c8a0860daa6686641b3e300394722c903 --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="41.7193" + inkscape:cx="31.52936" + inkscape:cy="29.058165" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29" + style="fill:#808080"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" + style="fill:#808080" /></g><g + id="g33"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" /></g><g + id="g37"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" + style="fill:#808080" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red_yellow.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red_yellow.svg new file mode 100644 index 0000000000000000000000000000000000000000..25c70bd6f857d94e5e0e3b979e921e13203b15fc --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_red_yellow.svg @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light_all_off.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="41.7193" + inkscape:cx="31.52936" + inkscape:cy="29.058165" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" /></g><g + id="g33"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" /></g><g + id="g37" + style="fill:#808080"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" + style="fill:#808080" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_yellow.svg b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_yellow.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a9715e709a7b23dc74c2ea5339d58f37f05abda --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/icons/traffic_light_yellow.svg @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 64 64" + height="64px" + version="1.1" + viewBox="0 0 64 64" + width="64px" + xml:space="preserve" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="traffic_light_green.svg"><metadata + id="metadata46"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs44" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview42" + showgrid="false" + inkscape:zoom="41.7193" + inkscape:cx="31.52936" + inkscape:cy="29.058165" + inkscape:window-x="1280" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /><g + id="Layer_1"><g + id="g5" /><g + opacity="0.2" + id="g9"><path + d="M44,54c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V14c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V54z" + fill="#231F20" + id="path11" /></g><g + id="g13"><path + d="M44,52c0,1.657-1.343,3-3,3H23c-1.657,0-3-1.343-3-3V12c0-1.657,1.343-3,3-3h18c1.657,0,3,1.343,3,3V52z" + fill="#4F5D73" + id="path15" /></g><g + opacity="0.2" + id="g17"><circle + cx="32" + cy="34" + fill="#231F20" + r="5" + id="circle19" /></g><g + opacity="0.2" + id="g21"><circle + cx="32" + cy="21" + fill="#231F20" + r="5" + id="circle23" /></g><g + opacity="0.2" + id="g25"><circle + cx="32" + cy="47" + fill="#231F20" + r="5" + id="circle27" /></g><g + id="g29"><circle + cx="32" + cy="32" + fill="#F5CF87" + r="5" + id="circle31" /></g><g + id="g33" + style="fill:#808080"><circle + cx="32" + cy="19" + fill="#C75C5C" + r="5" + id="circle35" + style="fill:#808080" /></g><g + id="g37" + style="fill:#808080"><circle + cx="32" + cy="45" + fill="#76C2AF" + r="5" + id="circle39" + style="fill:#808080" /></g></g><g + id="Layer_2" /></svg> \ No newline at end of file diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.cpp b/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1d1f124f0f16b30418ecc1f31b9a93545ec639fb --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.cpp @@ -0,0 +1,188 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package ArmarXGui::EnhancedGraphicsView + * @author Raphael Grimm ( raphael dot grimm at student dot kit dot edu ) + * @date 2017 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ +#include <QGraphicsItem> + +#include "EnhancedGraphicsView.h" + +namespace armarx +{ + + Qt::KeyboardModifier EnhancedGraphicsView::getRotationKeyboardModifier() const + { + return rotationModifier; + } + + qreal EnhancedGraphicsView::getRotationFactor() const + { + return rotationFactor; + } + + Qt::KeyboardModifier EnhancedGraphicsView::getZoomKeyboardModifier() const + { + return zoomModifier; + } + + qreal EnhancedGraphicsView::getZoomFactor() const + { + return zoomFacor; + } + + Qt::KeyboardModifier EnhancedGraphicsView::getDraggingKeyboardModifier() const + { + return draggingModifier; + } + + Qt::MouseButton EnhancedGraphicsView::getDraggingMouseButton() const + { + return draggingButton; + } + + void EnhancedGraphicsView::setRotationEnabled(bool enabled) + { + rotationEnabled = enabled; + } + + void EnhancedGraphicsView::setRotationDisabled(bool disabled) + { + rotationEnabled = !disabled; + } + + void EnhancedGraphicsView::setRotationKeyboardModifier(Qt::KeyboardModifier mod) + { + rotationModifier = mod; + } + + void EnhancedGraphicsView::setRotationFactor(qreal factor) + { + rotationFactor = factor; + } + + void EnhancedGraphicsView::setZoomEnabled(bool enabled) + { + zoomEnabled = enabled; + } + + void EnhancedGraphicsView::setZoomDisabled(bool disabled) + { + zoomEnabled = !disabled; + } + + void EnhancedGraphicsView::setZoomKeyboardModifier(Qt::KeyboardModifier mod) + { + zoomModifier = mod; + } + + void EnhancedGraphicsView::setZoomFactor(qreal factor) + { + zoomFacor = factor; + } + + void EnhancedGraphicsView::setDraggingEnabled(bool enabled) + { + draggingEnabled = enabled; + } + + void EnhancedGraphicsView::setDraggingDisabled(bool disabled) + { + draggingEnabled = !disabled; + } + + void EnhancedGraphicsView::setDraggingKeyboardModifier(Qt::KeyboardModifier mod) + { + draggingModifier = mod; + } + + void EnhancedGraphicsView::setDraggingMouseButton(Qt::MouseButton button) + { + draggingButton = button; + } + + void EnhancedGraphicsView::setAllVisible(bool visible) + { + for (QGraphicsItem* i : items()) + { + i->setVisible(visible); + } + } + + void EnhancedGraphicsView::mousePressEvent(QMouseEvent* e) + { + draggingStartPosition = mapToScene(e->pos()); + QGraphicsView::mousePressEvent(e); + } + + void EnhancedGraphicsView::mouseMoveEvent(QMouseEvent* e) + { + if ( + (e->modifiers() & draggingModifier) == draggingModifier && + (e->buttons() & draggingButton) == draggingButton + ) + { + const auto oldAnchor = transformationAnchor(); + setTransformationAnchor(QGraphicsView::NoAnchor); + + const QPointF vector = mapToScene(e->pos()) - draggingStartPosition; + translate(vector.x(), vector.y()); + draggingStartPosition = mapToScene(e->pos()); + e->accept(); + + setTransformationAnchor(oldAnchor); + return; + } + QGraphicsView::mouseMoveEvent(e); + } + + void EnhancedGraphicsView::wheelEvent(QWheelEvent* e) + { + bool used = false; + if ((e->modifiers() & zoomModifier) == zoomModifier) + { + const auto oldAnchor = transformationAnchor(); + setTransformationAnchor(QGraphicsView::NoAnchor); + + float factor = std::pow(zoomFacor, e->delta() < 0 ? -1 : +1); + scale(factor, factor); + used = true; + + setTransformationAnchor(oldAnchor); + } + if ((e->modifiers() & rotationModifier) == rotationModifier) + { + const auto oldAnchor = transformationAnchor(); + setTransformationAnchor(QGraphicsView::NoAnchor); + + rotate(e->delta() * rotationFactor); + used = true; + + setTransformationAnchor(oldAnchor); + } + if (used) + { + e->accept(); + } + else + { + QGraphicsView::wheelEvent(e); + } + } + +} diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.h b/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.h new file mode 100644 index 0000000000000000000000000000000000000000..32c9b0b27bf4c37bf32cc91688af15275db46826 --- /dev/null +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/widgets/EnhancedGraphicsView.h @@ -0,0 +1,94 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package ArmarXGui::EnhancedGraphicsView + * @author Raphael Grimm ( raphael dot grimm at student dot kit dot edu ) + * @date 2017 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#ifndef _ARMARX_ArmarXGui_EnhancedGraphicsView_H +#define _ARMARX_ArmarXGui_EnhancedGraphicsView_H + +#include <QGraphicsView> +#include <QPointF> +#include <QMouseEvent> +#include <QWheelEvent> +#include <cmath> +namespace armarx +{ + /** + * @brief The EnhancedGraphicsView is a QGraphicsView with some additional + * functions. + * + * Additional functions are: + * - Zooming (default ctrl+scroll) + * - Roatating (default shift+scroll) + * - Dragging the scene (default ctrl+left click+dragging) + */ + class EnhancedGraphicsView: public QGraphicsView + { + Q_OBJECT + public: + using QGraphicsView::QGraphicsView; + + Qt::KeyboardModifier getRotationKeyboardModifier() const; + qreal getRotationFactor() const; + + Qt::KeyboardModifier getZoomKeyboardModifier() const; + qreal setZoomFactor(); + qreal getZoomFactor() const; + + Qt::KeyboardModifier getDraggingKeyboardModifier() const; + Qt::MouseButton getDraggingMouseButton() const; + public slots: + void setRotationEnabled(bool enabled = true); + void setRotationDisabled(bool disabled = true); + void setRotationKeyboardModifier(Qt::KeyboardModifier mod); + void setRotationFactor(qreal factor); + + void setZoomEnabled(bool enabled = true); + void setZoomDisabled(bool disabled = true); + void setZoomKeyboardModifier(Qt::KeyboardModifier mod); + void setZoomFactor(qreal factor); + + void setDraggingEnabled(bool enabled = true); + void setDraggingDisabled(bool disabled = true); + void setDraggingKeyboardModifier(Qt::KeyboardModifier mod); + void setDraggingMouseButton(Qt::MouseButton button); + + void setAllVisible(bool visible); + + protected: + virtual void mousePressEvent(QMouseEvent* e) override; + virtual void mouseMoveEvent(QMouseEvent* e) override; + virtual void wheelEvent(QWheelEvent* e) override; + + bool rotationEnabled {true}; + Qt::KeyboardModifier rotationModifier {Qt::ShiftModifier}; + qreal rotationFactor {0.01}; + + bool zoomEnabled {true}; + Qt::KeyboardModifier zoomModifier {Qt::ControlModifier}; + qreal zoomFacor {1.05}; + + bool draggingEnabled {true}; + Qt::KeyboardModifier draggingModifier {Qt::ControlModifier}; + Qt::MouseButton draggingButton {Qt::LeftButton}; + QPointF draggingStartPosition; + }; +} +#endif diff --git a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/CMakeLists.txt b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/CMakeLists.txt index 4c31ee7eeeb89b61b7cafb5b56acb3fec4bb0f07..5cc314eae0e57155334c0a1b21633c2bfd0c1c62 100644 --- a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/CMakeLists.txt +++ b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/CMakeLists.txt @@ -3,7 +3,7 @@ set(LIB_NAME DefaultWidgetDescriptions) armarx_component_set_name("${LIB_NAME}") armarx_set_target("Library: ${LIB_NAME}") -set(LIBS ArmarXGuiInterfaces) +set(LIBS ArmarXCore ArmarXGuiInterfaces) set(LIB_FILES DefaultWidgetDescriptions.cpp) set(LIB_HEADERS DefaultWidgetDescriptions.h ) diff --git a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.cpp b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.cpp index f56401e70104aca8612a51f94b24f54fb45a5df0..1dde818bf17e922289b2fc1ce6858017fadf4d44 100644 --- a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.cpp +++ b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.cpp @@ -20,85 +20,271 @@ * GNU General Public License */ +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + #include "DefaultWidgetDescriptions.h" +namespace armarx +{ + namespace WidgetDescription + { + //base widgets + HBoxLayoutPtr makeHBoxLayout(std::vector<WidgetPtr> elements) + { + HBoxLayoutPtr w = new HBoxLayout; + w->children = std::move(elements); + return w; + } -using namespace armarx; + VBoxLayoutPtr makeVBoxLayout(std::vector<WidgetPtr> elements) + { + VBoxLayoutPtr w = new VBoxLayout; + w->children = std::move(elements); + return w; + } + FormLayoutElementPtr makeFormLayoutElement(WidgetPtr labelWidget, WidgetPtr child) + { + ARMARX_CHECK_NOT_NULL(labelWidget); + ARMARX_CHECK_NOT_NULL(child); + FormLayoutElementPtr e = new FormLayoutElement; + e->labelWidget = std::move(labelWidget); + e->child = std::move(child); + e->childIsSpanning = false; + return e; + } + FormLayoutElementPtr makeFormLayoutElement(std::string name, WidgetPtr child, bool spanning) + { + ARMARX_CHECK_NOT_NULL(child); + FormLayoutElementPtr e = new FormLayoutElement; + e->label = std::move(name); + e->child = std::move(child); + e->childIsSpanning = spanning; + return e; + } -WidgetDescription::HBoxLayoutPtr WidgetDescription::makeXYZRollPitchYawWidget( - const std::string& namePrefix, - float initX, - float initY, - float initz, - float initRoll, - float initPitch, - float initYaw, - FloatRange rangeX, - FloatRange rangeY, - FloatRange rangeZ, - FloatRange rangeRoll, - FloatRange rangePitch, - FloatRange rangeYaw) -{ - HBoxLayoutPtr layout = new HBoxLayout; - { - layout->widgets.emplace_back(new Label {"x / y / z"}); - { - FloatSpinBoxPtr spinX = new FloatSpinBox; - spinX->defaultValue = initX; - spinX->min = rangeX.min; - spinX->max = rangeX.max; - spinX->name = namePrefix + "X"; - layout->widgets.emplace_back(spinX); - } - { - FloatSpinBoxPtr spinY = new FloatSpinBox; - spinY->defaultValue = initY; - spinY->min = rangeY.min; - spinY->max = rangeY.max; - spinY->name = namePrefix + "Y"; - layout->widgets.emplace_back(spinY); - } - { - FloatSpinBoxPtr spinZ = new FloatSpinBox; - spinZ->defaultValue = initz; - spinZ->min = rangeZ.min; - spinZ->max = rangeZ.max; - spinZ->name = namePrefix + "Z"; - layout->widgets.emplace_back(spinZ); - } - layout->widgets.emplace_back(new Label {" "}); - layout->widgets.emplace_back(new Label {"rx / ry / rz"}); - { - FloatSpinBoxPtr spinRoll = new FloatSpinBox; - spinRoll->defaultValue = initRoll; - spinRoll->min = rangeRoll.min; - spinRoll->max = rangeRoll.max; - spinRoll->steps = 2000; - spinRoll->name = namePrefix + "Roll"; - layout->widgets.emplace_back(spinRoll); - } - { - FloatSpinBoxPtr spinPitch = new FloatSpinBox; - spinPitch->defaultValue = initPitch; - spinPitch->min = rangePitch.min; - spinPitch->max = rangePitch.max; - spinPitch->steps = 2000; - spinPitch->name = namePrefix + "Pitch"; - layout->widgets.emplace_back(spinPitch); - } - { - FloatSpinBoxPtr spinYaw = new FloatSpinBox; - spinYaw->defaultValue = initYaw; - spinYaw->min = rangeYaw.min; - spinYaw->max = rangeYaw.max; - spinYaw->steps = 2000; - spinYaw->name = namePrefix + "Yaw"; - layout->widgets.emplace_back(spinYaw); - layout->widgets.emplace_back(new Label {"rz"}); - } - return layout; + FormLayoutElementPtr makeFormLayoutElement(WidgetPtr child, bool spanning) + { + ARMARX_CHECK_NOT_NULL(child); + FormLayoutElementPtr e = new FormLayoutElement; + if (ConfigWidgetPtr::dynamicCast(child)) + { + e->label = ConfigWidgetPtr::dynamicCast(child)->name; + } + e->child = std::move(child); + e->childIsSpanning = spanning; + return e; + } + + FormLayoutElementPtr makeSpanningFormLayoutElement(WidgetPtr child) + { + return makeFormLayoutElement(std::move(child), true); + } + + FormLayoutPtr makeFormLayout(std::vector<std::pair<std::string, WidgetPtr> > elements) + { + FormLayoutPtr l = new FormLayout; + l->children.reserve(elements.size()); + for (auto& elem : elements) + { + l->children.emplace_back(makeFormLayoutElement(std::move(elem.first), std::move(elem.second))); + } + return l; + } + + FormLayoutPtr makeFormLayout(std::vector<WidgetPtr> elements) + { + FormLayoutPtr l = new FormLayout; + l->children.reserve(elements.size()); + for (auto& elem : elements) + { + l->children.emplace_back(makeFormLayoutElement(std::move(elem))); + } + return l; + } + + GroupBoxPtr makeGroupBox(std::string label, WidgetPtr child, bool framed) + { + GroupBoxPtr w = new GroupBox; + w->child = std::move(child); + w->label = std::move(label); + w->framed = framed; + return w; + } + + WidgetPtr makeFrame(WidgetPtr child) + { + child->framed = true; + return std::move(child); + } + + HSpacerPtr makeHSpacer() + { + return new HSpacer; + } + + VSpacerPtr makeVSpacer() + { + return new VSpacer; + } + + HLinePtr makeHLine() + { + return new HLine; + } + + VLinePtr makeVLine() + { + return new VLine; + } + + LabelPtr makeLabel(std::string text) + { + return new Label {false, std::move(text)}; + } + + CheckBoxPtr makeCheckBox(std::string name, bool defaultValue, std::string label) + { + CheckBoxPtr w = new CheckBox; + w->name = std::move(name); + w->label = std::move(label); + w->defaultValue = defaultValue; + return w; + } + CheckBoxPtr makeCheckBox(std::string name, bool defaultValue) + { + CheckBoxPtr w = new CheckBox; + w->name = std::move(name); + w->label = w->name; + w->defaultValue = defaultValue; + return w; + } + + IntSpinBoxPtr makeIntSpinBox(std::string name, int min, int max, int defaultValue) + { + IntSpinBoxPtr w = new IntSpinBox; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + return w; + } + + FloatSpinBoxPtr makeFloatSpinBox(std::string name, float min, float max, float defaultValue, int steps, int decimals) + { + FloatSpinBoxPtr w = new FloatSpinBox; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + w->steps = steps; + w->decimals = decimals; + return w; + } + + DoubleSpinBoxPtr makeDoubleSpinBox(std::string name, double min, double max, double defaultValue, int steps, int decimals) + { + DoubleSpinBoxPtr w = new DoubleSpinBox; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + w->steps = steps; + w->decimals = decimals; + return w; + } + + IntSliderPtr makeIntSlider(std::string name, int min, int max, int defaultValue) + { + IntSliderPtr w = new IntSlider; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + return w; + } + + FloatSliderPtr makeFloatSlider(std::string name, float min, float max, float defaultValue) + { + FloatSliderPtr w = new FloatSlider; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + return w; + } + + DoubleSliderPtr makeDoubleSlider(std::string name, double min, double max, double defaultValue) + { + DoubleSliderPtr w = new DoubleSlider; + w->name = std::move(name); + w->min = min; + w->max = max; + w->defaultValue = defaultValue; + return w; + } + + StringComboBoxPtr makeStringComboBox(std::string name, std::vector<std::string> options, long defaultIndex) + { + StringComboBoxPtr w = new StringComboBox; + w->name = std::move(name); + w->options = std::move(options); + w->defaultIndex = defaultIndex; + return w; + } + + LineEditPtr makeLineEdit(std::string name, std::string defaultValue) + { + LineEditPtr w = new LineEdit; + w->name = std::move(name); + w->defaultValue = std::move(defaultValue); + return w; + } + + FloatLineEditPtr makeFloatLineEdit(std::string name, float defaultValue) + { + FloatLineEditPtr w = new FloatLineEdit; + w->name = std::move(name); + w->defaultValue = defaultValue; + return w; + } + + DoubleLineEditPtr makeDoubleLineEdit(std::string name, double defaultValue) + { + DoubleLineEditPtr w = new DoubleLineEdit; + w->name = std::move(name); + w->defaultValue = defaultValue; + return w; + } + + //more complex widgets + HBoxLayoutPtr makeXYZRollPitchYawWidget( + const std::string& namePrefix, + float initX, + float initY, + float initZ, + float initRoll, + float initPitch, + float initYaw, + FloatRange rangeX, + FloatRange rangeY, + FloatRange rangeZ, + FloatRange rangeRoll, + FloatRange rangePitch, + FloatRange rangeYaw) + { + return makeHBoxLayout( + { + makeLabel("x / y / z"), + makeFloatSpinBox(namePrefix + "X", rangeX.min, rangeX.max, initX), + makeFloatSpinBox(namePrefix + "Y", rangeY.min, rangeY.max, initY), + makeFloatSpinBox(namePrefix + "Z", rangeZ.min, rangeZ.max, initZ), + makeLabel(" rx / ry / rz"), + makeFloatSpinBox(namePrefix + "Roll" , rangeRoll.min , rangeRoll.max , initRoll , 2000), + makeFloatSpinBox(namePrefix + "Pitch", rangePitch.min, rangePitch.max, initPitch, 2000), + makeFloatSpinBox(namePrefix + "Yaw" , rangeYaw.min , rangeYaw.max , initYaw , 2000) + }); + } } } diff --git a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.h b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.h index 977dcd7578298bc0f80f6be9081cf6ed3f8cd12b..c892d4b45c134c532749f0f87ee972266905eb45 100644 --- a/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.h +++ b/source/ArmarXGui/libraries/DefaultWidgetDescriptions/DefaultWidgetDescriptions.h @@ -29,6 +29,46 @@ namespace armarx { namespace WidgetDescription { + //base widgets + HBoxLayoutPtr makeHBoxLayout(std::vector<WidgetPtr> elements); + VBoxLayoutPtr makeVBoxLayout(std::vector<WidgetPtr> elements); + + FormLayoutElementPtr makeFormLayoutElement(WidgetPtr child, bool spanning = false); + FormLayoutElementPtr makeSpanningFormLayoutElement(WidgetPtr child); + FormLayoutElementPtr makeFormLayoutElement(std::string name, WidgetPtr child, bool spanning = false); + FormLayoutElementPtr makeFormLayoutElement(WidgetPtr labelWidget, WidgetPtr child); + + FormLayoutPtr makeFormLayout(std::vector<std::pair<std::string, WidgetPtr>> elements); + FormLayoutPtr makeFormLayout(std::vector<WidgetPtr> elements); + + GroupBoxPtr makeGroupBox(std::string label, WidgetPtr child, bool framed = false); + + WidgetPtr makeFrame(WidgetPtr child); + + HSpacerPtr makeHSpacer(); + VSpacerPtr makeVSpacer(); + HLinePtr makeHLine(); + VLinePtr makeVLine(); + LabelPtr makeLabel(std::string text); + + CheckBoxPtr makeCheckBox(std::string name, bool defaultValue, std::string label); + CheckBoxPtr makeCheckBox(std::string name, bool defaultValue = false); + + IntSpinBoxPtr makeIntSpinBox(std::string name, int min = 0, int max = 100, int defaultValue = 0); + FloatSpinBoxPtr makeFloatSpinBox(std::string name, float min = 0, float max = 100, float defaultValue = 0, int steps = 100, int decimals = 3); + DoubleSpinBoxPtr makeDoubleSpinBox(std::string name, double min = 0, double max = 100, double defaultValue = 0, int steps = 100, int decimals = 3); + + IntSliderPtr makeIntSlider(std::string name, int min = 0, int max = 100, int defaultValue = 0); + FloatSliderPtr makeFloatSlider(std::string name, float min = 0, float max = 100, float defaultValue = 0); + DoubleSliderPtr makeDoubleSlider(std::string name, double min = 0, double max = 100, double defaultValue = 0); + + StringComboBoxPtr makeStringComboBox(std::string name, std::vector<std::string> options, long defaultIndex = 0); + + LineEditPtr makeLineEdit(std::string name, std::string defaultValue = ""); + FloatLineEditPtr makeFloatLineEdit(std::string name, float defaultValue = 0); + DoubleLineEditPtr makeDoubleLineEdit(std::string name, double defaultValue = 0); + + //more complex widgets /** * @brief Values will have the names namePrefix{X,Y,Z,Roll,Pitch,Yaw} */ @@ -36,7 +76,7 @@ namespace armarx const std::string& namePrefix = "", float initX = 0, float initY = 0, - float initz = 0, + float initZ = 0, float initRoll = 0, float initPitch = 0, float initYaw = 0, @@ -46,6 +86,7 @@ namespace armarx FloatRange rangeRoll = { -M_PI, M_PI}, FloatRange rangePitch = { -M_PI, M_PI}, FloatRange rangeYaw = { -M_PI, M_PI}); + inline HBoxLayoutPtr makeXYZRollPitchYawWidget( const std::string& namePrefix, FloatRange rangeLin, diff --git a/source/ArmarXGui/libraries/VariantWidget/VariantWidget.cpp b/source/ArmarXGui/libraries/VariantWidget/VariantWidget.cpp index 0a53a1b7c692eb1a045f42762b0b545273bf4dcc..45a4c25d9c59b0aec1ccb0afa9966b229c9453df 100644 --- a/source/ArmarXGui/libraries/VariantWidget/VariantWidget.cpp +++ b/source/ArmarXGui/libraries/VariantWidget/VariantWidget.cpp @@ -51,7 +51,7 @@ namespace armarx }; BoolVariantDataWidget(const VariantDataPtr& v): - disp {DisplayOption::X} + disp {DisplayOption::Boolalpha} { auto l = new QVBoxLayout; l->setContentsMargins(0, 0, 0, 0); diff --git a/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.cpp b/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.cpp index 5dbbd8972a976399ff6ce78018295f684724e6eb..70893ed57ae12d12cf9e588eb67ba943b8d95e02 100644 --- a/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.cpp +++ b/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.cpp @@ -38,6 +38,7 @@ #include <QCheckBox> #include <QDoubleValidator> #include <QSlider> +#include <QGroupBox> #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" #include <qwt_slider.h> @@ -50,7 +51,7 @@ namespace armarx class DescribedWidget : public DescribedWidgetBase { public: - DescribedWidget(const WidgetPtr&, ValueChangedListenerInterface*) {} + DescribedWidget(const WidgetPtr& ptr, ValueChangedListenerInterface*): DescribedWidgetBase(ptr) {} virtual std::map<std::string, VariantBasePtr> getVariants() override { return {}; @@ -62,15 +63,15 @@ namespace armarx { public: DescribedVBoxLayout(const WidgetPtr& p, ValueChangedListenerInterface* listener) - : DescribedWidgetLayoutBase(listener) + : DescribedWidgetLayoutBase(p, listener) { VBoxLayoutPtr ptr = VBoxLayoutPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setLayout(new QVBoxLayout); - for (const WidgetPtr& childPtr : ptr->widgets) + layout()->setContentsMargins(0, 0, 0, 0); + for (const WidgetPtr& childPtr : ptr->children) { - addChild(childPtr); - layout()->addWidget(children.back()); + layout()->addWidget(addChild(childPtr)); } } @@ -81,15 +82,15 @@ namespace armarx { public: DescribedHBoxLayout(const WidgetPtr& p, ValueChangedListenerInterface* listener) - : DescribedWidgetLayoutBase(listener) + : DescribedWidgetLayoutBase(p, listener) { HBoxLayoutPtr ptr = HBoxLayoutPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setLayout(new QHBoxLayout); - for (const WidgetPtr& childPtr : ptr->widgets) + layout()->setContentsMargins(0, 0, 0, 0); + for (const WidgetPtr& childPtr : ptr->children) { - addChild(childPtr); - layout()->addWidget(children.back()); + layout()->addWidget(addChild(childPtr)); } } }; @@ -99,26 +100,82 @@ namespace armarx { public: DescribedFormLayout(const WidgetPtr& p, ValueChangedListenerInterface* listener) - : DescribedWidgetLayoutBase(listener) + : DescribedWidgetLayoutBase(p, listener) { FormLayoutPtr ptr = FormLayoutPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); auto l = new QFormLayout; setLayout(l); - for (const auto& pair : ptr->widgets) + layout()->setContentsMargins(0, 0, 0, 0); + for (const FormLayoutElementPtr& child : ptr->children) { - addChild(pair.second); - l->addRow(QString::fromStdString(pair.first), children.back()); + if (child->childIsSpanning) + { + l->addRow(addChild(child->child)); + continue; + } + if (child->labelWidget) + { + l->addRow(addChild(child->labelWidget), addChild(child->child)); + continue; + } + l->addRow(QString::fromStdString(child->label), addChild(child->child)); } } }; DescribedWidgetFactoryRegistration<DescribedFormLayout> registerDescribedFormLayout {FormLayout::ice_staticId()}; + class DescribedFormLayoutElement : public DescribedWidgetLayoutBase + { + public: + DescribedFormLayoutElement(const WidgetPtr& p, ValueChangedListenerInterface* listener) + : DescribedWidgetLayoutBase(p, listener) + { + FormLayoutElementPtr ptr = FormLayoutElementPtr::dynamicCast(p); + ARMARX_CHECK_NOT_NULL(ptr); + auto l = new QFormLayout; + setLayout(l); + layout()->setContentsMargins(0, 0, 0, 0); + if (ptr->childIsSpanning) + { + l->addRow(addChild(ptr->child)); + } + if (ptr->labelWidget) + { + l->addRow(addChild(ptr->labelWidget), addChild(ptr->child)); + } + l->addRow(QString::fromStdString(ptr->label), addChild(ptr->child)); + } + }; + DescribedWidgetFactoryRegistration<DescribedFormLayoutElement> registerDescribedFormLayoutElement {FormLayoutElement::ice_staticId()}; + + class DescribedGroupBox : public DescribedWidgetLayoutBase + { + public: + DescribedGroupBox(const WidgetPtr& p, ValueChangedListenerInterface* listener) + : DescribedWidgetLayoutBase(p, listener) + { + GroupBoxPtr ptr = GroupBoxPtr::dynamicCast(p); + ARMARX_CHECK_NOT_NULL(ptr); + auto ltop = new QHBoxLayout; + setLayout(ltop); + layout()->setContentsMargins(0, 0, 0, 0); + QGroupBox* grp = new QGroupBox; + ltop->addWidget(grp); + grp->setTitle(QString::fromStdString(ptr->label)); + auto l = new QHBoxLayout; + grp->setLayout(l); + l->setContentsMargins(0, 9, 0, 0); + l->addWidget(addChild(ptr->child)); + } + }; + DescribedWidgetFactoryRegistration<DescribedGroupBox> DescribedGroupBox {GroupBox::ice_staticId()}; + //static elements class DescribedHSpacer : public DescribedWidgetBase { public: - DescribedHSpacer(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedHSpacer(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -134,7 +191,7 @@ namespace armarx class DescribedVSpacer : public DescribedWidgetBase { public: - DescribedVSpacer(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedVSpacer(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -147,13 +204,43 @@ namespace armarx }; DescribedWidgetFactoryRegistration<DescribedVSpacer> registerDescribedVSpacer {VSpacer::ice_staticId()}; + class DescribedHLine : public DescribedWidgetBase + { + public: + DescribedHLine(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) + { + setFrameShape(QFrame::HLine); + setFrameShadow(QFrame::Sunken); + } + virtual std::map<std::string, VariantBasePtr> getVariants() override + { + return {}; + } + }; + DescribedWidgetFactoryRegistration<DescribedHLine> registerDescribedHLine {HLine::ice_staticId()}; + + class DescribedVLine : public DescribedWidgetBase + { + public: + DescribedVLine(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) + { + setFrameShape(QFrame::VLine); + setFrameShadow(QFrame::Sunken); + } + virtual std::map<std::string, VariantBasePtr> getVariants() override + { + return {}; + } + }; + DescribedWidgetFactoryRegistration<DescribedVLine> registerDescribedVLine {VLine::ice_staticId()}; + class DescribedLabel : public DescribedWidgetBase { public: - DescribedLabel(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedLabel(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { auto ptr = LabelPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); layout()->addWidget(new QLabel(QString::fromStdString(ptr->text))); @@ -169,10 +256,10 @@ namespace armarx class DescribedVariantWidget : public DescribedWidgetBase { public: - DescribedVariantWidget(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedVariantWidget(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { auto ptr = VariantWidgetPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); child = new armarx::VariantWidget; @@ -211,10 +298,10 @@ namespace armarx class DescribedCheckBox : public DescribedWidgetBase { public: - DescribedCheckBox(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedCheckBox(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { CheckBoxPtr ptr = CheckBoxPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -240,10 +327,10 @@ namespace armarx class DescribedIntSpinBox : public DescribedWidgetBase { public: - DescribedIntSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedIntSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { IntSpinBoxPtr ptr = IntSpinBoxPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -271,16 +358,17 @@ namespace armarx class DescribedDoubleSpinBox : public DescribedWidgetBase { public: - DescribedDoubleSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedDoubleSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { DoubleSpinBoxPtr ptr = DoubleSpinBoxPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); child = new QDoubleSpinBox {}; child->setMaximum(ptr->max); child->setMinimum(ptr->min); + child->setDecimals(ptr->decimals); child->setValue(ptr->defaultValue); child->setSingleStep((ptr->max - ptr->min) / ptr->steps); layout()->addWidget(child); @@ -303,16 +391,17 @@ namespace armarx class DescribedFloatSpinBox : public DescribedWidgetBase { public: - DescribedFloatSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedFloatSpinBox(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { FloatSpinBoxPtr ptr = FloatSpinBoxPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); child = new QDoubleSpinBox {}; child->setMaximum(ptr->max); child->setMinimum(ptr->min); + child->setDecimals(ptr->decimals); child->setValue(ptr->defaultValue); child->setSingleStep((ptr->max - ptr->min) / ptr->steps); layout()->addWidget(child); @@ -335,10 +424,10 @@ namespace armarx class DescribedStringComboBox : public DescribedWidgetBase { public: - DescribedStringComboBox(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedStringComboBox(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { StringComboBoxPtr ptr = StringComboBoxPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -365,21 +454,20 @@ namespace armarx }; DescribedWidgetFactoryRegistration<DescribedStringComboBox> registerDescribedStringComboBox {StringComboBox::ice_staticId()}; - class DescribedLineEdit : public DescribedWidgetBase { public: - DescribedLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { LineEditPtr ptr = LineEditPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); child = new QLineEdit {}; child->setText(QString::fromStdString(ptr->defaultValue)); layout()->addWidget(child); - connect(child, SIGNAL(returnPressed()), this, SLOT(contentUpdated())); + connect(child, SIGNAL(editingFinished()), this, SLOT(contentUpdated())); } virtual std::map<std::string, VariantBasePtr> getVariants() override { @@ -398,10 +486,10 @@ namespace armarx class DescribedDoubleLineEdit : public DescribedWidgetBase { public: - DescribedDoubleLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedDoubleLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { DoubleLineEditPtr ptr = DoubleLineEditPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -409,7 +497,7 @@ namespace armarx child->setText(QString::number(ptr->defaultValue)); child->setValidator(new QDoubleValidator {this}); layout()->addWidget(child); - connect(child, SIGNAL(returnPressed()), this, SLOT(contentUpdated())); + connect(child, SIGNAL(editingFinished()), this, SLOT(contentUpdated())); } virtual std::map<std::string, VariantBasePtr> getVariants() override { @@ -420,7 +508,7 @@ namespace armarx protected: virtual void contentUpdated() override { - emit valueChangedSignal(getName(), new Variant {child->text().toStdString()}); + emit valueChangedSignal(getName(), new Variant {child->text().toDouble()}); } }; DescribedWidgetFactoryRegistration<DescribedDoubleLineEdit> registerDescribedDoubleLineEdit {DoubleLineEdit::ice_staticId()}; @@ -428,10 +516,10 @@ namespace armarx class DescribedFloatLineEdit : public DescribedWidgetBase { public: - DescribedFloatLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedFloatLineEdit(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { FloatLineEditPtr ptr = FloatLineEditPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -439,7 +527,7 @@ namespace armarx child->setText(QString::number(ptr->defaultValue)); child->setValidator(new QDoubleValidator {this}); layout()->addWidget(child); - connect(child, SIGNAL(returnPressed()), this, SLOT(contentUpdated())); + connect(child, SIGNAL(editingFinished()), this, SLOT(contentUpdated())); } virtual std::map<std::string, VariantBasePtr> getVariants() override { @@ -450,7 +538,7 @@ namespace armarx protected: virtual void contentUpdated() override { - emit valueChangedSignal(getName(), new Variant {child->text().toStdString()}); + emit valueChangedSignal(getName(), new Variant {static_cast<float>(child->text().toDouble())}); } }; DescribedWidgetFactoryRegistration<DescribedFloatLineEdit> registerDescribedFloatLineEdit {FloatLineEdit::ice_staticId()}; @@ -459,10 +547,10 @@ namespace armarx class DescribedIntSlider : public DescribedWidgetBase { public: - DescribedIntSlider(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedIntSlider(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { IntSliderPtr ptr = IntSliderPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -490,10 +578,10 @@ namespace armarx class DescribedDoubleSlider : public DescribedWidgetBase { public: - DescribedDoubleSlider(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedDoubleSlider(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { DoubleSliderPtr ptr = DoubleSliderPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -523,10 +611,10 @@ namespace armarx class DescribedFloatSlider : public DescribedWidgetBase { public: - DescribedFloatSlider(const WidgetPtr& p, ValueChangedListenerInterface*) + DescribedFloatSlider(const WidgetPtr& p, ValueChangedListenerInterface*): DescribedWidgetBase(p) { FloatSliderPtr ptr = FloatSliderPtr::dynamicCast(p); - ARMARX_CHECK_EXPRESSION(ptr); + ARMARX_CHECK_NOT_NULL(ptr); setName(ptr->name); setLayout(new QHBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); @@ -555,6 +643,8 @@ namespace armarx DescribedWidgetFactoryRegistration<DescribedFloatSlider> registerDescribedFloatSlider {FloatSlider::ice_staticId()}; //functions from base classes + DescribedWidgetLayoutBase::DescribedWidgetLayoutBase(WidgetPtr ptr, ValueChangedListenerInterface* listener): DescribedWidgetBase(ptr), listener {listener ? listener : this} {} + std::map<std::string, VariantBasePtr> DescribedWidgetLayoutBase::getVariants() { std::map<std::string, VariantBasePtr> result; @@ -565,7 +655,7 @@ namespace armarx return result; } - void DescribedWidgetLayoutBase::addChild(const WidgetPtr& childPtr) + DescribedWidgetBase* DescribedWidgetLayoutBase::addChild(const WidgetPtr& childPtr) { ARMARX_CHECK_EXPRESSION(listener); DescribedWidgetBase* c = makeDescribedWidget(childPtr, listener); @@ -574,6 +664,7 @@ namespace armarx this, SIGNAL(variantWidgetUpdatedSignal(std::string, VariantWidgetContent::VariantWidgetContentBasePtr)), c , SLOT(variantWidgetUpdatedSlot(std::string, VariantWidgetContent::VariantWidgetContentBasePtr)) ); + return c; } DescribedWidgetBase* makeDescribedWidget(const WidgetPtr& p, ValueChangedListenerInterface* listener) @@ -581,7 +672,7 @@ namespace armarx class ErrorMessageWidget : public DescribedWidgetBase { public: - ErrorMessageWidget(const std::string& errorMessage) + ErrorMessageWidget(const std::string& errorMessage): DescribedWidgetBase(nullptr) { setLayout(new QVBoxLayout); setName(".ErrorMessageWidget"); @@ -624,5 +715,19 @@ namespace armarx return new ErrorMessageWidget {"makeDescribedWidget: Unknown error"}; } + DescribedWidgetBase::DescribedWidgetBase(WidgetPtr ptr) + { + if (ptr && ptr->framed) + { + setFrameShape(QFrame::StyledPanel); + } + } + + ValueChangedListenerInterface::ValueChangedListenerInterface() + { + setFrameShape(QFrame::NoFrame); + setFrameShadow(QFrame::Raised); + } + } } diff --git a/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.h b/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.h index 8fe82d93519e093add4e609882ede96f9a15c04c..baacde9394721dc4453f76b4728c6cc7fa581be9 100644 --- a/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.h +++ b/source/ArmarXGui/libraries/WidgetDescription/WidgetDescription.h @@ -25,7 +25,7 @@ #include <functional> -#include <QWidget> +#include <QFrame> #include <ArmarXCore/core/util/Registrar.h> #include <ArmarXCore/core/exceptions/local/ExpressionException.h> @@ -36,18 +36,21 @@ namespace armarx { namespace WidgetDescription { - class ValueChangedListenerInterface: public QWidget + class ValueChangedListenerInterface: public QFrame { Q_OBJECT + public: + ValueChangedListenerInterface(); public slots: virtual void valueChangedSlot(std::string name, VariantBasePtr value) {} }; - class DescribedWidgetBase: public ValueChangedListenerInterface { Q_OBJECT public: + DescribedWidgetBase(WidgetPtr ptr); + virtual std::map<std::string, VariantBasePtr> getVariants() { return {}; @@ -74,7 +77,7 @@ namespace armarx { Q_OBJECT public: - DescribedWidgetLayoutBase(ValueChangedListenerInterface* listener): listener {listener ? listener : this} {} + DescribedWidgetLayoutBase(WidgetPtr ptr, ValueChangedListenerInterface* listener); virtual std::map<std::string, VariantBasePtr> getVariants() override; virtual void valueChangedSlot(std::string name, VariantBasePtr value) override { @@ -84,7 +87,7 @@ namespace armarx { emit variantWidgetUpdatedSignal(name, data); } - virtual void addChild(const WidgetPtr& childPtr); + virtual DescribedWidgetBase* addChild(const WidgetPtr& childPtr); protected: std::vector<DescribedWidgetBase*> children;