Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
app_settings.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "utils/isettings_backend.h"
7#include "utils/qt.h"
8#include "utils/utf8_string.h"
9
10#include <QCoreApplication>
11#include <QStandardPaths>
12#include <QtQmlIntegration/qqmlintegration.h>
13
14using namespace Qt::StringLiterals;
15
16namespace zrythm::utils::detail
17{
18void
19log_setting_change (const char * name, const QVariant &value);
20}
21
22#define DEFINE_SETTING_PROPERTY(ptype, name, default_value) \
23\
24 Q_PROPERTY (ptype name READ name WRITE set_##name NOTIFY name##Changed) \
25\
26public: \
27 [[nodiscard]] static ptype get_default_##name () \
28 { \
29 return default_value; \
30 } \
31 [[nodiscard]] ptype name () const \
32 { \
33 return backend_->value (QStringLiteral (#name), default_value) \
34 .value<ptype> (); \
35 } \
36 void set_##name (ptype value) \
37 { \
38 const auto current_value = \
39 backend_->value (QStringLiteral (#name), default_value).value<ptype> (); \
40 if (utils::values_equal_for_qproperty_type (current_value, value)) \
41 return; \
42 detail::log_setting_change (#name, QVariant::fromValue (value)); \
43 backend_->setValue (QStringLiteral (#name), value); \
44 Q_EMIT name##Changed (value); \
45 } \
46 Q_SIGNAL void name##Changed (ptype value);
47
48namespace zrythm::utils
49{
50class AppSettings : public QObject
51{
52 Q_OBJECT
53 QML_ELEMENT
54 QML_UNCREATABLE ("")
55
56 // FIXME: should be part of DirectoryManager, not an editable setting
57 DEFINE_SETTING_PROPERTY (
58 QString,
59 zrythm_user_path,
60 QStandardPaths::writableLocation (QStandardPaths::AppDataLocation))
61 DEFINE_SETTING_PROPERTY (bool, first_run, true)
62 // DEFINE_SETTING_PROPERTY (bool, transportLoop, true)
63 DEFINE_SETTING_PROPERTY (bool, transportReturnToCue, true)
64 DEFINE_SETTING_PROPERTY (bool, showCacheActivity, false)
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 explicit AppSettings (
150 std::unique_ptr<ISettingsBackend> backend,
151 QObject * parent = nullptr);
152
153private:
154 std::unique_ptr<ISettingsBackend> backend_;
155};
156}
157
158#undef DEFINE_SETTING_PROPERTY
String utilities.