315 * |
315 * |
316 * @param w The current window |
316 * @param w The current window |
317 */ |
317 */ |
318 static void BuildRoadClick_OneWay(Window *w) |
318 static void BuildRoadClick_OneWay(Window *w) |
319 { |
319 { |
320 if (IsWindowWidgetDisabled(w, RTW_ONE_WAY)) return; |
320 if (w->IsWidgetDisabled(RTW_ONE_WAY)) return; |
321 SetWindowDirty(w); |
321 SetWindowDirty(w); |
322 ToggleWidgetLoweredState(w, RTW_ONE_WAY); |
322 w->ToggleWidgetLoweredState(RTW_ONE_WAY); |
323 SetSelectionRed(false); |
323 SetSelectionRed(false); |
324 } |
324 } |
325 |
325 |
326 static void BuildRoadClick_Bridge(Window *w) |
326 static void BuildRoadClick_Bridge(Window *w) |
327 { |
327 { |
333 HandlePlacePushButton(w, RTW_BUILD_TUNNEL, SPR_CURSOR_ROAD_TUNNEL, VHM_SPECIAL, PlaceRoad_Tunnel); |
333 HandlePlacePushButton(w, RTW_BUILD_TUNNEL, SPR_CURSOR_ROAD_TUNNEL, VHM_SPECIAL, PlaceRoad_Tunnel); |
334 } |
334 } |
335 |
335 |
336 static void BuildRoadClick_Remove(Window *w) |
336 static void BuildRoadClick_Remove(Window *w) |
337 { |
337 { |
338 if (IsWindowWidgetDisabled(w, RTW_REMOVE)) return; |
338 if (w->IsWidgetDisabled(RTW_REMOVE)) return; |
339 SetWindowDirty(w); |
339 SetWindowDirty(w); |
340 SndPlayFx(SND_15_BEEP); |
340 SndPlayFx(SND_15_BEEP); |
341 ToggleWidgetLoweredState(w, RTW_REMOVE); |
341 w->ToggleWidgetLoweredState(RTW_REMOVE); |
342 SetSelectionRed(IsWindowWidgetLowered(w, RTW_REMOVE)); |
342 SetSelectionRed(w->IsWidgetLowered(RTW_REMOVE)); |
343 } |
343 } |
344 |
344 |
345 /** Array with the handlers of the button-clicks for the road-toolbar */ |
345 /** Array with the handlers of the button-clicks for the road-toolbar */ |
346 static OnButtonClick* const _build_road_button_proc[] = { |
346 static OnButtonClick* const _build_road_button_proc[] = { |
347 BuildRoadClick_X_Dir, |
347 BuildRoadClick_X_Dir, |
383 /* The remove and the one way button state is driven |
383 /* The remove and the one way button state is driven |
384 * by the other buttons so they don't act on themselfs. |
384 * by the other buttons so they don't act on themselfs. |
385 * Both are only valid if they are able to apply as options. */ |
385 * Both are only valid if they are able to apply as options. */ |
386 switch (clicked_widget) { |
386 switch (clicked_widget) { |
387 case RTW_REMOVE: |
387 case RTW_REMOVE: |
388 RaiseWindowWidget(w, RTW_ONE_WAY); |
388 w->RaiseWidget(RTW_ONE_WAY); |
389 break; |
389 break; |
390 case RTW_ONE_WAY: |
390 case RTW_ONE_WAY: |
391 RaiseWindowWidget(w, RTW_REMOVE); |
391 w->RaiseWidget(RTW_REMOVE); |
392 break; |
392 break; |
393 case RTW_BUS_STATION: |
393 case RTW_BUS_STATION: |
394 case RTW_TRUCK_STATION: |
394 case RTW_TRUCK_STATION: |
395 DisableWindowWidget(w, RTW_ONE_WAY); |
395 w->DisableWidget(RTW_ONE_WAY); |
396 SetWindowWidgetDisabledState(w, RTW_REMOVE, !IsWindowWidgetLowered(w, clicked_widget)); |
396 w->SetWidgetDisabledState(RTW_REMOVE, !w->IsWidgetLowered(clicked_widget)); |
397 break; |
397 break; |
398 case RTW_ROAD_X: |
398 case RTW_ROAD_X: |
399 case RTW_ROAD_Y: |
399 case RTW_ROAD_Y: |
400 case RTW_AUTOROAD: |
400 case RTW_AUTOROAD: |
401 SetWindowWidgetsDisabledState(w, !IsWindowWidgetLowered(w, clicked_widget), |
401 w->SetWidgetsDisabledState(!w->IsWidgetLowered(clicked_widget), |
402 RTW_REMOVE, |
402 RTW_REMOVE, |
403 RTW_ONE_WAY, |
403 RTW_ONE_WAY, |
404 WIDGET_LIST_END); |
404 WIDGET_LIST_END); |
405 break; |
405 break; |
406 default: |
406 default: |
407 /* When any other buttons than road/station, raise and |
407 /* When any other buttons than road/station, raise and |
408 * disable the removal button */ |
408 * disable the removal button */ |
409 SetWindowWidgetsDisabledState(w, true, |
409 w->SetWidgetsDisabledState(true, |
410 RTW_REMOVE, |
410 RTW_REMOVE, |
411 RTW_ONE_WAY, |
411 RTW_ONE_WAY, |
412 WIDGET_LIST_END); |
412 WIDGET_LIST_END); |
413 SetWindowWidgetsLoweredState (w, false, |
413 w->SetWidgetsLoweredState (false, |
414 RTW_REMOVE, |
414 RTW_REMOVE, |
415 RTW_ONE_WAY, |
415 RTW_ONE_WAY, |
416 WIDGET_LIST_END); |
416 WIDGET_LIST_END); |
417 break; |
417 break; |
418 } |
418 } |
420 |
420 |
421 static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) |
421 static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) |
422 { |
422 { |
423 switch (e->event) { |
423 switch (e->event) { |
424 case WE_CREATE: |
424 case WE_CREATE: |
425 SetWindowWidgetsDisabledState(w, true, |
425 w->SetWidgetsDisabledState(true, |
426 RTW_REMOVE, |
426 RTW_REMOVE, |
427 RTW_ONE_WAY, |
427 RTW_ONE_WAY, |
428 WIDGET_LIST_END); |
428 WIDGET_LIST_END); |
429 break; |
429 break; |
430 |
430 |
431 case WE_PAINT: |
431 case WE_PAINT: |
432 SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_ROAD), |
432 w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_ROAD), |
433 RTW_DEPOT, |
433 RTW_DEPOT, |
434 RTW_BUS_STATION, |
434 RTW_BUS_STATION, |
435 RTW_TRUCK_STATION, |
435 RTW_TRUCK_STATION, |
436 WIDGET_LIST_END); |
436 WIDGET_LIST_END); |
437 DrawWindowWidgets(w); |
437 DrawWindowWidgets(w); |
459 } |
459 } |
460 MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection |
460 MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection |
461 break; |
461 break; |
462 |
462 |
463 case WE_PLACE_OBJ: |
463 case WE_PLACE_OBJ: |
464 _remove_button_clicked = IsWindowWidgetLowered(w, RTW_REMOVE); |
464 _remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE); |
465 _one_way_button_clicked = IsWindowWidgetLowered(w, RTW_ONE_WAY); |
465 _one_way_button_clicked = w->IsWidgetLowered(RTW_ONE_WAY); |
466 _place_proc(e->we.place.tile); |
466 _place_proc(e->we.place.tile); |
467 break; |
467 break; |
468 |
468 |
469 case WE_ABORT_PLACE_OBJ: |
469 case WE_ABORT_PLACE_OBJ: |
470 RaiseWindowButtons(w); |
470 RaiseWindowButtons(w); |
471 DisableWindowWidget(w, RTW_REMOVE); |
471 w->DisableWidget(RTW_REMOVE); |
472 InvalidateWidget(w, RTW_REMOVE); |
472 InvalidateWidget(w, RTW_REMOVE); |
473 |
473 |
474 w = FindWindowById(WC_BUS_STATION, 0); |
474 w = FindWindowById(WC_BUS_STATION, 0); |
475 if (w != NULL) WP(w, def_d).close = true; |
475 if (w != NULL) WP(w, def_d).close = true; |
476 w = FindWindowById(WC_TRUCK_STATION, 0); |
476 w = FindWindowById(WC_TRUCK_STATION, 0); |
679 }; |
679 }; |
680 |
680 |
681 static void BuildRoadDepotWndProc(Window *w, WindowEvent *e) |
681 static void BuildRoadDepotWndProc(Window *w, WindowEvent *e) |
682 { |
682 { |
683 switch (e->event) { |
683 switch (e->event) { |
684 case WE_CREATE: LowerWindowWidget(w, _road_depot_orientation + BRDW_DEPOT_NE); break; |
684 case WE_CREATE: w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE); break; |
685 |
685 |
686 case WE_PAINT: |
686 case WE_PAINT: |
687 DrawWindowWidgets(w); |
687 DrawWindowWidgets(w); |
688 |
688 |
689 DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype); |
689 DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype); |
696 switch (e->we.click.widget) { |
696 switch (e->we.click.widget) { |
697 case BRDW_DEPOT_NW: |
697 case BRDW_DEPOT_NW: |
698 case BRDW_DEPOT_NE: |
698 case BRDW_DEPOT_NE: |
699 case BRDW_DEPOT_SW: |
699 case BRDW_DEPOT_SW: |
700 case BRDW_DEPOT_SE: |
700 case BRDW_DEPOT_SE: |
701 RaiseWindowWidget(w, _road_depot_orientation + BRDW_DEPOT_NE); |
701 w->RaiseWidget(_road_depot_orientation + BRDW_DEPOT_NE); |
702 _road_depot_orientation = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE); |
702 _road_depot_orientation = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE); |
703 LowerWindowWidget(w, _road_depot_orientation + BRDW_DEPOT_NE); |
703 w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE); |
704 SndPlayFx(SND_15_BEEP); |
704 SndPlayFx(SND_15_BEEP); |
705 SetWindowDirty(w); |
705 SetWindowDirty(w); |
706 break; |
706 break; |
707 } |
707 } |
708 break; |
708 break; |
784 case WE_CREATE: |
784 case WE_CREATE: |
785 /* Trams don't have non-drivethrough stations */ |
785 /* Trams don't have non-drivethrough stations */ |
786 if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) { |
786 if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) { |
787 _road_station_picker_orientation = DIAGDIR_END; |
787 _road_station_picker_orientation = DIAGDIR_END; |
788 } |
788 } |
789 SetWindowWidgetsDisabledState(w, _cur_roadtype == ROADTYPE_TRAM, |
789 w->SetWidgetsDisabledState(_cur_roadtype == ROADTYPE_TRAM, |
790 BRSW_STATION_NE, |
790 BRSW_STATION_NE, |
791 BRSW_STATION_SE, |
791 BRSW_STATION_SE, |
792 BRSW_STATION_SW, |
792 BRSW_STATION_SW, |
793 BRSW_STATION_NW, |
793 BRSW_STATION_NW, |
794 WIDGET_LIST_END); |
794 WIDGET_LIST_END); |
795 |
795 |
796 LowerWindowWidget(w, _road_station_picker_orientation + BRSW_STATION_NE); |
796 w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE); |
797 LowerWindowWidget(w, _station_show_coverage + BRSW_LT_OFF); |
797 w->LowerWidget(_station_show_coverage + BRSW_LT_OFF); |
798 break; |
798 break; |
799 |
799 |
800 case WE_PAINT: { |
800 case WE_PAINT: { |
801 if (WP(w, def_d).close) return; |
801 if (WP(w, def_d).close) return; |
802 |
802 |
831 case BRSW_STATION_SE: |
831 case BRSW_STATION_SE: |
832 case BRSW_STATION_SW: |
832 case BRSW_STATION_SW: |
833 case BRSW_STATION_NW: |
833 case BRSW_STATION_NW: |
834 case BRSW_STATION_X: |
834 case BRSW_STATION_X: |
835 case BRSW_STATION_Y: |
835 case BRSW_STATION_Y: |
836 RaiseWindowWidget(w, _road_station_picker_orientation + BRSW_STATION_NE); |
836 w->RaiseWidget(_road_station_picker_orientation + BRSW_STATION_NE); |
837 _road_station_picker_orientation = (DiagDirection)(e->we.click.widget - BRSW_STATION_NE); |
837 _road_station_picker_orientation = (DiagDirection)(e->we.click.widget - BRSW_STATION_NE); |
838 LowerWindowWidget(w, _road_station_picker_orientation + BRSW_STATION_NE); |
838 w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE); |
839 SndPlayFx(SND_15_BEEP); |
839 SndPlayFx(SND_15_BEEP); |
840 SetWindowDirty(w); |
840 SetWindowDirty(w); |
841 break; |
841 break; |
842 |
842 |
843 case BRSW_LT_OFF: |
843 case BRSW_LT_OFF: |
844 case BRSW_LT_ON: |
844 case BRSW_LT_ON: |
845 RaiseWindowWidget(w, _station_show_coverage + BRSW_LT_OFF); |
845 w->RaiseWidget(_station_show_coverage + BRSW_LT_OFF); |
846 _station_show_coverage = (e->we.click.widget != BRSW_LT_OFF); |
846 _station_show_coverage = (e->we.click.widget != BRSW_LT_OFF); |
847 LowerWindowWidget(w, _station_show_coverage + BRSW_LT_OFF); |
847 w->LowerWidget(_station_show_coverage + BRSW_LT_OFF); |
848 SndPlayFx(SND_15_BEEP); |
848 SndPlayFx(SND_15_BEEP); |
849 SetWindowDirty(w); |
849 SetWindowDirty(w); |
850 break; |
850 break; |
851 } |
851 } |
852 } break; |
852 } break; |