Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions qtfred/source_groups.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,10 @@ add_file_folder("Source/UI/Dialogs/ShipEditor"
src/ui/dialogs/ShipEditor/WeaponsTBLViewer.cpp
src/ui/dialogs/ShipEditor/WeaponsTBLViewer.h
)
add_file_folder("Source/UI/Dialogs/EventEditor"
src/ui/dialogs/EventEditor/HeadAnimationPickerDialog.cpp
src/ui/dialogs/EventEditor/HeadAnimationPickerDialog.h
)
add_file_folder("Source/UI/General"
src/ui/dialogs/General/CheckBoxListDialog.cpp
src/ui/dialogs/General/CheckBoxListDialog.h
Expand Down
36 changes: 34 additions & 2 deletions qtfred/src/mission/dialogs/MissionEventsDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,29 @@

namespace fso::fred::dialogs {

SCP_vector<SCP_string> MissionEventsDialogModel::s_extra_head_anis;

void MissionEventsDialogModel::addExtraHeadAni(const SCP_string& name)
{
if (name.empty() || lcase_equal(name, "<none>") || lcase_equal(name, "none")) {
return;
}
auto it = std::find(s_extra_head_anis.begin(), s_extra_head_anis.end(), name);
if (it == s_extra_head_anis.end()) {
s_extra_head_anis.push_back(name);
}
}

void MissionEventsDialogModel::clearBrowsedHeadAnis()
{
s_extra_head_anis.clear();
}

const SCP_vector<SCP_string>& MissionEventsDialogModel::getExtraHeadAnis()
{
return s_extra_head_anis;
}

MissionEventsDialogModel::MissionEventsDialogModel(QObject* parent, fso::fred::EditorViewport* viewport, IEventTreeOps& tree_ops)
: AbstractDialogModel(parent, viewport), m_event_tree_ops(tree_ops)
{
Expand Down Expand Up @@ -371,11 +394,20 @@ void MissionEventsDialogModel::initializeHeadAniList()
m_head_ani_list.emplace_back(thisHead);
}

// Include any anis discovered during this session
for (const auto& extra : s_extra_head_anis) {
auto it = std::find(m_head_ani_list.begin(), m_head_ani_list.end(), extra);
if (it == m_head_ani_list.end()) {
m_head_ani_list.emplace_back(extra);
}
}

// Scan the current mission's messages. Any head ANI not already in the list is added to the list
for (auto& msg : m_messages) {
if (msg.avi_info.name) {
auto it = std::find(m_head_ani_list.begin(), m_head_ani_list.end(), msg.avi_info.name);
if (it == m_head_ani_list.end()) {
m_head_ani_list.emplace_back(msg.avi_info.name);
addExtraHeadAni(msg.avi_info.name);
}
}
}
Expand Down Expand Up @@ -647,7 +679,7 @@ void MissionEventsDialogModel::insertEvent()
m_sig.insert(m_sig.begin() + pos, -1);
auto& event = m_events[pos];

// Place after the previous root if it exists and is valid; otherwise well fix index explicitly
// Place after the previous root if it exists and is valid; otherwise we'll fix index explicitly
int after = (pos > 0 && m_events[pos - 1].formula >= 0) ? m_events[pos - 1].formula : -1;

event.formula = m_event_tree_ops.build_default_root(event.name, after);
Expand Down
7 changes: 7 additions & 0 deletions qtfred/src/mission/dialogs/MissionEventsDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ class MissionEventsDialogModel : public AbstractDialogModel {
int getCurrentlySelectedMessage() const;
const SCP_vector<SCP_string>& getHeadAniList();
const SCP_vector<SCP_string>& getWaveList();

// Session-persistent list of head ANIs discovered outside the built-in defaults
static void addExtraHeadAni(const SCP_string& name);
static void clearBrowsedHeadAnis();
static const SCP_vector<SCP_string>& getExtraHeadAnis();
const SCP_vector<std::pair<SCP_string, int>>& getPersonaList();
const SCP_vector<std::pair<SCP_string, int>>& getTeamList();

Expand Down Expand Up @@ -199,6 +204,8 @@ class MissionEventsDialogModel : public AbstractDialogModel {

SCP_vector<SCP_string> m_head_ani_list;
SCP_vector<SCP_string> m_wave_list;

static SCP_vector<SCP_string> s_extra_head_anis;
SCP_vector<std::pair<SCP_string, int>> m_persona_list;
SCP_vector<std::pair<SCP_string, int>> m_team_list;
};
Expand Down
4 changes: 4 additions & 0 deletions qtfred/src/ui/FredView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <ui/dialogs/WingEditorDialog.h>
#include <ui/dialogs/PropEditorDialog.h>
#include <ui/dialogs/MissionEventsDialog.h>
#include <mission/dialogs/MissionEventsDialogModel.h>
#include <ui/dialogs/AsteroidEditorDialog.h>
#include <ui/dialogs/VolumetricNebulaDialog.h>
#include <ui/dialogs/BriefingEditorDialog.h>
Expand Down Expand Up @@ -273,6 +274,9 @@ bool FredView::saveMissionAs() {
}

void FredView::on_mission_loaded(const std::string& filepath) {
// Clear browsed head ANIs so the new mission's message scan starts fresh.
fso::fred::dialogs::MissionEventsDialogModel::clearBrowsedHeadAnis();

QString filename = "Untitled";
if (!filepath.empty()) {
filename = QFileInfo(QString::fromStdString(filepath)).fileName();
Expand Down
Loading
Loading