Added output map remove output support

Dieser Commit ist enthalten in:
Reinder Feenstra 2021-06-26 09:59:21 +02:00
Ursprung dec1d4f84a
Commit a4c443afe2
5 geänderte Dateien mit 58 neuen und 19 gelöschten Zeilen

Datei anzeigen

@ -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<OutputMap> 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<ObjectSelectListDialog>(*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<ObjectSelectListDialog>(*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);

Datei anzeigen

@ -28,12 +28,18 @@
#include <QTableWidget>
#include "../network/outputmap.hpp"
class Method;
class MethodAction;
class OutputMapWidget : public QWidget
{
Q_OBJECT
protected:
std::shared_ptr<OutputMap> m_object;
Method* m_methodAdd;
Method* m_methodRemove;
MethodAction* m_actionRemove;
QTableWidget* m_table;
protected slots:

Datei anzeigen

@ -58,13 +58,14 @@ class OutputMapBase : public OutputMap
void outputAdded(const std::shared_ptr<Output>& 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>& output) final
{
assert(false); /// @todo
for(const auto& it : m_items)
it.second->removeOutput(output);
}
public:

Datei anzeigen

@ -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>& output)
{
m_outputActions.emplace_back(new OutputMapOutputAction(m_map, output));
}
void OutputMapItem::removeOutput(const std::shared_ptr<Output>& 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);
}
}

Datei anzeigen

@ -26,6 +26,7 @@
#include "../../../core/object.hpp"
#include <vector>
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>& output);
void removeOutput(const std::shared_ptr<Output>& output);
public:
OutputMapItem(Object& map);