src/timetable_gui.cpp
branchnoai
changeset 9826 9707ad4c9b60
parent 9724 b39bc69bb2f2
child 9837 c9ec4f82e0d0
equal deleted inserted replaced
9825:cc77111ebd85 9826:9707ad4c9b60
    19 #include "player_func.h"
    19 #include "player_func.h"
    20 #include "settings_type.h"
    20 #include "settings_type.h"
    21 
    21 
    22 #include "table/strings.h"
    22 #include "table/strings.h"
    23 
    23 
       
    24 enum TimetableViewWindowWidgets {
       
    25 	TTV_WIDGET_CLOSEBOX = 0,
       
    26 	TTV_CAPTION,
       
    27 	TTV_ORDER_VIEW,
       
    28 	TTV_STICKY,
       
    29 	TTV_TIMETABLE_PANEL,
       
    30 	TTV_SCROLLBAR,
       
    31 	TTV_SUMMARY_PANEL,
       
    32 	TTV_CHANGE_TIME,
       
    33 	TTV_CLEAR_TIME,
       
    34 	TTV_RESET_LATENESS,
       
    35 	TTV_AUTOFILL,
       
    36 	TTV_EMPTY,
       
    37 	TTV_RESIZE,
       
    38 };
       
    39 
    24 static int GetOrderFromTimetableWndPt(Window *w, int y, const Vehicle *v)
    40 static int GetOrderFromTimetableWndPt(Window *w, int y, const Vehicle *v)
    25 {
    41 {
    26 	/*
    42 	/*
    27 	 * Calculation description:
    43 	 * Calculation description:
    28 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
    44 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
    55 
    71 
    56 	SetVScrollCount(w, v->num_orders * 2);
    72 	SetVScrollCount(w, v->num_orders * 2);
    57 
    73 
    58 	if (v->owner == _local_player) {
    74 	if (v->owner == _local_player) {
    59 		if (selected == -1) {
    75 		if (selected == -1) {
    60 			w->DisableWidget(6);
    76 			w->DisableWidget(TTV_CHANGE_TIME);
    61 			w->DisableWidget(7);
    77 			w->DisableWidget(TTV_CLEAR_TIME);
    62 		} else if (selected % 2 == 1) {
    78 		} else if (selected % 2 == 1) {
    63 			w->EnableWidget(6);
    79 			w->EnableWidget(TTV_CHANGE_TIME);
    64 			w->EnableWidget(7);
    80 			w->EnableWidget(TTV_CLEAR_TIME);
    65 		} else {
    81 		} else {
    66 			const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
    82 			const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
    67 			bool disable = order == NULL || order->type != OT_GOTO_STATION || (_patches.new_nonstop && (order->flags & OFB_NON_STOP));
    83 			bool disable = order == NULL || order->type != OT_GOTO_STATION || (_patches.new_nonstop && (order->flags & OFB_NON_STOP));
    68 
    84 
    69 			w->SetWidgetDisabledState(6, disable);
    85 			w->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
    70 			w->SetWidgetDisabledState(7, disable);
    86 			w->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
    71 		}
    87 		}
    72 
    88 
    73 		w->EnableWidget(8);
    89 		w->EnableWidget(TTV_RESET_LATENESS);
    74 		w->EnableWidget(9);
    90 		w->EnableWidget(TTV_AUTOFILL);
    75 	} else {
    91 	} else {
    76 		w->DisableWidget(6);
    92 		w->DisableWidget(TTV_CHANGE_TIME);
    77 		w->DisableWidget(7);
    93 		w->DisableWidget(TTV_CLEAR_TIME);
    78 		w->DisableWidget(8);
    94 		w->DisableWidget(TTV_RESET_LATENESS);
    79 		w->DisableWidget(9);
    95 		w->DisableWidget(TTV_AUTOFILL);
    80 	}
    96 	}
    81 
    97 
    82 	w->SetWidgetLoweredState(9, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
    98 	w->SetWidgetLoweredState(TTV_AUTOFILL, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
    83 
    99 
    84 	SetDParam(0, v->index);
   100 	SetDParam(0, v->index);
    85 	DrawWindowWidgets(w);
   101 	DrawWindowWidgets(w);
    86 
   102 
    87 	int y = 15;
   103 	int y = 15;
   171 
   187 
   172 		i++;
   188 		i++;
   173 		y += 10;
   189 		y += 10;
   174 	}
   190 	}
   175 
   191 
   176 	y = w->widget[5].top + 1;
   192 	y = w->widget[TTV_SUMMARY_PANEL].top + 1;
   177 
   193 
   178 	{
   194 	{
   179 		uint total_time = 0;
   195 		uint total_time = 0;
   180 		bool complete = true;
   196 		bool complete = true;
   181 
   197 
   219 
   235 
   220 		case WE_CLICK: {
   236 		case WE_CLICK: {
   221 			const Vehicle *v = GetVehicle(w->window_number);
   237 			const Vehicle *v = GetVehicle(w->window_number);
   222 
   238 
   223 			switch (we->we.click.widget) {
   239 			switch (we->we.click.widget) {
   224 				case 3: { /* Main panel. */
   240 				case TTV_ORDER_VIEW: /* Order view button */
       
   241 					ShowOrdersWindow(v);
       
   242 					break;
       
   243 
       
   244 				case TTV_TIMETABLE_PANEL: { /* Main panel. */
   225 					int selected = GetOrderFromTimetableWndPt(w, we->we.click.pt.y, v);
   245 					int selected = GetOrderFromTimetableWndPt(w, we->we.click.pt.y, v);
   226 
   246 
   227 					if (selected == INVALID_ORDER || selected == WP(w, order_d).sel) {
   247 					if (selected == INVALID_ORDER || selected == WP(w, order_d).sel) {
   228 						/* Deselect clicked order */
   248 						/* Deselect clicked order */
   229 						WP(w, order_d).sel = -1;
   249 						WP(w, order_d).sel = -1;
   231 						/* Select clicked order */
   251 						/* Select clicked order */
   232 						WP(w, order_d).sel = selected;
   252 						WP(w, order_d).sel = selected;
   233 					}
   253 					}
   234 				} break;
   254 				} break;
   235 
   255 
   236 				case 6: { /* "Wait For" button. */
   256 				case TTV_CHANGE_TIME: { /* "Wait For" button. */
   237 					int selected = WP(w, order_d).sel;
   257 					int selected = WP(w, order_d).sel;
   238 					VehicleOrderID real = (selected + 1) / 2;
   258 					VehicleOrderID real = (selected + 1) / 2;
   239 
   259 
   240 					if (real >= v->num_orders) real = 0;
   260 					if (real >= v->num_orders) real = 0;
   241 
   261 
   253 					}
   273 					}
   254 
   274 
   255 					ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, 150, w, CS_NUMERAL);
   275 					ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, 150, w, CS_NUMERAL);
   256 				} break;
   276 				} break;
   257 
   277 
   258 				case 7: { /* Clear waiting time button. */
   278 				case TTV_CLEAR_TIME: { /* Clear waiting time button. */
   259 					uint32 p1 = PackTimetableArgs(v, WP(w, order_d).sel);
   279 					uint32 p1 = PackTimetableArgs(v, WP(w, order_d).sel);
   260 					DoCommandP(0, p1, 0, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   280 					DoCommandP(0, p1, 0, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   261 				} break;
   281 				} break;
   262 
   282 
   263 				case 8: /* Reset the vehicle's late counter. */
   283 				case TTV_RESET_LATENESS: /* Reset the vehicle's late counter. */
   264 					DoCommandP(0, v->index, 0, NULL, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   284 					DoCommandP(0, v->index, 0, NULL, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   265 					break;
   285 					break;
   266 
   286 
   267 				case 9: /* Autofill the timetable. */
   287 				case TTV_AUTOFILL: /* Autofill the timetable. */
   268 					DoCommandP(0, v->index, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   288 					DoCommandP(0, v->index, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   269 					break;
   289 					break;
   270 			}
   290 			}
   271 
   291 
   272 			SetWindowDirty(w);
   292 			SetWindowDirty(w);
   285 			DoCommandP(0, p1, p2, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   305 			DoCommandP(0, p1, p2, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
   286 		} break;
   306 		} break;
   287 
   307 
   288 		case WE_RESIZE:
   308 		case WE_RESIZE:
   289 			/* Update the scroll + matrix */
   309 			/* Update the scroll + matrix */
   290 			w->vscroll.cap = (w->widget[3].bottom - w->widget[3].top) / 10;
   310 			w->vscroll.cap = (w->widget[TTV_TIMETABLE_PANEL].bottom - w->widget[TTV_TIMETABLE_PANEL].top) / 10;
   291 			break;
   311 			break;
   292 
   312 
   293 	}
   313 	}
   294 }
   314 }
   295 
   315 
   296 static const Widget _timetable_widgets[] = {
   316 static const Widget _timetable_widgets[] = {
   297 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
   317 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},                // TTV_WIDGET_CLOSEBOX
   298 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   387,     0,    13, STR_TIMETABLE_TITLE,        STR_018C_WINDOW_TITLE_DRAG_THIS},
   318 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   326,     0,    13, STR_TIMETABLE_TITLE,        STR_018C_WINDOW_TITLE_DRAG_THIS},      // TTV_CAPTION
   299 	{  WWT_STICKYBOX,   RESIZE_LR,      14,   388,   399,     0,    13, STR_NULL,                   STR_STICKY_BUTTON},
   319 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   327,   387,     0,    13, STR_ORDER_VIEW,             STR_ORDER_VIEW_TOOLTIP},               // TTV_ORDER_VIEW
   300 
   320 	{  WWT_STICKYBOX,   RESIZE_LR,      14,   388,   399,     0,    13, STR_NULL,                   STR_STICKY_BUTTON},                    // TTV_STICKY
   301 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   387,    14,    95, STR_NULL,                   STR_TIMETABLE_TOOLTIP},
   321 
   302 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   388,   399,    14,    95, STR_NULL,                   STR_0190_SCROLL_BAR_SCROLLS_LIST},
   322 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   387,    14,    95, STR_NULL,                   STR_TIMETABLE_TOOLTIP},                // TTV_TIMETABLE_PANEL
   303 
   323 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   388,   399,    14,    95, STR_NULL,                   STR_0190_SCROLL_BAR_SCROLLS_LIST},     // TTV_SCROLLBAR
   304 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   399,    96,   117, STR_NULL,                   STR_NULL},
   324 
   305 
   325 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   399,    96,   117, STR_NULL,                   STR_NULL},                             // TTV_SUMMARY_PANEL
   306 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   109,   118,   129, STR_TIMETABLE_CHANGE_TIME,  STR_TIMETABLE_WAIT_TIME_TOOLTIP},
   326 
   307 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   110,   219,   118,   129, STR_CLEAR_TIME,             STR_TIMETABLE_CLEAR_TIME_TOOLTIP},
   327 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   109,   118,   129, STR_TIMETABLE_CHANGE_TIME,  STR_TIMETABLE_WAIT_TIME_TOOLTIP},      // TTV_CHANGE_TIME
   308 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   220,   337,   118,   129, STR_RESET_LATENESS,         STR_TIMETABLE_RESET_LATENESS_TOOLTIP},
   328 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   110,   219,   118,   129, STR_CLEAR_TIME,             STR_TIMETABLE_CLEAR_TIME_TOOLTIP},     // TTV_CLEAR_TIME
   309 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   338,   387,   118,   129, STR_TIMETABLE_AUTOFILL,     STR_TIMETABLE_AUTOFILL_TOOLTIP},
   329 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   220,   337,   118,   129, STR_RESET_LATENESS,         STR_TIMETABLE_RESET_LATENESS_TOOLTIP}, // TTV_RESET_LATENESS
   310 
   330 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   338,   387,   118,   129, STR_TIMETABLE_AUTOFILL,     STR_TIMETABLE_AUTOFILL_TOOLTIP},       // TTV_AUTOFILL
   311 	{      WWT_PANEL,   RESIZE_RTB,     14,   388,   387,   118,   129, STR_NULL,                   STR_NULL},
   331 
   312 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   388,   399,   118,   129, STR_NULL,                   STR_RESIZE_BUTTON},
   332 	{      WWT_PANEL,   RESIZE_RTB,     14,   388,   387,   118,   129, STR_NULL,                   STR_NULL},                             // TTV_EMPTY
       
   333 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   388,   399,   118,   129, STR_NULL,                   STR_RESIZE_BUTTON},                    // TTV_RESIZE
   313 
   334 
   314 	{    WIDGETS_END }
   335 	{    WIDGETS_END }
   315 };
   336 };
   316 
   337 
   317 static const WindowDesc _timetable_desc = {
   338 static const WindowDesc _timetable_desc = {