From a4c443afe27db676956da264edf093ca29e28e59 Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Sat, 26 Jun 2021 09:59:21 +0200 Subject: [PATCH] Added output map remove output support --- client/src/widget/outputmapwidget.cpp | 45 ++++++++++++------- client/src/widget/outputmapwidget.hpp | 6 +++ .../src/hardware/output/map/outputmapbase.hpp | 7 +-- .../src/hardware/output/map/outputmapitem.cpp | 15 +++++++ .../src/hardware/output/map/outputmapitem.hpp | 4 ++ 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/client/src/widget/outputmapwidget.cpp b/client/src/widget/outputmapwidget.cpp index 50283533..58c300db 100644 --- a/client/src/widget/outputmapwidget.cpp +++ b/client/src/widget/outputmapwidget.cpp @@ -30,10 +30,12 @@ #include "propertycheckbox.hpp" #include "outputmapoutputactionwidget.hpp" #include "../dialog/objectselectlistdialog.hpp" +#include "../network/callmethod.hpp" #include "../network/method.hpp" #include "../network/property.hpp" #include "../utils/enum.hpp" #include "../theme/theme.hpp" +#include "../misc/methodaction.hpp" constexpr int columnCountNonOutput = 2; constexpr int columnUse = 0; @@ -47,32 +49,43 @@ OutputMapWidget::OutputMapWidget(std::shared_ptr object, QWidget* par { QVBoxLayout* l = new QVBoxLayout(); - QToolBar* tb = new QToolBar(this); - if(auto* method = m_object->getMethod("add_output")) + QToolBar* toolbar = new QToolBar(this); + + if((m_methodAdd = m_object->getMethod("add_output"))) + toolbar->addAction(new MethodAction(Theme::getIcon("add"), *m_methodAdd, + [this]() + { + std::make_unique(*m_methodAdd, this)->exec(); + }, toolbar)); + + if((m_methodRemove = m_object->getMethod("remove_output"))) { - QAction* act = tb->addAction(Theme::getIcon("add"), method->displayName(), - [this, method]() + m_actionRemove = new MethodAction(Theme::getIcon("remove"), *m_methodRemove, + [this]() { - std::make_unique(*method, this)->exec(); - }); - act->setEnabled(method->getAttributeBool(AttributeName::Enabled, true)); - connect(method, &Method::attributeChanged, this, - [this, act](AttributeName name, QVariant value) - { - if(name == AttributeName::Enabled) - act->setEnabled(value.toBool()); - }); + const int index = m_table->currentColumn() - columnOutputFirst; + if(index >= 0) + callMethod(*m_methodRemove, nullptr, m_object->outputs()[index]); + }, toolbar); + m_actionRemove->setForceDisabled(true); + toolbar->addAction(m_actionRemove); } - /// @todo remove output - - l->addWidget(tb); + l->addWidget(toolbar); m_table->setColumnCount(columnCountNonOutput); m_table->setRowCount(0); m_table->setHorizontalHeaderLabels({Locale::tr("output_map:use"), Locale::tr(m_object->classId() + ":key")}); m_table->verticalHeader()->setVisible(false); m_table->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_table->setSelectionMode(QAbstractItemView::SingleSelection); + m_table->setSelectionBehavior(QAbstractItemView::SelectColumns); + connect(m_table, &QTableWidget::itemSelectionChanged, this, + [this]() + { + m_actionRemove->setForceDisabled(m_table->currentColumn() < columnOutputFirst); + }); + l->addWidget(m_table); setLayout(l); diff --git a/client/src/widget/outputmapwidget.hpp b/client/src/widget/outputmapwidget.hpp index ac2be97b..b19fe6c4 100644 --- a/client/src/widget/outputmapwidget.hpp +++ b/client/src/widget/outputmapwidget.hpp @@ -28,12 +28,18 @@ #include #include "../network/outputmap.hpp" +class Method; +class MethodAction; + class OutputMapWidget : public QWidget { Q_OBJECT protected: std::shared_ptr m_object; + Method* m_methodAdd; + Method* m_methodRemove; + MethodAction* m_actionRemove; QTableWidget* m_table; protected slots: diff --git a/server/src/hardware/output/map/outputmapbase.hpp b/server/src/hardware/output/map/outputmapbase.hpp index 220fc85f..d61437cf 100644 --- a/server/src/hardware/output/map/outputmapbase.hpp +++ b/server/src/hardware/output/map/outputmapbase.hpp @@ -58,13 +58,14 @@ class OutputMapBase : public OutputMap void outputAdded(const std::shared_ptr& output) final { - for(auto it : m_items) - it.second->m_outputActions.emplace_back(new OutputMapOutputAction(*this, output)); + for(const auto& it : m_items) + it.second->addOutput(output); } void outputRemoved(const std::shared_ptr& output) final { - assert(false); /// @todo + for(const auto& it : m_items) + it.second->removeOutput(output); } public: diff --git a/server/src/hardware/output/map/outputmapitem.cpp b/server/src/hardware/output/map/outputmapitem.cpp index 51d8e96c..680303c7 100644 --- a/server/src/hardware/output/map/outputmapitem.cpp +++ b/server/src/hardware/output/map/outputmapitem.cpp @@ -76,3 +76,18 @@ void OutputMapItem::worldEvent(WorldState state, WorldEvent event) for(auto& action : m_outputActions) action->worldEvent(state, event); } + +void OutputMapItem::addOutput(const std::shared_ptr& output) +{ + m_outputActions.emplace_back(new OutputMapOutputAction(m_map, output)); +} + +void OutputMapItem::removeOutput(const std::shared_ptr& output) +{ + auto it = std::find_if(m_outputActions.begin(), m_outputActions.end(), [output](const auto& it){ return it->output() == output; }); + if(it != m_outputActions.end()) + { + (*it)->destroy(); + m_outputActions.erase(it); + } +} diff --git a/server/src/hardware/output/map/outputmapitem.hpp b/server/src/hardware/output/map/outputmapitem.hpp index d771b968..d1cf1082 100644 --- a/server/src/hardware/output/map/outputmapitem.hpp +++ b/server/src/hardware/output/map/outputmapitem.hpp @@ -26,6 +26,7 @@ #include "../../../core/object.hpp" #include +class Output; class OutputMapOutputAction; class OutputMapItem : public Object @@ -41,6 +42,9 @@ class OutputMapItem : public Object void save(WorldSaver& saver, nlohmann::json& data, nlohmann::json& state) const override; void worldEvent(WorldState state, WorldEvent event) override; + void addOutput(const std::shared_ptr& output); + void removeOutput(const std::shared_ptr& output); + public: OutputMapItem(Object& map);