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 */ |