From 37e321044a1c32873980fc6d75c45011639ca2f3 Mon Sep 17 00:00:00 2001 From: michi_cc Date: Tue, 17 Apr 2012 19:44:16 +0000 Subject: [PATCH] (svn r24139) -Add: Creating a new vehicle group by drag and drop. (Based on patch by Juanjo) --- src/command_func.h | 1 + src/group_cmd.cpp | 10 +++++++++- src/group_gui.cpp | 19 +++++++++++++++++-- src/group_type.h | 1 + src/network/network_command.cpp | 1 + 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/command_func.h b/src/command_func.h index df5f099a7b..c4cc51e3da 100644 --- 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 index a3587abbfe..ca671e6800 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -429,7 +429,7 @@ CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, u 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 tile, DoCommandFlag flags, uint32 p1, u 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 index 0c7a412c7d..c68d4405ff 100644 --- 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; } @@ -864,6 +864,21 @@ void CcCreateGroup(const CommandCost &result, TileIndex tile, uint32 p1, uint32 if (w != NULL) w->ShowRenameGroupWindow(_new_group_id, true); } +/** + * 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 index ef93e91d99..530f31f1ea 100644 --- 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 index 41f853f15d..6cf96c9f58 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -48,6 +48,7 @@ static CommandCallback * const _callback_table[] = { /* 0x18 */ CcBuildIndustry, /* 0x19 */ CcStartStopVehicle, /* 0x1A */ CcGame, + /* 0x1B */ CcAddVehicleNewGroup, }; /**