StopModel: suggest track when fail to set next segment
This commit is contained in:
parent
43658c227a
commit
cb20814a69
3 changed files with 57 additions and 7 deletions
|
@ -858,8 +858,9 @@ void StopModel::setStopInfo(const QModelIndex &idx, StopItem newStop, StopItem::
|
|||
StopItem& prevStop = stops[row - 1];
|
||||
if(prevStop.nextSegment.segmentId != prevSeg.segmentId)
|
||||
{
|
||||
db_id suggestedTrackId = 0;
|
||||
if(!trySelectNextSegment(prevStop, prevSeg.segmentId, prevStop.toGate.gateTrackNum,
|
||||
newStop.stationId, newStop.fromGate.gateId))
|
||||
newStop.stationId, newStop.fromGate.gateId, suggestedTrackId))
|
||||
return;
|
||||
|
||||
startStopsEditing();
|
||||
|
@ -1381,8 +1382,11 @@ bool StopModel::trySetTrackConnections(StopItem &item, db_id trackId, QString *o
|
|||
return true;
|
||||
}
|
||||
|
||||
bool StopModel::trySelectNextSegment(StopItem &item, db_id segmentId, int suggestedOutGateTrk, db_id nextStationId, db_id &seg_out_gateId)
|
||||
bool StopModel::trySelectNextSegment(StopItem &item, db_id segmentId, int suggestedOutGateTrk, db_id nextStationId,
|
||||
db_id &seg_out_gateId, db_id &out_suggestedTrackId)
|
||||
{
|
||||
out_suggestedTrackId = -1;
|
||||
|
||||
bool reversed = false;
|
||||
query q(mDb, "SELECT s.in_gate_id,g1.station_id,s.out_gate_id,g2.station_id"
|
||||
" FROM railway_segments s"
|
||||
|
@ -1421,6 +1425,8 @@ bool StopModel::trySelectNextSegment(StopItem &item, db_id segmentId, int sugges
|
|||
//Station out gate = segment in gate
|
||||
if(seg_in_gateId != item.toGate.gateId || item.toGate.gateTrackNum != item.nextSegment.inTrackNum)
|
||||
{
|
||||
out_suggestedTrackId = 0;
|
||||
|
||||
//Try to find a gate connected to previous track_id
|
||||
//Prefer suggested gate out track num if possible or lowest one possible
|
||||
QByteArray sql = "SELECT c.id,c.gate_track,c.track_side,sc.id,sc.%2_track"
|
||||
|
@ -1441,7 +1447,48 @@ bool StopModel::trySelectNextSegment(StopItem &item, db_id segmentId, int sugges
|
|||
if(q.step() != SQLITE_ROW)
|
||||
{
|
||||
//Error: gate is not connected to previous track
|
||||
//User must change previous track
|
||||
//User must change previous track, make a suggestion (lowest track connected to in and out gates)
|
||||
|
||||
sql = "SELECT c2.track_id"
|
||||
" FROM station_gate_connections c2"
|
||||
" JOIN railway_connections sc ON sc.seg_id=?2 AND sc.%1_track=c2.gate_track"
|
||||
" %3"
|
||||
" JOIN station_tracks t ON t.id=c2.track_id"
|
||||
" WHERE c2.gate_id=?1"
|
||||
" ORDER BY c2.gate_track=?3 DESC,c2.gate_track ASC,t.pos ASC"
|
||||
" LIMIT 1";
|
||||
|
||||
if(item.type != StopType::First)
|
||||
{
|
||||
//Check also in gate
|
||||
sql.replace("%3", "JOIN station_gate_connections c1 ON"
|
||||
" c1.gate_id=?4 AND c1.gate_track=?5 AND c1.track_id=c2.track_id");
|
||||
}
|
||||
else
|
||||
{
|
||||
//Do not check in gate for first stop
|
||||
sql.replace("%3", "");
|
||||
}
|
||||
|
||||
sql.replace("%1", reversed ? "out" : "in");
|
||||
sql.replace("%2", reversed ? "in" : "out");
|
||||
|
||||
q.prepare(sql);
|
||||
q.bind(1, seg_in_gateId);
|
||||
q.bind(2, segmentId);
|
||||
q.bind(3, suggestedOutGateTrk);
|
||||
|
||||
if(item.type != StopType::First)
|
||||
{
|
||||
q.bind(4, item.fromGate.gateId);
|
||||
q.bind(5, item.fromGate.gateTrackNum);
|
||||
}
|
||||
|
||||
if(q.step() == SQLITE_ROW)
|
||||
{
|
||||
out_suggestedTrackId = q.getRows().get<db_id>(0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ public:
|
|||
QString *outErr);
|
||||
|
||||
bool trySelectNextSegment(StopItem &item, db_id segmentId, int suggestedOutGateTrk,
|
||||
db_id nextStationId, db_id &out_gateId);
|
||||
db_id nextStationId, db_id &out_gateId, db_id &out_suggestedTrackId);
|
||||
|
||||
signals:
|
||||
void edited(bool val);
|
||||
|
|
|
@ -151,7 +151,8 @@ void StopEditingHelper::popupSegmentCombo()
|
|||
db_id newSegId = stationOutGateMatchModel->getSegmentIdAtRow(0);
|
||||
|
||||
db_id segOutGateId = 0;
|
||||
if(model->trySelectNextSegment(curStop, newSegId, 0, 0, segOutGateId))
|
||||
db_id suggestedTrackId = 0;
|
||||
if(model->trySelectNextSegment(curStop, newSegId, 0, 0, segOutGateId, suggestedTrackId))
|
||||
{
|
||||
//Success, close editor
|
||||
emit nextSegmentChosen();
|
||||
|
@ -257,7 +258,8 @@ void StopEditingHelper::onOutGateSelected(const QModelIndex &idx)
|
|||
const db_id newSegId = stationOutGateMatchModel->getSegmentIdAtRow(idx.row());
|
||||
const db_id oldGateId = curStop.toGate.gateId;
|
||||
db_id segOutGateId = 0;
|
||||
if(model->trySelectNextSegment(curStop, newSegId, 0, 0, segOutGateId))
|
||||
db_id suggestedTrackId = 0;
|
||||
if(model->trySelectNextSegment(curStop, newSegId, 0, 0, segOutGateId, suggestedTrackId))
|
||||
{
|
||||
//Update gate track
|
||||
updateGateTrackSpin(curStop.toGate);
|
||||
|
@ -284,7 +286,8 @@ void StopEditingHelper::checkOutGateTrack()
|
|||
curStop.toGate.gateTrackNum = trackNum; //Trigger checking of railway segment connections
|
||||
|
||||
db_id segOutGateId = 0;
|
||||
if(model->trySelectNextSegment(curStop, curStop.nextSegment.segmentId, trackNum, 0, segOutGateId))
|
||||
db_id suggestedTrackId = 0;
|
||||
if(model->trySelectNextSegment(curStop, curStop.nextSegment.segmentId, trackNum, 0, segOutGateId, suggestedTrackId))
|
||||
{
|
||||
//Update gate track
|
||||
updateGateTrackSpin(curStop.toGate);
|
||||
|
|
Loading…
Reference in a new issue