Skip to content

Commit de07dc6

Browse files
authored
Qtfred settings dialog (scp-fs2open#7316)
* working preferences dialog * some cleanup * clang ignore * fix rebase issue
1 parent f70d07a commit de07dc6

18 files changed

Lines changed: 833 additions & 196 deletions

qtfred/source_groups.cmake

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ add_file_folder("Source/Mission/Dialogs"
6868
src/mission/dialogs/MissionStatsDialogModel.h
6969
src/mission/dialogs/MissionSpecDialogModel.cpp
7070
src/mission/dialogs/MissionSpecDialogModel.h
71+
src/mission/dialogs/PreferencesDialogModel.cpp
72+
src/mission/dialogs/PreferencesDialogModel.h
7173
src/mission/dialogs/MusicPlayerDialogModel.cpp
7274
src/mission/dialogs/MusicPlayerDialogModel.h
7375
src/mission/dialogs/ObjectOrientEditorDialogModel.cpp
@@ -152,8 +154,6 @@ add_file_folder("Source/UI/Dialogs"
152154
src/ui/dialogs/CampaignEditorDialog.cpp
153155
src/ui/dialogs/CommandBriefingDialog.cpp
154156
src/ui/dialogs/CommandBriefingDialog.h
155-
src/ui/dialogs/ControlsDialog.cpp
156-
src/ui/dialogs/ControlsDialog.h
157157
src/ui/dialogs/DebriefingDialog.cpp
158158
src/ui/dialogs/DebriefingDialog.h
159159
src/ui/dialogs/FictionViewerDialog.cpp
@@ -176,6 +176,8 @@ add_file_folder("Source/UI/Dialogs"
176176
src/ui/dialogs/MusicPlayerDialog.h
177177
src/ui/dialogs/ObjectOrientEditorDialog.cpp
178178
src/ui/dialogs/ObjectOrientEditorDialog.h
179+
src/ui/dialogs/PreferencesDialog.cpp
180+
src/ui/dialogs/PreferencesDialog.h
179181
src/ui/dialogs/PropEditorDialog.cpp
180182
src/ui/dialogs/PropEditorDialog.h
181183
src/ui/dialogs/ReinforcementsEditorDialog.cpp
@@ -317,6 +319,7 @@ add_file_folder("UI"
317319
ui/MissionSpecDialog.ui
318320
ui/MusicPlayerDialog.ui
319321
ui/ObjectOrientationDialog.ui
322+
ui/PreferencesDialog.ui
320323
ui/PropEditorDialog.ui
321324
ui/ReinforcementsDialog.ui
322325
ui/RelativeCoordinatesDialog.ui

qtfred/src/mission/EditorViewport.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@
1111
#include "object.h"
1212

1313
#include "EditorViewport.h"
14+
#include <QSettings>
1415
#include <math/fvi.h>
1516
#include <jumpnode/jumpnode.h>
1617
#include <prop/prop.h>
1718
#include <FredApplication.h>
1819

1920
namespace {
2021

22+
constexpr auto SETTINGS_GROUP = "Preferences";
23+
2124
const fix MAX_FRAMETIME = (F1_0 / 4); // Frametime gets saturated at this.
2225
const fix MIN_FRAMETIME = (F1_0 / 120);
2326

@@ -121,8 +124,38 @@ EditorViewport::EditorViewport(Editor* in_editor, std::unique_ptr<FredRenderer>&
121124

122125
memset(&saved_cam_orient, 0, sizeof(saved_cam_orient));
123126

127+
loadSettings();
128+
124129
fredApp->runAfterInit([this]() { initialSetup(); });
125130
}
131+
132+
void EditorViewport::loadSettings() {
133+
QSettings settings;
134+
settings.beginGroup(SETTINGS_GROUP);
135+
Move_ships_when_undocking = settings.value("move_ships_when_undocking", Move_ships_when_undocking).toBool();
136+
Always_save_display_names = settings.value("always_save_display_names", Always_save_display_names).toBool();
137+
Error_checker_checks_potential_issues = settings.value("error_checker_checks_potential_issues", Error_checker_checks_potential_issues).toBool();
138+
Show_sexp_help_mission_events = settings.value("show_sexp_help_mission_events", Show_sexp_help_mission_events).toBool();
139+
Show_sexp_help_mission_goals = settings.value("show_sexp_help_mission_goals", Show_sexp_help_mission_goals).toBool();
140+
Show_sexp_help_mission_cutscenes = settings.value("show_sexp_help_mission_cutscenes", Show_sexp_help_mission_cutscenes).toBool();
141+
Show_sexp_help_ship_editor = settings.value("show_sexp_help_ship_editor", Show_sexp_help_ship_editor).toBool();
142+
Show_sexp_help_wing_editor = settings.value("show_sexp_help_wing_editor", Show_sexp_help_wing_editor).toBool();
143+
settings.endGroup();
144+
}
145+
146+
void EditorViewport::saveSettings() const {
147+
QSettings settings;
148+
settings.beginGroup(SETTINGS_GROUP);
149+
settings.setValue("move_ships_when_undocking", Move_ships_when_undocking);
150+
settings.setValue("always_save_display_names", Always_save_display_names);
151+
settings.setValue("error_checker_checks_potential_issues", Error_checker_checks_potential_issues);
152+
settings.setValue("show_sexp_help_mission_events", Show_sexp_help_mission_events);
153+
settings.setValue("show_sexp_help_mission_goals", Show_sexp_help_mission_goals);
154+
settings.setValue("show_sexp_help_mission_cutscenes", Show_sexp_help_mission_cutscenes);
155+
settings.setValue("show_sexp_help_ship_editor", Show_sexp_help_ship_editor);
156+
settings.setValue("show_sexp_help_wing_editor", Show_sexp_help_wing_editor);
157+
settings.endGroup();
158+
}
126159
void EditorViewport::needsUpdate() {
127160
_renderer->scheduleUpdate();
128161
}

qtfred/src/mission/EditorViewport.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,20 @@ class EditorViewport {
170170
bool Error_checker_checks_potential_issues = true;
171171
bool Error_checker_checks_potential_issues_once = false;
172172

173+
bool Show_sexp_help_mission_events = true;
174+
bool Show_sexp_help_mission_goals = true;
175+
bool Show_sexp_help_mission_cutscenes = true;
176+
bool Show_sexp_help_ship_editor = false;
177+
bool Show_sexp_help_wing_editor = false;
178+
179+
void saveSettings() const;
180+
173181
Editor* editor = nullptr;
174182
FredRenderer* renderer = nullptr;
175183
IDialogProvider* dialogProvider = nullptr;
184+
185+
private:
186+
void loadSettings();
176187
};
177188

178189
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#include "PreferencesDialogModel.h"
2+
3+
#include "mission/EditorViewport.h"
4+
#include "mission/missiongrid.h"
5+
#include "math/vecmat.h"
6+
7+
namespace fso::fred::dialogs {
8+
9+
PreferencesDialogModel::PreferencesDialogModel(QObject* parent, EditorViewport* viewport)
10+
: AbstractDialogModel(parent, viewport)
11+
, _moveShipsWhenUndocking(viewport->Move_ships_when_undocking)
12+
, _alwaysSaveDisplayNames(viewport->Always_save_display_names)
13+
, _errorCheckerChecksForPotentialIssues(viewport->Error_checker_checks_potential_issues)
14+
, _showSexpHelpMissionEvents(viewport->Show_sexp_help_mission_events)
15+
, _showSexpHelpMissionGoals(viewport->Show_sexp_help_mission_goals)
16+
, _showSexpHelpMissionCutscenes(viewport->Show_sexp_help_mission_cutscenes)
17+
, _showSexpHelpShipEditor(viewport->Show_sexp_help_ship_editor)
18+
, _showSexpHelpWingEditor(viewport->Show_sexp_help_wing_editor)
19+
, _gridCenterX(static_cast<int>(viewport->The_grid->center.xyz.x))
20+
, _gridCenterY(static_cast<int>(viewport->The_grid->center.xyz.y))
21+
, _gridCenterZ(static_cast<int>(viewport->The_grid->center.xyz.z))
22+
{
23+
auto& bindings = ControlBindings::instance();
24+
for (const auto& def : bindings.definitions()) {
25+
_controlKeys.emplace(def.action, bindings.keyFor(def.action));
26+
}
27+
28+
// Detect current grid plane from the normal vector (uvec)
29+
const auto& uvec = viewport->The_grid->gmatrix.vec.uvec;
30+
if (uvec.xyz.y != 0.0f) {
31+
_gridPlane = GridPlane::XZ;
32+
} else if (uvec.xyz.z != 0.0f) {
33+
_gridPlane = GridPlane::XY;
34+
} else {
35+
_gridPlane = GridPlane::YZ;
36+
}
37+
}
38+
39+
bool PreferencesDialogModel::apply() {
40+
_viewport->Move_ships_when_undocking = _moveShipsWhenUndocking;
41+
_viewport->Always_save_display_names = _alwaysSaveDisplayNames;
42+
_viewport->Error_checker_checks_potential_issues = _errorCheckerChecksForPotentialIssues;
43+
_viewport->Show_sexp_help_mission_events = _showSexpHelpMissionEvents;
44+
_viewport->Show_sexp_help_mission_goals = _showSexpHelpMissionGoals;
45+
_viewport->Show_sexp_help_mission_cutscenes = _showSexpHelpMissionCutscenes;
46+
_viewport->Show_sexp_help_ship_editor = _showSexpHelpShipEditor;
47+
_viewport->Show_sexp_help_wing_editor = _showSexpHelpWingEditor;
48+
49+
_viewport->saveSettings();
50+
51+
auto& bindings = ControlBindings::instance();
52+
for (const auto& entry : _controlKeys) {
53+
bindings.setKey(entry.first, entry.second);
54+
}
55+
bindings.save();
56+
57+
_viewport->The_grid->center.xyz.x = static_cast<float>(_gridCenterX);
58+
_viewport->The_grid->center.xyz.y = static_cast<float>(_gridCenterY);
59+
_viewport->The_grid->center.xyz.z = static_cast<float>(_gridCenterZ);
60+
61+
switch (_gridPlane) {
62+
case GridPlane::XY:
63+
_viewport->The_grid->gmatrix.vec.fvec = vmd_x_vector;
64+
_viewport->The_grid->gmatrix.vec.rvec = vmd_y_vector;
65+
break;
66+
case GridPlane::XZ:
67+
_viewport->The_grid->gmatrix.vec.fvec = vmd_x_vector;
68+
_viewport->The_grid->gmatrix.vec.rvec = vmd_z_vector;
69+
break;
70+
case GridPlane::YZ:
71+
_viewport->The_grid->gmatrix.vec.fvec = vmd_y_vector;
72+
_viewport->The_grid->gmatrix.vec.rvec = vmd_z_vector;
73+
break;
74+
}
75+
76+
modify_grid(_viewport->The_grid);
77+
78+
return true;
79+
}
80+
81+
void PreferencesDialogModel::reject() {
82+
// Nothing to do — data sources are not modified until apply()
83+
}
84+
85+
bool PreferencesDialogModel::getMoveShipsWhenUndocking() const { return _moveShipsWhenUndocking; }
86+
void PreferencesDialogModel::setMoveShipsWhenUndocking(bool value) { modify(_moveShipsWhenUndocking, value); }
87+
88+
bool PreferencesDialogModel::getAlwaysSaveDisplayNames() const { return _alwaysSaveDisplayNames; }
89+
void PreferencesDialogModel::setAlwaysSaveDisplayNames(bool value) { modify(_alwaysSaveDisplayNames, value); }
90+
91+
bool PreferencesDialogModel::getErrorCheckerChecksForPotentialIssues() const { return _errorCheckerChecksForPotentialIssues; }
92+
void PreferencesDialogModel::setErrorCheckerChecksForPotentialIssues(bool value) { modify(_errorCheckerChecksForPotentialIssues, value); }
93+
94+
bool PreferencesDialogModel::getShowSexpHelpMissionEvents() const { return _showSexpHelpMissionEvents; }
95+
void PreferencesDialogModel::setShowSexpHelpMissionEvents(bool value) { modify(_showSexpHelpMissionEvents, value); }
96+
bool PreferencesDialogModel::getShowSexpHelpMissionGoals() const { return _showSexpHelpMissionGoals; }
97+
void PreferencesDialogModel::setShowSexpHelpMissionGoals(bool value) { modify(_showSexpHelpMissionGoals, value); }
98+
bool PreferencesDialogModel::getShowSexpHelpMissionCutscenes() const { return _showSexpHelpMissionCutscenes; }
99+
void PreferencesDialogModel::setShowSexpHelpMissionCutscenes(bool value) { modify(_showSexpHelpMissionCutscenes, value); }
100+
bool PreferencesDialogModel::getShowSexpHelpShipEditor() const { return _showSexpHelpShipEditor; }
101+
void PreferencesDialogModel::setShowSexpHelpShipEditor(bool value) { modify(_showSexpHelpShipEditor, value); }
102+
bool PreferencesDialogModel::getShowSexpHelpWingEditor() const { return _showSexpHelpWingEditor; }
103+
void PreferencesDialogModel::setShowSexpHelpWingEditor(bool value) { modify(_showSexpHelpWingEditor, value); }
104+
105+
QKeySequence PreferencesDialogModel::getControlKey(ControlAction action) const {
106+
auto it = _controlKeys.find(action);
107+
Assertion(it != _controlKeys.end(), "Unknown control action!");
108+
return it->second;
109+
}
110+
111+
void PreferencesDialogModel::setControlKey(ControlAction action, const QKeySequence& sequence) {
112+
auto it = _controlKeys.find(action);
113+
Assertion(it != _controlKeys.end(), "Unknown control action!");
114+
modify(it->second, sequence);
115+
}
116+
117+
void PreferencesDialogModel::resetControlDefaults() {
118+
auto& bindings = ControlBindings::instance();
119+
for (const auto& def : bindings.definitions()) {
120+
modify(_controlKeys[def.action], def.defaultKey);
121+
}
122+
}
123+
124+
int PreferencesDialogModel::getGridCenterX() const { return _gridCenterX; }
125+
int PreferencesDialogModel::getGridCenterY() const { return _gridCenterY; }
126+
int PreferencesDialogModel::getGridCenterZ() const { return _gridCenterZ; }
127+
void PreferencesDialogModel::setGridCenterX(int value) { modify(_gridCenterX, value); }
128+
void PreferencesDialogModel::setGridCenterY(int value) { modify(_gridCenterY, value); }
129+
void PreferencesDialogModel::setGridCenterZ(int value) { modify(_gridCenterZ, value); }
130+
131+
GridPlane PreferencesDialogModel::getGridPlane() const { return _gridPlane; }
132+
void PreferencesDialogModel::setGridPlane(GridPlane plane) { modify(_gridPlane, plane); }
133+
134+
void PreferencesDialogModel::resetGrid() {
135+
modify(_gridCenterX, 0);
136+
modify(_gridCenterY, 0);
137+
modify(_gridCenterZ, 0);
138+
modify(_gridPlane, GridPlane::XZ);
139+
}
140+
141+
} // namespace fso::fred::dialogs
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#pragma once
2+
3+
#include "mission/dialogs/AbstractDialogModel.h"
4+
#include "ui/ControlBindings.h"
5+
6+
namespace fso::fred::dialogs {
7+
8+
enum class GridPlane { XY, XZ, YZ };
9+
10+
class PreferencesDialogModel : public AbstractDialogModel {
11+
Q_OBJECT
12+
13+
public:
14+
PreferencesDialogModel(QObject* parent, EditorViewport* viewport);
15+
~PreferencesDialogModel() override = default;
16+
17+
bool apply() override;
18+
void reject() override;
19+
20+
// General
21+
bool getMoveShipsWhenUndocking() const;
22+
void setMoveShipsWhenUndocking(bool value);
23+
24+
bool getAlwaysSaveDisplayNames() const;
25+
void setAlwaysSaveDisplayNames(bool value);
26+
27+
bool getErrorCheckerChecksForPotentialIssues() const;
28+
void setErrorCheckerChecksForPotentialIssues(bool value);
29+
30+
bool getShowSexpHelpMissionEvents() const;
31+
void setShowSexpHelpMissionEvents(bool value);
32+
bool getShowSexpHelpMissionGoals() const;
33+
void setShowSexpHelpMissionGoals(bool value);
34+
bool getShowSexpHelpMissionCutscenes() const;
35+
void setShowSexpHelpMissionCutscenes(bool value);
36+
bool getShowSexpHelpShipEditor() const;
37+
void setShowSexpHelpShipEditor(bool value);
38+
bool getShowSexpHelpWingEditor() const;
39+
void setShowSexpHelpWingEditor(bool value);
40+
41+
// Controls
42+
QKeySequence getControlKey(ControlAction action) const;
43+
void setControlKey(ControlAction action, const QKeySequence& sequence);
44+
void resetControlDefaults();
45+
46+
// Grid
47+
int getGridCenterX() const;
48+
int getGridCenterY() const;
49+
int getGridCenterZ() const;
50+
void setGridCenterX(int value);
51+
void setGridCenterY(int value);
52+
void setGridCenterZ(int value);
53+
54+
GridPlane getGridPlane() const;
55+
void setGridPlane(GridPlane plane);
56+
void resetGrid();
57+
58+
private:
59+
// General
60+
bool _moveShipsWhenUndocking;
61+
bool _alwaysSaveDisplayNames;
62+
bool _errorCheckerChecksForPotentialIssues;
63+
bool _showSexpHelpMissionEvents;
64+
bool _showSexpHelpMissionGoals;
65+
bool _showSexpHelpMissionCutscenes;
66+
bool _showSexpHelpShipEditor;
67+
bool _showSexpHelpWingEditor;
68+
69+
// Controls
70+
std::map<ControlAction, QKeySequence> _controlKeys;
71+
72+
// Grid
73+
int _gridCenterX;
74+
int _gridCenterY;
75+
int _gridCenterZ;
76+
GridPlane _gridPlane;
77+
};
78+
79+
} // namespace fso::fred::dialogs

qtfred/src/ui/FredView.cpp

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
#include <ui/dialogs/VariableDialog.h>
4545
#include <ui/dialogs/MusicPlayerDialog.h>
4646
#include <ui/dialogs/RelativeCoordinatesDialog.h>
47-
#include <ui/dialogs/ControlsDialog.h>
4847
#include <ui/dialogs/SaveAsTemplateDialog.h>
4948
#include <ui/dialogs/TemplateBrowserDialog.h>
49+
#include <ui/dialogs/PreferencesDialog.h>
5050
#include <ui/ControlBindings.h>
5151
#include <iff_defs/iff_defs.h>
5252

@@ -108,12 +108,10 @@ FredView::FredView(QWidget* parent) : QMainWindow(parent), ui(new Ui::FredView()
108108
connect(propsAction, &QAction::triggered, this, &FredView::on_actionProps_triggered);
109109
ui->menuObjects->insertAction(ui->actionWaypoint_Paths, propsAction);
110110

111-
auto controlsAction = new QAction(tr("Controls"), ui->menuSeetings);
112-
connect(controlsAction, &QAction::triggered, this, [this]() {
113-
dialogs::ControlsDialog controlsDialog(this);
114-
controlsDialog.exec();
111+
connect(ui->actionPreferences, &QAction::triggered, this, [this]() {
112+
dialogs::PreferencesDialog preferencesDialog(this, _viewport);
113+
preferencesDialog.exec();
115114
});
116-
ui->menuSeetings->insertAction(ui->actionAdjust_Grid, controlsAction);
117115
}
118116

119117
FredView::~FredView() {
@@ -171,9 +169,6 @@ void FredView::setEditor(Editor* editor, EditorViewport* viewport) {
171169
this,
172170
[this]() { ui->actionRestore_Camera_Pos->setEnabled(!IS_VEC_NULL(&_viewport->saved_cam_orient.vec.fvec)); });
173171

174-
connect(this, &FredView::viewIdle, this, [this]() { ui->actionMove_Ships_When_Undocking->setChecked(_viewport->Move_ships_when_undocking); });
175-
connect(this, &FredView::viewIdle, this, [this]() { ui->actionAlways_Save_Display_Names->setChecked(_viewport->Always_save_display_names); });
176-
connect(this, &FredView::viewIdle, this, [this]() { ui->actionError_Checker_Checks_Potential_Issues->setChecked(_viewport->Error_checker_checks_potential_issues); });
177172
}
178173

179174
void FredView::loadMissionFile(const QString& pathName, int flags) {
@@ -1427,15 +1422,6 @@ void FredView::on_actionPrev_Subsystem_triggered(bool) {
14271422
void FredView::on_actionCancel_Subsystem_triggered(bool) {
14281423
fred->cancel_select_subsystem();
14291424
}
1430-
void FredView::on_actionMove_Ships_When_Undocking_triggered(bool) {
1431-
_viewport->Move_ships_when_undocking = !_viewport->Move_ships_when_undocking;
1432-
}
1433-
void FredView::on_actionAlways_Save_Display_Names_triggered(bool) {
1434-
_viewport->Always_save_display_names = !_viewport->Always_save_display_names;
1435-
}
1436-
void FredView::on_actionError_Checker_Checks_Potential_Issues_triggered(bool) {
1437-
_viewport->Error_checker_checks_potential_issues = !_viewport->Error_checker_checks_potential_issues;
1438-
}
14391425
void FredView::on_actionError_Checker_triggered(bool) {
14401426
fred->global_error_check();
14411427
}

qtfred/src/ui/FredView.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,6 @@ class FredView: public QMainWindow, public IDialogProvider {
146146
void on_actionPrev_Subsystem_triggered(bool);
147147
void on_actionCancel_Subsystem_triggered(bool);
148148

149-
void on_actionMove_Ships_When_Undocking_triggered(bool);
150-
151-
void on_actionAlways_Save_Display_Names_triggered(bool);
152-
void on_actionError_Checker_Checks_Potential_Issues_triggered(bool);
153149
void on_actionError_Checker_triggered(bool);
154150

155151
void on_actionAbout_triggered(bool);

0 commit comments

Comments
 (0)