nx button: draw gray if not enabled
Dieser Commit ist enthalten in:
Ursprung
7b3da355d1
Commit
84ef8713cd
@ -162,6 +162,7 @@ void BoardAreaWidget::tileObjectAdded(int16_t x, int16_t y, const ObjectPtr& obj
|
||||
break;
|
||||
|
||||
case TileId::RailNXButton:
|
||||
tryConnect("enabled");
|
||||
if(auto* nxButton = dynamic_cast<NXButtonRailTile*>(object.get())) /*[[likely]]*/
|
||||
{
|
||||
connect(nxButton, &NXButtonRailTile::isPressedChanged, this, handler);
|
||||
@ -335,6 +336,15 @@ DecouplerState BoardAreaWidget::getDecouplerState(const TileLocation& l) const
|
||||
return DecouplerState::Deactivated;
|
||||
}
|
||||
|
||||
bool BoardAreaWidget::getNXButtonEnabled(const TileLocation& l) const
|
||||
{
|
||||
if(auto object = std::dynamic_pointer_cast<NXButtonRailTile>(m_board.board().getTileObject(l)))
|
||||
{
|
||||
return object->getPropertyValueBool("enabled", false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool BoardAreaWidget::getNXButtonPressed(const TileLocation& l) const
|
||||
{
|
||||
if(auto object = std::dynamic_pointer_cast<NXButtonRailTile>(m_board.board().getTileObject(l)))
|
||||
@ -585,7 +595,7 @@ void BoardAreaWidget::paintEvent(QPaintEvent* event)
|
||||
break;
|
||||
|
||||
case TileId::RailNXButton:
|
||||
tilePainter.drawRailNX(r, a, isReserved, getNXButtonPressed(it.first));
|
||||
tilePainter.drawRailNX(r, a, isReserved, getNXButtonEnabled(it.first), getNXButtonPressed(it.first));
|
||||
break;
|
||||
|
||||
case TileId::None:
|
||||
|
||||
@ -102,6 +102,7 @@ class BoardAreaWidget : public QWidget
|
||||
SignalAspect getSignalAspect(const TileLocation& l) const;
|
||||
Color getColor(const TileLocation& l) const;
|
||||
DecouplerState getDecouplerState(const TileLocation& l) const;
|
||||
bool getNXButtonEnabled(const TileLocation& l) const;
|
||||
bool getNXButtonPressed(const TileLocation& l) const;
|
||||
TileLocation pointToTileLocation(const QPoint& p);
|
||||
|
||||
|
||||
@ -394,11 +394,35 @@ BoardWidget::BoardWidget(std::shared_ptr<Board> object, QWidget* parent) :
|
||||
m_statusBarCoords->setText(QString::number(x) + ", " + QString::number(y));
|
||||
|
||||
const auto tileId = m_object->getTileId(tl);
|
||||
if((!m_toolbarEdit->isVisible() && (isRailTurnout(tileId) || isRailSignal(tileId) || tileId == TileId::RailDirectionControl || tileId == TileId::RailDecoupler || tileId == TileId::PushButton || tileId == TileId::RailNXButton)) ||
|
||||
(m_toolbarEdit->isVisible() && isActive(tileId) && m_editActions->checkedAction() == m_editActionNone))
|
||||
setCursor(Qt::PointingHandCursor);
|
||||
else
|
||||
setCursor(Qt::ArrowCursor);
|
||||
auto cursorShape = Qt::ArrowCursor;
|
||||
|
||||
if(m_toolbarEdit->isVisible()) // Edit mode
|
||||
{
|
||||
if(isActive(tileId) && m_editActions->checkedAction() == m_editActionNone)
|
||||
{
|
||||
cursorShape = Qt::PointingHandCursor;
|
||||
}
|
||||
}
|
||||
else // Operate mode
|
||||
{
|
||||
if(isRailTurnout(tileId) ||
|
||||
isRailSignal(tileId) ||
|
||||
tileId == TileId::RailDirectionControl ||
|
||||
tileId == TileId::RailDecoupler ||
|
||||
tileId == TileId::PushButton)
|
||||
{
|
||||
cursorShape = Qt::PointingHandCursor;
|
||||
}
|
||||
else if(tileId == TileId::RailNXButton)
|
||||
{
|
||||
if(auto nxButton = m_object->getTileObject(tl); nxButton && nxButton->getPropertyValueBool("enabled", false))
|
||||
{
|
||||
cursorShape = Qt::PointingHandCursor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setCursor(cursorShape);
|
||||
}
|
||||
else
|
||||
m_statusBarCoords->setText("");
|
||||
@ -597,6 +621,11 @@ void BoardWidget::tileClicked(int16_t x, int16_t y)
|
||||
{
|
||||
if(auto nxButton = std::dynamic_pointer_cast<NXButtonRailTile>(obj)) /*[[likely]]*/
|
||||
{
|
||||
if(!nxButton->getPropertyValueBool("enabled", false))
|
||||
{
|
||||
return; // not enabled, no action
|
||||
}
|
||||
|
||||
if(nxButton->isPressed())
|
||||
{
|
||||
releaseNXButton(nxButton);
|
||||
|
||||
@ -1289,9 +1289,9 @@ void TilePainter::drawRailDecoupler(const QRectF& r, TileRotate rotate, bool isR
|
||||
m_painter.restore();
|
||||
}
|
||||
|
||||
void TilePainter::drawRailNX(const QRectF& r, TileRotate rotate, bool isReserved, bool pressed)
|
||||
void TilePainter::drawRailNX(const QRectF& r, TileRotate rotate, bool isReserved, bool isEnabled, bool pressed)
|
||||
{
|
||||
setTrackPen(isReserved);
|
||||
drawStraight(r, rotate);
|
||||
drawPushButton(r, pressed ? Color::White : Color::Blue);
|
||||
drawPushButton(r, pressed ? Color::White : (isEnabled ? Color::Blue : Color::Gray));
|
||||
}
|
||||
|
||||
@ -110,7 +110,7 @@ class TilePainter
|
||||
|
||||
void drawRailDecoupler(const QRectF& r, TileRotate rotate, bool isReserved = false, DecouplerState active = DecouplerState::Deactivated);
|
||||
|
||||
void drawRailNX(const QRectF& r, TileRotate rotate, bool isReserved = false, bool pressed = false);
|
||||
void drawRailNX(const QRectF& r, TileRotate rotate, bool isReserved = false, bool isEnabled = false, bool pressed = false);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -49,6 +49,7 @@ NXButtonRailTile::NXButtonRailTile(World& world, std::string_view id_)
|
||||
: StraightRailTile(world, id_, TileId::RailNXButton)
|
||||
, m_node{*this, 2}
|
||||
, name{this, "name", std::string{id_}, PropertyFlags::ReadWrite | PropertyFlags::Store}
|
||||
, enabled{this, "enabled", false, PropertyFlags::ReadOnly | PropertyFlags::NoStore}
|
||||
, block{this, "block", nullptr, PropertyFlags::ReadOnly | PropertyFlags::NoStore}
|
||||
, input{this, "input", nullptr, PropertyFlags::ReadWrite | PropertyFlags::Store, nullptr,
|
||||
[this](const std::shared_ptr<Input>& value)
|
||||
@ -70,6 +71,9 @@ NXButtonRailTile::NXButtonRailTile(World& world, std::string_view id_)
|
||||
Attributes::addDisplayName(name, DisplayName::Object::name);
|
||||
m_interfaceItems.add(name);
|
||||
|
||||
Attributes::addObjectEditor(enabled, false);
|
||||
m_interfaceItems.add(enabled);
|
||||
|
||||
m_interfaceItems.add(block);
|
||||
|
||||
Attributes::addEnabled(input, editable);
|
||||
@ -91,6 +95,8 @@ void NXButtonRailTile::loaded()
|
||||
|
||||
if(input)
|
||||
connectInput(*input);
|
||||
|
||||
updateEnabled();
|
||||
}
|
||||
|
||||
void NXButtonRailTile::destroying()
|
||||
@ -107,6 +113,8 @@ void NXButtonRailTile::worldEvent(WorldState worldState, WorldEvent worldEvent)
|
||||
|
||||
Attributes::setEnabled(name, editable);
|
||||
Attributes::setEnabled(input, editable);
|
||||
|
||||
updateEnabled();
|
||||
}
|
||||
|
||||
void NXButtonRailTile::boardModified()
|
||||
@ -132,6 +140,8 @@ void NXButtonRailTile::boardModified()
|
||||
block.setValueInternal(nullptr);
|
||||
Log::log(*this, LogMessage::W3002_NX_BUTTON_NOT_CONNECTED_TO_ANY_BLOCK);
|
||||
}
|
||||
|
||||
updateEnabled();
|
||||
}
|
||||
|
||||
void NXButtonRailTile::connectInput(Input& object)
|
||||
@ -146,9 +156,9 @@ void NXButtonRailTile::connectInput(Input& object)
|
||||
m_inputValueChanged = object.onValueChanged.connect(
|
||||
[this](bool value, const std::shared_ptr<Input>& /*input*/)
|
||||
{
|
||||
if(!block)
|
||||
if(!enabled)
|
||||
{
|
||||
return; // no block, no action
|
||||
return; // not enabled, no action
|
||||
}
|
||||
|
||||
if(value)
|
||||
@ -168,3 +178,8 @@ void NXButtonRailTile::disconnectInput(Input& object)
|
||||
m_inputDestroying.disconnect();
|
||||
object.consumers.removeInternal(shared_from_this());
|
||||
}
|
||||
|
||||
void NXButtonRailTile::updateEnabled()
|
||||
{
|
||||
enabled.setValueInternal(block && contains(m_world.state, WorldState::Run));
|
||||
}
|
||||
|
||||
@ -45,6 +45,8 @@ class NXButtonRailTile final : public StraightRailTile
|
||||
void connectInput(Input& object);
|
||||
void disconnectInput(Input& object);
|
||||
|
||||
void updateEnabled();
|
||||
|
||||
protected:
|
||||
void loaded() final;
|
||||
void destroying() final;
|
||||
@ -53,6 +55,7 @@ class NXButtonRailTile final : public StraightRailTile
|
||||
|
||||
public:
|
||||
Property<std::string> name;
|
||||
Property<bool> enabled;
|
||||
ObjectProperty<BlockRailTile> block;
|
||||
ObjectProperty<Input> input;
|
||||
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren