@@ -78,58 +78,62 @@ int ShipEditorDialogModel::getIfPlayerShip() const
7878{
7979 return player_ship;
8080}
81- std::vector<std::pair<SCP_string, bool >> ShipEditorDialogModel::getAcceptedOrders () const
81+
82+ SCP_vector<std::pair<SCP_string, int >> ShipEditorDialogModel::getPlayerOrders ()
8283{
83- std::vector<std::pair<SCP_string, bool >> acceptedOrders;
84- object* objp;
85- SCP_set<size_t > default_orders;
86- if (!multi_edit) {
87- default_orders = ship_get_default_orders_accepted (&Ship_info[Ships[_editor->cur_ship ].ship_info_index ]);
88- } else {
89- for (objp = GET_FIRST (&obj_used_list); objp != END_OF_LIST (&obj_used_list); objp = GET_NEXT (objp)) {
90- if (((objp->type == OBJ_SHIP ) || (objp->type == OBJ_START )) &&
91- (objp->flags [Object::Object_Flags::Marked])) {
92- const SCP_set<size_t >& these_orders =
93- ship_get_default_orders_accepted (&Ship_info[Ships[objp->instance ].ship_info_index ]);
84+ SCP_vector<std::pair<SCP_string, int >> orders;
9485
95- if (default_orders.empty ()) {
96- default_orders = these_orders;
97- } else {
98- Assert (default_orders == these_orders);
99- }
86+ // Build the canonical default order set from marked ships (caller guarantees all marked ships share it)
87+ SCP_set<size_t > default_orders;
88+ object* objp;
89+ for (objp = GET_FIRST (&obj_used_list); objp != END_OF_LIST (&obj_used_list); objp = GET_NEXT (objp)) {
90+ if (((objp->type == OBJ_SHIP ) || (objp->type == OBJ_START )) && (objp->flags [Object::Object_Flags::Marked])) {
91+ const SCP_set<size_t >& these_orders =
92+ ship_get_default_orders_accepted (&Ship_info[Ships[objp->instance ].ship_info_index ]);
93+ if (default_orders.empty ()) {
94+ default_orders = these_orders;
95+ } else {
96+ Assert (default_orders == these_orders);
10097 }
10198 }
10299 }
103100
104101 for (size_t order_id : default_orders) {
105102 SCP_string name = Player_orders[order_id].localized_name ;
106- bool state = false ;
107- const SCP_set<size_t >& orders_accepted = Ships[_editor->cur_ship ].orders_accepted ;
108- if (orders_accepted.contains (order_id))
109- state = true ;
110- acceptedOrders.emplace_back (name, state);
103+ int state = -1 ;
104+ for (objp = GET_FIRST (&obj_used_list); objp != END_OF_LIST (&obj_used_list); objp = GET_NEXT (objp)) {
105+ if (((objp->type == OBJ_SHIP ) || (objp->type == OBJ_START )) &&
106+ (objp->flags [Object::Object_Flags::Marked])) {
107+ int ship_state = Ships[objp->instance ].orders_accepted .contains (order_id) ? Qt::Checked : Qt::Unchecked;
108+ state = (state == -1 ) ? ship_state : tristate_set (ship_state, state);
109+ }
110+ }
111+ orders.emplace_back (name, (state == -1 ) ? Qt::Unchecked : state);
111112 }
112- return acceptedOrders;
113+
114+ return orders;
113115}
114- void ShipEditorDialogModel::setAcceptedOrders (const std::vector<std::pair<SCP_string, bool >>& newOrders)
116+
117+ void ShipEditorDialogModel::applyPlayerOrders (const SCP_vector<std::pair<SCP_string, int >>& orders)
115118{
116- orders = newOrders;
117- // Write directly to all marked ships
118- for (auto * ptr = GET_FIRST (&obj_used_list); ptr != END_OF_LIST (&obj_used_list); ptr = GET_NEXT (ptr)) {
119+ object* ptr;
120+ for (ptr = GET_FIRST (&obj_used_list); ptr != END_OF_LIST (&obj_used_list); ptr = GET_NEXT (ptr)) {
119121 if (((ptr->type == OBJ_SHIP ) || (ptr->type == OBJ_START )) && (ptr->flags [Object::Object_Flags::Marked])) {
120122 auto i = ptr->instance ;
121123 SCP_set<size_t > default_orders = ship_get_default_orders_accepted (&Ship_info[Ships[i].ship_info_index ]);
122- SCP_set<size_t > new_orders_set;
123124 for (size_t order_id : default_orders) {
124- for (const auto & order : orders) {
125- if (order.first == Player_orders[order_id].localized_name ) {
126- if (order.second ) {
127- new_orders_set.insert (order_id);
125+ for (const auto & [name, state] : orders) {
126+ if (name == Player_orders[order_id].localized_name ) {
127+ if (state == Qt::Checked) {
128+ Ships[i].orders_accepted .insert (order_id);
129+ } else if (state == Qt::Unchecked) {
130+ Ships[i].orders_accepted .erase (order_id);
128131 }
132+ // Qt::PartiallyChecked: leave each ship's existing state unchanged
133+ break ;
129134 }
130135 }
131136 }
132- Ships[i].orders_accepted = new_orders_set;
133137 }
134138 }
135139 set_modified ();
0 commit comments