summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2012-04-17 19:44:12 +0000
committermichi_cc <michi_cc@openttd.org>2012-04-17 19:44:12 +0000
commit0daf3509227d476d7c869ce5c74906d7e3214565 (patch)
treea6eb39dadefba7ee49023b66f6667038a3660b1a
parente44a923a71ad25f1a2d913d8bf858820e5ee7300 (diff)
downloadopenttd-0daf3509227d476d7c869ce5c74906d7e3214565.tar.xz
(svn r24138) -Feature(ette): Ctrl+drag to add all vehicles with a shared order list to a group. (Juanjo)
-rw-r--r--src/group_cmd.cpp50
-rw-r--r--src/group_gui.cpp4
2 files changed, 37 insertions, 17 deletions
diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp
index 029ea1e92..a3587abbf 100644
--- a/src/group_cmd.cpp
+++ b/src/group_cmd.cpp
@@ -387,6 +387,32 @@ CommandCost CmdRenameGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/**
+ * Do add a vehicle to a group.
+ * @param v Vehicle to add.
+ * @param new_g Group to add to.
+ */
+static void AddVehicleToGroup(Vehicle *v, GroupID new_g)
+{
+ GroupStatistics::CountVehicle(v, -1);
+
+ switch (v->type) {
+ default: NOT_REACHED();
+ case VEH_TRAIN:
+ SetTrainGroupID(Train::From(v), new_g);
+ break;
+
+ case VEH_ROAD:
+ case VEH_SHIP:
+ case VEH_AIRCRAFT:
+ if (v->IsEngineCountable()) UpdateNumEngineGroup(v, v->group_id, new_g);
+ v->group_id = new_g;
+ break;
+ }
+
+ GroupStatistics::CountVehicle(v, 1);
+}
+
+/**
* Add a vehicle to a group
* @param tile unused
* @param flags type of operation
@@ -394,12 +420,13 @@ CommandCost CmdRenameGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
* - p1 bit 0-15 : GroupID
* @param p2 vehicle to add to a group
* - p2 bit 0-19 : VehicleID
+ * - p2 bit 31 : Add shared vehicles as well.
* @param text unused
* @return the cost of this operation or an error
*/
CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
{
- Vehicle *v = Vehicle::GetIfValid(p2);
+ 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;
@@ -412,22 +439,15 @@ CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, u
if (v->owner != _current_company || !v->IsPrimaryVehicle()) return CMD_ERROR;
if (flags & DC_EXEC) {
- GroupStatistics::CountVehicle(v, -1);
-
- switch (v->type) {
- default: NOT_REACHED();
- case VEH_TRAIN:
- SetTrainGroupID(Train::From(v), new_g);
- break;
- case VEH_ROAD:
- case VEH_SHIP:
- case VEH_AIRCRAFT:
- if (v->IsEngineCountable()) UpdateNumEngineGroup(v, v->group_id, new_g);
- v->group_id = new_g;
- break;
+ AddVehicleToGroup(v, new_g);
+
+ if (HasBit(p2, 31)) {
+ /* Add vehicles in the shared order list as well. */
+ for (Vehicle *v2 = v->FirstShared(); v2 != NULL; v2 = v2->NextShared()) {
+ if (v2->group_id != new_g) AddVehicleToGroup(v2, new_g);
+ }
}
- GroupStatistics::CountVehicle(v, 1);
GroupStatistics::UpdateAutoreplace(v->owner);
/* Update the Replace Vehicle Windows */
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index 7b2c5c516..0c7a412c7 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -631,7 +631,7 @@ public:
switch (widget) {
case WID_GL_ALL_VEHICLES: // All vehicles
case WID_GL_DEFAULT_VEHICLES: // Ungrouped vehicles
- DoCommandP(0, DEFAULT_GROUP, this->vehicle_sel, CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE));
+ DoCommandP(0, DEFAULT_GROUP, this->vehicle_sel | (_ctrl_pressed ? 1 << 31 : 0), CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE));
this->vehicle_sel = INVALID_VEHICLE;
this->group_over = INVALID_GROUP;
@@ -648,7 +648,7 @@ public:
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;
- DoCommandP(0, this->groups[id_g]->index, vindex, CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE));
+ 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));
break;
}