Changeset - r28763:93acaf2569cd
[Not reviewed]
master
0 2 0
Peter Nelson - 10 months ago 2024-02-14 17:23:17
peter1138@openttd.org
Change: Show 6 or 2 orientation buttons in NewGRF road stop picker as appropriate.

This replaces the normal method of masking unusable buttons.
2 files changed with 21 insertions and 5 deletions:
0 comments (0 inline, 0 general)
src/road_gui.cpp
Show inline comments
 
@@ -1126,14 +1126,21 @@ private:
 
		this->vscrollList->SetCount(this->roadstop_classes.size());
 
		this->vscrollList->ScrollTowards(pos);
 
	}
 

	
 
	void CheckOrientationValid()
 
	{
 
		const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type);
 

	
 
		/* Raise and lower to ensure the correct widget is lowered after changing displayed orientation plane. */
 
		this->RaiseWidget(WID_BROS_STATION_NE + _roadstop_gui_settings.orientation);
 
		this->GetWidget<NWidgetStacked>(WID_BROS_AVAILABLE_ORIENTATIONS)->SetDisplayedPlane((spec != nullptr && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY)) ? 1 : 0);
 
		this->LowerWidget(WID_BROS_STATION_NE + _roadstop_gui_settings.orientation);
 

	
 
		if (_roadstop_gui_settings.orientation >= DIAGDIR_END) return;
 
		const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type);
 

	
 
		if (spec != nullptr && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY)) {
 
			this->RaiseWidget(WID_BROS_STATION_NE + _roadstop_gui_settings.orientation);
 
			_roadstop_gui_settings.orientation = DIAGDIR_END;
 
			this->LowerWidget(WID_BROS_STATION_NE + _roadstop_gui_settings.orientation);
 
			this->SetDirty();
 
			CloseWindowById(WC_SELECT_STATION, 0);
 
@@ -1415,26 +1422,24 @@ public:
 
			case WID_BROS_STATION_SW:
 
			case WID_BROS_STATION_NW:
 
			case WID_BROS_STATION_X:
 
			case WID_BROS_STATION_Y: {
 
				StationType st = GetRoadStationTypeByWindowClass(this->window_class);
 
				const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type);
 
				bool disabled = (spec != nullptr && widget < WID_BROS_STATION_X && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY));
 
				DrawPixelInfo tmp_dpi;
 
				Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
 
				if (FillDrawPixelInfo(&tmp_dpi, ir)) {
 
					AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
 
					int x = (ir.Width()  - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31);
 
					int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31);
 
					if (spec == nullptr || disabled) {
 
					if (spec == nullptr) {
 
						StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE);
 
					} else {
 
						DrawRoadStopTile(x, y, _cur_roadtype, spec, st, widget - WID_BROS_STATION_NE);
 
					}
 
				}
 
				if (disabled) GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER);
 
				break;
 
			}
 

	
 
			case WID_BROS_NEWST_LIST: {
 
				uint statclass = 0;
 
				uint row = 0;
 
@@ -1537,17 +1542,17 @@ public:
 
					_roadstop_gui_settings.roadstop_type = std::min((int)_roadstop_gui_settings.roadstop_type, std::max(0, (int)_roadstop_gui_settings.roadstop_count - 1));
 
					this->SelectFirstAvailableTypeIfUnavailable();
 

	
 
					NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BROS_MATRIX);
 
					matrix->SetCount(_roadstop_gui_settings.roadstop_count);
 
					matrix->SetClicked(_roadstop_gui_settings.roadstop_type);
 
					this->CheckOrientationValid();
 
				}
 
				if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
 
				this->SetDirty();
 
				CloseWindowById(WC_SELECT_STATION, 0);
 
				this->CheckOrientationValid();
 
				break;
 
			}
 

	
 
			case WID_BROS_IMAGE: {
 
				uint16_t y = this->GetWidget<NWidgetBase>(widget)->GetParentWidget<NWidgetMatrix>()->GetCurrentElement();
 
				if (y >= _roadstop_gui_settings.roadstop_count) return;
 
@@ -1631,12 +1636,14 @@ static constexpr NWidgetPart _nested_roa
 
								NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_BROS_NEWST_SCROLL),
 
							EndContainer(),
 
						EndContainer(),
 
						NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BROS_SHOW_NEWST_ORIENTATION),
 
							NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_ORIENTATION, STR_NULL), SetFill(1, 0),
 
						EndContainer(),
 
						NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BROS_AVAILABLE_ORIENTATIONS),
 
							/* 6-orientation plane. */
 
						NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0),
 
							NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), SetPIPRatio(1, 0, 1),
 
								NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0),
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
								EndContainer(),
 
@@ -1647,12 +1654,20 @@ static constexpr NWidgetPart _nested_roa
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
								EndContainer(),
 
								NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y),  SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
							EndContainer(),
 
						EndContainer(),
 
							/* 2-orientation plane. */
 
							NWidget(NWID_VERTICAL), SetPIPRatio(0, 0, 1),
 
								NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), SetPIPRatio(1, 0, 1),
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X),  SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
									NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y),  SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
 
								EndContainer(),
 
							EndContainer(),
 
						EndContainer(),
 
						NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BROS_SHOW_NEWST_TYPE_SEL),
 
							NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_SHOW_NEWST_TYPE), SetMinimalSize(144, 8), SetDataTip(STR_JUST_STRING, STR_NULL), SetTextStyle(TC_ORANGE), SetFill(1, 0),
 
						EndContainer(),
 
						NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
 
						NWidget(NWID_HORIZONTAL), SetPIPRatio(1, 0, 1),
 
							NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12),
src/widgets/road_widget.h
Show inline comments
 
@@ -55,12 +55,13 @@ enum BuildRoadStationWidgets : WidgetID 
 
	WID_BROS_ACCEPTANCE,             ///< Station acceptance info.
 
	WID_BROS_MATRIX,                 ///< Matrix widget displaying all available road stops.
 
	WID_BROS_IMAGE,                  ///< Panel used for each image of the matrix.
 
	WID_BROS_MATRIX_SCROLL,          ///< Scrollbar of the #WID_BROS_SHOW_NEWST_ADDITIONS.
 
	WID_BROS_FILTER_CONTAINER,       ///< Container for the filter text box for the road stop class list.
 
	WID_BROS_FILTER_EDITBOX,         ///< Filter text box for the road stop class list.
 
	WID_BROS_AVAILABLE_ORIENTATIONS, ///< Selection for selecting 6 or 2 orientations.
 
	WID_BROS_SHOW_NEWST_DEFSIZE,     ///< Selection for default-size button for new road stops.
 
	WID_BROS_SHOW_NEWST_ADDITIONS,   ///< Selection for new class selection list.
 
	WID_BROS_SHOW_NEWST_MATRIX,      ///< Selection for new stop image matrix.
 
	WID_BROS_SHOW_NEWST_RESIZE,      ///< Selection for panel and resize at bottom right for new stops.
 
	WID_BROS_SHOW_NEWST_ORIENTATION, ///< Selection for the orientation string for new stops.
 
	WID_BROS_SHOW_NEWST_TYPE_SEL,    ///< Selection for the type name.
0 comments (0 inline, 0 general)