TBTR: Handle template being deleted during edit.

This commit is contained in:
Jonathan G Rennison
2016-02-15 19:28:14 +00:00
parent 98fc4493c8
commit 5b6560b73b
2 changed files with 21 additions and 17 deletions

View File

@@ -131,14 +131,13 @@ private:
Scrollbar *vscroll; Scrollbar *vscroll;
int line_height; int line_height;
Train* virtual_train; Train* virtual_train;
bool editMode; bool *create_window_open; /// used to notify main window of progress (dummy way of disabling 'delete' while editing a template)
bool *createWindowOpen; /// used to notify main window of progress (dummy way of disabling 'delete' while editing a template)
VehicleID sel; VehicleID sel;
VehicleID vehicle_over; VehicleID vehicle_over;
TemplateVehicle *editTemplate; uint32 template_index;
public: public:
TemplateCreateWindow(WindowDesc* _wdesc, TemplateVehicle *to_edit, bool *windowOpen, int step_h) : Window(_wdesc) TemplateCreateWindow(WindowDesc* _wdesc, TemplateVehicle *to_edit, bool *window_open, int step_h) : Window(_wdesc)
{ {
this->line_height = step_h; this->line_height = step_h;
this->CreateNestedTree(_wdesc != NULL); this->CreateNestedTree(_wdesc != NULL);
@@ -150,15 +149,13 @@ public:
this->owner = _local_company; this->owner = _local_company;
createWindowOpen = windowOpen; this->create_window_open = window_open;
this->editTemplate = to_edit; this->template_index = (to_edit != NULL) ? to_edit->index : INVALID_VEHICLE;
editMode = (to_edit != NULL);
this->sel = INVALID_VEHICLE; this->sel = INVALID_VEHICLE;
this->vehicle_over = INVALID_VEHICLE; this->vehicle_over = INVALID_VEHICLE;
if (to_edit) { if (to_edit != NULL) {
DoCommandP(0, to_edit->index, 0, CMD_VIRTUAL_TRAIN_FROM_TEMPLATE_VEHICLE | CMD_MSG(STR_TMPL_CANT_CREATE), CcSetVirtualTrain); DoCommandP(0, to_edit->index, 0, CMD_VIRTUAL_TRAIN_FROM_TEMPLATE_VEHICLE | CMD_MSG(STR_TMPL_CANT_CREATE), CcSetVirtualTrain);
} }
@@ -177,7 +174,7 @@ public:
SetWindowClassesDirty(WC_TRAINS_LIST); SetWindowClassesDirty(WC_TRAINS_LIST);
/* more cleanup */ /* more cleanup */
*createWindowOpen = false; *create_window_open = false;
DeleteWindowById(WC_BUILD_VIRTUAL_TRAIN, this->window_number); DeleteWindowById(WC_BUILD_VIRTUAL_TRAIN, this->window_number);
InvalidateWindowClassesData(WC_TEMPLATEGUI_MAIN); InvalidateWindowClassesData(WC_TEMPLATEGUI_MAIN);
} }
@@ -204,6 +201,14 @@ public:
virtual void OnInvalidateData(int data = 0, bool gui_scope = true) virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
{ {
if(!gui_scope) return;
if (this->template_index != INVALID_VEHICLE) {
if (TemplateVehicle::GetIfValid(this->template_index) == NULL) {
delete this;
return;
}
}
this->SetDirty(); this->SetDirty();
UpdateButtonState(); UpdateButtonState();
} }
@@ -231,13 +236,11 @@ public:
break; break;
} }
case TCW_OK: { case TCW_OK: {
uint32 templateIndex = (editTemplate != NULL) ? editTemplate->index : INVALID_VEHICLE;
if (virtual_train != NULL) { if (virtual_train != NULL) {
DoCommandP(0, templateIndex, virtual_train->index, CMD_REPLACE_TEMPLATE_VEHICLE); DoCommandP(0, this->template_index, virtual_train->index, CMD_REPLACE_TEMPLATE_VEHICLE);
virtual_train = NULL; virtual_train = NULL;
} else if (templateIndex != INVALID_VEHICLE) { } else if (this->template_index != INVALID_VEHICLE) {
DoCommandP(0, templateIndex, 0, CMD_DELETE_TEMPLATE_VEHICLE); DoCommandP(0, this->template_index, 0, CMD_DELETE_TEMPLATE_VEHICLE);
} }
delete this; delete this;
break; break;
@@ -536,10 +539,10 @@ public:
} }
}; };
void ShowTemplateCreateWindow(TemplateVehicle *to_edit, bool *createWindowOpen, int step_h) void ShowTemplateCreateWindow(TemplateVehicle *to_edit, bool *create_window_open, int step_h)
{ {
if (BringWindowToFrontById(WC_CREATE_TEMPLATE, VEH_TRAIN) != NULL) return; if (BringWindowToFrontById(WC_CREATE_TEMPLATE, VEH_TRAIN) != NULL) return;
new TemplateCreateWindow(&_template_create_window_desc, to_edit, createWindowOpen, step_h); new TemplateCreateWindow(&_template_create_window_desc, to_edit, create_window_open, step_h);
} }
void CcSetVirtualTrain(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) void CcSetVirtualTrain(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)

View File

@@ -1186,6 +1186,7 @@ CommandCost CmdDeleteTemplateVehicle(TileIndex tile, DoCommandFlag flags, uint32
delete del; delete del;
InvalidateWindowClassesData(WC_CREATE_TEMPLATE, 0);
InvalidateWindowClassesData(WC_TEMPLATEGUI_MAIN, 0); InvalidateWindowClassesData(WC_TEMPLATEGUI_MAIN, 0);
} }