--- a/src/rail_gui.cpp Sun Apr 06 14:12:19 2008 +0000
+++ b/src/rail_gui.cpp Sun Apr 06 23:07:42 2008 +0000
@@ -45,9 +45,9 @@
static DiagDirection _build_depot_direction;
static byte _waypoint_count = 1;
static byte _cur_waypoint_type;
-static bool _convert_signal_button; // convert signal button in the signal GUI pressed
-static SignalVariant _cur_signal_variant; // set the signal variant (for signal GUI)
-static SignalType _cur_signal_type; // set the signal type (for signal GUI)
+static bool _convert_signal_button; ///< convert signal button in the signal GUI pressed
+static SignalVariant _cur_signal_variant; ///< set the signal variant (for signal GUI)
+static SignalType _cur_signal_type; ///< set the signal type (for signal GUI)
static struct {
byte orientation;
@@ -205,17 +205,26 @@
DoCommandP(tile, track, 0, CcPlaySound1E,
CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
} else {
- if (!_patches.enable_signal_gui) _cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
+ const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
/* various bitstuffed elements for CmdBuildSingleSignal() */
uint32 p1 = track;
- SB(p1, 3, 1, _ctrl_pressed);
- SB(p1, 4, 1, _cur_signal_variant);
- SB(p1, 5, 2, _patches.enable_signal_gui ? _cur_signal_type : SIGTYPE_NORMAL);
- SB(p1, 7, 1, _convert_signal_button);
+
+ if (w != NULL) {
+ /* signal GUI is used */
+ SB(p1, 3, 1, _ctrl_pressed);
+ SB(p1, 4, 1, _cur_signal_variant);
+ SB(p1, 5, 2, _cur_signal_type);
+ SB(p1, 7, 1, _convert_signal_button);
+ } else {
+ SB(p1, 3, 1, _ctrl_pressed);
+ SB(p1, 4, 1, (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC));
+ SB(p1, 5, 2, SIGTYPE_NORMAL);
+ SB(p1, 7, 1, 0);
+ }
DoCommandP(tile, p1, 0, CcPlaySound1E, CMD_BUILD_SIGNALS |
- CMD_MSG(_convert_signal_button ? STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_1010_CAN_T_BUILD_SIGNALS_HERE));
+ CMD_MSG((w != NULL && _convert_signal_button) ? STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_1010_CAN_T_BUILD_SIGNALS_HERE));
}
}
@@ -364,7 +373,7 @@
/** The "build signal"-button proc from BuildRailToolbWndProc() (start ShowSignalBuilder() and/or HandleAutoSignalPlacement()) */
static void BuildRailClick_AutoSignals(Window *w)
{
- if (_patches.enable_signal_gui) {
+ if (_patches.enable_signal_gui != _ctrl_pressed) {
if (HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals)) ShowSignalBuilder();
} else {
HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals);
@@ -454,11 +463,20 @@
return;
}
- /* XXX Steal ctrl for autosignal function, until we get some GUI */
- SB(p2, 3, 1, 0);
- SB(p2, 4, 1, _cur_year < _patches.semaphore_build_before);
- SB(p2, 6, 1, _ctrl_pressed);
- SB(p2, 24, 8, _patches.drag_signals_density);
+ const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
+
+ if (w != NULL) {
+ /* signal GUI is used */
+ SB(p2, 3, 1, 0);
+ SB(p2, 4, 1, _cur_signal_variant);
+ SB(p2, 6, 1, _ctrl_pressed);
+ SB(p2, 24, 8, _patches.drag_signals_density);
+ } else {
+ SB(p2, 3, 1, 0);
+ SB(p2, 4, 1, (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC));
+ SB(p2, 6, 1, _ctrl_pressed);
+ SB(p2, 24, 8, _patches.drag_signals_density);
+ }
/* _patches.drag_signals_density is given as a parameter such that each user
* in a network game can specify his/her own signal density */
@@ -583,7 +601,7 @@
case WE_PLACE_DRAG: {
/* no dragging if you have pressed the convert button */
- if (_convert_signal_button && w->IsWidgetLowered(RTW_BUILD_SIGNALS)) return;
+ if (FindWindowById(WC_BUILD_SIGNAL, 0) != NULL && _convert_signal_button && w->IsWidgetLowered(RTW_BUILD_SIGNALS)) return;
VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
return;
@@ -918,8 +936,9 @@
DrawStringCentered(74, 101 + y_offset, STR_3004_PLATFORM_LENGTH, TC_FROMSTRING);
DrawStringCentered(74, 141 + y_offset, STR_3066_COVERAGE_AREA_HIGHLIGHT, TC_FROMSTRING);
- int text_end = DrawStationCoverageAreaText(2, 166 + y_offset, SCT_ALL, rad) + 4;
- if (text_end > w->widget[BRSW_BACKGROUND].bottom) {
+ int text_end = DrawStationCoverageAreaText(2, 166 + y_offset, SCT_ALL, rad, false);
+ text_end = DrawStationCoverageAreaText(2, text_end + 4, SCT_ALL, rad, true) + 4;
+ if (text_end != w->widget[BRSW_BACKGROUND].bottom) {
SetWindowDirty(w);
ResizeWindowForWidget(w, BRSW_BACKGROUND, 0, text_end - w->widget[BRSW_BACKGROUND].bottom);
SetWindowDirty(w);
@@ -1310,11 +1329,19 @@
break;
case BSW_DRAG_SIGNALS_DENSITY_DECREASE:
- if (_patches.drag_signals_density > 1) _patches.drag_signals_density--;
+ if (_patches.drag_signals_density > 1) {
+ _patches.drag_signals_density--;
+ const Window *w = FindWindowById(WC_GAME_OPTIONS, 0);
+ if (w != NULL) SetWindowDirty(w);
+ }
break;
case BSW_DRAG_SIGNALS_DENSITY_INCREASE:
- if (_patches.drag_signals_density < 20) _patches.drag_signals_density++;
+ if (_patches.drag_signals_density < 20) {
+ _patches.drag_signals_density++;
+ const Window *w = FindWindowById(WC_GAME_OPTIONS, 0);
+ if (w != NULL) SetWindowDirty(w);
+ }
break;
default: break;
@@ -1367,14 +1394,9 @@
/**
* Open the signal selection window
- * @pre reset all signal GUI relevant variables
*/
static void ShowSignalBuilder()
{
- _convert_signal_button = false;
- _cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
- _cur_signal_type = SIGTYPE_NORMAL;
-
AllocateWindowDesc(&_signal_builder_desc);
}
@@ -1583,7 +1605,7 @@
MarkWholeScreenDirty();
}
-void SetDefaultRailGui()
+static void SetDefaultRailGui()
{
if (_local_player == PLAYER_SPECTATOR || !IsValidPlayer(_local_player)) return;
@@ -1632,5 +1654,36 @@
}
}
+/**
+ * Updates the current signal variant used in the signal GUI
+ * to the one adequate to current year.
+ * @param 0 needed to be called when a patch setting changes
+ * @return success, needed for patch settings
+ */
+int32 ResetSignalVariant(int32 = 0)
+{
+ SignalVariant new_variant = (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC);
+ if (new_variant != _cur_signal_variant) {
+ Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
+ if (w != NULL) {
+ SetWindowDirty(w);
+ w->RaiseWidget((_cur_signal_variant == SIG_ELECTRIC ? BSW_ELECTRIC_NORM : BSW_SEMAPHORE_NORM) + _cur_signal_type);
+ }
+ _cur_signal_variant = new_variant;
+ }
+ return 0;
+}
+
+/** Resets the rail GUI - sets default railtype to build
+ * and resets the signal GUI
+ */
+void InitializeRailGUI()
+{
+ SetDefaultRailGui();
+
+ _convert_signal_button = false;
+ _cur_signal_type = SIGTYPE_NORMAL;
+ ResetSignalVariant();
+}