Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
settings_manager.h
1// SPDX-FileCopyrightText: © 2018-2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "utils/logger.h"
7#include "utils/qt.h"
8
9#include <QCoreApplication>
10#include <QSettings>
11#include <QStandardPaths>
12#include <QtQmlIntegration>
13
14using namespace Qt::StringLiterals;
15
16namespace zrythm::gui
17{
18
19#define DEFINE_SETTING_PROPERTY(ptype, name, default_value) \
20\
21 Q_PROPERTY ( \
22 ptype name READ get_##name WRITE set_##name NOTIFY name##_changed) \
23\
24public: \
25 [[nodiscard]] static ptype get_default_##name () \
26 { \
27 return default_value; \
28 } \
29 [[nodiscard]] ptype get_##name () const \
30 { \
31 return settings_.value (QStringLiteral (#name), default_value) \
32 .value<ptype> (); \
33 } \
34 [[nodiscard]] static ptype name () \
35 { \
36 return get_instance ()->get_##name (); \
37 } \
38 void set_##name (ptype value) \
39 { \
40 const auto current_value = \
41 settings_.value (QStringLiteral (#name), default_value).value<ptype> (); \
42 if (utils::values_equal_for_qproperty_type (current_value, value)) \
43 return; \
44 z_debug ("setting '{}' to '{}'", #name, value); \
45 settings_.setValue (QStringLiteral (#name), value); \
46 Q_EMIT name##_changed (value); \
47 settings_.sync (); \
48 } \
49 Q_SIGNAL void name##_changed (ptype value);
50
51class SettingsManager : public QObject
52{
53 Q_OBJECT
54 QML_ELEMENT
55 QML_UNCREATABLE ("")
56
57 // FIXME: should be part of DirectoryManager, not an editable setting
58 DEFINE_SETTING_PROPERTY (
59 QString,
60 zrythm_user_path,
61 QStandardPaths::writableLocation (QStandardPaths::AppDataLocation))
62 DEFINE_SETTING_PROPERTY (bool, first_run, true)
63 // DEFINE_SETTING_PROPERTY (bool, transportLoop, true)
64 DEFINE_SETTING_PROPERTY (bool, transportReturnToCue, true)
65 // note: in amplitude (0 to 2)
66 DEFINE_SETTING_PROPERTY (double, metronomeVolume, 1.0)
67 DEFINE_SETTING_PROPERTY (bool, metronomeEnabled, -1)
68 DEFINE_SETTING_PROPERTY (int, metronomeCountIn, 0) // number of bars
69 // DEFINE_SETTING_PROPERTY (bool, punchModeEnabled, false)
70 DEFINE_SETTING_PROPERTY (bool, startPlaybackOnMidiInput, false)
71 DEFINE_SETTING_PROPERTY (int, recordingMode, 2) // takes
72 DEFINE_SETTING_PROPERTY (int, recordingPreroll, 0) // number of bars
73 DEFINE_SETTING_PROPERTY (int, jackTransportType, 0) // timebase master
74 DEFINE_SETTING_PROPERTY (QString, icon_theme, u"zrythm-dark"_s)
75 DEFINE_SETTING_PROPERTY (QStringList, recent_projects, QStringList ())
76 DEFINE_SETTING_PROPERTY (QStringList, lv2_search_paths, QStringList ())
77 DEFINE_SETTING_PROPERTY (QStringList, vst2_search_paths, QStringList ())
78 DEFINE_SETTING_PROPERTY (QStringList, vst3_search_paths, QStringList ())
79 DEFINE_SETTING_PROPERTY (QStringList, sf2_search_paths, QStringList ())
80 DEFINE_SETTING_PROPERTY (QStringList, sfz_search_paths, QStringList ())
81 DEFINE_SETTING_PROPERTY (QStringList, dssi_search_paths, QStringList ())
82 DEFINE_SETTING_PROPERTY (QStringList, ladspa_search_paths, QStringList ())
83 DEFINE_SETTING_PROPERTY (QStringList, clap_search_paths, QStringList ())
84 DEFINE_SETTING_PROPERTY (QStringList, jsfx_search_paths, QStringList ())
85 DEFINE_SETTING_PROPERTY (QStringList, au_search_paths, QStringList ())
86 DEFINE_SETTING_PROPERTY (
87 QString,
88 new_project_directory,
89 utils::Utf8String::from_path (
90 (utils::Utf8String::from_qstring (
91 QStandardPaths::writableLocation (QStandardPaths::DocumentsLocation))
92 .to_path ()
93 / utils::Utf8String::from_qstring (QCoreApplication::applicationName ())
94 .to_path ()))
95 .to_qstring ())
96 DEFINE_SETTING_PROPERTY (bool, leftPanelVisible, true)
97 DEFINE_SETTING_PROPERTY (bool, rightPanelVisible, true)
98 DEFINE_SETTING_PROPERTY (bool, bottomPanelVisible, true)
99 DEFINE_SETTING_PROPERTY (bool, trackAutoArm, true)
100 DEFINE_SETTING_PROPERTY (int, audioBackend, 0) // dummy
101 DEFINE_SETTING_PROPERTY (int, midiBackend, 0) // dummy
102 DEFINE_SETTING_PROPERTY (int, panLaw, 1)
103 DEFINE_SETTING_PROPERTY (int, panAlgorithm, 2)
104 DEFINE_SETTING_PROPERTY (QStringList, midiControllers, QStringList ())
105 DEFINE_SETTING_PROPERTY (QStringList, audioInputs, QStringList ())
106 DEFINE_SETTING_PROPERTY (QStringList, fileBrowserBookmarks, QStringList ())
107 DEFINE_SETTING_PROPERTY (QString, fileBrowserLastLocation, {})
108 DEFINE_SETTING_PROPERTY (int, undoStackLength, 128)
109 DEFINE_SETTING_PROPERTY (int, pianoRollHighlight, 3) // both
110 DEFINE_SETTING_PROPERTY (int, pianoRollMidiModifier, 0) // velocity
111 /* these are all in amplitude (0.0 ~ 2.0) */
112 DEFINE_SETTING_PROPERTY (float, monitorVolume, 1.0f)
113 DEFINE_SETTING_PROPERTY (float, monitorMuteVolume, 0.0f)
114 DEFINE_SETTING_PROPERTY (float, monitorListenVolume, 1.0f)
115 DEFINE_SETTING_PROPERTY (float, monitorDimVolume, 0.1f)
116 DEFINE_SETTING_PROPERTY (bool, monitorDimEnabled, false)
117 DEFINE_SETTING_PROPERTY (bool, monitorMuteEnabled, false)
118 DEFINE_SETTING_PROPERTY (bool, monitorMonoEnabled, false)
119 DEFINE_SETTING_PROPERTY (bool, openPluginsOnInstantiation, true)
120 // list of output devices to connect each channel to
121 DEFINE_SETTING_PROPERTY (
122 QStringList,
123 monitorLeftOutputDeviceList,
124 QStringList ())
125 DEFINE_SETTING_PROPERTY (
126 QStringList,
127 monitorRightOutputDeviceList,
128 QStringList ())
129 DEFINE_SETTING_PROPERTY (bool, musicalMode, false)
130 DEFINE_SETTING_PROPERTY (QString, rtAudioAudioDeviceName, {})
131 DEFINE_SETTING_PROPERTY (int, sampleRate, 3) // 48000
132 DEFINE_SETTING_PROPERTY (int, audioBufferSize, 5) // 512
133 DEFINE_SETTING_PROPERTY (int, bounceTailLength, 100) // 100ms
134 DEFINE_SETTING_PROPERTY (bool, bounceWithParents, 100)
135 DEFINE_SETTING_PROPERTY (int, bounceStep, 2) // post-fader
136 DEFINE_SETTING_PROPERTY (bool, disableAfterBounce, true)
137 DEFINE_SETTING_PROPERTY (bool, autoSelectTracks, true)
138 DEFINE_SETTING_PROPERTY (int, lastAutomationFunction, -1)
139 DEFINE_SETTING_PROPERTY (int, lastAudioFunction, -1)
140 DEFINE_SETTING_PROPERTY (double, lastAudioFunctionPitchShiftRatio, 1.0)
141 DEFINE_SETTING_PROPERTY (int, lastMidiFunction, -1)
142 DEFINE_SETTING_PROPERTY (QString, fileBrowserInstrument, {})
143 DEFINE_SETTING_PROPERTY (int, automationCurveAlgorithm, 1) // superellipse
144 DEFINE_SETTING_PROPERTY (double, timelineLastCreatedObjectLengthInTicks, 3840.0)
145 DEFINE_SETTING_PROPERTY (double, editorLastCreatedObjectLengthInTicks, 480.0)
146 DEFINE_SETTING_PROPERTY (QString, uiLocale, {})
147
148public:
149 SettingsManager (QObject * parent = nullptr);
150
151 static SettingsManager * get_instance ();
152
156 Q_INVOKABLE void reset_and_sync ();
157
158private:
159 QSettings settings_;
160};
161
162} // namespace zrythm::gui::glue
163
164#undef DEFINE_SETTING_PROPERTY