src/rail_gui.cpp
changeset 9082 8217cb013e23
parent 9069 7b9573ccc411
child 9083 b242adf8191b
equal deleted inserted replaced
9081:4c47047836f3 9082:8217cb013e23
    74 }
    74 }
    75 
    75 
    76 static void GenericPlaceRail(TileIndex tile, int cmd)
    76 static void GenericPlaceRail(TileIndex tile, int cmd)
    77 {
    77 {
    78 	DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
    78 	DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
    79 		(_remove_button_clicked || _ctrl_pressed) ?
    79 		_remove_button_clicked ?
    80 		CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_NO_WATER :
    80 		CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_NO_WATER :
    81 		CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_NO_WATER
    81 		CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_NO_WATER
    82 	);
    82 	);
    83 }
    83 }
    84 
    84 
   275 	RTW_BUILD_TUNNEL,
   275 	RTW_BUILD_TUNNEL,
   276 	RTW_REMOVE,
   276 	RTW_REMOVE,
   277 	RTW_CONVERT_RAIL,
   277 	RTW_CONVERT_RAIL,
   278 };
   278 };
   279 
   279 
       
   280 
       
   281 /** Toogles state of the Remove button of Build rail toolbar
       
   282  * @param w window the button belongs to
       
   283  */
       
   284 static void ToggleRailButton_Remove(Window *w)
       
   285 {
       
   286 	w->ToggleWidgetLoweredState(RTW_REMOVE);
       
   287 	w->InvalidateWidget(RTW_REMOVE);
       
   288 	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
       
   289 	SetSelectionRed(_remove_button_clicked);
       
   290 
       
   291 	// handle station builder
       
   292 	if (_remove_button_clicked) {
       
   293 		SetTileSelectSize(1, 1);
       
   294 	}
       
   295 }
       
   296 
       
   297 /** Updates the Remove button because of Ctrl state change
       
   298  * @param w window the button belongs to
       
   299  * @return true iff the remove buton was changed
       
   300  */
       
   301 static bool RailToolbar_CtrlChanged(Window *w)
       
   302 {
       
   303 	if (w->IsWidgetDisabled(RTW_REMOVE)) return false;
       
   304 
       
   305 	/* allow ctrl to switch remove mode only for these widgets */
       
   306 	for (uint i = RTW_BUILD_NS; i <= RTW_BUILD_WAYPOINT; i++) {
       
   307 		if ((i <= RTW_AUTORAIL || i == RTW_BUILD_WAYPOINT) && w->IsWidgetLowered(i)) {
       
   308 			ToggleRailButton_Remove(w);
       
   309 			return true;
       
   310 		}
       
   311 	}
       
   312 
       
   313 	return false;
       
   314 }
       
   315 
       
   316 
   280 static void BuildRailClick_N(Window *w)
   317 static void BuildRailClick_N(Window *w)
   281 {
   318 {
   282 	HandlePlacePushButton(w, RTW_BUILD_NS, GetRailTypeInfo(_cur_railtype)->cursor.rail_ns, VHM_RECT, PlaceRail_N);
   319 	HandlePlacePushButton(w, RTW_BUILD_NS, GetRailTypeInfo(_cur_railtype)->cursor.rail_ns, VHM_RECT, PlaceRail_N);
   283 }
   320 }
   284 
   321 
   349 }
   386 }
   350 
   387 
   351 static void BuildRailClick_Remove(Window *w)
   388 static void BuildRailClick_Remove(Window *w)
   352 {
   389 {
   353 	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
   390 	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
   354 	SetWindowDirty(w);
   391 	ToggleRailButton_Remove(w);
   355 	SndPlayFx(SND_15_BEEP);
   392 	SndPlayFx(SND_15_BEEP);
   356 
       
   357 	w->ToggleWidgetLoweredState(RTW_REMOVE);
       
   358 	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
       
   359 	SetSelectionRed(_remove_button_clicked);
       
   360 
       
   361 	// handle station builder
       
   362 	if (_remove_button_clicked) {
       
   363 		SetTileSelectSize(1, 1);
       
   364 	}
       
   365 }
   393 }
   366 
   394 
   367 static void BuildRailClick_Convert(Window *w)
   395 static void BuildRailClick_Convert(Window *w)
   368 {
   396 {
   369 	HandlePlacePushButton(w, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, VHM_RECT, PlaceRail_ConvertRail);
   397 	HandlePlacePushButton(w, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, VHM_RECT, PlaceRail_ConvertRail);
   371 
   399 
   372 
   400 
   373 static void DoRailroadTrack(int mode)
   401 static void DoRailroadTrack(int mode)
   374 {
   402 {
   375 	DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
   403 	DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
   376 		(_remove_button_clicked || _ctrl_pressed) ?
   404 		_remove_button_clicked ?
   377 		CMD_REMOVE_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
   405 		CMD_REMOVE_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
   378 		CMD_BUILD_RAILROAD_TRACK  | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
   406 		CMD_BUILD_RAILROAD_TRACK  | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
   379 	);
   407 	);
   380 }
   408 }
   381 
   409 
   512 		if (e->we.click.widget >= RTW_BUILD_NS) {
   540 		if (e->we.click.widget >= RTW_BUILD_NS) {
   513 			_remove_button_clicked = false;
   541 			_remove_button_clicked = false;
   514 			_build_railroad_button_proc[e->we.click.widget - RTW_BUILD_NS](w);
   542 			_build_railroad_button_proc[e->we.click.widget - RTW_BUILD_NS](w);
   515 		}
   543 		}
   516 		UpdateRemoveWidgetStatus(w, e->we.click.widget);
   544 		UpdateRemoveWidgetStatus(w, e->we.click.widget);
       
   545 		if (_ctrl_pressed) RailToolbar_CtrlChanged(w);
   517 		break;
   546 		break;
   518 
   547 
   519 	case WE_KEYPRESS:
   548 	case WE_KEYPRESS:
   520 		for (uint8 i = 0; i != lengthof(_rail_keycodes); i++) {
   549 		for (uint8 i = 0; i != lengthof(_rail_keycodes); i++) {
   521 			if (e->we.keypress.keycode == _rail_keycodes[i]) {
   550 			if (e->we.keypress.keycode == _rail_keycodes[i]) {
   522 				e->we.keypress.cont = false;
   551 				e->we.keypress.cont = false;
   523 				_remove_button_clicked = false;
   552 				_remove_button_clicked = false;
   524 				_build_railroad_button_proc[i](w);
   553 				_build_railroad_button_proc[i](w);
   525 				UpdateRemoveWidgetStatus(w, i + RTW_BUILD_NS);
   554 				UpdateRemoveWidgetStatus(w, i + RTW_BUILD_NS);
       
   555 				if (_ctrl_pressed) RailToolbar_CtrlChanged(w);
   526 				break;
   556 				break;
   527 			}
   557 			}
   528 		}
   558 		}
   529 		MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
   559 		MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
   530 		break;
   560 		break;
   604 		VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
   634 		VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
   605 	} break;
   635 	} break;
   606 
   636 
   607 	case WE_DESTROY:
   637 	case WE_DESTROY:
   608 		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
   638 		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
       
   639 		break;
       
   640 
       
   641 	case WE_CTRL_CHANGED:
       
   642 		if (RailToolbar_CtrlChanged(w)) e->we.ctrl.cont = false;
   609 		break;
   643 		break;
   610 	}
   644 	}
   611 }
   645 }
   612 
   646 
   613 /** Widget definition for the rail toolbar */
   647 /** Widget definition for the rail toolbar */