Added output map remove output support
Dieser Commit ist enthalten in:
Ursprung
dec1d4f84a
Commit
a4c443afe2
@ -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);
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren