diff --git a/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.cpp b/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.cpp index 13aaadde5a9..96ac76db7dc 100644 --- a/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.cpp +++ b/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.cpp @@ -187,6 +187,11 @@ void ShipInitialStatusDialogModel::initializeData(bool multi) _afterburnerLocked = Qt::Unchecked; } + if (Ship_info[Ships[_ship].ship_info_index].uses_team_colors) { + _useTeams = true; + _teamColorSetting = Ships[_ship].team_name; + } + if (_multiEdit) { objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { @@ -198,6 +203,10 @@ void ShipInitialStatusDialogModel::initializeData(bool multi) sflag = 1; if (static_cast(objp->hull_strength) != _hull) hflag = 1; + if (Ships[get_ship_from_obj(objp)].ship_guardian_threshold != _guardianThreshold) + _guardianInconsistent = true; + if (_useTeams && Ships[get_ship_from_obj(objp)].team_name != _teamColorSetting) + _teamColorInconsistent = true; if (objp->flags[Object::Object_Flags::No_shields]) { if (_hasShields) _hasShields = Qt::PartiallyChecked; @@ -273,20 +282,16 @@ void ShipInitialStatusDialogModel::initializeData(bool multi) } } - if (Ship_info[Ships[_ship].ship_info_index].uses_team_colors) { - _useTeams = true; - _teamColorSetting = Ships[_ship].team_name; - } changeSubsys(0); if (vflag) { _velocity = BLANKFIELD; } - if (vflag) { - _velocity = BLANKFIELD; + if (sflag) { + _shields = BLANKFIELD; } - if (vflag) { - _velocity = BLANKFIELD; + if (hflag) { + _hull = BLANKFIELD; } _modified = false; modelChanged(); @@ -295,6 +300,10 @@ void ShipInitialStatusDialogModel::initializeData(bool multi) void ShipInitialStatusDialogModel::updateDockingInfo() { + if (!_dockpointArray || _numDockPoints <= 0) { + return; + } + int i; object* objp = &Objects[Ships[_ship].objnum]; for (i = 0; i < _numDockPoints; i++) { @@ -587,11 +596,12 @@ bool ShipInitialStatusDialogModel::apply() while (objp != END_OF_LIST(&obj_used_list)) { if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->flags[Object::Object_Flags::Marked])) { - modify(objp->phys_info.speed, (float)_velocity); - - modify(objp->shield_quadrant[0], (float)_shields); - - modify(objp->hull_strength, (float)_hull); + if (_velocity != BLANKFIELD) + modify(objp->phys_info.speed, (float)_velocity); + if (_shields != BLANKFIELD) + modify(objp->shield_quadrant[0], (float)_shields); + if (_hull != BLANKFIELD) + modify(objp->hull_strength, (float)_hull); if (_hasShields == Qt::Checked) { objp->flags.remove(Object::Object_Flags::No_shields); @@ -599,7 +609,8 @@ bool ShipInitialStatusDialogModel::apply() objp->flags.set(Object::Object_Flags::No_shields); } auto shipp = &Ships[get_ship_from_obj(objp)]; - shipp->ship_guardian_threshold = _guardianThreshold; + if (!_guardianInconsistent) + shipp->ship_guardian_threshold = _guardianThreshold; // We need to ensure that we handle the inconsistent "boolean" value correctly handle_inconsistent_flag(shipp->flags, Ship::Ship_Flags::Force_shields_on, _forceShields); handle_inconsistent_flag(shipp->flags, Ship::Ship_Flags::Ship_locked, _shipLocked); @@ -608,7 +619,8 @@ bool ShipInitialStatusDialogModel::apply() handle_inconsistent_flag(shipp->flags, Ship::Ship_Flags::Secondaries_locked, _secondariesLocked); handle_inconsistent_flag(shipp->flags, Ship::Ship_Flags::Lock_all_turrets_initially, _turretsLocked); handle_inconsistent_flag(shipp->flags, Ship::Ship_Flags::Afterburner_locked, _afterburnerLocked); - shipp->team_name = _teamColorSetting; + if (!_teamColorInconsistent) + shipp->team_name = _teamColorSetting; } objp = GET_NEXT(objp); @@ -632,7 +644,9 @@ bool ShipInitialStatusDialogModel::apply() handle_inconsistent_flag(Ships[_ship].flags, Ship::Ship_Flags::Afterburner_locked, _afterburnerLocked); Ships[_ship].team_name = _teamColorSetting; } - updateDockingInfo(); + if (!_multiEdit) { + updateDockingInfo(); + } _editor->missionChanged(); return true; } @@ -796,6 +810,7 @@ SCP_string ShipInitialStatusDialogModel::getColor() const void ShipInitialStatusDialogModel::setColor(const SCP_string& color) { + _teamColorInconsistent = false; modify(_teamColorSetting, color); } @@ -916,6 +931,7 @@ int ShipInitialStatusDialogModel::getGuardian() const void ShipInitialStatusDialogModel::setGuardian(int guardian) { + _guardianInconsistent = false; modify(_guardianThreshold, guardian); } diff --git a/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.h b/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.h index a911ca5b864..5d80026e6b3 100644 --- a/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.h +++ b/qtfred/src/mission/dialogs/ShipEditor/ShipInitialStatusDialogModel.h @@ -127,11 +127,13 @@ class ShipInitialStatusDialogModel : public AbstractDialogModel { int _afterburnerLocked; SCP_string _teamColorSetting; int _shipHasScannableSubsystems; - int _numDockPoints; + int _numDockPoints = 0; std::unique_ptr _dockpointArray; - bool _multiEdit; + bool _multiEdit = false; bool _useTeams = false; bool _moveShipsWhenUndocking = true; + bool _guardianInconsistent = false; + bool _teamColorInconsistent = false; }; template diff --git a/qtfred/src/ui/dialogs/ShipEditor/ShipInitialStatusDialog.cpp b/qtfred/src/ui/dialogs/ShipEditor/ShipInitialStatusDialog.cpp index 1d28b170af9..7463effeb65 100644 --- a/qtfred/src/ui/dialogs/ShipEditor/ShipInitialStatusDialog.cpp +++ b/qtfred/src/ui/dialogs/ShipEditor/ShipInitialStatusDialog.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -174,18 +175,25 @@ void ShipInitialStatusDialog::on_moveShipsCheckBox_toggled(bool value) void ShipInitialStatusDialog::updateUi() { util::SignalBlockers blockers(this); + auto value = _model->getVelocity(); if (value != BLANKFIELD) { + ui->velocitySpinBox->setSpecialValueText(QString()); ui->velocitySpinBox->setValue(value); } else { ui->velocitySpinBox->setSpecialValueText("-"); + ui->velocitySpinBox->setValue(ui->velocitySpinBox->minimum()); } + value = _model->getHull(); if (value != BLANKFIELD) { + ui->hullSpinBox->setSpecialValueText(QString()); ui->hullSpinBox->setValue(value); } else { ui->hullSpinBox->setSpecialValueText("-"); + ui->hullSpinBox->setValue(ui->hullSpinBox->minimum()); } + value = _model->getHasShield(); ui->hasShieldCheckBox->setCheckState(Qt::CheckState(value)); if (_model->getHasShield()) { @@ -193,12 +201,16 @@ void ShipInitialStatusDialog::updateUi() } else { ui->shieldHullSpinBox->setEnabled(false); } + value = _model->getShieldHull(); if (value != BLANKFIELD) { + ui->shieldHullSpinBox->setSpecialValueText(QString()); ui->shieldHullSpinBox->setValue(value); } else { ui->shieldHullSpinBox->setSpecialValueText("-"); + ui->shieldHullSpinBox->setValue(ui->shieldHullSpinBox->minimum()); } + ui->guardianSpinBox->setValue(_model->getGuardian()); updateFlags(); updateDocks();