summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/command_func.h1
-rw-r--r--src/group_cmd.cpp10
-rw-r--r--src/group_gui.cpp19
-rw-r--r--src/group_type.h1
-rw-r--r--src/network/network_command.cpp1
5 files changed, 29 insertions, 3 deletions
diff --git a/src/command_func.h b/src/command_func.h
index df5f099a7..c4cc51e3d 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 a3587abbf..ca671e680 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 0c7a412c7..c68d4405f 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;
}
@@ -865,6 +865,21 @@ void CcCreateGroup(const CommandCost &result, TileIndex tile, uint32 p1, uint32
}
/**
+ * 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 ef93e91d9..530f31f1e 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 41f853f15..6cf96c9f5 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,
};
/**