src/autoreplace_gui.cpp
changeset 10453 9dcddad4df48
parent 10434 d6accd017341
child 10462 416b62f5ee6f
equal deleted inserted replaced
10452:27eb85080c0a 10453:9dcddad4df48
   195 	EngineID selected_engine = INVALID_ENGINE;
   195 	EngineID selected_engine = INVALID_ENGINE;
   196 	VehicleType type = (VehicleType)w->window_number;
   196 	VehicleType type = (VehicleType)w->window_number;
   197 	byte i = draw_left ? 0 : 1;
   197 	byte i = draw_left ? 0 : 1;
   198 
   198 
   199 	EngineList *list = &WP(w, replaceveh_d).list[i];
   199 	EngineList *list = &WP(w, replaceveh_d).list[i];
   200 	EngList_RemoveAll(list);
   200 	list->clear();
   201 
   201 
   202 	const Engine *e;
   202 	const Engine *e;
   203 	FOR_ALL_ENGINES_OF_TYPE(e, type) {
   203 	FOR_ALL_ENGINES_OF_TYPE(e, type) {
   204 		EngineID eid = e->index;
   204 		EngineID eid = e->index;
   205 		if (type == VEH_TRAIN && !GenerateReplaceRailList(eid, draw_left, WP(w, replaceveh_d).wagon_btnstate)) continue; // special rules for trains
   205 		if (type == VEH_TRAIN && !GenerateReplaceRailList(eid, draw_left, WP(w, replaceveh_d).wagon_btnstate)) continue; // special rules for trains
   218 			/* Road vehicles can't be replaced by trams and vice-versa */
   218 			/* Road vehicles can't be replaced by trams and vice-versa */
   219 			if (type == VEH_ROAD && HasBit(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
   219 			if (type == VEH_ROAD && HasBit(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
   220 			if (eid == WP(w, replaceveh_d).sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
   220 			if (eid == WP(w, replaceveh_d).sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
   221 		}
   221 		}
   222 
   222 
   223 		EngList_Add(list, eid);
   223 		list->push_back(eid);
   224 		if (eid == WP(w, replaceveh_d).sel_engine[i]) selected_engine = eid; // The selected engine is still in the list
   224 		if (eid == WP(w, replaceveh_d).sel_engine[i]) selected_engine = eid; // The selected engine is still in the list
   225 	}
   225 	}
   226 	WP(w, replaceveh_d).sel_engine[i] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
   226 	WP(w, replaceveh_d).sel_engine[i] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
   227 	if (type == VEH_TRAIN) EngList_Sort(list, &TrainEngineNumberSorter);
   227 	if (type == VEH_TRAIN) EngList_Sort(list, &TrainEngineNumberSorter);
   228 }
   228 }
   235 	EngineID e = WP(w, replaceveh_d).sel_engine[0];
   235 	EngineID e = WP(w, replaceveh_d).sel_engine[0];
   236 
   236 
   237 	if (WP(w, replaceveh_d).update_left == true) {
   237 	if (WP(w, replaceveh_d).update_left == true) {
   238 		/* We need to rebuild the left list */
   238 		/* We need to rebuild the left list */
   239 		GenerateReplaceVehList(w, true);
   239 		GenerateReplaceVehList(w, true);
   240 		SetVScrollCount(w, EngList_Count(&WP(w, replaceveh_d).list[0]));
   240 		SetVScrollCount(w, WP(w, replaceveh_d).list[0].size());
   241 		if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE && EngList_Count(&WP(w, replaceveh_d).list[0]) != 0) {
   241 		if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE && WP(w, replaceveh_d).list[0].size() != 0) {
   242 			WP(w, replaceveh_d).sel_engine[0] = WP(w, replaceveh_d).list[0][0];
   242 			WP(w, replaceveh_d).sel_engine[0] = WP(w, replaceveh_d).list[0][0];
   243 		}
   243 		}
   244 	}
   244 	}
   245 
   245 
   246 	if (WP(w, replaceveh_d).update_right || e != WP(w, replaceveh_d).sel_engine[0]) {
   246 	if (WP(w, replaceveh_d).update_right || e != WP(w, replaceveh_d).sel_engine[0]) {
   247 		/* Either we got a request to rebuild the right list or the left list selected a different engine */
   247 		/* Either we got a request to rebuild the right list or the left list selected a different engine */
   248 		if (WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE) {
   248 		if (WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE) {
   249 			/* Always empty the right list when nothing is selected in the left list */
   249 			/* Always empty the right list when nothing is selected in the left list */
   250 			EngList_RemoveAll(&WP(w, replaceveh_d).list[1]);
   250 			WP(w, replaceveh_d).list[1].clear();
   251 			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
   251 			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
   252 		} else {
   252 		} else {
   253 			GenerateReplaceVehList(w, false);
   253 			GenerateReplaceVehList(w, false);
   254 			SetVScroll2Count(w, EngList_Count(&WP(w, replaceveh_d).list[1]));
   254 			SetVScroll2Count(w, WP(w, replaceveh_d).list[1].size());
   255 			if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[1] == INVALID_ENGINE && EngList_Count(&WP(w, replaceveh_d).list[1]) != 0) {
   255 			if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[1] == INVALID_ENGINE && WP(w, replaceveh_d).list[1].size() != 0) {
   256 				WP(w, replaceveh_d).sel_engine[1] = WP(w, replaceveh_d).list[1][0];
   256 				WP(w, replaceveh_d).sel_engine[1] = WP(w, replaceveh_d).list[1][0];
   257 			}
   257 			}
   258 		}
   258 		}
   259 	}
   259 	}
   260 	/* Reset the flags about needed updates */
   260 	/* Reset the flags about needed updates */
   277 	};
   277 	};
   278 
   278 
   279 	switch (e->event) {
   279 	switch (e->event) {
   280 		case WE_CREATE:
   280 		case WE_CREATE:
   281 			WP(w, replaceveh_d).wagon_btnstate = true; // start with locomotives (all other vehicles will not read this bool)
   281 			WP(w, replaceveh_d).wagon_btnstate = true; // start with locomotives (all other vehicles will not read this bool)
   282 			EngList_Create(&WP(w, replaceveh_d).list[0]);
   282 			new (&WP(w, replaceveh_d).list[0]) EngineList();
   283 			EngList_Create(&WP(w, replaceveh_d).list[1]);
   283 			new (&WP(w, replaceveh_d).list[1]) EngineList();
   284 			WP(w, replaceveh_d).update_left   = true;
   284 			WP(w, replaceveh_d).update_left   = true;
   285 			WP(w, replaceveh_d).update_right  = true;
   285 			WP(w, replaceveh_d).update_right  = true;
   286 			WP(w, replaceveh_d).init_lists    = true;
   286 			WP(w, replaceveh_d).init_lists    = true;
   287 			WP(w, replaceveh_d).sel_engine[0] = INVALID_ENGINE;
   287 			WP(w, replaceveh_d).sel_engine[0] = INVALID_ENGINE;
   288 			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
   288 			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
   355 			/* Draw the lists */
   355 			/* Draw the lists */
   356 			for(byte i = 0; i < 2; i++) {
   356 			for(byte i = 0; i < 2; i++) {
   357 				uint widget     = (i == 0) ? RVW_WIDGET_LEFT_MATRIX : RVW_WIDGET_RIGHT_MATRIX;
   357 				uint widget     = (i == 0) ? RVW_WIDGET_LEFT_MATRIX : RVW_WIDGET_RIGHT_MATRIX;
   358 				EngineList list = WP(w, replaceveh_d).list[i]; // which list to draw
   358 				EngineList list = WP(w, replaceveh_d).list[i]; // which list to draw
   359 				EngineID start  = i == 0 ? w->vscroll.pos : w->vscroll2.pos; // what is the offset for the start (scrolling)
   359 				EngineID start  = i == 0 ? w->vscroll.pos : w->vscroll2.pos; // what is the offset for the start (scrolling)
   360 				EngineID end    = min((i == 0 ? w->vscroll.cap : w->vscroll2.cap) + start, EngList_Count(&list));
   360 				EngineID end    = min((i == 0 ? w->vscroll.cap : w->vscroll2.cap) + start, list.size());
   361 
   361 
   362 				/* Do the actual drawing */
   362 				/* Do the actual drawing */
   363 				DrawEngineList((VehicleType)w->window_number, w->widget[widget].left + 2, w->widget[widget].top + 1, list, start, end, WP(w, replaceveh_d).sel_engine[i], i == 0 ? w->widget[RVW_WIDGET_LEFT_MATRIX].right - 2 : 0, selected_group);
   363 				DrawEngineList((VehicleType)w->window_number, w->widget[widget].left + 2, w->widget[widget].top + 1, list, start, end, WP(w, replaceveh_d).sel_engine[i], i == 0 ? w->widget[RVW_WIDGET_LEFT_MATRIX].right - 2 : 0, selected_group);
   364 
   364 
   365 				/* Also draw the details if an engine is selected */
   365 				/* Also draw the details if an engine is selected */
   409 				case RVW_WIDGET_RIGHT_MATRIX: {
   409 				case RVW_WIDGET_RIGHT_MATRIX: {
   410 					uint i = (e->we.click.pt.y - 14) / w->resize.step_height;
   410 					uint i = (e->we.click.pt.y - 14) / w->resize.step_height;
   411 					uint16 click_scroll_pos = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.pos : w->vscroll2.pos;
   411 					uint16 click_scroll_pos = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.pos : w->vscroll2.pos;
   412 					uint16 click_scroll_cap = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.cap : w->vscroll2.cap;
   412 					uint16 click_scroll_cap = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.cap : w->vscroll2.cap;
   413 					byte click_side         = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? 0 : 1;
   413 					byte click_side         = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? 0 : 1;
   414 					uint16 engine_count     = EngList_Count(&WP(w, replaceveh_d).list[click_side]);
   414 					uint16 engine_count     = WP(w, replaceveh_d).list[click_side].size();
   415 
   415 
   416 					if (i < click_scroll_cap) {
   416 					if (i < click_scroll_cap) {
   417 						i += click_scroll_pos;
   417 						i += click_scroll_pos;
   418 						EngineID e = engine_count > i ? WP(w, replaceveh_d).list[click_side][i] : INVALID_ENGINE;
   418 						EngineID e = engine_count > i ? WP(w, replaceveh_d).list[click_side][i] : INVALID_ENGINE;
   419 						if (e == WP(w, replaceveh_d).sel_engine[click_side]) break; // we clicked the one we already selected
   419 						if (e == WP(w, replaceveh_d).sel_engine[click_side]) break; // we clicked the one we already selected
   474 			if (_rebuild_right_list) WP(w, replaceveh_d).update_right = true;
   474 			if (_rebuild_right_list) WP(w, replaceveh_d).update_right = true;
   475 			w->SetDirty();
   475 			w->SetDirty();
   476 			break;
   476 			break;
   477 
   477 
   478 		case WE_DESTROY:
   478 		case WE_DESTROY:
   479 			EngList_RemoveAll(&WP(w, replaceveh_d).list[0]);
   479 			WP(w, replaceveh_d).list[0].~EngineList(); // call destructor explicitly
   480 			EngList_RemoveAll(&WP(w, replaceveh_d).list[1]);
   480 			WP(w, replaceveh_d).list[1].~EngineList();
   481 		break;
   481 		break;
   482 	}
   482 	}
   483 }
   483 }
   484 
   484 
   485 static const Widget _replace_vehicle_widgets[] = {
   485 static const Widget _replace_vehicle_widgets[] = {