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
7 changes: 5 additions & 2 deletions qtfred/source_groups.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ add_file_folder("Source/Mission/Dialogs"
src/mission/dialogs/MissionGoalsDialogModel.h
src/mission/dialogs/MissionSpecDialogModel.cpp
src/mission/dialogs/MissionSpecDialogModel.h
src/mission/dialogs/PreferencesDialogModel.cpp
src/mission/dialogs/PreferencesDialogModel.h
src/mission/dialogs/MusicPlayerDialogModel.cpp
src/mission/dialogs/MusicPlayerDialogModel.h
src/mission/dialogs/MusicTBLViewerModel.cpp
Expand Down Expand Up @@ -152,8 +154,6 @@ add_file_folder("Source/UI/Dialogs"
src/ui/dialogs/CampaignEditorDialog.cpp
src/ui/dialogs/CommandBriefingDialog.cpp
src/ui/dialogs/CommandBriefingDialog.h
src/ui/dialogs/ControlsDialog.cpp
src/ui/dialogs/ControlsDialog.h
src/ui/dialogs/DebriefingDialog.cpp
src/ui/dialogs/DebriefingDialog.h
src/ui/dialogs/FictionViewerDialog.cpp
Expand All @@ -178,6 +178,8 @@ add_file_folder("Source/UI/Dialogs"
src/ui/dialogs/MusicTBLViewer.h
src/ui/dialogs/ObjectOrientEditorDialog.cpp
src/ui/dialogs/ObjectOrientEditorDialog.h
src/ui/dialogs/PreferencesDialog.cpp
src/ui/dialogs/PreferencesDialog.h
src/ui/dialogs/PropEditorDialog.cpp
src/ui/dialogs/PropEditorDialog.h
src/ui/dialogs/ReinforcementsEditorDialog.cpp
Expand Down Expand Up @@ -312,6 +314,7 @@ add_file_folder("UI"
ui/MissionSpecDialog.ui
ui/MusicPlayerDialog.ui
ui/ObjectOrientationDialog.ui
ui/PreferencesDialog.ui
ui/PropEditorDialog.ui
ui/ReinforcementsDialog.ui
ui/RelativeCoordinatesDialog.ui
Expand Down
33 changes: 33 additions & 0 deletions qtfred/src/mission/EditorViewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
#include "object.h"

#include "EditorViewport.h"
#include <QSettings>
#include <math/fvi.h>
#include <jumpnode/jumpnode.h>
#include <prop/prop.h>
#include <FredApplication.h>

namespace {

constexpr auto SETTINGS_GROUP = "Preferences";

const fix MAX_FRAMETIME = (F1_0 / 4); // Frametime gets saturated at this.
const fix MIN_FRAMETIME = (F1_0 / 120);

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

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

loadSettings();

fredApp->runAfterInit([this]() { initialSetup(); });
}

void EditorViewport::loadSettings() {
QSettings settings;
settings.beginGroup(SETTINGS_GROUP);
Move_ships_when_undocking = settings.value("move_ships_when_undocking", Move_ships_when_undocking).toBool();
Always_save_display_names = settings.value("always_save_display_names", Always_save_display_names).toBool();
Error_checker_checks_potential_issues = settings.value("error_checker_checks_potential_issues", Error_checker_checks_potential_issues).toBool();
Show_sexp_help_mission_events = settings.value("show_sexp_help_mission_events", Show_sexp_help_mission_events).toBool();
Show_sexp_help_mission_goals = settings.value("show_sexp_help_mission_goals", Show_sexp_help_mission_goals).toBool();
Show_sexp_help_mission_cutscenes = settings.value("show_sexp_help_mission_cutscenes", Show_sexp_help_mission_cutscenes).toBool();
Show_sexp_help_ship_editor = settings.value("show_sexp_help_ship_editor", Show_sexp_help_ship_editor).toBool();
Show_sexp_help_wing_editor = settings.value("show_sexp_help_wing_editor", Show_sexp_help_wing_editor).toBool();
settings.endGroup();
}

void EditorViewport::saveSettings() const {
QSettings settings;
settings.beginGroup(SETTINGS_GROUP);
settings.setValue("move_ships_when_undocking", Move_ships_when_undocking);
settings.setValue("always_save_display_names", Always_save_display_names);
settings.setValue("error_checker_checks_potential_issues", Error_checker_checks_potential_issues);
settings.setValue("show_sexp_help_mission_events", Show_sexp_help_mission_events);
settings.setValue("show_sexp_help_mission_goals", Show_sexp_help_mission_goals);
settings.setValue("show_sexp_help_mission_cutscenes", Show_sexp_help_mission_cutscenes);
settings.setValue("show_sexp_help_ship_editor", Show_sexp_help_ship_editor);
settings.setValue("show_sexp_help_wing_editor", Show_sexp_help_wing_editor);
settings.endGroup();
}
void EditorViewport::needsUpdate() {
_renderer->scheduleUpdate();
}
Expand Down
11 changes: 11 additions & 0 deletions qtfred/src/mission/EditorViewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,20 @@ class EditorViewport {
bool Error_checker_checks_potential_issues = true;
bool Error_checker_checks_potential_issues_once = false;

bool Show_sexp_help_mission_events = true;
bool Show_sexp_help_mission_goals = true;
bool Show_sexp_help_mission_cutscenes = true;
bool Show_sexp_help_ship_editor = false;
bool Show_sexp_help_wing_editor = false;

void saveSettings() const;

Editor* editor = nullptr;
FredRenderer* renderer = nullptr;
IDialogProvider* dialogProvider = nullptr;

private:
void loadSettings();
};

}
Expand Down
141 changes: 141 additions & 0 deletions qtfred/src/mission/dialogs/PreferencesDialogModel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
#include "PreferencesDialogModel.h"

#include "mission/EditorViewport.h"
#include "mission/missiongrid.h"
#include "math/vecmat.h"

namespace fso::fred::dialogs {

PreferencesDialogModel::PreferencesDialogModel(QObject* parent, EditorViewport* viewport)
: AbstractDialogModel(parent, viewport)
, _moveShipsWhenUndocking(viewport->Move_ships_when_undocking)
, _alwaysSaveDisplayNames(viewport->Always_save_display_names)
, _errorCheckerChecksForPotentialIssues(viewport->Error_checker_checks_potential_issues)
, _showSexpHelpMissionEvents(viewport->Show_sexp_help_mission_events)
, _showSexpHelpMissionGoals(viewport->Show_sexp_help_mission_goals)
, _showSexpHelpMissionCutscenes(viewport->Show_sexp_help_mission_cutscenes)
, _showSexpHelpShipEditor(viewport->Show_sexp_help_ship_editor)
, _showSexpHelpWingEditor(viewport->Show_sexp_help_wing_editor)
, _gridCenterX(static_cast<int>(viewport->The_grid->center.xyz.x))
, _gridCenterY(static_cast<int>(viewport->The_grid->center.xyz.y))
, _gridCenterZ(static_cast<int>(viewport->The_grid->center.xyz.z))
{
auto& bindings = ControlBindings::instance();
for (const auto& def : bindings.definitions()) {
_controlKeys.emplace(def.action, bindings.keyFor(def.action));
}

// Detect current grid plane from the normal vector (uvec)
const auto& uvec = viewport->The_grid->gmatrix.vec.uvec;
if (uvec.xyz.y != 0.0f) {
_gridPlane = GridPlane::XZ;
} else if (uvec.xyz.z != 0.0f) {
_gridPlane = GridPlane::XY;
} else {
_gridPlane = GridPlane::YZ;
}
}

bool PreferencesDialogModel::apply() {
_viewport->Move_ships_when_undocking = _moveShipsWhenUndocking;
_viewport->Always_save_display_names = _alwaysSaveDisplayNames;
_viewport->Error_checker_checks_potential_issues = _errorCheckerChecksForPotentialIssues;
_viewport->Show_sexp_help_mission_events = _showSexpHelpMissionEvents;
_viewport->Show_sexp_help_mission_goals = _showSexpHelpMissionGoals;
_viewport->Show_sexp_help_mission_cutscenes = _showSexpHelpMissionCutscenes;
_viewport->Show_sexp_help_ship_editor = _showSexpHelpShipEditor;
_viewport->Show_sexp_help_wing_editor = _showSexpHelpWingEditor;

_viewport->saveSettings();

auto& bindings = ControlBindings::instance();
for (const auto& entry : _controlKeys) {
bindings.setKey(entry.first, entry.second);
}
bindings.save();

_viewport->The_grid->center.xyz.x = static_cast<float>(_gridCenterX);
_viewport->The_grid->center.xyz.y = static_cast<float>(_gridCenterY);
_viewport->The_grid->center.xyz.z = static_cast<float>(_gridCenterZ);

switch (_gridPlane) {
case GridPlane::XY:
_viewport->The_grid->gmatrix.vec.fvec = vmd_x_vector;
_viewport->The_grid->gmatrix.vec.rvec = vmd_y_vector;
break;
case GridPlane::XZ:
_viewport->The_grid->gmatrix.vec.fvec = vmd_x_vector;
_viewport->The_grid->gmatrix.vec.rvec = vmd_z_vector;
break;
case GridPlane::YZ:
_viewport->The_grid->gmatrix.vec.fvec = vmd_y_vector;
_viewport->The_grid->gmatrix.vec.rvec = vmd_z_vector;
break;
}

modify_grid(_viewport->The_grid);

return true;
}

void PreferencesDialogModel::reject() {
// Nothing to do — data sources are not modified until apply()
}

bool PreferencesDialogModel::getMoveShipsWhenUndocking() const { return _moveShipsWhenUndocking; }
void PreferencesDialogModel::setMoveShipsWhenUndocking(bool value) { modify(_moveShipsWhenUndocking, value); }

bool PreferencesDialogModel::getAlwaysSaveDisplayNames() const { return _alwaysSaveDisplayNames; }
void PreferencesDialogModel::setAlwaysSaveDisplayNames(bool value) { modify(_alwaysSaveDisplayNames, value); }

bool PreferencesDialogModel::getErrorCheckerChecksForPotentialIssues() const { return _errorCheckerChecksForPotentialIssues; }
void PreferencesDialogModel::setErrorCheckerChecksForPotentialIssues(bool value) { modify(_errorCheckerChecksForPotentialIssues, value); }

bool PreferencesDialogModel::getShowSexpHelpMissionEvents() const { return _showSexpHelpMissionEvents; }
void PreferencesDialogModel::setShowSexpHelpMissionEvents(bool value) { modify(_showSexpHelpMissionEvents, value); }
bool PreferencesDialogModel::getShowSexpHelpMissionGoals() const { return _showSexpHelpMissionGoals; }
void PreferencesDialogModel::setShowSexpHelpMissionGoals(bool value) { modify(_showSexpHelpMissionGoals, value); }
bool PreferencesDialogModel::getShowSexpHelpMissionCutscenes() const { return _showSexpHelpMissionCutscenes; }
void PreferencesDialogModel::setShowSexpHelpMissionCutscenes(bool value) { modify(_showSexpHelpMissionCutscenes, value); }
bool PreferencesDialogModel::getShowSexpHelpShipEditor() const { return _showSexpHelpShipEditor; }
void PreferencesDialogModel::setShowSexpHelpShipEditor(bool value) { modify(_showSexpHelpShipEditor, value); }
bool PreferencesDialogModel::getShowSexpHelpWingEditor() const { return _showSexpHelpWingEditor; }
void PreferencesDialogModel::setShowSexpHelpWingEditor(bool value) { modify(_showSexpHelpWingEditor, value); }

QKeySequence PreferencesDialogModel::getControlKey(ControlAction action) const {
auto it = _controlKeys.find(action);
Assertion(it != _controlKeys.end(), "Unknown control action!");
return it->second;
}

void PreferencesDialogModel::setControlKey(ControlAction action, const QKeySequence& sequence) {
auto it = _controlKeys.find(action);
Assertion(it != _controlKeys.end(), "Unknown control action!");
modify(it->second, sequence);
}

void PreferencesDialogModel::resetControlDefaults() {
auto& bindings = ControlBindings::instance();
for (const auto& def : bindings.definitions()) {
modify(_controlKeys[def.action], def.defaultKey);
}
}

int PreferencesDialogModel::getGridCenterX() const { return _gridCenterX; }
int PreferencesDialogModel::getGridCenterY() const { return _gridCenterY; }
int PreferencesDialogModel::getGridCenterZ() const { return _gridCenterZ; }
void PreferencesDialogModel::setGridCenterX(int value) { modify(_gridCenterX, value); }
void PreferencesDialogModel::setGridCenterY(int value) { modify(_gridCenterY, value); }
void PreferencesDialogModel::setGridCenterZ(int value) { modify(_gridCenterZ, value); }

GridPlane PreferencesDialogModel::getGridPlane() const { return _gridPlane; }
void PreferencesDialogModel::setGridPlane(GridPlane plane) { modify(_gridPlane, plane); }

void PreferencesDialogModel::resetGrid() {
modify(_gridCenterX, 0);
modify(_gridCenterY, 0);
modify(_gridCenterZ, 0);
modify(_gridPlane, GridPlane::XZ);
}

} // namespace fso::fred::dialogs
79 changes: 79 additions & 0 deletions qtfred/src/mission/dialogs/PreferencesDialogModel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#pragma once

#include "mission/dialogs/AbstractDialogModel.h"
#include "ui/ControlBindings.h"

namespace fso::fred::dialogs {

enum class GridPlane { XY, XZ, YZ };

class PreferencesDialogModel : public AbstractDialogModel {
Q_OBJECT

public:
PreferencesDialogModel(QObject* parent, EditorViewport* viewport);
~PreferencesDialogModel() override = default;

bool apply() override;
void reject() override;

// General
bool getMoveShipsWhenUndocking() const;
void setMoveShipsWhenUndocking(bool value);

bool getAlwaysSaveDisplayNames() const;
void setAlwaysSaveDisplayNames(bool value);

bool getErrorCheckerChecksForPotentialIssues() const;
void setErrorCheckerChecksForPotentialIssues(bool value);

bool getShowSexpHelpMissionEvents() const;
void setShowSexpHelpMissionEvents(bool value);
bool getShowSexpHelpMissionGoals() const;
void setShowSexpHelpMissionGoals(bool value);
bool getShowSexpHelpMissionCutscenes() const;
void setShowSexpHelpMissionCutscenes(bool value);
bool getShowSexpHelpShipEditor() const;
void setShowSexpHelpShipEditor(bool value);
bool getShowSexpHelpWingEditor() const;
void setShowSexpHelpWingEditor(bool value);

// Controls
QKeySequence getControlKey(ControlAction action) const;
void setControlKey(ControlAction action, const QKeySequence& sequence);
void resetControlDefaults();

// Grid
int getGridCenterX() const;
int getGridCenterY() const;
int getGridCenterZ() const;
void setGridCenterX(int value);
void setGridCenterY(int value);
void setGridCenterZ(int value);

GridPlane getGridPlane() const;
void setGridPlane(GridPlane plane);
void resetGrid();

private:
// General
bool _moveShipsWhenUndocking;
bool _alwaysSaveDisplayNames;
bool _errorCheckerChecksForPotentialIssues;
bool _showSexpHelpMissionEvents;
bool _showSexpHelpMissionGoals;
bool _showSexpHelpMissionCutscenes;
bool _showSexpHelpShipEditor;
bool _showSexpHelpWingEditor;

// Controls
std::map<ControlAction, QKeySequence> _controlKeys;

// Grid
int _gridCenterX;
int _gridCenterY;
int _gridCenterZ;
GridPlane _gridPlane;
};

} // namespace fso::fred::dialogs
22 changes: 4 additions & 18 deletions qtfred/src/ui/FredView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
#include <ui/dialogs/VariableDialog.h>
#include <ui/dialogs/MusicPlayerDialog.h>
#include <ui/dialogs/RelativeCoordinatesDialog.h>
#include <ui/dialogs/ControlsDialog.h>
#include <ui/dialogs/PreferencesDialog.h>
#include <ui/ControlBindings.h>
#include <iff_defs/iff_defs.h>

Expand Down Expand Up @@ -102,12 +102,10 @@ FredView::FredView(QWidget* parent) : QMainWindow(parent), ui(new Ui::FredView()
connect(propsAction, &QAction::triggered, this, &FredView::on_actionProps_triggered);
ui->menuObjects->insertAction(ui->actionWaypoint_Paths, propsAction);

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

FredView::~FredView() {
Expand Down Expand Up @@ -165,9 +163,6 @@ void FredView::setEditor(Editor* editor, EditorViewport* viewport) {
this,
[this]() { ui->actionRestore_Camera_Pos->setEnabled(!IS_VEC_NULL(&_viewport->saved_cam_orient.vec.fvec)); });

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

void FredView::loadMissionFile(const QString& pathName) {
Expand Down Expand Up @@ -1351,15 +1346,6 @@ void FredView::on_actionPrev_Subsystem_triggered(bool) {
void FredView::on_actionCancel_Subsystem_triggered(bool) {
fred->cancel_select_subsystem();
}
void FredView::on_actionMove_Ships_When_Undocking_triggered(bool) {
_viewport->Move_ships_when_undocking = !_viewport->Move_ships_when_undocking;
}
void FredView::on_actionAlways_Save_Display_Names_triggered(bool) {
_viewport->Always_save_display_names = !_viewport->Always_save_display_names;
}
void FredView::on_actionError_Checker_Checks_Potential_Issues_triggered(bool) {
_viewport->Error_checker_checks_potential_issues = !_viewport->Error_checker_checks_potential_issues;
}
void FredView::on_actionError_Checker_triggered(bool) {
fred->global_error_check();
}
Expand Down
4 changes: 0 additions & 4 deletions qtfred/src/ui/FredView.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,6 @@ class FredView: public QMainWindow, public IDialogProvider {
void on_actionPrev_Subsystem_triggered(bool);
void on_actionCancel_Subsystem_triggered(bool);

void on_actionMove_Ships_When_Undocking_triggered(bool);

void on_actionAlways_Save_Display_Names_triggered(bool);
void on_actionError_Checker_Checks_Potential_Issues_triggered(bool);
void on_actionError_Checker_triggered(bool);

void on_actionAbout_triggered(bool);
Expand Down
Loading
Loading