Skip to content
Merged
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
21 changes: 18 additions & 3 deletions qtfred/src/mission/dialogs/JumpNodeEditorDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include <model/model.h>
#include <ship/ship.h>

#include <QTimer>

namespace fso::fred::dialogs {

JumpNodeEditorDialogModel::JumpNodeEditorDialogModel(QObject* parent, EditorViewport* viewport)
Expand Down Expand Up @@ -445,16 +447,29 @@ void JumpNodeEditorDialogModel::selectPreviousNode() {
selectNodeFromObjectList(GET_PREV(&Objects[_selectedJumpNodes.front()]), false);
}

void JumpNodeEditorDialogModel::scheduleInitializeData() {
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.
if (_initPending) {
return;
}
_initPending = true;
QTimer::singleShot(0, this, [this] {
_initPending = false;
initializeData();
});
}

void JumpNodeEditorDialogModel::onSelectedObjectChanged(int) {
initializeData();
scheduleInitializeData();
}

void JumpNodeEditorDialogModel::onSelectedObjectMarkingChanged(int, bool) {
initializeData();
scheduleInitializeData();
}

void JumpNodeEditorDialogModel::onMissionChanged() {
initializeData();
scheduleInitializeData();
}

} // namespace fso::fred::dialogs
2 changes: 2 additions & 0 deletions qtfred/src/mission/dialogs/JumpNodeEditorDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ private slots:

private: // NOLINT(readability-redundant-access-specifiers)
void initializeData();
void scheduleInitializeData();
void showErrorDialogNoCancel(const SCP_string& message);
bool validateName(const SCP_string& name);
void selectNodeFromObjectList(object* start, bool forward);
Expand All @@ -73,6 +74,7 @@ private slots:
bool _hiddenMixed = false;

bool _bypass_errors = false;
bool _initPending = false;
};

} // namespace fso::fred::dialogs
21 changes: 18 additions & 3 deletions qtfred/src/mission/dialogs/PropEditorDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <mission/object.h>
#include <prop/prop.h>

#include <QTimer>

#include <unordered_set>

namespace fso::fred::dialogs {
Expand Down Expand Up @@ -312,16 +314,29 @@ void PropEditorDialogModel::selectPreviousProp() {
selectPropFromObjectList(GET_PREV(&Objects[_selectedPropObjects.front()]), false);
}

void PropEditorDialogModel::scheduleInitializeData() {
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.
if (_initPending) {
return;
}
_initPending = true;
QTimer::singleShot(0, this, [this] {
_initPending = false;
initializeData();
});
}

void PropEditorDialogModel::onSelectedObjectChanged(int) {
initializeData();
scheduleInitializeData();
}

void PropEditorDialogModel::onSelectedObjectMarkingChanged(int, bool) {
initializeData();
scheduleInitializeData();
}

void PropEditorDialogModel::onMissionChanged() {
initializeData();
scheduleInitializeData();
}

SCP_vector<std::pair<SCP_string, SCP_string>> PropEditorDialogModel::getPropFlagDescriptions()
Expand Down
2 changes: 2 additions & 0 deletions qtfred/src/mission/dialogs/PropEditorDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class PropEditorDialogModel : public AbstractDialogModel {

private: // NOLINT(readability-redundant-access-specifiers)
void initializeData();
void scheduleInitializeData();
void showErrorDialogNoCancel(const SCP_string& message);
void selectPropFromObjectList(object* start, bool forward);
void selectFirstPropInMission();
Expand All @@ -53,6 +54,7 @@ class PropEditorDialogModel : public AbstractDialogModel {
SCP_vector<int> _flagState;
SCP_vector<int> _selectedPropObjects;
bool _bypass_errors = false;
bool _initPending = false;
};

}
18 changes: 16 additions & 2 deletions qtfred/src/mission/dialogs/SceneBrowserModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,16 +307,30 @@ void SceneBrowserModel::setNameFilter(const QString& filter)
// Signal handlers
// ---------------------------------------------------------------------------

void SceneBrowserModel::scheduleSelectionSync()
{
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.
if (_syncPending) {
return;
}
_syncPending = true;
QTimer::singleShot(0, this, [this] {
_syncPending = false;
modelChanged();
});
}

void SceneBrowserModel::onCurrentObjectChanged(int /*newObj*/)
{
if (_updatingFromBrowser) return;
modelChanged();
scheduleSelectionSync();
}

void SceneBrowserModel::onObjectMarkingChanged(int /*obj*/, bool /*marked*/)
{
if (_updatingFromBrowser) return;
modelChanged();
scheduleSelectionSync();
}

void SceneBrowserModel::onLayerVisibilityChanged()
Expand Down
2 changes: 2 additions & 0 deletions qtfred/src/mission/dialogs/SceneBrowserModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,13 @@ class SceneBrowserModel : public AbstractDialogModel {

private:
void buildTree();
void scheduleSelectionSync();

QVector<BrowserLayer> _tree;
QString _nameFilter;
QVector<bool> _filterIff;
bool _updatingFromBrowser = false;
bool _syncPending = false;
QTimer* _rebuildTimer = nullptr;

Q_SLOT void onCurrentObjectChanged(int newObj);
Expand Down
32 changes: 31 additions & 1 deletion qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,39 @@ namespace fso::fred::dialogs {
ShipEditorDialogModel::ShipEditorDialogModel(QObject* parent, EditorViewport* viewport)
: AbstractDialogModel(parent, viewport)
{
connect(viewport->editor, &Editor::currentObjectChanged, this, &ShipEditorDialogModel::onSelectedObjectChanged);
connect(viewport->editor,
&Editor::objectMarkingChanged,
this,
&ShipEditorDialogModel::onSelectedObjectMarkingChanged);

initializeData();
}

void ShipEditorDialogModel::scheduleInitializeData()
{
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.
if (_initPending) {
return;
}
_initPending = true;
QTimer::singleShot(0, this, [this] {
_initPending = false;
initializeData();
});
}

void ShipEditorDialogModel::onSelectedObjectChanged(int)
{
scheduleInitializeData();
}

void ShipEditorDialogModel::onSelectedObjectMarkingChanged(int, bool)
{
scheduleInitializeData();
}


int ShipEditorDialogModel::tristate_set(int val, int cur_state)
{
Expand Down Expand Up @@ -546,7 +576,7 @@ void ShipEditorDialogModel::initializeData()
}
}

modelChanged();
Q_EMIT shipMarkingChanged();
_modified = false;
}

Expand Down
11 changes: 11 additions & 0 deletions qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,18 @@ class ShipEditorDialogModel : public AbstractDialogModel {

void initializeData();

signals:
// Emitted after the model has re-synced from the current selection; the view
// should do a full (overwrite) refresh in response.
void shipMarkingChanged();

private slots:
void onSelectedObjectChanged(int);
void onSelectedObjectMarkingChanged(int, bool);

private: // NOLINT(readability-redundant-access-specifiers)
void setModified();
void scheduleInitializeData();
void shipAltNameClose(int baseShip);
void shipCallsignClose(int baseShip);
static int makeShipList(int* arr);
Expand Down Expand Up @@ -203,6 +213,7 @@ class ShipEditorDialogModel : public AbstractDialogModel {
int _respawnPriority;
SCP_vector<std::pair<SCP_string, bool>> _arrivalPaths;
SCP_vector<std::pair<SCP_string, bool>> _departurePaths;
bool _initPending = false;
};

} // namespace fso::fred::dialogs
21 changes: 18 additions & 3 deletions qtfred/src/mission/dialogs/WaypointEditorDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <unordered_set>
#include "mission/dialogs/WaypointEditorDialogModel.h"

#include <QTimer>

namespace fso::fred::dialogs {

namespace {
Expand Down Expand Up @@ -425,19 +427,32 @@ void WaypointEditorDialogModel::selectPreviousPath() {
selectWaypointPathByIndex(prev);
}

void WaypointEditorDialogModel::scheduleInitializeData() {
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.tles.
if (_initPending) {
return;
}
_initPending = true;
QTimer::singleShot(0, this, [this] {
_initPending = false;
initializeData();
});
}

void WaypointEditorDialogModel::onSelectedObjectChanged(int) {
if (_suppressRefresh) return;
initializeData();
scheduleInitializeData();
}

void WaypointEditorDialogModel::onSelectedObjectMarkingChanged(int, bool) {
if (_suppressRefresh) return;
initializeData();
scheduleInitializeData();
}

void WaypointEditorDialogModel::onMissionChanged() {
if (_suppressRefresh) return;
initializeData();
scheduleInitializeData();
}

} // namespace fso::fred::dialogs
2 changes: 2 additions & 0 deletions qtfred/src/mission/dialogs/WaypointEditorDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ private slots:

private: // NOLINT(readability-redundant-access-specifiers)
void initializeData();
void scheduleInitializeData();
void showErrorDialogNoCancel(const SCP_string& message);
bool validateName(const SCP_string& name);

Expand All @@ -75,6 +76,7 @@ private slots:
// Guards against re-entry into initializeData() from selection/marking/mission signals
// while we're already mutating mission state (e.g., setLayer fans out unmarks).
bool _suppressRefresh = false;
bool _initPending = false;
};

} // namespace fso::fred::dialogs
19 changes: 17 additions & 2 deletions qtfred/src/mission/dialogs/WingEditorDialogModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "missioneditor/common.h"
#include <QObject>
#include <QMessageBox>
#include <QTimer>

namespace fso::fred::dialogs {
WingEditorDialogModel::WingEditorDialogModel(QObject* parent, EditorViewport* viewport)
Expand All @@ -25,14 +26,28 @@ void WingEditorDialogModel::initializeData()
_modified = false;
}

void WingEditorDialogModel::scheduleReloadFromCurWing()
{
// Bulk selection changes fire one signal per object, so coalesce
// the burst into a single refresh once the event loop settles.
if (_reloadPending) {
return;
}
_reloadPending = true;
QTimer::singleShot(0, this, [this] {
_reloadPending = false;
reloadFromCurWing();
});
}

void WingEditorDialogModel::onEditorSelectionChanged(int)
{
reloadFromCurWing();
scheduleReloadFromCurWing();
}

void WingEditorDialogModel::onEditorMissionChanged()
{
reloadFromCurWing();
scheduleReloadFromCurWing();
}

void WingEditorDialogModel::reloadFromCurWing()
Expand Down
2 changes: 2 additions & 0 deletions qtfred/src/mission/dialogs/WingEditorDialogModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,14 @@ class WingEditorDialogModel : public AbstractDialogModel {
private: // NOLINT(readability-redundant-access-specifiers)
void initializeData();
void reloadFromCurWing();
void scheduleReloadFromCurWing();
wing* getCurrentWing() const;
static SCP_vector<std::pair<SCP_string, bool>> getDockBayPathsForWingMask(uint32_t mask, int anchorShipnum);
void prepareSquadLogoList();

int _currentWingIndex = -1;
SCP_string _currentWingName;
bool _reloadPending = false;

SCP_vector<SCP_string> _squadLogoList;
};
Expand Down
Loading
Loading