# HG changeset patch # Parent b54d2729dd1ad81179652741cc6e6ebb58d17a41 diff -r b54d2729dd1a src/rail_gui.cpp --- a/src/rail_gui.cpp Tue Sep 03 09:44:23 2013 +0200 +++ b/src/rail_gui.cpp Tue Sep 03 14:53:02 2013 +0200 @@ -1509,17 +1509,29 @@ if (widget == WID_BS_DRAG_SIGNALS_DENSITY_LABEL) { /* Two digits for signals density. */ size->width = max(size->width, 2 * GetDigitWidth() + padding.width); - } else if (IsInsideMM(widget, WID_BS_SEMAPHORE_NORM, WID_BS_ELECTRIC_PBS_OWAY + 1)) { - /* Extract signal from widget number. */ - int type = (widget - WID_BS_SEMAPHORE_NORM) % SIGTYPE_END; - int var = (widget < WID_BS_ELECTRIC_NORM) ? SIG_SEMAPHORE : SIG_ELECTRIC; - /* Fit the widget to signal sprites. */ + } else { + int type, end_type, var; + if (widget == WID_BS_SEMAPHORE || widget == WID_BS_ELECTRIC) { + type = SIGTYPE_NORMAL; + end_type = SIGTYPE_END; + var = (widget == WID_BS_SEMAPHORE) ? SIG_SEMAPHORE : SIG_ELECTRIC; + } else if (IsInsideMM(widget, WID_BS_SEMAPHORE_NORM, WID_BS_ELECTRIC_PBS_OWAY + 1)) { + type = (widget - WID_BS_SEMAPHORE_NORM) % SIGTYPE_END; + end_type = type + 1; + var = (widget < WID_BS_ELECTRIC_NORM) ? SIG_SEMAPHORE : SIG_ELECTRIC; + } else { + return; + } + Dimension dim = { 0, 0 }; - const SpriteID *images = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var]; - for (uint lowered = 0; lowered < 2; lowered++) { - const Sprite *sprite = GetSprite(images[lowered], ST_NORMAL); - dim.width = max(dim.width, UnScaleByZoom(sprite->width, ZOOM_LVL_GUI)); - dim.height = max(dim.height, UnScaleByZoom(sprite->height, ZOOM_LVL_GUI)); + for (; type < end_type; type++) { + /* Fit the widget to signal sprites. */ + const SpriteID *images = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var]; + for (uint lowered = 0; lowered < 2; lowered++) { + const Sprite *sprite = GetSprite(images[lowered], ST_NORMAL); + dim.width = max(dim.width, UnScaleByZoom(sprite->width, ZOOM_LVL_GUI)); + dim.height = max(dim.height, UnScaleByZoom(sprite->height, ZOOM_LVL_GUI)); + } } dim.width += padding.width + 4; dim.height += padding.height + 4; @@ -1529,19 +1541,30 @@ virtual void DrawWidget(const Rect &r, int widget) const { - if (IsInsideMM(widget, WID_BS_SEMAPHORE_NORM, WID_BS_ELECTRIC_PBS_OWAY + 1)) { - /* Extract signal from widget number. */ - int type = (widget - WID_BS_SEMAPHORE_NORM) % SIGTYPE_END; - int var = SIG_SEMAPHORE - (widget - WID_BS_SEMAPHORE_NORM) / SIGTYPE_END; // SignalVariant order is reversed compared to the widgets. - SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)]; - - this->DrawSignalSprite(widget, sprite); + /* Extract signal from widget number. */ + int type, var; + if (widget == WID_BS_SEMAPHORE || widget == WID_BS_ELECTRIC) { + type = _cur_signal_type; + var = (widget == WID_BS_SEMAPHORE) ? SIG_SEMAPHORE : SIG_ELECTRIC; + } else if (IsInsideMM(widget, WID_BS_SEMAPHORE_NORM, WID_BS_ELECTRIC_PBS_OWAY + 1)) { + type = (widget - WID_BS_SEMAPHORE_NORM) % SIGTYPE_END; + var = (widget < WID_BS_ELECTRIC_NORM) ? SIG_SEMAPHORE : SIG_ELECTRIC; + } else { + return; } + SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)]; + this->DrawSignalSprite(widget, sprite); } virtual void OnClick(Point pt, int widget, int click_count) { switch (widget) { + case WID_BS_SEMAPHORE: + case WID_BS_ELECTRIC: + this->RaiseWidget((_cur_signal_variant == SIG_ELECTRIC ? WID_BS_ELECTRIC_NORM : WID_BS_SEMAPHORE_NORM) + _cur_signal_type); + _cur_signal_variant = (widget == WID_BS_SEMAPHORE) ? SIG_SEMAPHORE : SIG_ELECTRIC; + break; + case WID_BS_SEMAPHORE_NORM: case WID_BS_SEMAPHORE_ENTRY: case WID_BS_SEMAPHORE_EXIT: @@ -1599,6 +1622,10 @@ virtual void OnInvalidateData(int data = 0, bool gui_scope = true) { if (!gui_scope) return; + this->SetWidgetLoweredState(WID_BS_SEMAPHORE, _cur_signal_variant == SIG_SEMAPHORE); + this->SetWidgetLoweredState(WID_BS_ELECTRIC, _cur_signal_variant == SIG_ELECTRIC); + this->GetWidget(WID_BS_SIGNALS_PANEL)->SetDisplayedPlane(_cur_signal_variant == SIG_SEMAPHORE ? 0 : 1); + this->LowerWidget((_cur_signal_variant == SIG_ELECTRIC ? WID_BS_ELECTRIC_NORM : WID_BS_SEMAPHORE_NORM) + _cur_signal_type); this->SetWidgetLoweredState(WID_BS_CONVERT, _convert_signal_button); @@ -1614,33 +1641,55 @@ NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_BUILD_SIGNAL_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_NORM), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_ENTRY), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_EXIT), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_COMBO), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS_OWAY), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_BS_CONVERT), SetDataTip(SPR_IMG_SIGNAL_CONVERT, STR_BUILD_SIGNAL_CONVERT_TOOLTIP), SetFill(1, 1), - EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_NORM), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_ENTRY), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_EXIT), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_COMBO), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS_OWAY), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP), EndContainer(), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP), SetFill(1, 1), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BS_DRAG_SIGNALS_DENSITY_LABEL), SetDataTip(STR_ORANGE_INT, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP), SetFill(1, 1), - NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetPIP(6, 0, 6), + NWidget(NWID_HORIZONTAL), SetPIP(10, 0, 10), + /* SIGNAL VARIANT */ + NWidget(NWID_VERTICAL), + NWidget(NWID_SPACER), SetFill(0, 1), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BS_SEMAPHORE), SetMinimalSize(20, 0), SetDataTip(STR_NULL, STR_NULL), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BS_ELECTRIC), SetMinimalSize(20, 0), SetDataTip(STR_NULL, STR_NULL), EndContainer(), + EndContainer(), + NWidget(NWID_SPACER), SetFill(0, 1), + EndContainer(), + NWidget(NWID_SPACER), SetFill(1, 0), SetMinimalSize(5, 0), + /* SIGNAL DENSITY */ + NWidget(NWID_VERTICAL), + NWidget(NWID_SPACER), SetFill(0, 1), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BS_DRAG_SIGNALS_DENSITY_LABEL), SetDataTip(STR_ORANGE_INT, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP), + NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_BS_DRAG_SIGNALS_DENSITY_DECREASE), SetMinimalSize(9, 12), SetDataTip(AWV_DECREASE, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_BS_DRAG_SIGNALS_DENSITY_INCREASE), SetMinimalSize(9, 12), SetDataTip(AWV_INCREASE, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), SetFill(1, 0), + NWidget(NWID_SPACER), SetFill(0, 1), EndContainer(), + NWidget(NWID_SPACER), SetFill(1, 0), SetMinimalSize(5, 0), + /* CONVERT SIGNALS */ + NWidget(NWID_VERTICAL), + NWidget(NWID_SPACER), SetFill(0, 1), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_BS_CONVERT), SetDataTip(SPR_IMG_SIGNAL_CONVERT, STR_BUILD_SIGNAL_CONVERT_TOOLTIP), + NWidget(NWID_SPACER), SetFill(0, 1), + EndContainer(), + EndContainer(), + EndContainer(), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BS_SIGNALS_PANEL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_NORM), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_ENTRY), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_EXIT), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_COMBO), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS_OWAY), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP), EndContainer(), SetFill(1, 1), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_NORM), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_ENTRY), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_EXIT), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_COMBO), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP), EndContainer(), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS_OWAY), SetMinimalSize(24, 0), SetDataTip(STR_NULL, STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP), EndContainer(), SetFill(1, 1), EndContainer(), EndContainer(), }; diff -r b54d2729dd1a src/widgets/rail_widget.h --- a/src/widgets/rail_widget.h Tue Sep 03 09:44:23 2013 +0200 +++ b/src/widgets/rail_widget.h Tue Sep 03 14:53:02 2013 +0200 @@ -78,6 +78,13 @@ /** Widgets of the #BuildSignalWindow class. */ enum BuildSignalWidgets { + WID_BS_SEMAPHORE, ///< Chose "semaphore" signal variant + WID_BS_ELECTRIC, ///< Chose "electric" signal variant + WID_BS_CONVERT, ///< Convert the signal. + WID_BS_DRAG_SIGNALS_DENSITY_LABEL, ///< The current signal density. + WID_BS_DRAG_SIGNALS_DENSITY_DECREASE, ///< Decrease the signal density. + WID_BS_DRAG_SIGNALS_DENSITY_INCREASE, ///< Increase the signal density. + WID_BS_SIGNALS_PANEL, ///< Panel with all signals WID_BS_SEMAPHORE_NORM, ///< Build a semaphore normal block signal WID_BS_SEMAPHORE_ENTRY, ///< Build a semaphore entry block signal WID_BS_SEMAPHORE_EXIT, ///< Build a semaphore exit block signal @@ -90,10 +97,6 @@ WID_BS_ELECTRIC_COMBO, ///< Build an electric combo block signal WID_BS_ELECTRIC_PBS, ///< Build an electric path signal. WID_BS_ELECTRIC_PBS_OWAY, ///< Build an electric one way path signal. - WID_BS_CONVERT, ///< Convert the signal. - WID_BS_DRAG_SIGNALS_DENSITY_LABEL, ///< The current signal density. - WID_BS_DRAG_SIGNALS_DENSITY_DECREASE, ///< Decrease the signal density. - WID_BS_DRAG_SIGNALS_DENSITY_INCREASE, ///< Increase the signal density. }; /** Widgets of the #BuildRailDepotWindow class. */