OpenTTD Source 20250205-master-gfd85ab1e2c
autoreplace_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "command_func.h"
12#include "vehicle_gui.h"
13#include "newgrf_engine.h"
14#include "rail.h"
15#include "road.h"
16#include "strings_func.h"
17#include "window_func.h"
18#include "autoreplace_func.h"
19#include "company_func.h"
20#include "engine_base.h"
21#include "window_gui.h"
22#include "engine_gui.h"
23#include "settings_func.h"
25#include "rail_gui.h"
26#include "road_gui.h"
27#include "dropdown_type.h"
28#include "dropdown_func.h"
29#include "autoreplace_cmd.h"
30#include "group_cmd.h"
31#include "settings_cmd.h"
32
34
35#include "safeguards.h"
36
37static bool EngineNumberSorter(const GUIEngineListItem &a, const GUIEngineListItem &b)
38{
39 return Engine::Get(a.engine_id)->list_position < Engine::Get(b.engine_id)->list_position;
40}
41
52{
54 /* We don't have any of this engine type.
55 * Either we just sold the last one, we build a new one or we stopped replacing it.
56 * In all cases, we need to update the left list */
58 }
59}
60
66{
67 InvalidateWindowData(WC_REPLACE_VEHICLE, type, 0); // Update the autoreplace window
68 InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
69}
70
71static const StringID _start_replace_dropdown[] = {
72 STR_REPLACE_VEHICLES_NOW,
73 STR_REPLACE_VEHICLES_WHEN_OLD,
74};
75
91 Scrollbar *vscroll[2];
92
101 {
102 const RailVehicleInfo *rvi = RailVehInfo(e);
103
104 /* Ensure that the wagon/engine selection fits the engine. */
105 if ((rvi->railveh_type == RAILVEH_WAGON) == show_engines) return false;
106
107 if (draw_left && this->sel_railtype != INVALID_RAILTYPE) {
108 /* Ensure that the railtype is specific to the selected one */
109 if (rvi->railtype != this->sel_railtype) return false;
110 }
111 return true;
112 }
113
119 {
120 std::vector<EngineID> variants;
122 VehicleType type = this->window_number;
123 uint8_t side = draw_left ? 0 : 1;
124
125 GUIEngineList list;
126
127 for (const Engine *e : Engine::IterateType(type)) {
128 if (!draw_left && !this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue;
129 EngineID eid = e->index;
130 switch (type) {
131 case VEH_TRAIN:
132 if (!this->GenerateReplaceRailList(eid, draw_left, this->replace_engines)) continue; // special rules for trains
133 break;
134
135 case VEH_ROAD:
136 if (draw_left && this->sel_roadtype != INVALID_ROADTYPE) {
137 /* Ensure that the roadtype is specific to the selected one */
138 if (e->u.road.roadtype != this->sel_roadtype) continue;
139 }
140 break;
141
142 default:
143 break;
144 }
145
146 if (draw_left) {
147 const uint num_engines = GetGroupNumEngines(_local_company, this->sel_group, eid);
148
149 /* Skip drawing the engines we don't have any of and haven't set for replacement */
150 if (num_engines == 0 && EngineReplacementForCompany(Company::Get(_local_company), eid, this->sel_group) == INVALID_ENGINE) continue;
151 } else {
152 if (!CheckAutoreplaceValidity(this->sel_engine[0], eid, _local_company)) continue;
153 }
154
155 list.emplace_back(eid, e->info.variant_id, (side == 0) ? EngineDisplayFlags{} : e->display_flags, 0);
156
157 if (side == 1) {
158 EngineID parent = e->info.variant_id;
159 while (parent != INVALID_ENGINE) {
160 variants.push_back(parent);
161 parent = Engine::Get(parent)->info.variant_id;
162 }
163 }
164 if (eid == this->sel_engine[side]) selected_engine = eid; // The selected engine is still in the list
165 }
166
167 if (side == 1) {
168 /* ensure primary engine of variant group is in list */
169 for (const auto &variant : variants) {
170 if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) {
171 const Engine *e = Engine::Get(variant);
172 list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlag::Shaded, 0);
173 }
174 }
175 }
176
177 this->sel_engine[side] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
178 if (draw_left) {
179 EngList_Sort(list, &EngineNumberSorter);
180 } else {
182 EngList_Sort(list, _engine_sort_functions[this->window_number][this->sort_criteria]);
183 }
184
185 this->engines[side].clear();
186 if (side == 1) {
187 GUIEngineListAddChildren(this->engines[side], list);
188 } else {
189 this->engines[side].swap(list);
190 }
191 }
192
195 {
196 EngineID e = this->sel_engine[0];
197
198 if (this->engines[0].NeedRebuild()) {
199 /* We need to rebuild the left engines list */
200 this->GenerateReplaceVehList(true);
201 this->vscroll[0]->SetCount(this->engines[0].size());
202 if (this->reset_sel_engine && this->sel_engine[0] == INVALID_ENGINE && !this->engines[0].empty()) {
203 this->sel_engine[0] = this->engines[0][0].engine_id;
204 }
205 }
206
207 if (this->engines[1].NeedRebuild() || e != this->sel_engine[0]) {
208 /* Either we got a request to rebuild the right engines list, or the left engines list selected a different engine */
209 if (this->sel_engine[0] == INVALID_ENGINE) {
210 /* Always empty the right engines list when nothing is selected in the left engines list */
211 this->engines[1].clear();
212 this->sel_engine[1] = INVALID_ENGINE;
213 this->vscroll[1]->SetCount(this->engines[1].size());
214 } else {
215 if (this->reset_sel_engine && this->sel_engine[0] != INVALID_ENGINE) {
216 /* Select the current replacement for sel_engine[0]. */
218 this->sel_engine[1] = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group);
219 }
220 /* Regenerate the list on the right. Note: This resets sel_engine[1] to INVALID_ENGINE, if it is no longer available. */
221 this->GenerateReplaceVehList(false);
222 this->vscroll[1]->SetCount(this->engines[1].size());
223 if (this->reset_sel_engine && this->sel_engine[1] != INVALID_ENGINE) {
224 int position = 0;
225 for (const auto &item : this->engines[1]) {
226 if (item.engine_id == this->sel_engine[1]) break;
227 ++position;
228 }
229 this->vscroll[1]->ScrollTowards(position);
230 }
231 }
232 }
233 /* Reset the flags about needed updates */
234 this->engines[0].RebuildDone();
235 this->engines[1].RebuildDone();
236 this->reset_sel_engine = false;
237 }
238
243 void ReplaceClick_StartReplace(bool replace_when_old)
244 {
245 EngineID veh_from = this->sel_engine[0];
246 EngineID veh_to = this->sel_engine[1];
247 Command<CMD_SET_AUTOREPLACE>::Post(this->sel_group, veh_from, veh_to, replace_when_old);
248 }
249
254 {
255 /* Reset scrollbar positions */
256 this->vscroll[0]->SetPosition(0);
257 this->vscroll[1]->SetPosition(0);
258 /* Rebuild the lists */
259 this->engines[0].ForceRebuild();
260 this->engines[1].ForceRebuild();
261 this->reset_sel_engine = true;
262 this->SetDirty();
263 }
264
265public:
267 {
268 this->sel_railtype = INVALID_RAILTYPE;
269 this->sel_roadtype = INVALID_ROADTYPE;
270 this->replace_engines = true; // start with locomotives (all other vehicles will not read this bool)
271 this->engines[0].ForceRebuild();
272 this->engines[1].ForceRebuild();
273 this->reset_sel_engine = true;
274 this->details_height = ((vehicletype == VEH_TRAIN) ? 10 : 9);
275 this->sel_engine[0] = INVALID_ENGINE;
276 this->sel_engine[1] = INVALID_ENGINE;
277 this->show_hidden_engines = _engine_sort_show_hidden_engines[vehicletype];
278
279 this->CreateNestedTree();
280 this->vscroll[0] = this->GetScrollbar(WID_RV_LEFT_SCROLLBAR);
281 this->vscroll[1] = this->GetScrollbar(WID_RV_RIGHT_SCROLLBAR);
282
285 widget->SetLowered(this->show_hidden_engines);
286 this->FinishInitNested(vehicletype);
287
288 this->sort_criteria = _engine_sort_last_criteria[vehicletype];
289 this->descending_sort_order = _engine_sort_last_order[vehicletype];
290 this->owner = _local_company;
291 this->sel_group = id_g;
292 }
293
295 {
296 switch (widget) {
299 d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
300 d.height += padding.height;
301 size = maxdim(size, d);
302 break;
303 }
304
308 size.height = (this->window_number <= VEH_ROAD ? 8 : 4) * resize.height;
309 break;
310
313 size.height = GetCharacterHeight(FS_NORMAL) * this->details_height + padding.height;
314 break;
315
317 StringID str = this->GetWidget<NWidgetCore>(widget)->GetString();
322 d.width += padding.width;
323 d.height += padding.height;
324 size = maxdim(size, d);
325 break;
326 }
327
331 d.width += padding.width;
332 d.height += padding.height;
333 size = maxdim(size, d);
334 break;
335 }
336
337 case WID_RV_INFO_TAB: {
340 d.width += padding.width;
341 d.height += padding.height;
342 size = maxdim(size, d);
343 break;
344 }
345
347 Dimension d = {0, 0};
348 for (const RailType &rt : _sorted_railtypes) {
350 }
351 d.width += padding.width;
352 d.height += padding.height;
353 size = maxdim(size, d);
354 break;
355 }
356
358 Dimension d = {0, 0};
359 for (const RoadType &rt : _sorted_roadtypes) {
361 }
362 d.width += padding.width;
363 d.height += padding.height;
364 size = maxdim(size, d);
365 break;
366 }
367
370 d = maxdim(d, GetStringListBoundingBox(_start_replace_dropdown));
371 d.width += padding.width;
372 d.height += padding.height;
373 size = maxdim(size, d);
374 break;
375 }
376 }
377 }
378
379 void SetStringParameters(WidgetID widget) const override
380 {
381 switch (widget) {
382 case WID_RV_CAPTION:
384 switch (this->sel_group) {
385 case ALL_GROUP:
387 break;
388
389 case DEFAULT_GROUP:
391 break;
392
393 default:
395 SetDParam(2, sel_group);
396 break;
397 }
398 break;
399
401 SetDParam(0, std::data(_engine_sort_listing[this->window_number])[this->sort_criteria]);
402 break;
403
405 bool remove_wagon;
406 const Group *g = Group::GetIfValid(this->sel_group);
407 if (g != nullptr) {
411 } else {
414 SetDParam(0, STR_GROUP_DEFAULT_TRAINS + this->window_number);
415 }
417 break;
418 }
419
421 SetDParam(0, this->replace_engines ? STR_REPLACE_ENGINES : STR_REPLACE_WAGONS);
422 break;
423
425 SetDParam(0, this->sel_railtype == INVALID_RAILTYPE ? STR_REPLACE_ALL_RAILTYPE : GetRailTypeInfo(this->sel_railtype)->strings.replace_text);
426 break;
427
429 SetDParam(0, this->sel_roadtype == INVALID_ROADTYPE ? STR_REPLACE_ALL_ROADTYPE : GetRoadTypeInfo(this->sel_roadtype)->strings.replace_text);
430 break;
431 }
432 }
433
434 void DrawWidget(const Rect &r, WidgetID widget) const override
435 {
436 switch (widget) {
438 this->DrawSortButtonState(WID_RV_SORT_ASCENDING_DESCENDING, this->descending_sort_order ? SBS_DOWN : SBS_UP);
439 break;
440
441 case WID_RV_INFO_TAB: {
443 StringID str;
444 if (this->sel_engine[0] != INVALID_ENGINE) {
445 if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
447 } else {
448 bool when_old = false;
449 EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
452 }
453 } else {
455 }
456
458 break;
459 }
460
462 case WID_RV_RIGHT_MATRIX: {
463 int side = (widget == WID_RV_LEFT_MATRIX) ? 0 : 1;
464
465 /* Do the actual drawing */
466 DrawEngineList(this->window_number, r, this->engines[side], *this->vscroll[side], this->sel_engine[side], side == 0, this->sel_group);
467 break;
468 }
469 }
470 }
471
472 void OnPaint() override
473 {
474 if (this->engines[0].NeedRebuild() || this->engines[1].NeedRebuild()) this->GenerateLists();
475
477
478 /* Disable the "Start Replacing" button if:
479 * Either engines list is empty
480 * or The selected replacement engine has a replacement (to prevent loops). */
482 this->sel_engine[0] == INVALID_ENGINE || this->sel_engine[1] == INVALID_ENGINE || EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE);
483
484 /* Disable the "Stop Replacing" button if:
485 * The left engines list (existing vehicle) is empty
486 * or The selected vehicle has no replacement set up */
487 this->SetWidgetDisabledState(WID_RV_STOP_REPLACE, this->sel_engine[0] == INVALID_ENGINE || !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
488
489 this->DrawWidgets();
490
491 if (!this->IsShaded()) {
492 int needed_height = this->details_height;
493 /* Draw details panels. */
494 for (int side = 0; side < 2; side++) {
495 if (this->sel_engine[side] != INVALID_ENGINE) {
496 /* Use default engine details without refitting */
497 const Engine *e = Engine::Get(this->sel_engine[side]);
499 ted.cost = 0;
500 ted.FillDefaultCapacities(e);
501
502 const Rect r = this->GetWidget<NWidgetBase>(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS)->GetCurrentRect()
504 int text_end = DrawVehiclePurchaseInfo(r.left, r.right, r.top, this->sel_engine[side], ted);
506 }
507 }
508 if (needed_height != this->details_height) { // Details window are not high enough, enlarge them.
509 this->details_height = needed_height;
510 this->ReInit();
511 return;
512 }
513 }
514 }
515
516 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
517 {
518 switch (widget) {
520 this->descending_sort_order ^= true;
522 this->engines[1].ForceRebuild();
523 this->SetDirty();
524 break;
525
527 this->show_hidden_engines ^= true;
529 this->engines[1].ForceRebuild();
530 this->SetWidgetLoweredState(widget, this->show_hidden_engines);
531 this->SetDirty();
532 break;
533
535 DisplayVehicleSortDropDown(this, this->window_number, this->sort_criteria, WID_RV_SORT_DROPDOWN);
536 break;
537
539 DropDownList list;
540 list.push_back(MakeDropDownListStringItem(STR_REPLACE_ENGINES, 1));
541 list.push_back(MakeDropDownListStringItem(STR_REPLACE_WAGONS, 0));
542 ShowDropDownList(this, std::move(list), this->replace_engines ? 1 : 0, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN);
543 break;
544 }
545
546 case WID_RV_RAIL_TYPE_DROPDOWN: // Railtype selection dropdown menu
547 ShowDropDownList(this, GetRailTypeDropDownList(true, true), this->sel_railtype, widget);
548 break;
549
550 case WID_RV_ROAD_TYPE_DROPDOWN: // Roadtype selection dropdown menu
551 ShowDropDownList(this, GetRoadTypeDropDownList(RTTB_ROAD | RTTB_TRAM, true, true), this->sel_roadtype, widget);
552 break;
553
555 const Group *g = Group::GetIfValid(this->sel_group);
556 if (g != nullptr) {
558 } else {
559 // toggle renew_keep_length
560 Command<CMD_CHANGE_COMPANY_SETTING>::Post("company.renew_keep_length", Company::Get(_local_company)->settings.renew_keep_length ? 0 : 1);
561 }
562 break;
563 }
564
565 case WID_RV_START_REPLACE: { // Start replacing
566 if (this->GetWidget<NWidgetLeaf>(widget)->ButtonHit(pt)) {
569 } else {
570 bool replacment_when_old = EngineHasReplacementWhenOldForCompany(Company::Get(_local_company), this->sel_engine[0], this->sel_group);
571 ShowDropDownMenu(this, _start_replace_dropdown, replacment_when_old ? 1 : 0, WID_RV_START_REPLACE, !this->replace_engines ? 1 << 1 : 0, 0);
572 }
573 break;
574 }
575
576 case WID_RV_STOP_REPLACE: { // Stop replacing
577 EngineID veh_from = this->sel_engine[0];
579 break;
580 }
581
583 case WID_RV_RIGHT_MATRIX: {
585 if (widget == WID_RV_LEFT_MATRIX) {
586 click_side = 0;
587 } else {
588 click_side = 1;
589 }
590
592 const auto it = this->vscroll[click_side]->GetScrolledItemFromWidget(this->engines[click_side], pt.y, this, widget);
593 if (it != this->engines[click_side].end()) {
594 const auto &item = *it;
595 const Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL);
596 if (item.flags.Test(EngineDisplayFlag::HasVariants) && IsInsideMM(r.left, r.right, pt.x)) {
597 /* toggle folded flag on engine */
598 assert(item.variant_id != INVALID_ENGINE);
599 Engine *engine = Engine::Get(item.variant_id);
601
602 InvalidateWindowData(WC_REPLACE_VEHICLE, this->window_number, 0); // Update the autoreplace window
603 InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
604 return;
605 }
606 if (!item.flags.Test(EngineDisplayFlag::Shaded)) e = item.engine_id;
607 }
608
609 /* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
610 * This is most common when we have finished autoreplacing the engine and want to remove it from the list. */
611 if (click_side == 0 && _ctrl_pressed && e != INVALID_ENGINE &&
615 break;
616 }
617
618 if (e == this->sel_engine[click_side]) break; // we clicked the one we already selected
619 this->sel_engine[click_side] = e;
620 if (click_side == 0) {
621 this->engines[1].ForceRebuild();
622 this->reset_sel_engine = true;
623 }
624 this->SetDirty();
625 break;
626 }
627 }
628 }
629
630 void OnDropdownSelect(WidgetID widget, int index) override
631 {
632 switch (widget) {
634 if (this->sort_criteria != index) {
635 this->sort_criteria = index;
637 this->engines[1].ForceRebuild();
638 this->SetDirty();
639 }
640 break;
641
643 RailType temp = (RailType)index;
644 if (temp == this->sel_railtype) return; // we didn't select a new one. No need to change anything
645 this->sel_railtype = temp;
646 this->OnRailRoadTypeChange();
647 break;
648 }
649
651 RoadType temp = (RoadType)index;
652 if (temp == this->sel_roadtype) return; // we didn't select a new one. No need to change anything
653 this->sel_roadtype = temp;
654 this->OnRailRoadTypeChange();
655 break;
656 }
657
659 this->replace_engines = index != 0;
660 this->engines[0].ForceRebuild();
661 this->reset_sel_engine = true;
662 this->SetDirty();
663 break;
664 }
665
667 this->ReplaceClick_StartReplace(index != 0);
668 break;
669 }
670 }
671
672 bool OnTooltip([[maybe_unused]] Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
673 {
674 if (widget != WID_RV_TRAIN_WAGONREMOVE_TOGGLE) return false;
675
676 if (Group::IsValidID(this->sel_group)) {
679 } else {
681 }
682 return true;
683 }
684
685 void OnResize() override
686 {
687 this->vscroll[0]->SetCapacityFromWidget(this, WID_RV_LEFT_MATRIX);
688 this->vscroll[1]->SetCapacityFromWidget(this, WID_RV_RIGHT_MATRIX);
689 }
690
696 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
697 {
698 if (data != 0) {
699 /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */
700 this->engines[0].ForceRebuild();
701 } else {
702 this->engines[1].ForceRebuild();
703 }
704 }
705};
706
707static constexpr NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
709 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
710 NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), SetStringTip(STR_REPLACE_VEHICLES_WHITE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
711 NWidget(WWT_SHADEBOX, COLOUR_GREY),
712 NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
713 NWidget(WWT_STICKYBOX, COLOUR_GREY),
714 EndContainer(),
716 NWidget(WWT_PANEL, COLOUR_GREY),
717 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
718 EndContainer(),
719 NWidget(WWT_PANEL, COLOUR_GREY),
720 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
721 EndContainer(),
722 EndContainer(),
726 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_RAIL_TYPE_DROPDOWN), SetMinimalSize(136, 12), SetStringTip(STR_JUST_STRING, STR_REPLACE_RAILTYPE_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
727 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN), SetStringTip(STR_JUST_STRING, STR_REPLACE_ENGINE_WAGON_SELECT_TOOLTIP),
728 EndContainer(),
729 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
730 EndContainer(),
733 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetStringTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1),
734 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetStringTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
735 EndContainer(),
737 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetStringTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
738 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
739 EndContainer(),
740 EndContainer(),
741 EndContainer(),
743 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_LEFT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
745 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_RIGHT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_RIGHT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_RIGHT_SCROLLBAR),
747 EndContainer(),
749 NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
752 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_WAGONREMOVE_TOGGLE), SetMinimalSize(138, 12), SetStringTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
753 EndContainer(),
754 EndContainer(),
756 NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetStringTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_START_BUTTON_TOOLTIP),
757 NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetToolTip(STR_REPLACE_REPLACE_INFO_TAB_TOOLTIP), SetResize(1, 0),
758 EndContainer(),
759 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetStringTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_STOP_BUTTON_TOOLTIP),
760 NWidget(WWT_RESIZEBOX, COLOUR_GREY),
761 EndContainer(),
762};
763
764static WindowDesc _replace_rail_vehicle_desc(
765 WDP_AUTO, "replace_vehicle_train", 500, 140,
768 _nested_replace_rail_vehicle_widgets
769);
770
771static constexpr NWidgetPart _nested_replace_road_vehicle_widgets[] = {
773 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
774 NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), SetStringTip(STR_REPLACE_VEHICLES_WHITE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
775 NWidget(WWT_SHADEBOX, COLOUR_GREY),
776 NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
777 NWidget(WWT_STICKYBOX, COLOUR_GREY),
778 EndContainer(),
780 NWidget(WWT_PANEL, COLOUR_GREY),
781 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
782 EndContainer(),
783 NWidget(WWT_PANEL, COLOUR_GREY),
784 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
785 EndContainer(),
786 EndContainer(),
789 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_ROAD_TYPE_DROPDOWN), SetMinimalSize(136, 12), SetStringTip(STR_JUST_STRING, STR_REPLACE_ROADTYPE_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
790 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
791 EndContainer(),
794 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetStringTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1),
795 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetStringTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
796 EndContainer(),
798 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetStringTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
799 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
800 EndContainer(),
801 EndContainer(),
802 EndContainer(),
804 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_LEFT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
806 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_RIGHT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_RIGHT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_RIGHT_SCROLLBAR),
808 EndContainer(),
810 NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
812 EndContainer(),
814 NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetStringTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_START_BUTTON_TOOLTIP),
815 NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetToolTip(STR_REPLACE_REPLACE_INFO_TAB_TOOLTIP), SetResize(1, 0),
816 EndContainer(),
817 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetStringTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_STOP_BUTTON_TOOLTIP),
818 NWidget(WWT_RESIZEBOX, COLOUR_GREY),
819 EndContainer(),
820};
821
822static WindowDesc _replace_road_vehicle_desc(
823 WDP_AUTO, "replace_vehicle_road", 500, 140,
826 _nested_replace_road_vehicle_widgets
827);
828
829static constexpr NWidgetPart _nested_replace_vehicle_widgets[] = {
831 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
832 NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), SetMinimalSize(433, 14), SetStringTip(STR_REPLACE_VEHICLES_WHITE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
833 NWidget(WWT_SHADEBOX, COLOUR_GREY),
834 NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
835 NWidget(WWT_STICKYBOX, COLOUR_GREY),
836 EndContainer(),
838 NWidget(WWT_PANEL, COLOUR_GREY),
839 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
840 EndContainer(),
841 NWidget(WWT_PANEL, COLOUR_GREY),
842 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0),
843 EndContainer(),
844 EndContainer(),
846 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
849 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetStringTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
850 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetStringTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
851 EndContainer(),
853 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetStringTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
854 NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
855 EndContainer(),
856 EndContainer(),
857 EndContainer(),
859 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_LEFT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
861 NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_RIGHT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_RIGHT_ARRAY_TOOLTIP), SetResize(1, 1), SetScrollbar(WID_RV_RIGHT_SCROLLBAR),
863 EndContainer(),
867 EndContainer(),
869 NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetStringTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_START_BUTTON_TOOLTIP),
870 NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetToolTip(STR_REPLACE_REPLACE_INFO_TAB_TOOLTIP), SetResize(1, 0), EndContainer(),
871 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(138, 12), SetStringTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_STOP_BUTTON_TOOLTIP),
872 NWidget(WWT_RESIZEBOX, COLOUR_GREY),
873 EndContainer(),
874};
875
876static WindowDesc _replace_vehicle_desc(
877 WDP_AUTO, "replace_vehicle", 456, 118,
880 _nested_replace_vehicle_widgets
881);
882
889{
891 switch (vehicletype) {
892 case VEH_TRAIN: new ReplaceVehicleWindow(_replace_rail_vehicle_desc, vehicletype, id_g); break;
893 case VEH_ROAD: new ReplaceVehicleWindow(_replace_road_vehicle_desc, vehicletype, id_g); break;
894 default: new ReplaceVehicleWindow(_replace_vehicle_desc, vehicletype, id_g); break;
895 }
896}
bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
Checks some basic properties whether autoreplace is allowed.
Command definitions related to autoreplace.
Functions related to autoreplacing.
bool EngineHasReplacementWhenOldForCompany(const Company *c, EngineID engine, GroupID group)
Check if a company has a replacement set up for the given engine when it gets old.
EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group, bool *replace_when_old=nullptr)
Retrieve the engine replacement for the given company and original engine type.
bool EngineHasReplacementForCompany(const Company *c, EngineID engine, GroupID group)
Check if a company has a replacement set up for the given engine.
void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
Show the autoreplace configuration window for a particular group.
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
Rebuild the left autoreplace list if an engine is removed or added.
void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
When an engine is made buildable or is removed from being buildable, add/remove it from the build/aut...
Types related to the autoreplace widgets.
@ WID_RV_SHOW_HIDDEN_ENGINES
Toggle whether to display the hidden vehicles.
@ WID_RV_TRAIN_ENGINEWAGON_DROPDOWN
Dropdown to select engines and/or wagons.
@ WID_RV_LEFT_SCROLLBAR
The scrollbar for the matrix on the left.
@ WID_RV_CAPTION
Caption of the window.
@ WID_RV_RIGHT_DETAILS
Details of the entry on the right.
@ WID_RV_TRAIN_WAGONREMOVE_TOGGLE
Button to toggle removing wagons.
@ WID_RV_STOP_REPLACE
Stop Replacing button.
@ WID_RV_ROAD_TYPE_DROPDOWN
Dropdown to select roadtype.
@ WID_RV_RIGHT_MATRIX
The matrix on the right.
@ WID_RV_INFO_TAB
Info tab.
@ WID_RV_RAIL_TYPE_DROPDOWN
Dropdown to select railtype.
@ WID_RV_LEFT_MATRIX
The matrix on the left.
@ WID_RV_SORT_ASCENDING_DESCENDING
Ascending/descending sort order button.
@ WID_RV_RIGHT_SCROLLBAR
The scrollbar for the matrix on the right.
@ WID_RV_START_REPLACE
Start Replacing button.
@ WID_RV_SORT_DROPDOWN
Dropdown for the sort criteria.
@ WID_RV_LEFT_DETAILS
Details of the entry on the left.
void GUIEngineListAddChildren(GUIEngineList &dst, const GUIEngineList &src, EngineID parent, uint8_t indent)
Add children to GUI engine list to build a hierarchical tree.
bool _engine_sort_last_order[]
Last set direction of the sort order, for each vehicle type.
uint GetEngineListHeight(VehicleType type)
Get the height of a single 'entry' in the engine lists.
const std::initializer_list< const StringID > _engine_sort_listing[]
Dropdown menu strings for the vehicle sort criteria.
uint8_t _engine_sort_last_criteria[]
Last set sort criteria, for each vehicle type.
int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, TestedEngineDetails &te)
Draw the purchase info details of a vehicle at a given location.
EngList_SortTypeFunction *const _engine_sort_functions[][11]
Sort functions for the vehicle sort criteria, for each vehicle type.
void DisplayVehicleSortDropDown(Window *w, VehicleType vehicle_type, int selected, WidgetID button)
Display the dropdown for the vehicle sort criteria.
bool _engine_sort_direction
false = descending, true = ascending.
bool _engine_sort_show_hidden_engines[]
Last set 'show hidden engines' setting for each vehicle type.
void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, const Scrollbar &sb, EngineID selected_id, bool show_count, GroupID selected_group)
Engine drawing loop.
constexpr EnumBitSet & Flip(Tenum value)
Flip the enum value.
constexpr bool Test(Tenum value) const
Test if the enum value is set.
void RebuildDone()
Notify the sortlist that the rebuild is done.
void ForceRebuild()
Force that a rebuild is needed.
Base class for a 'real' widget.
void SetLowered(bool lowered)
Lower or raise the widget.
void SetStringTip(StringID string, StringID tool_tip)
Set string and tool tip of the nested widget.
Definition widget.cpp:1139
struct RailTypeInfo::@24 strings
Strings associated with the rail type.
StringID replace_text
Text used in the autoreplace GUI.
Definition rail.h:170
Window for the autoreplacing of vehicles.
void OnResize() override
Called after the window got resized.
bool GenerateReplaceRailList(EngineID e, bool draw_left, bool show_engines)
Figure out if an engine should be added to a list.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
GUIEngineList engines[2]
Left and right list of engines.
EngineID sel_engine[2]
Selected engine left and right.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void ReplaceClick_StartReplace(bool replace_when_old)
Handle click on the start replace button.
bool OnTooltip(Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
Event to display a custom tooltip.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
uint8_t sort_criteria
Criteria of sorting vehicles.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
RailType sel_railtype
Type of rail tracks selected. INVALID_RAILTYPE to show all.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
bool replace_engines
If true, engines are replaced, if false, wagons are replaced (only for trains).
bool reset_sel_engine
Also reset sel_engine while updating left and/or right and no valid engine selected.
void OnPaint() override
The window must be repainted.
bool show_hidden_engines
Whether to show the hidden engines.
void GenerateLists()
Generate the lists.
RoadType sel_roadtype
Type of road selected. INVALID_ROADTYPE to show all.
int details_height
Minimal needed height of the details panels, in text lines (found so far).
void GenerateReplaceVehList(bool draw_left)
Generate an engines list.
GroupID sel_group
Group selected to replace.
bool descending_sort_order
Order of sorting vehicles.
void OnRailRoadTypeChange()
Perform tasks after rail or road type is changed.
StringID replace_text
Text used in the autoreplace GUI.
Definition road.h:97
struct RoadTypeInfo::@27 strings
Strings associated with the rail type.
Scrollbar data structure.
void SetCount(size_t num)
Sets the number of elements in the list.
auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Return an iterator pointing to the element of a scrolled widget that a user clicked in.
bool SetPosition(size_type position)
Sets the position of the first visible element.
void SetCapacityFromWidget(Window *w, WidgetID widget, int padding=0)
Set capacity of visible elements from the size and resize properties of a widget.
Definition widget.cpp:2533
void ScrollTowards(size_type position)
Scroll towards the given position; if the item is visible nothing happens, otherwise it will be shown...
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:40
RectPadding frametext
Padding inside frame with text.
Definition window_gui.h:41
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:94
Functions related to commands.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowDropDownMenu(Window *w, std::span< const StringID > strings, int selected, WidgetID button, uint32_t disabled_mask, uint32_t hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
Definition dropdown.cpp:441
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:404
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
@ HasVariants
Set if engine has variants.
@ IsFolded
Set if display of variants should be folded (hidden).
@ Shaded
Set if engine should be masked.
void EngList_Sort(GUIEngineList &el, EngList_SortTypeFunction compare)
Sort all items using quick sort and given 'CompareItems' function.
Engine GUI functions, used by build_vehicle_gui and autoreplace_gui
static const EngineID INVALID_ENGINE
Constant denoting an invalid engine.
uint16_t EngineID
Unique identification number of an engine.
Definition engine_type.h:23
uint64_t PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32_t extra_data=0)
Combine an engine ID and a name context to an engine name dparam.
@ PurchaseList
Name is shown in the purchase list (including autoreplace window 'Available vehicles' panel).
@ RAILVEH_WAGON
simple wagon, not motorized
Definition engine_type.h:31
fluid_settings_t * settings
FluidSynth settings handle.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition gfx.cpp:889
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:243
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:376
@ ReplaceWagonRemoval
If set, autoreplace will perform wagon removal on vehicles in this group.
uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e)
Get the number of engines with EngineID id_e in the group with GroupID id_g and its sub-groups.
constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip={})
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Command definitions related to engine groups.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:937
uint16_t GroupID
Type for all group identifiers.
Definition group_type.h:13
static const GroupID DEFAULT_GROUP
Ungrouped vehicles are in this group.
Definition group_type.h:17
static const GroupID ALL_GROUP
All vehicles are in this group.
Definition group_type.h:16
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
Definition misc_gui.cpp:740
Functions for NewGRF engines.
Rail specific functions.
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition rail.h:297
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:27
@ INVALID_RAILTYPE
Flag for invalid railtype.
Definition rail_type.h:34
Road specific functions.
const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
Definition road.h:217
Functions/types related to the road GUIs.
RoadType
The different roadtypes we support.
Definition road_type.h:25
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:30
A number of safeguards to prevent using unsafe methods.
Command definitions related to settings.
Functions related to setting/changing the settings.
Definition of base types and functions in a cross-platform compatible way.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:332
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
CompanySettings settings
settings specific for each company
bool renew_keep_length
sell some wagons if after autoreplace the train is longer than before
Dimensions (a width and height) of a rectangle in 2D.
static Pool::IterateWrapperFiltered< Engine, EngineTypeFilter > IterateType(VehicleType vt, size_t from=0)
Returns an iterable ensemble of all valid engines of the given type.
EngineDisplayFlags display_flags
NOSAVE client-side-only display flags for build engine list.
Definition engine_base.h:63
EngineID engine_id
Engine to display in build purchase list.
Definition engine_gui.h:21
Group data.
Definition group.h:72
GroupFlags flags
Group flags.
Definition group.h:77
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
static Titem * Get(size_t index)
Returns Titem with given index.
Information about a rail vehicle.
Definition engine_type.h:44
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Extra information about refitted cargo and capacity.
Definition vehicle_gui.h:42
Money cost
Refit cost.
Definition vehicle_gui.h:43
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:272
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:949
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
Definition widget.cpp:780
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1730
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:731
Window * parent
Parent window.
Definition window_gui.h:327
void DrawSortButtonState(WidgetID widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
Definition widget.cpp:763
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1720
Owner owner
The owner of the content shown in this window. Company colour is acquired from this variable.
Definition window_gui.h:315
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:440
bool IsShaded() const
Is window shaded currently?
Definition window_gui.h:556
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:970
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition window.cpp:587
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition window.cpp:311
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:380
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:301
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_TRAIN
Train vehicle type.
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_LABEL
Centered label.
Definition widget_type.h:48
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:46
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:41
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:57
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:50
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:55
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:52
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:76
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:59
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:56
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:61
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition window.cpp:1137
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition window.cpp:3217
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3234
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Construction
This window is used for construction; close it whenever changing company.
@ SBS_DOWN
Sort ascending.
Definition window_gui.h:219
@ SBS_UP
Sort descending.
Definition window_gui.h:220
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:145
int WidgetID
Widget ID.
Definition window_type.h:20
@ WC_REPLACE_VEHICLE
Replace vehicle window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47
@ WC_BUILD_VEHICLE
Build vehicle; Window numbers: