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 |