(svn r20753) -Feature [FS#3999]: make it possible to select vehicle to clone and vehicle to clone orders from directly from vehicle lists and depot window

This commit is contained in:
smatz
2010-09-06 14:14:09 +00:00
parent d2572f94d2
commit fd54943c7a
11 changed files with 77 additions and 111 deletions

View File

@@ -486,12 +486,6 @@ struct DepotWindow : Window {
const Vehicle *v = NULL;
DepotGUIAction mode = this->GetVehicleFromDepotWndPt(x, y, &v, &gdvp);
/* share / copy orders */
if (_thd.place_mode != HT_NONE && mode != MODE_ERROR) {
_place_clicked_vehicle = (this->type == VEH_TRAIN ? gdvp.head : v);
return;
}
if (this->type == VEH_TRAIN) v = gdvp.wagon;
switch (mode) {
@@ -499,6 +493,8 @@ struct DepotWindow : Window {
return;
case MODE_DRAG_VEHICLE: { // start dragging of vehicle
if (v != NULL && VehicleClicked(v)) return;
VehicleID sel = this->sel;
if (this->type == VEH_TRAIN && sel != INVALID_VEHICLE) {
@@ -506,10 +502,10 @@ struct DepotWindow : Window {
TrainDepotMoveVehicle(v, sel, gdvp.head);
} else if (v != NULL) {
int image = v->GetImage(DIR_W);
SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this);
this->sel = v->index;
this->SetDirty();
SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this);
switch (v->type) {
case VEH_TRAIN:
@@ -541,25 +537,6 @@ struct DepotWindow : Window {
}
}
/**
* Clones a vehicle
* @param *v is the original vehicle to clone
*/
void HandleCloneVehClick(const Vehicle *v)
{
if (v == NULL || !IsCompanyBuildableVehicleType(v)) return;
if (!v->IsPrimaryVehicle()) {
v = v->First();
/* Do nothing when clicking on a train in depot with no loc attached */
if (v->type == VEH_TRAIN && !Train::From(v)->IsFrontEngine()) return;
}
DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle);
ResetObjectToPlace();
}
/* Function to set up vehicle specific widgets (mainly sprites and strings).
* Only use this if it's the same widget, that's used for more than one vehicle type and it needs different text/sprites
* Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the nested widget array
@@ -742,8 +719,7 @@ struct DepotWindow : Window {
SPR_CURSOR_CLONE_SHIP, SPR_CURSOR_CLONE_AIRPLANE
};
_place_clicked_vehicle = NULL;
SetObjectToPlaceWnd(clone_icons[this->type], PAL_NONE, HT_RECT, this);
SetObjectToPlaceWnd(clone_icons[this->type], PAL_NONE, HT_VEHICLE, this);
} else {
ResetObjectToPlace();
}
@@ -860,11 +836,15 @@ struct DepotWindow : Window {
return true;
}
virtual void OnPlaceObject(Point pt, TileIndex tile)
/**
* Clones a vehicle
* @param v the original vehicle to clone
*/
virtual void OnVehicleSelect(const Vehicle *v)
{
const Vehicle *v = CheckMouseOverVehicle();
if (v != NULL) this->HandleCloneVehClick(v);
if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) {
ResetObjectToPlace();
}
}
virtual void OnPlaceObjectAbort()
@@ -879,18 +859,6 @@ struct DepotWindow : Window {
this->SetWidgetDirty(DEPOT_WIDGET_MATRIX);
};
/* check if a vehicle in a depot was clicked.. */
virtual void OnMouseLoop()
{
const Vehicle *v = _place_clicked_vehicle;
/* since OTTD checks all open depot windows, we will make sure that it triggers the one with a clicked clone button */
if (v != NULL && this->IsWidgetLowered(DEPOT_WIDGET_CLONE)) {
_place_clicked_vehicle = NULL;
this->HandleCloneVehClick(v);
}
}
virtual void OnMouseDrag(Point pt, int widget)
{
if (this->type != VEH_TRAIN || this->sel == INVALID_VEHICLE) return;