569 } |
569 } |
570 |
570 |
571 |
571 |
572 typedef void OnButtonClick(Window *w); |
572 typedef void OnButtonClick(Window *w); |
573 |
573 |
574 static OnButtonClick * const _build_railroad_button_proc[] = { |
574 /** Data associated with a push button in the build rail toolbar window */ |
575 BuildRailClick_N, |
575 struct RailBuildingGUIButtonData { |
576 BuildRailClick_NE, |
576 uint16 keycode; ///< Keycode associated with the button |
577 BuildRailClick_E, |
577 OnButtonClick *click_proc; ///< Procedure to call when button is clicked |
578 BuildRailClick_NW, |
578 }; |
579 BuildRailClick_AutoRail, |
579 |
580 BuildRailClick_Demolish, |
580 /** |
581 BuildRailClick_Depot, |
581 * GUI rail-building button data constants. |
582 BuildRailClick_Waypoint, |
582 * Offsets match widget order, starting at RTW_BUILD_NS |
583 BuildRailClick_Station, |
583 */ |
584 BuildRailClick_AutoSignals, |
584 static const RailBuildingGUIButtonData _rail_build_button_data[] = { |
585 BuildRailClick_Bridge, |
585 {'1', BuildRailClick_N }, |
586 BuildRailClick_Tunnel, |
586 {'2', BuildRailClick_NE }, |
587 BuildRailClick_Remove, |
587 {'3', BuildRailClick_E }, |
588 BuildRailClick_Convert |
588 {'4', BuildRailClick_NW }, |
589 }; |
589 {'5', BuildRailClick_AutoRail }, |
590 |
590 {'6', BuildRailClick_Demolish }, |
591 static const uint16 _rail_keycodes[] = { |
591 {'7', BuildRailClick_Depot }, |
592 '1', |
592 {'8', BuildRailClick_Waypoint }, |
593 '2', |
593 {'9', BuildRailClick_Station }, |
594 '3', |
594 {'S', BuildRailClick_AutoSignals}, |
595 '4', |
595 {'B', BuildRailClick_Bridge }, |
596 '5', |
596 {'T', BuildRailClick_Tunnel }, |
597 '6', |
597 {'R', BuildRailClick_Remove }, |
598 '7', // depot |
598 {'C', BuildRailClick_Convert } |
599 '8', // waypoint |
599 }; |
600 '9', // station |
|
601 'S', // signals |
|
602 'B', // bridge |
|
603 'T', // tunnel |
|
604 'R', // remove |
|
605 'C', // convert rail |
|
606 }; |
|
607 |
|
608 |
600 |
609 /** |
601 /** |
610 * Based on the widget clicked, update the status of the 'remove' button. |
602 * Based on the widget clicked, update the status of the 'remove' button. |
611 * @param w Rail toolbar window |
603 * @param w Rail toolbar window |
612 * @param clicked_widget Widget clicked in the toolbar |
604 * @param clicked_widget Widget clicked in the toolbar |
662 |
654 |
663 virtual void OnClick(Point pt, int widget) |
655 virtual void OnClick(Point pt, int widget) |
664 { |
656 { |
665 if (widget >= RTW_BUILD_NS) { |
657 if (widget >= RTW_BUILD_NS) { |
666 _remove_button_clicked = false; |
658 _remove_button_clicked = false; |
667 _build_railroad_button_proc[widget - RTW_BUILD_NS](this); |
659 _rail_build_button_data[widget - RTW_BUILD_NS].click_proc(this); |
668 } |
660 } |
669 this->UpdateRemoveWidgetStatus(widget); |
661 this->UpdateRemoveWidgetStatus(widget); |
670 if (_ctrl_pressed) RailToolbar_CtrlChanged(this); |
662 if (_ctrl_pressed) RailToolbar_CtrlChanged(this); |
671 } |
663 } |
672 |
664 |
673 virtual EventState OnKeyPress(uint16 key, uint16 keycode) |
665 virtual EventState OnKeyPress(uint16 key, uint16 keycode) |
674 { |
666 { |
675 EventState state = ES_NOT_HANDLED; |
667 EventState state = ES_NOT_HANDLED; |
676 for (uint8 i = 0; i != lengthof(_rail_keycodes); i++) { |
668 for (uint8 i = 0; i != lengthof(_rail_build_button_data); i++) { |
677 if (keycode == _rail_keycodes[i]) { |
669 if (keycode == _rail_build_button_data[i].keycode) { |
678 _remove_button_clicked = false; |
670 _remove_button_clicked = false; |
679 _build_railroad_button_proc[i](this); |
671 _rail_build_button_data[i].click_proc(this); |
680 this->UpdateRemoveWidgetStatus(i + RTW_BUILD_NS); |
672 this->UpdateRemoveWidgetStatus(i + RTW_BUILD_NS); |
681 if (_ctrl_pressed) RailToolbar_CtrlChanged(this); |
673 if (_ctrl_pressed) RailToolbar_CtrlChanged(this); |
682 state = ES_HANDLED; |
674 state = ES_HANDLED; |
683 break; |
675 break; |
684 } |
676 } |
850 SetupRailToolbar(railtype, w); |
842 SetupRailToolbar(railtype, w); |
851 } |
843 } |
852 |
844 |
853 _remove_button_clicked = false; |
845 _remove_button_clicked = false; |
854 if (w != NULL && button >= RTW_CLOSEBOX) { |
846 if (w != NULL && button >= RTW_CLOSEBOX) { |
855 _build_railroad_button_proc[button](w); |
847 _rail_build_button_data[button].click_proc(w); |
856 w->UpdateRemoveWidgetStatus(button + RTW_BUILD_NS); |
848 w->UpdateRemoveWidgetStatus(button + RTW_BUILD_NS); |
857 } |
849 } |
858 } |
850 } |
859 |
851 |
860 /* TODO: For custom stations, respect their allowed platforms/lengths bitmasks! |
852 /* TODO: For custom stations, respect their allowed platforms/lengths bitmasks! |