diff --git a/src/command_func.h b/src/command_func.h --- a/src/command_func.h +++ b/src/command_func.h @@ -91,6 +91,7 @@ CommandCallback CcGame; /* group_gui.cpp */ CommandCallback CcCreateGroup; +CommandCallback CcAddVehicleNewGroup; /* industry_gui.cpp */ CommandCallback CcBuildIndustry; diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -429,7 +429,7 @@ CommandCost CmdAddVehicleGroup(TileIndex Vehicle *v = Vehicle::GetIfValid(GB(p2, 0, 20)); GroupID new_g = p1; - if (v == NULL || (!Group::IsValidID(new_g) && !IsDefaultGroupID(new_g))) return CMD_ERROR; + if (v == NULL || (!Group::IsValidID(new_g) && !IsDefaultGroupID(new_g) && new_g != NEW_GROUP)) return CMD_ERROR; if (Group::IsValidID(new_g)) { Group *g = Group::Get(new_g); @@ -438,6 +438,14 @@ CommandCost CmdAddVehicleGroup(TileIndex if (v->owner != _current_company || !v->IsPrimaryVehicle()) return CMD_ERROR; + if (new_g == NEW_GROUP) { + /* Create new group. */ + CommandCost ret = CmdCreateGroup(0, flags, v->type, 0, NULL); + if (ret.Failed()) return ret; + + new_g = _new_group_id; + } + if (flags & DC_EXEC) { AddVehicleToGroup(v, new_g); diff --git a/src/group_gui.cpp b/src/group_gui.cpp --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -646,9 +646,9 @@ public: this->SetDirty(); uint id_g = this->group_sb->GetScrolledRowFromWidget(pt.y, this, WID_GL_LIST_GROUP, 0, this->tiny_step_height); - if (id_g >= this->groups.Length()) return; + GroupID new_g = id_g >= this->groups.Length() ? NEW_GROUP : this->groups[id_g]->index; - DoCommandP(0, this->groups[id_g]->index, vindex | (_ctrl_pressed ? 1 << 31 : 0), CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE)); + DoCommandP(0, new_g, vindex | (_ctrl_pressed ? 1 << 31 : 0), CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE), new_g == NEW_GROUP ? CcAddVehicleNewGroup : NULL); break; } @@ -865,6 +865,21 @@ void CcCreateGroup(const CommandCost &re } /** + * Open rename window after adding a vehicle to a new group via drag and drop. + * @param success Did command succeed? + * @param tile Unused. + * @param p1 Unused. + * @param p2 Bit 0-19: Vehicle ID. + */ +void CcAddVehicleNewGroup(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) +{ + if (result.Failed()) return; + assert(Vehicle::IsValidID(GB(p2, 0, 20))); + + CcCreateGroup(result, 0, Vehicle::Get(GB(p2, 0, 20))->type, 0); +} + +/** * Removes the highlight of a vehicle in a group window * @param *v Vehicle to remove all highlights from */ diff --git a/src/group_type.h b/src/group_type.h --- a/src/group_type.h +++ b/src/group_type.h @@ -14,6 +14,7 @@ typedef uint16 GroupID; ///< Type for all group identifiers. +static const GroupID NEW_GROUP = 0xFFFC; ///< Sentinel for a to-be-created group. static const GroupID ALL_GROUP = 0xFFFD; ///< All vehicles are in this group. static const GroupID DEFAULT_GROUP = 0xFFFE; ///< Ungrouped vehicles are in this group. static const GroupID INVALID_GROUP = 0xFFFF; ///< Sentinel for invalid groups. diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -48,6 +48,7 @@ static CommandCallback * const _callback /* 0x18 */ CcBuildIndustry, /* 0x19 */ CcStartStopVehicle, /* 0x1A */ CcGame, + /* 0x1B */ CcAddVehicleNewGroup, }; /**