diff --git a/qtfred/src/mission/dialogs/WingEditorDialogModel.cpp b/qtfred/src/mission/dialogs/WingEditorDialogModel.cpp index 459c9d46134..80d29e2f799 100644 --- a/qtfred/src/mission/dialogs/WingEditorDialogModel.cpp +++ b/qtfred/src/mission/dialogs/WingEditorDialogModel.cpp @@ -70,9 +70,9 @@ wing* WingEditorDialogModel::getCurrentWing() const return &Wings[_currentWingIndex]; } -std::vector> WingEditorDialogModel::getDockBayPathsForWingMask(uint32_t mask, int anchorShipnum) +SCP_vector> WingEditorDialogModel::getDockBayPathsForWingMask(uint32_t mask, int anchorShipnum) { - std::vector> out; + SCP_vector> out; if (anchorShipnum < 0 || !ship_has_hangar_bay(anchorShipnum)) return out; @@ -104,7 +104,7 @@ void WingEditorDialogModel::prepareSquadLogoList() pilot_load_squad_pic_list(); for (int i = 0; i < Num_pilot_squad_images; i++) { - squadLogoList.emplace_back(Pilot_squad_image_names[i]); + _squadLogoList.emplace_back(Pilot_squad_image_names[i]); } } @@ -277,9 +277,9 @@ std::pair> WingEditorDialogModel::getLeaderList() co return items; } -std::vector> WingEditorDialogModel::getHotkeyList() +SCP_vector> WingEditorDialogModel::getHotkeyList() { - std::vector> items; + SCP_vector> items; items.emplace_back(-1, "None"); for (int i = 0; i < MAX_KEYED_TARGETS; ++i) { @@ -293,9 +293,9 @@ std::vector> WingEditorDialogModel::getHotkeyList() return items; } -std::vector> WingEditorDialogModel::getFormationList() +SCP_vector> WingEditorDialogModel::getFormationList() { - std::vector> items; + SCP_vector> items; items.emplace_back(-1, "Default"); for (int i = 0; i < static_cast(Wing_formations.size()); i++) { @@ -305,9 +305,9 @@ std::vector> WingEditorDialogModel::getFormationList return items; } -std::vector> WingEditorDialogModel::getArrivalLocationList() +SCP_vector> WingEditorDialogModel::getArrivalLocationList() { - std::vector> items; + SCP_vector> items; items.reserve(MAX_ARRIVAL_NAMES); for (int i = 0; i < MAX_ARRIVAL_NAMES; i++) { items.emplace_back(i, Arrival_location_names[i]); @@ -315,9 +315,9 @@ std::vector> WingEditorDialogModel::getArrivalLocati return items; } -std::vector> WingEditorDialogModel::getDepartureLocationList() +SCP_vector> WingEditorDialogModel::getDepartureLocationList() { - std::vector> items; + SCP_vector> items; items.reserve(MAX_DEPARTURE_NAMES); for (int i = 0; i < MAX_DEPARTURE_NAMES; i++) { items.emplace_back(i, Departure_location_names[i]); @@ -336,9 +336,9 @@ static bool shipHasDockBay(int ship_info_index) return pm && pm->ship_bay && pm->ship_bay->num_paths > 0; } -std::vector> WingEditorDialogModel::getArrivalTargetList() const +SCP_vector> WingEditorDialogModel::getArrivalTargetList() const { - std::vector> items; + SCP_vector> items; const auto* w = getCurrentWing(); if (!w) return items; @@ -378,9 +378,9 @@ std::vector> WingEditorDialogModel::getArrivalTarget return items; } -std::vector> WingEditorDialogModel::getDepartureTargetList() const +SCP_vector> WingEditorDialogModel::getDepartureTargetList() const { - std::vector> items; + SCP_vector> items; const auto* w = getCurrentWing(); if (!w) return items; @@ -688,9 +688,9 @@ void WingEditorDialogModel::disbandCurrentWing() reloadFromCurWing(); } -std::vector> WingEditorDialogModel::getWingFlags() const +SCP_vector> WingEditorDialogModel::getWingFlags() const { - std::vector> flags; + SCP_vector> flags; if (!wingIsValid()) return flags; @@ -713,10 +713,10 @@ std::vector> WingEditorDialogModel::getWingFlags() c return flags; } -std::vector> WingEditorDialogModel::getWingFlagDescriptions() +SCP_vector> WingEditorDialogModel::getWingFlagDescriptions() { const size_t num_descs = Num_parse_wing_flag_descriptions; - std::vector> descriptions; + SCP_vector> descriptions; descriptions.reserve(Num_parse_wing_flags); for (size_t i = 0; i < Num_parse_wing_flags; ++i) { const auto& flagDef = Parse_wing_flags[i]; @@ -736,7 +736,7 @@ std::vector> WingEditorDialogModel::getWingFla return descriptions; } -void WingEditorDialogModel::setWingFlags(const std::vector>& newFlags) +void WingEditorDialogModel::setWingFlags(const SCP_vector>& newFlags) { if (!wingIsValid()) return; @@ -980,7 +980,7 @@ void WingEditorDialogModel::setArrivalDistance(int newDistance) modify(w->arrival_distance, newDistance); } -std::vector> WingEditorDialogModel::getArrivalPaths() const +SCP_vector> WingEditorDialogModel::getArrivalPaths() const { if (!wingIsValid()) return {}; @@ -992,7 +992,7 @@ std::vector> WingEditorDialogModel::getArrivalPaths( return getDockBayPathsForWingMask(w->arrival_path_mask, anchor_to_target(w->arrival_anchor)); } -void WingEditorDialogModel::setArrivalPaths(const std::vector>& chosen) +void WingEditorDialogModel::setArrivalPaths(const SCP_vector>& chosen) { if (!wingIsValid()) return; @@ -1220,7 +1220,7 @@ void WingEditorDialogModel::setDepartureTarget(int targetIndex) modify(w->departure_path_mask, 0); } -std::vector> WingEditorDialogModel::getDeparturePaths() const +SCP_vector> WingEditorDialogModel::getDeparturePaths() const { if (!wingIsValid()) return {}; @@ -1232,7 +1232,7 @@ std::vector> WingEditorDialogModel::getDeparturePath return getDockBayPathsForWingMask(w->departure_path_mask, anchor_to_target(w->departure_anchor)); } -void WingEditorDialogModel::setDeparturePaths(const std::vector>& chosen) +void WingEditorDialogModel::setDeparturePaths(const SCP_vector>& chosen) { if (!wingIsValid()) return; diff --git a/qtfred/src/mission/dialogs/WingEditorDialogModel.h b/qtfred/src/mission/dialogs/WingEditorDialogModel.h index b25195be769..b34f4d36c1f 100644 --- a/qtfred/src/mission/dialogs/WingEditorDialogModel.h +++ b/qtfred/src/mission/dialogs/WingEditorDialogModel.h @@ -18,130 +18,126 @@ namespace fso::fred::dialogs { //TODO: This dialog currently works on the wing data directly instead of model members // so it does not support temporary changes. This will need to be changed in a future PR -/** - * @brief QTFred's Wing Editor's Model - */ class WingEditorDialogModel : public AbstractDialogModel { - Q_OBJECT - - public: - WingEditorDialogModel(QObject* parent, EditorViewport* viewport); - - // The model in this dialog directly applies changes to the mission, so apply and reject are superfluous - bool apply() override { return true; } - void reject() override {} - - int getCurrentWingIndex() const { return _currentWingIndex; }; - - bool wingIsValid() const; - - bool isPlayerWing() const; - bool containsPlayerStart() const; - bool wingAllFighterBombers() const; - - bool arrivalIsDockBay() const; - bool arrivalNeedsTarget() const; - bool departureIsDockBay() const; - bool departureNeedsTarget() const; - int getMaxWaveThreshold() const; - int getMinArrivalDistance() const; - - std::pair> getLeaderList() const; - static std::vector> getHotkeyList(); - static std::vector> getFormationList(); - static std::vector> getArrivalLocationList(); - static std::vector> getDepartureLocationList(); - std::vector> getArrivalTargetList() const; - std::vector> getDepartureTargetList() const; - std::vector getSquadLogoList() const { return squadLogoList; }; - - // Top section, first column - SCP_string getWingName() const; - void setWingName(const SCP_string& name); - int getWingLeaderIndex() const; - void setWingLeaderIndex(int newLeaderIndex); - int getNumberOfWaves() const; - void setNumberOfWaves(int newTotalWaves); - int getWaveThreshold() const; - void setWaveThreshold(int newThreshhold); - int getHotkey() const; - void setHotkey(int newHotkeyIndex); - - // Top section, second column - int getFormationId() const; - void setFormationId(int newFormationId); - float getFormationScale() const; - void setFormationScale(float newScale); - void alignWingFormation(); - SCP_string getSquadLogo() const; - void setSquadLogo(const SCP_string& filename); - - // Top section, third column - void selectPreviousWing(); - void selectNextWing(); - void deleteCurrentWing(); - void disbandCurrentWing(); - // Initial orders is handled by its own dialog, so no model function here - std::vector> getWingFlags() const; - void setWingFlags(const std::vector>& newFlags); - static std::vector> getWingFlagDescriptions(); - - - // Arrival controls - ArrivalLocation getArrivalType() const; - void setArrivalType(ArrivalLocation arrivalType); - int getArrivalDelay() const; - void setArrivalDelay(int delayIn); - int getMinWaveDelay() const; - void setMinWaveDelay(int newMin); - int getMaxWaveDelay() const; - void setMaxWaveDelay(int newMax); - int getArrivalTarget() const; - void setArrivalTarget(int targetIndex); - int getArrivalDistance() const; - void setArrivalDistance(int newDistance); - std::vector> getArrivalPaths() const; - void setArrivalPaths(const std::vector>& newFlags); - int getArrivalTree() const; - void setArrivalTree(int newTree); - bool getNoArrivalWarpFlag() const; - void setNoArrivalWarpFlag(bool flagIn); - bool getNoArrivalWarpAdjustFlag() const; - void setNoArrivalWarpAdjustFlag(bool flagIn); - - // Departure controls - DepartureLocation getDepartureType() const; - void setDepartureType(DepartureLocation departureType); - int getDepartureDelay() const; - void setDepartureDelay(int delayIn); - int getDepartureTarget() const; - void setDepartureTarget(int targetIndex); - std::vector> getDeparturePaths() const; - void setDeparturePaths(const std::vector>& newFlags); - int getDepartureTree() const; - void setDepartureTree(int newTree); - bool getNoDepartureWarpFlag() const; - void setNoDepartureWarpFlag(bool flagIn); - bool getNoDepartureWarpAdjustFlag() const; - void setNoDepartureWarpAdjustFlag(bool flagIn); - - signals: - void wingChanged(); - - private slots: - void onEditorSelectionChanged(int); // currentObjectChanged - void onEditorMissionChanged(); // missionChanged - - private: // NOLINT(readability-redundant-access-specifiers) - void initializeData(); - void reloadFromCurWing(); - wing* getCurrentWing() const; - static std::vector> getDockBayPathsForWingMask(uint32_t mask, int anchorShipnum); - void prepareSquadLogoList(); - - int _currentWingIndex = -1; - SCP_string _currentWingName; - - SCP_vector squadLogoList; + Q_OBJECT + + public: + WingEditorDialogModel(QObject* parent, EditorViewport* viewport); + + // The model in this dialog directly applies changes to the mission, so apply and reject are superfluous + bool apply() override { return true; } + void reject() override {} + + int getCurrentWingIndex() const { return _currentWingIndex; }; + + bool wingIsValid() const; + + bool isPlayerWing() const; + bool containsPlayerStart() const; + bool wingAllFighterBombers() const; + + bool arrivalIsDockBay() const; + bool arrivalNeedsTarget() const; + bool departureIsDockBay() const; + bool departureNeedsTarget() const; + int getMaxWaveThreshold() const; + int getMinArrivalDistance() const; + + std::pair> getLeaderList() const; + static SCP_vector> getHotkeyList(); + static SCP_vector> getFormationList(); + static SCP_vector> getArrivalLocationList(); + static SCP_vector> getDepartureLocationList(); + SCP_vector> getArrivalTargetList() const; + SCP_vector> getDepartureTargetList() const; + SCP_vector getSquadLogoList() const { return _squadLogoList; }; + + // Top section, first column + SCP_string getWingName() const; + void setWingName(const SCP_string& name); + int getWingLeaderIndex() const; + void setWingLeaderIndex(int newLeaderIndex); + int getNumberOfWaves() const; + void setNumberOfWaves(int newTotalWaves); + int getWaveThreshold() const; + void setWaveThreshold(int newThreshhold); + int getHotkey() const; + void setHotkey(int newHotkeyIndex); + + // Top section, second column + int getFormationId() const; + void setFormationId(int newFormationId); + float getFormationScale() const; + void setFormationScale(float newScale); + void alignWingFormation(); + SCP_string getSquadLogo() const; + void setSquadLogo(const SCP_string& filename); + + // Top section, third column + void selectPreviousWing(); + void selectNextWing(); + void deleteCurrentWing(); + void disbandCurrentWing(); + // Initial orders is handled by its own dialog, so no model function here + SCP_vector> getWingFlags() const; + void setWingFlags(const SCP_vector>& newFlags); + static SCP_vector> getWingFlagDescriptions(); + + // Arrival controls + ArrivalLocation getArrivalType() const; + void setArrivalType(ArrivalLocation arrivalType); + int getArrivalDelay() const; + void setArrivalDelay(int delayIn); + int getMinWaveDelay() const; + void setMinWaveDelay(int newMin); + int getMaxWaveDelay() const; + void setMaxWaveDelay(int newMax); + int getArrivalTarget() const; + void setArrivalTarget(int targetIndex); + int getArrivalDistance() const; + void setArrivalDistance(int newDistance); + SCP_vector> getArrivalPaths() const; + void setArrivalPaths(const SCP_vector>& newFlags); + int getArrivalTree() const; + void setArrivalTree(int newTree); + bool getNoArrivalWarpFlag() const; + void setNoArrivalWarpFlag(bool flagIn); + bool getNoArrivalWarpAdjustFlag() const; + void setNoArrivalWarpAdjustFlag(bool flagIn); + + // Departure controls + DepartureLocation getDepartureType() const; + void setDepartureType(DepartureLocation departureType); + int getDepartureDelay() const; + void setDepartureDelay(int delayIn); + int getDepartureTarget() const; + void setDepartureTarget(int targetIndex); + SCP_vector> getDeparturePaths() const; + void setDeparturePaths(const SCP_vector>& newFlags); + int getDepartureTree() const; + void setDepartureTree(int newTree); + bool getNoDepartureWarpFlag() const; + void setNoDepartureWarpFlag(bool flagIn); + bool getNoDepartureWarpAdjustFlag() const; + void setNoDepartureWarpAdjustFlag(bool flagIn); + + signals: + void wingChanged(); + + private slots: + void onEditorSelectionChanged(int); // currentObjectChanged + void onEditorMissionChanged(); // missionChanged + + private: // NOLINT(readability-redundant-access-specifiers) + void initializeData(); + void reloadFromCurWing(); + wing* getCurrentWing() const; + static SCP_vector> getDockBayPathsForWingMask(uint32_t mask, int anchorShipnum); + void prepareSquadLogoList(); + + int _currentWingIndex = -1; + SCP_string _currentWingName; + + SCP_vector _squadLogoList; }; -} // namespace fso::fred::dialogs \ No newline at end of file +} // namespace fso::fred::dialogs diff --git a/qtfred/src/ui/dialogs/WingEditorDialog.cpp b/qtfred/src/ui/dialogs/WingEditorDialog.cpp index 060bd86def1..c831c755f41 100644 --- a/qtfred/src/ui/dialogs/WingEditorDialog.cpp +++ b/qtfred/src/ui/dialogs/WingEditorDialog.cpp @@ -420,7 +420,7 @@ void WingEditorDialog::on_setSquadLogoButton_clicked() if (dlg.exec() != QDialog::Accepted) return; - const std::string chosen = dlg.selectedFile().toUtf8().constData(); + const SCP_string chosen = dlg.selectedFile().toUtf8().constData(); _model->setSquadLogo(chosen); updateLogoPreview(); } @@ -490,7 +490,7 @@ void WingEditorDialog::on_wingFlagsButton_clicked() dlg.setOptionDescriptions(qtDescs); if (dlg.exec() == QDialog::Accepted) { - std::vector> result; + SCP_vector> result; for (const auto& f : dlg.getFlags()) result.emplace_back(f.first.toUtf8().constData(), f.second == Qt::Checked); _model->setWingFlags(result); @@ -554,11 +554,10 @@ void WingEditorDialog::on_restrictArrivalPathsButton_clicked() if (dlg.exec() == QDialog::Accepted) { auto returned_values = dlg.getCheckedStates(); - std::vector> updatedFlags; + SCP_vector> updatedFlags; for (int i = 0; i < checkbox_list.size(); ++i) { - // Convert back to std::string - std::string name = checkbox_list[i].first.toUtf8().constData(); + SCP_string name = checkbox_list[i].first.toUtf8().constData(); updatedFlags.emplace_back(name, returned_values[i]); } @@ -632,11 +631,10 @@ void WingEditorDialog::on_restrictDeparturePathsButton_clicked() if (dlg.exec() == QDialog::Accepted) { auto returned_values = dlg.getCheckedStates(); - std::vector> updatedFlags; + SCP_vector> updatedFlags; for (int i = 0; i < checkbox_list.size(); ++i) { - // Convert back to std::string - std::string name = checkbox_list[i].first.toUtf8().constData(); + SCP_string name = checkbox_list[i].first.toUtf8().constData(); updatedFlags.emplace_back(name, returned_values[i]); } diff --git a/qtfred/src/ui/dialogs/WingEditorDialog.h b/qtfred/src/ui/dialogs/WingEditorDialog.h index 14a8a9527f2..fe7735d5a12 100644 --- a/qtfred/src/ui/dialogs/WingEditorDialog.h +++ b/qtfred/src/ui/dialogs/WingEditorDialog.h @@ -14,90 +14,90 @@ class WingEditorDialog; class WingEditorDialog : public QDialog, public SexpTreeEditorInterface { Q_OBJECT - public: - explicit WingEditorDialog(FredView* parent, EditorViewport* viewport); - ~WingEditorDialog() override; - - private slots: - void on_hideCuesButton_clicked(); - - // Top section, first column - void on_wingNameEdit_editingFinished(); - void on_wingLeaderCombo_currentIndexChanged(int index); - void on_numWavesSpinBox_valueChanged(int value); - void on_waveThresholdSpinBox_valueChanged(int value); - void on_hotkeyCombo_currentIndexChanged(int /*index*/); - - // Top section, second column - void on_formationCombo_currentIndexChanged(int /*index*/); - void on_formationScaleSpinBox_valueChanged(double value); - void on_alignFormationButton_clicked(); - void on_setSquadLogoButton_clicked(); - - // Top section, third column - void on_prevWingButton_clicked(); - void on_nextWingButton_clicked(); - void on_deleteWingButton_clicked(); - void on_disbandWingButton_clicked(); - void on_initialOrdersButton_clicked(); - void on_wingFlagsButton_clicked(); - - // Arrival controls - void on_arrivalLocationCombo_currentIndexChanged(int /*index*/); - void on_arrivalDelaySpinBox_valueChanged(int value); - void on_minDelaySpinBox_valueChanged(int value); - void on_maxDelaySpinBox_valueChanged(int value); - void on_arrivalTargetCombo_currentIndexChanged(int /*index*/); - void on_arrivalDistanceSpinBox_valueChanged(int value); - void on_restrictArrivalPathsButton_clicked(); - void on_customWarpinButton_clicked(); - void on_arrivalTree_nodeChanged(int newTree); - void on_noArrivalWarpCheckBox_toggled(bool checked); - void on_noArrivalWarpAdjustCheckbox_toggled(bool checked); - - // Departure controls - void on_departureLocationCombo_currentIndexChanged(int /*index*/); - void on_departureDelaySpinBox_valueChanged(int value); - void on_departureTargetCombo_currentIndexChanged(int /*index*/); - void on_restrictDeparturePathsButton_clicked(); - void on_customWarpoutButton_clicked(); - void on_departureTree_nodeChanged(int newTree); - void on_noDepartureWarpCheckBox_toggled(bool checked); - void on_noDepartureWarpAdjustCheckbox_toggled(bool checked); - - // Sexp help text - void on_arrivalTree_helpChanged(const QString& help); - void on_arrivalTree_miniHelpChanged(const QString& help); - void on_departureTree_helpChanged(const QString& help); - void on_departureTree_miniHelpChanged(const QString& help); - - protected: - void closeEvent(QCloseEvent* e) override; - - private: // NOLINT(readability-redundant-access-specifiers) - std::unique_ptr ui; - std::unique_ptr _model; - EditorViewport* _viewport; - - bool _cues_hidden = false; - - void updateUi(); - void enableOrDisableControls(); - - void clearArrivalFields(); - void clearDepartureFields(); - void clearGeneralFields(); - - void refreshLeaderCombo(); - void refreshHotkeyCombo(); - void refreshFormationCombo(); - void refreshArrivalLocationCombo(); - void refreshDepartureLocationCombo(); - void refreshArrivalTargetCombo(); - void refreshDepartureTargetCombo(); - void refreshAllDynamicCombos(); - - void updateLogoPreview(); + public: + explicit WingEditorDialog(FredView* parent, EditorViewport* viewport); + ~WingEditorDialog() override; + + private slots: + void on_hideCuesButton_clicked(); + + // Top section, first column + void on_wingNameEdit_editingFinished(); + void on_wingLeaderCombo_currentIndexChanged(int index); + void on_numWavesSpinBox_valueChanged(int value); + void on_waveThresholdSpinBox_valueChanged(int value); + void on_hotkeyCombo_currentIndexChanged(int /*index*/); + + // Top section, second column + void on_formationCombo_currentIndexChanged(int /*index*/); + void on_formationScaleSpinBox_valueChanged(double value); + void on_alignFormationButton_clicked(); + void on_setSquadLogoButton_clicked(); + + // Top section, third column + void on_prevWingButton_clicked(); + void on_nextWingButton_clicked(); + void on_deleteWingButton_clicked(); + void on_disbandWingButton_clicked(); + void on_initialOrdersButton_clicked(); + void on_wingFlagsButton_clicked(); + + // Arrival controls + void on_arrivalLocationCombo_currentIndexChanged(int /*index*/); + void on_arrivalDelaySpinBox_valueChanged(int value); + void on_minDelaySpinBox_valueChanged(int value); + void on_maxDelaySpinBox_valueChanged(int value); + void on_arrivalTargetCombo_currentIndexChanged(int /*index*/); + void on_arrivalDistanceSpinBox_valueChanged(int value); + void on_restrictArrivalPathsButton_clicked(); + void on_customWarpinButton_clicked(); + void on_arrivalTree_nodeChanged(int newTree); + void on_noArrivalWarpCheckBox_toggled(bool checked); + void on_noArrivalWarpAdjustCheckbox_toggled(bool checked); + + // Departure controls + void on_departureLocationCombo_currentIndexChanged(int /*index*/); + void on_departureDelaySpinBox_valueChanged(int value); + void on_departureTargetCombo_currentIndexChanged(int /*index*/); + void on_restrictDeparturePathsButton_clicked(); + void on_customWarpoutButton_clicked(); + void on_departureTree_nodeChanged(int newTree); + void on_noDepartureWarpCheckBox_toggled(bool checked); + void on_noDepartureWarpAdjustCheckbox_toggled(bool checked); + + // Sexp help text + void on_arrivalTree_helpChanged(const QString& help); + void on_arrivalTree_miniHelpChanged(const QString& help); + void on_departureTree_helpChanged(const QString& help); + void on_departureTree_miniHelpChanged(const QString& help); + + protected: + void closeEvent(QCloseEvent* e) override; + + private: // NOLINT(readability-redundant-access-specifiers) + std::unique_ptr ui; + std::unique_ptr _model; + EditorViewport* _viewport; + + bool _cues_hidden = false; + + void updateUi(); + void enableOrDisableControls(); + + void clearArrivalFields(); + void clearDepartureFields(); + void clearGeneralFields(); + + void refreshLeaderCombo(); + void refreshHotkeyCombo(); + void refreshFormationCombo(); + void refreshArrivalLocationCombo(); + void refreshDepartureLocationCombo(); + void refreshArrivalTargetCombo(); + void refreshDepartureTargetCombo(); + void refreshAllDynamicCombos(); + + void updateLogoPreview(); }; } // namespace fso::fred::dialogs