From 40d20b903d573de2f560f8873111654cf1d946ef Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Fri, 16 Aug 2024 15:58:46 +0200 Subject: [PATCH] server: TrainVehicleList more strict checks for add/remove - Do not add vehicle to an active train if it is already in an other active train - When removing vehicle from active train reset activeTrain property - When adding vehicle to active train, set it's activeTrain property --- server/src/train/trainvehiclelist.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/src/train/trainvehiclelist.cpp b/server/src/train/trainvehiclelist.cpp index a0e2a4b6..db8bdeaa 100644 --- a/server/src/train/trainvehiclelist.cpp +++ b/server/src/train/trainvehiclelist.cpp @@ -170,8 +170,8 @@ void TrainVehicleList::rowsChanged(uint32_t first, uint32_t last) void TrainVehicleList::addObject(std::shared_ptr vehicle) { - if(!vehicle) - return; //Cannot add null vehicles + if(!vehicle || (vehicle->activeTrain.value() && train().active)) + return; //Cannot add null vehicles or vehicles in other active trains to an active train std::shared_ptr object = getItemFromVehicle(vehicle); if(object) @@ -181,6 +181,9 @@ void TrainVehicleList::addObject(std::shared_ptr vehicle) object->vehicle.setValueInternal(vehicle); object->vehicle->trains.appendInternal(parent().shared_ptr()); + if(train().active) + object->vehicle->activeTrain.setValueInternal(parent().shared_ptr()); + items.appendInternal(object); m_propertyChanged.emplace(object.get(), object->propertyChanged.connect(std::bind(&TrainVehicleList::propertyChanged, this, std::placeholders::_1))); @@ -197,6 +200,9 @@ void TrainVehicleList::removeObject(const std::shared_ptr m_propertyChanged[item.get()].disconnect(); m_propertyChanged.erase(item.get()); + if(item->vehicle->activeTrain.value() == parent().shared_ptr()) + item->vehicle->activeTrain.setValueInternal(nullptr); + item->vehicle->trains.removeInternal(parent().shared_ptr()); item->destroy(); items.removeInternal(item);