src/rail_gui.cpp
changeset 9771 9b1bcac0f84b
parent 9762 5e591b9665a2
child 9772 eeb3d3284895
equal deleted inserted replaced
9770:8c260fb382f8 9771:9b1bcac0f84b
   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!