src/build_vehicle_gui.cpp
changeset 11138 7a4428077a35
parent 11136 4641e5d64d1f
equal deleted inserted replaced
11137:16d0ea29e638 11138:7a4428077a35
   802 		RoadTypes roadtypes;
   802 		RoadTypes roadtypes;
   803 	} filter;
   803 	} filter;
   804 	bool descending_sort_order;
   804 	bool descending_sort_order;
   805 	byte sort_criteria;
   805 	byte sort_criteria;
   806 	bool regenerate_list;
   806 	bool regenerate_list;
       
   807 	bool listview_mode;
   807 	EngineID sel_engine;
   808 	EngineID sel_engine;
   808 	EngineID rename_engine;
   809 	EngineID rename_engine;
   809 	GUIEngineList eng_list;
   810 	GUIEngineList eng_list;
   810 
   811 
   811 	BuildVehicleWindow(const WindowDesc *desc, TileIndex tile, VehicleType type) : Window(desc, tile == 0 ? (int)type : tile)
   812 	BuildVehicleWindow(const WindowDesc *desc, TileIndex tile, VehicleType type) : Window(desc, tile == 0 ? (int)type : tile)
   842 				this->filter.flags =
   843 				this->filter.flags =
   843 					tile == 0 ? AirportFTAClass::ALL : GetStationByTile(tile)->Airport()->flags;
   844 					tile == 0 ? AirportFTAClass::ALL : GetStationByTile(tile)->Airport()->flags;
   844 				break;
   845 				break;
   845 		}
   846 		}
   846 		this->SetupWindowStrings(type);
   847 		this->SetupWindowStrings(type);
   847 		ResizeButtons(this, BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME);
   848 
       
   849 		this->listview_mode = (this->window_number <= VEH_END);
       
   850 		/* If we are just viewing the list of vehicles, we do not need the Build button.
       
   851 		 * So we just hide it, and enlarge the Rename buton by the now vacant place. */
       
   852 		if (this->listview_mode) {
       
   853 			this->HideWidget(BUILD_VEHICLE_WIDGET_BUILD);
       
   854 			this->widget[BUILD_VEHICLE_WIDGET_RENAME].left = this->widget[BUILD_VEHICLE_WIDGET_BUILD].left;
       
   855 		} else {
       
   856 			/* Both are visible, adjust the size of each */
       
   857 			ResizeButtons(this, BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME);
       
   858 		}
   848 
   859 
   849 		this->GenerateBuildList(); // generate the list, since we need it in the next line
   860 		this->GenerateBuildList(); // generate the list, since we need it in the next line
   850 		/* Select the first engine in the list as default when opening the window */
   861 		/* Select the first engine in the list as default when opening the window */
   851 		if (this->eng_list.Length() > 0) this->sel_engine = this->eng_list[0];
   862 		if (this->eng_list.Length() > 0) this->sel_engine = this->eng_list[0];
   852 
   863 
   854 	}
   865 	}
   855 
   866 
   856 	/* Setup widget strings to fit the different types of vehicles */
   867 	/* Setup widget strings to fit the different types of vehicles */
   857 	void SetupWindowStrings(VehicleType type)
   868 	void SetupWindowStrings(VehicleType type)
   858 	{
   869 	{
   859 		bool available_vehicle = this->window_number <= VEH_END;
       
   860 		switch (type) {
   870 		switch (type) {
   861 			default: NOT_REACHED();
   871 			default: NOT_REACHED();
   862 
   872 
   863 			case VEH_TRAIN:
   873 			case VEH_TRAIN:
   864 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = available_vehicle ? STR_AVAILABLE_TRAINS : STR_JUST_STRING;
   874 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = this->listview_mode ? STR_AVAILABLE_TRAINS : STR_JUST_STRING;
   865 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_8843_TRAIN_VEHICLE_SELECTION;
   875 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_8843_TRAIN_VEHICLE_SELECTION;
   866 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_881F_BUILD_VEHICLE;
   876 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_881F_BUILD_VEHICLE;
   867 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN;
   877 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN;
   868 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_8820_RENAME;
   878 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_8820_RENAME;
   869 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_8845_RENAME_TRAIN_VEHICLE_TYPE;
   879 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_8845_RENAME_TRAIN_VEHICLE_TYPE;
   870 				break;
   880 				break;
   871 
   881 
   872 			case VEH_ROAD:
   882 			case VEH_ROAD:
   873 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = available_vehicle ? STR_AVAILABLE_ROAD_VEHICLES : STR_9006_NEW_ROAD_VEHICLES;
   883 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = this->listview_mode ? STR_AVAILABLE_ROAD_VEHICLES : STR_9006_NEW_ROAD_VEHICLES;
   874 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9026_ROAD_VEHICLE_SELECTION;
   884 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9026_ROAD_VEHICLE_SELECTION;
   875 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_9007_BUILD_VEHICLE;
   885 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_9007_BUILD_VEHICLE;
   876 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_9027_BUILD_THE_HIGHLIGHTED_ROAD;
   886 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_9027_BUILD_THE_HIGHLIGHTED_ROAD;
   877 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9034_RENAME;
   887 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9034_RENAME;
   878 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9035_RENAME_ROAD_VEHICLE_TYPE;
   888 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9035_RENAME_ROAD_VEHICLE_TYPE;
   879 				break;
   889 				break;
   880 
   890 
   881 			case VEH_SHIP:
   891 			case VEH_SHIP:
   882 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = available_vehicle ? STR_AVAILABLE_SHIPS : STR_9808_NEW_SHIPS;
   892 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = this->listview_mode ? STR_AVAILABLE_SHIPS : STR_9808_NEW_SHIPS;
   883 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9825_SHIP_SELECTION_LIST_CLICK;
   893 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9825_SHIP_SELECTION_LIST_CLICK;
   884 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_9809_BUILD_SHIP;
   894 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_9809_BUILD_SHIP;
   885 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_9826_BUILD_THE_HIGHLIGHTED_SHIP;
   895 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_9826_BUILD_THE_HIGHLIGHTED_SHIP;
   886 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9836_RENAME;
   896 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9836_RENAME;
   887 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9837_RENAME_SHIP_TYPE;
   897 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9837_RENAME_SHIP_TYPE;
   888 				break;
   898 				break;
   889 
   899 
   890 			case VEH_AIRCRAFT:
   900 			case VEH_AIRCRAFT:
   891 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = available_vehicle ? STR_AVAILABLE_AIRCRAFT : STR_A005_NEW_AIRCRAFT;
   901 				this->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = this->listview_mode ? STR_AVAILABLE_AIRCRAFT : STR_A005_NEW_AIRCRAFT;
   892 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_A025_AIRCRAFT_SELECTION_LIST;
   902 				this->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_A025_AIRCRAFT_SELECTION_LIST;
   893 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_A006_BUILD_AIRCRAFT;
   903 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].data      = STR_A006_BUILD_AIRCRAFT;
   894 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT;
   904 				this->widget[BUILD_VEHICLE_WIDGET_BUILD].tooltips  = STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT;
   895 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_A037_RENAME;
   905 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_A037_RENAME;
   896 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_A038_RENAME_AIRCRAFT_TYPE;
   906 				this->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_A038_RENAME_AIRCRAFT_TYPE;
   903 	{
   913 	{
   904 		EngineID sel_id = INVALID_ENGINE;
   914 		EngineID sel_id = INVALID_ENGINE;
   905 		int num_engines = 0;
   915 		int num_engines = 0;
   906 		int num_wagons  = 0;
   916 		int num_wagons  = 0;
   907 
   917 
   908 		this->filter.railtype = (this->window_number <= VEH_END) ? RAILTYPE_END : GetRailType(this->window_number);
   918 		this->filter.railtype = (this->listview_mode) ? RAILTYPE_END : GetRailType(this->window_number);
   909 
   919 
   910 		this->eng_list.Clear();
   920 		this->eng_list.Clear();
   911 
   921 
   912 		/* Make list of all available train engines and wagons.
   922 		/* Make list of all available train engines and wagons.
   913 		* Also check to see if the previously selected engine is still available,
   923 		* Also check to see if the previously selected engine is still available,
   996 		const Engine *e;
  1006 		const Engine *e;
   997 		FOR_ALL_ENGINES_OF_TYPE(e, VEH_AIRCRAFT) {
  1007 		FOR_ALL_ENGINES_OF_TYPE(e, VEH_AIRCRAFT) {
   998 			EngineID eid = e->index;
  1008 			EngineID eid = e->index;
   999 			if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
  1009 			if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
  1000 			/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
  1010 			/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
  1001 			if (this->window_number > VEH_END && !CanAircraftUseStation(eid, this->window_number)) continue;
  1011 			if (!this->listview_mode && !CanAircraftUseStation(eid, this->window_number)) continue;
  1002 
  1012 
  1003 			*this->eng_list.Append() = eid;
  1013 			*this->eng_list.Append() = eid;
  1004 			if (eid == this->sel_engine) sel_id = eid;
  1014 			if (eid == this->sel_engine) sel_id = eid;
  1005 		}
  1015 		}
  1006 
  1016 
  1107 			this->GenerateBuildList();
  1117 			this->GenerateBuildList();
  1108 		}
  1118 		}
  1109 
  1119 
  1110 		uint max = min(this->vscroll.pos + this->vscroll.cap, this->eng_list.Length());
  1120 		uint max = min(this->vscroll.pos + this->vscroll.cap, this->eng_list.Length());
  1111 
  1121 
  1112 		this->SetWidgetDisabledState(BUILD_VEHICLE_WIDGET_BUILD, this->window_number <= VEH_END);
       
  1113 
       
  1114 		SetVScrollCount(this, this->eng_list.Length());
  1122 		SetVScrollCount(this, this->eng_list.Length());
  1115 		SetDParam(0, this->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
  1123 		SetDParam(0, this->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
  1116 
  1124 
  1117 		/* Set text of sort by dropdown */
  1125 		/* Set text of sort by dropdown */
  1118 		this->widget[BUILD_VEHICLE_WIDGET_SORT_DROPDOWN].data = _sort_listing[this->vehicle_type][this->sort_criteria];
  1126 		this->widget[BUILD_VEHICLE_WIDGET_SORT_DROPDOWN].data = _sort_listing[this->vehicle_type][this->sort_criteria];
  1169 		this->SetDirty();
  1177 		this->SetDirty();
  1170 	}
  1178 	}
  1171 
  1179 
  1172 	virtual void OnResize(Point new_size, Point delta)
  1180 	virtual void OnResize(Point new_size, Point delta)
  1173 	{
  1181 	{
  1174 		if (delta.x != 0) ResizeButtons(this, BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME);
  1182 		if (delta.x != 0 && !this->listview_mode) {
       
  1183 			ResizeButtons(this, BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME);
       
  1184 		}
  1175 		if (delta.y == 0) return;
  1185 		if (delta.y == 0) return;
  1176 
  1186 
  1177 		this->vscroll.cap += delta.y / (int)GetVehicleListHeight(this->vehicle_type);
  1187 		this->vscroll.cap += delta.y / (int)GetVehicleListHeight(this->vehicle_type);
  1178 		this->widget[BUILD_VEHICLE_WIDGET_LIST].data = (this->vscroll.cap << 8) + 1;
  1188 		this->widget[BUILD_VEHICLE_WIDGET_LIST].data = (this->vscroll.cap << 8) + 1;
  1179 	}
  1189 	}