outputmap: dialog now has icons for each row :)

Dieser Commit ist enthalten in:
Reinder Feenstra 2024-07-08 23:22:01 +02:00
Ursprung 80b08cb02a
Commit 1a9edd0492
2 geänderte Dateien mit 94 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -35,6 +35,8 @@
#include "objectpropertycombobox.hpp" #include "objectpropertycombobox.hpp"
#include "propertyaddresses.hpp" #include "propertyaddresses.hpp"
#include "outputmapoutputactionwidget.hpp" #include "outputmapoutputactionwidget.hpp"
#include "../board/tilepainter.hpp"
#include "../board/getboardcolorscheme.hpp"
#include "../dialog/objectselectlistdialog.hpp" #include "../dialog/objectselectlistdialog.hpp"
#include "../network/callmethod.hpp" #include "../network/callmethod.hpp"
#include "../network/method.hpp" #include "../network/method.hpp"
@ -67,6 +69,8 @@ OutputMapWidget::OutputMapWidget(ObjectPtr object, QWidget* parent)
, m_ecosObject{dynamic_cast<Property*>(m_object->getProperty("ecos_object"))} , m_ecosObject{dynamic_cast<Property*>(m_object->getProperty("ecos_object"))}
, m_items{m_object->getObjectVectorProperty("items")} , m_items{m_object->getObjectVectorProperty("items")}
, m_table{new QTableWidget(this)} , m_table{new QTableWidget(this)}
, m_getParentRequestId{Connection::invalidRequestId}
, m_getItemsRequestId{Connection::invalidRequestId}
{ {
QVBoxLayout* l = new QVBoxLayout(); QVBoxLayout* l = new QVBoxLayout();
@ -97,6 +101,8 @@ OutputMapWidget::OutputMapWidget(ObjectPtr object, QWidget* parent)
} }
l->addLayout(form); l->addLayout(form);
const int listViewIconSize = m_table->style()->pixelMetric(QStyle::PM_ListViewIconSize);
m_table->setIconSize({listViewIconSize, listViewIconSize});
m_table->setColumnCount(m_columnCountNonOutput); m_table->setColumnCount(m_columnCountNonOutput);
m_table->setRowCount(0); m_table->setRowCount(0);
QStringList labels; QStringList labels;
@ -113,6 +119,20 @@ OutputMapWidget::OutputMapWidget(ObjectPtr object, QWidget* parent)
setLayout(l); setLayout(l);
if(auto* parentObject = m_object->getObjectProperty("parent"))
{
m_getParentRequestId = parentObject->getObject(
[this](const ObjectPtr& obj, std::optional<const Error> ec)
{
if(obj && !ec)
{
m_getParentRequestId = Connection::invalidRequestId;
m_parentObject = obj;
updateKeyIcons();
}
});
}
if(m_items) /*[[likely]]*/ if(m_items) /*[[likely]]*/
{ {
m_getItemsRequestId = m_items->getObjects( m_getItemsRequestId = m_items->getObjects(
@ -123,6 +143,20 @@ OutputMapWidget::OutputMapWidget(ObjectPtr object, QWidget* parent)
updateItems(objects); updateItems(objects);
} }
}); });
connect(&BoardSettings::instance(), &BoardSettings::changed, this, &OutputMapWidget::updateKeyIcons);
}
}
OutputMapWidget::~OutputMapWidget()
{
if(m_getParentRequestId != Connection::invalidRequestId)
{
m_object->connection()->cancelRequest(m_getParentRequestId);
}
if(m_getItemsRequestId != Connection::invalidRequestId)
{
m_object->connection()->cancelRequest(m_getItemsRequestId);
} }
} }
@ -204,9 +238,65 @@ void OutputMapWidget::updateItems(const std::vector<ObjectPtr>& items)
} }
} }
updateKeyIcons();
updateTableOutputColumns(); updateTableOutputColumns();
} }
void OutputMapWidget::updateKeyIcons()
{
if(!m_parentObject)
{
return;
}
if(auto tileIdProperty = m_parentObject->getProperty("tile_id"))
{
const bool darkBackground = m_table->palette().window().color().lightnessF() < 0.5;
const auto tileId = tileIdProperty->toEnum<TileId>();
const int iconSize = m_table->iconSize().height();
QImage image(iconSize, iconSize, QImage::Format_ARGB32);
QPainter painter{&image};
painter.setRenderHint(QPainter::Antialiasing, true);
TilePainter tilePainter{painter, iconSize, *getBoardColorScheme(darkBackground ? BoardSettings::ColorScheme::Dark : BoardSettings::ColorScheme::Light)};
for(size_t i = 0; i < m_itemObjects.size(); i++)
{
if(auto* key = m_itemObjects[i]->getProperty("key"))
{
image.fill(Qt::transparent);
if(isRailTurnout(tileId))
{
tilePainter.drawTurnout(tileId, image.rect(), TileRotate::Deg0, TurnoutPosition::Unknown, static_cast<TurnoutPosition>(key->toInt()));
}
else if(isRailSignal(tileId))
{
tilePainter.drawSignal(tileId, image.rect(), TileRotate::Deg0, false, static_cast<SignalAspect>(key->toInt()));
}
else if(tileId == TileId::RailDirectionControl)
{
tilePainter.drawDirectionControl(tileId, image.rect(), TileRotate::Deg0, false, static_cast<DirectionControlState>(key->toInt()));
}
else if(tileId == TileId::RailDecoupler)
{
tilePainter.drawRailDecoupler(image.rect(), TileRotate::Deg90, false, static_cast<DecouplerState>(key->toInt()));
}
else if(tileId == TileId::Switch)
{
tilePainter.drawSwitch(image.rect(), key->toBool());
}
else
{
break; // tileId not supported (yet)
}
m_table->item(i, columnKey)->setIcon(QPixmap::fromImage(image));
}
}
}
}
void OutputMapWidget::updateTableOutputColumns() void OutputMapWidget::updateTableOutputColumns()
{ {
if(m_addresses && m_addresses->getAttributeBool(AttributeName::Visible, true)) if(m_addresses && m_addresses->getAttributeBool(AttributeName::Visible, true))

Datei anzeigen

@ -40,6 +40,7 @@ class OutputMapWidget : public QWidget
protected: protected:
ObjectPtr m_object; ObjectPtr m_object;
ObjectPtr m_parentObject;
const bool m_hasUseColumn; const bool m_hasUseColumn;
const int m_columnCountNonOutput; const int m_columnCountNonOutput;
AbstractVectorProperty* m_addresses; AbstractVectorProperty* m_addresses;
@ -48,15 +49,18 @@ class OutputMapWidget : public QWidget
QTableWidget* m_table; QTableWidget* m_table;
std::vector<ObjectPtr> m_itemObjects; std::vector<ObjectPtr> m_itemObjects;
std::vector<std::vector<ObjectPtr>> m_actions; std::vector<std::vector<ObjectPtr>> m_actions;
int m_getParentRequestId;
int m_getItemsRequestId; int m_getItemsRequestId;
int m_dummy; int m_dummy;
void updateTableOutputActions(ObjectVectorProperty& property, int row); void updateTableOutputActions(ObjectVectorProperty& property, int row);
void updateItems(const std::vector<ObjectPtr>& items); void updateItems(const std::vector<ObjectPtr>& items);
void updateKeyIcons();
void updateTableOutputColumns(); void updateTableOutputColumns();
public: public:
explicit OutputMapWidget(ObjectPtr object, QWidget* parent = nullptr); explicit OutputMapWidget(ObjectPtr object, QWidget* parent = nullptr);
~OutputMapWidget() override;
}; };
#endif #endif