Scheduled dispatch: Add dispatch slot tooltip
This commit is contained in:
@@ -2078,6 +2078,7 @@ STR_SCHDISPATCH_ADJUST :{BLACK}Adjust S
|
|||||||
STR_SCHDISPATCH_ADJUST_TOOLTIP :{BLACK}Adjust all departure slots in this schedule.
|
STR_SCHDISPATCH_ADJUST_TOOLTIP :{BLACK}Adjust all departure slots in this schedule.
|
||||||
STR_SCHDISPATCH_REMOVE :{BLACK}Remove Slots
|
STR_SCHDISPATCH_REMOVE :{BLACK}Remove Slots
|
||||||
STR_SCHDISPATCH_REMOVE_TOOLTIP :{BLACK}Enable removing departure slots from this schedule.
|
STR_SCHDISPATCH_REMOVE_TOOLTIP :{BLACK}Enable removing departure slots from this schedule.
|
||||||
|
STR_SCHDISPATCH_REMOVE_SLOT :{BLACK}Remove departure slot
|
||||||
STR_SCHDISPATCH_ADJUST_CAPTION_MINUTE :{BLACK}Adjustment to add (minutes)
|
STR_SCHDISPATCH_ADJUST_CAPTION_MINUTE :{BLACK}Adjustment to add (minutes)
|
||||||
STR_SCHDISPATCH_ADJUST_CAPTION_DAY :{BLACK}Adjustment to add (days)
|
STR_SCHDISPATCH_ADJUST_CAPTION_DAY :{BLACK}Adjustment to add (days)
|
||||||
STR_SCHDISPATCH_ADJUST_CAPTION_TICKS :{BLACK}Adjustment to add (ticks)
|
STR_SCHDISPATCH_ADJUST_CAPTION_TICKS :{BLACK}Adjustment to add (ticks)
|
||||||
@@ -2112,6 +2113,12 @@ STR_SCHDISPATCH_RENAME_SCHEDULE_CAPTION :{WHITE}Name sch
|
|||||||
STR_ERROR_CAN_T_RENAME_SCHEDULE :{WHITE}Can't name schedule...
|
STR_ERROR_CAN_T_RENAME_SCHEDULE :{WHITE}Can't name schedule...
|
||||||
STR_SCHDISPATCH_MOVE_SCHEDULE :{BLACK}Change position of current schedule in schedule list
|
STR_SCHDISPATCH_MOVE_SCHEDULE :{BLACK}Change position of current schedule in schedule list
|
||||||
STR_SCHDISPATCH_DATE_WALLCLOCK_TINY_FLAGGED :{DATE_WALLCLOCK_TINY}*
|
STR_SCHDISPATCH_DATE_WALLCLOCK_TINY_FLAGGED :{DATE_WALLCLOCK_TINY}*
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP :{BLACK}{DATE_WALLCLOCK_TINY}
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP_RELATIVE : ({TIME_HHMM} from start)
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP_LAST :{}Last departure slot
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP_NEXT :{}Next available departure slot
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP_REUSE :{}Departure slot may be used more than once
|
||||||
|
STR_SCHDISPATCH_SLOT_TOOLTIP_TIME_SUFFIX : ({DATE_WALLCLOCK_TINY})
|
||||||
|
|
||||||
STR_SCHDISPATCH_SUMMARY_NO_LAST_DEPARTURE :{BLACK}No previous departures.
|
STR_SCHDISPATCH_SUMMARY_NO_LAST_DEPARTURE :{BLACK}No previous departures.
|
||||||
STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_PAST :{BLACK}Last departure at {DATE_WALLCLOCK_TINY}.
|
STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_PAST :{BLACK}Last departure at {DATE_WALLCLOCK_TINY}.
|
||||||
|
@@ -455,6 +455,69 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WID_SCHDISPATCH_MATRIX: {
|
||||||
|
NWidgetBase *nwi = this->GetWidget<NWidgetBase>(WID_SCHDISPATCH_MATRIX);
|
||||||
|
const DispatchSlot *slot;
|
||||||
|
bool is_header;
|
||||||
|
std::tie(slot, is_header) = this->GetSlotFromMatrixPoint(pt.x - nwi->pos_x, pt.y - nwi->pos_y);
|
||||||
|
if (slot == nullptr) return false;
|
||||||
|
|
||||||
|
if (is_header && this->remove_slot_mode) {
|
||||||
|
GuiShowTooltips(this, STR_SCHDISPATCH_REMOVE_SLOT, close_cond);
|
||||||
|
} else {
|
||||||
|
const DispatchSchedule &ds = this->GetSelectedSchedule();
|
||||||
|
const DateTicksScaled start_tick = ds.GetScheduledDispatchStartTick();
|
||||||
|
|
||||||
|
SetDParam(0, start_tick + slot->offset);
|
||||||
|
_temp_special_strings[0] = GetString(STR_SCHDISPATCH_SLOT_TOOLTIP);
|
||||||
|
if (_settings_time.time_in_minutes) {
|
||||||
|
ClockFaceMinutes start_minutes = _settings_time.ToTickMinutes(start_tick).ToClockFaceMinutes();
|
||||||
|
if (start_minutes != 0) {
|
||||||
|
TickMinutes offset_minutes = slot->offset / _settings_time.ticks_per_minute;
|
||||||
|
SetDParam(0, offset_minutes.ClockHHMM());
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_RELATIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool have_last = false;
|
||||||
|
if (ds.GetScheduledDispatchLastDispatch() % ds.GetScheduledDispatchDuration() == slot->offset) {
|
||||||
|
_temp_special_strings[0] += '\n';
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_LAST);
|
||||||
|
if (_settings_time.time_in_minutes) {
|
||||||
|
ClockFaceMinutes mins = _settings_time.ToTickMinutes(start_tick + ds.GetScheduledDispatchLastDispatch()).ToClockFaceMinutes();
|
||||||
|
if (mins != _settings_time.ToTickMinutes(start_tick + slot->offset).ToClockFaceMinutes()) {
|
||||||
|
SetDParam(0, start_tick + ds.GetScheduledDispatchLastDispatch());
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_TIME_SUFFIX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
have_last = true;
|
||||||
|
}
|
||||||
|
DateTicksScaled next_slot = GetScheduledDispatchTime(ds, _scaled_date_ticks);
|
||||||
|
if ((next_slot - ds.GetScheduledDispatchStartTick()).AsTicks() % ds.GetScheduledDispatchDuration() == slot->offset) {
|
||||||
|
if (!have_last) _temp_special_strings[0] += '\n';
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_NEXT);
|
||||||
|
if (_settings_time.time_in_minutes) {
|
||||||
|
ClockFaceMinutes mins = _settings_time.ToTickMinutes(next_slot).ToClockFaceMinutes();
|
||||||
|
if (mins != _settings_time.ToTickMinutes(start_tick + slot->offset).ToClockFaceMinutes()) {
|
||||||
|
SetDParam(0, next_slot);
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_TIME_SUFFIX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto flags = slot->flags;
|
||||||
|
if (ds.GetScheduledDispatchReuseSlots()) ClrBit(flags, DispatchSlot::SDSF_REUSE_SLOT);
|
||||||
|
if (flags != 0) {
|
||||||
|
_temp_special_strings[0] += '\n';
|
||||||
|
if (HasBit(flags, DispatchSlot::SDSF_REUSE_SLOT)) {
|
||||||
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_REUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GuiShowTooltips(this, SPECSTR_TEMP_START, close_cond);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -763,13 +826,14 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle click in the departure time matrix.
|
* Get slot and whether it's in the header section in the departure time matrix.
|
||||||
* @param x Horizontal position in the matrix widget in pixels.
|
* @param x Horizontal position in the matrix widget in pixels.
|
||||||
* @param y Vertical position in the matrix widget in pixels.
|
* @param y Vertical position in the matrix widget in pixels.
|
||||||
|
* @return slot, and whether the position was in the header section
|
||||||
*/
|
*/
|
||||||
void TimeClick(int x, int y)
|
std::pair<const DispatchSlot *, bool> GetSlotFromMatrixPoint(int x, int y) const
|
||||||
{
|
{
|
||||||
if (!this->IsScheduleSelected()) return;
|
if (!this->IsScheduleSelected()) return { nullptr, false };
|
||||||
|
|
||||||
const NWidgetCore *matrix_widget = this->GetWidget<NWidgetCore>(WID_SCHDISPATCH_MATRIX);
|
const NWidgetCore *matrix_widget = this->GetWidget<NWidgetCore>(WID_SCHDISPATCH_MATRIX);
|
||||||
/* In case of RTL the widgets are swapped as a whole */
|
/* In case of RTL the widgets are swapped as a whole */
|
||||||
@@ -777,16 +841,31 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
|
|
||||||
uint xt = x / this->resize.step_width;
|
uint xt = x / this->resize.step_width;
|
||||||
int xm = x % this->resize.step_width;
|
int xm = x % this->resize.step_width;
|
||||||
if (xt >= this->num_columns) return;
|
if (xt >= this->num_columns) return { nullptr, false };
|
||||||
|
|
||||||
uint row = y / this->resize.step_height;
|
uint row = y / this->resize.step_height;
|
||||||
if (row >= this->vscroll->GetCapacity()) return;
|
if (row >= this->vscroll->GetCapacity()) return { nullptr, false };
|
||||||
|
|
||||||
uint pos = ((row + this->vscroll->GetPosition()) * this->num_columns) + xt;
|
uint pos = ((row + this->vscroll->GetPosition()) * this->num_columns) + xt;
|
||||||
|
|
||||||
const DispatchSchedule &ds = this->GetSelectedSchedule();
|
const DispatchSchedule &ds = this->GetSelectedSchedule();
|
||||||
|
if (pos >= this->item_count || pos >= ds.GetScheduledDispatch().size()) return { nullptr, false };
|
||||||
|
|
||||||
if (pos >= this->item_count || pos >= ds.GetScheduledDispatch().size()) {
|
return { &ds.GetScheduledDispatch()[pos], xm <= this->header_width };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle click in the departure time matrix.
|
||||||
|
* @param x Horizontal position in the matrix widget in pixels.
|
||||||
|
* @param y Vertical position in the matrix widget in pixels.
|
||||||
|
*/
|
||||||
|
void TimeClick(int x, int y)
|
||||||
|
{
|
||||||
|
const DispatchSlot *slot;
|
||||||
|
bool is_header;
|
||||||
|
std::tie(slot, is_header) = this->GetSlotFromMatrixPoint(x, y);
|
||||||
|
|
||||||
|
if (slot == nullptr) {
|
||||||
if (this->selected_slot != UINT32_MAX) {
|
if (this->selected_slot != UINT32_MAX) {
|
||||||
this->selected_slot = UINT32_MAX;
|
this->selected_slot = UINT32_MAX;
|
||||||
this->SetWidgetDirty(WID_SCHDISPATCH_MATRIX);
|
this->SetWidgetDirty(WID_SCHDISPATCH_MATRIX);
|
||||||
@@ -794,16 +873,15 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t offset = ds.GetScheduledDispatch()[pos].offset;
|
if (is_header && this->remove_slot_mode) {
|
||||||
|
DoCommandP(0, this->vehicle->index | (this->schedule_index << 20), slot->offset, CMD_SCHEDULED_DISPATCH_REMOVE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE));
|
||||||
if (xm <= this->header_width && this->remove_slot_mode) {
|
return;
|
||||||
DoCommandP(0, this->vehicle->index | (this->schedule_index << 20), offset, CMD_SCHEDULED_DISPATCH_REMOVE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->selected_slot == offset) {
|
if (this->selected_slot == slot->offset) {
|
||||||
this->selected_slot = UINT32_MAX;
|
this->selected_slot = UINT32_MAX;
|
||||||
} else {
|
} else {
|
||||||
this->selected_slot = offset;
|
this->selected_slot = slot->offset;
|
||||||
}
|
}
|
||||||
this->SetWidgetDirty(WID_SCHDISPATCH_MATRIX);
|
this->SetWidgetDirty(WID_SCHDISPATCH_MATRIX);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user