Audacity 3.2.0
BasicEffectUIServices.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file BasicEffectUIServices.cpp
6
7 Dominic Mazzoni
8 Vaughan Johnson
9
10 Paul Licameli split from Effect.h
11
12**********************************************************************/
14#include "EffectPlugin.h"
15#include "FileNames.h"
16
17#include <wx/dialog.h>
18#include <wx/ffile.h>
19#include <wx/filedlg.h>
20#include "SelectFile.h"
21#include "AudacityMessageBox.h"
22#include "../widgets/VetoDialogHook.h"
23
25 wxWindow &parent, wxDialog &dialog, EffectEditor *, bool forceModal) const
26{
27 dialog.Layout();
28 dialog.Fit();
29 dialog.SetMinSize(dialog.GetSize());
30 if (VetoDialogHook::Call(&dialog))
31 return 0;
32 if (plugin.SupportsRealtime() && !forceModal) {
33 dialog.Show();
34 // Return false to bypass effect processing
35 return 0;
36 }
37 return dialog.ShowModal();
38}
39
41 const EffectPlugin &context, EffectSettings &) const
42{
43 return true;
44}
45
47{
48 return true;
49}
50
52{
53 static const FileNames::FileTypes result {
54 { XO("Presets"), { wxT("txt") }, true },
56 };
57 return result;
58};
59
61 const EffectPlugin &plugin, const EffectSettings &settings) const
62{
63 wxString params;
65 auto commandId = plugin.GetSquashedName(plugin.GetSymbol().Internal());
66 params = commandId.GET() + ":" + params;
67
68 auto path = SelectFile(FileNames::Operation::Presets,
69 XO("Export Effect Parameters"),
70 wxEmptyString,
71 wxEmptyString,
72 wxEmptyString,
74 wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
75 nullptr);
76 if (path.empty()) {
77 return;
78 }
79
80 // Create/Open the file
81 wxFFile f(path, wxT("wb"));
82 if (!f.IsOpened())
83 {
85 XO("Could not open file: \"%s\"").Format( path ),
86 XO("Error Saving Effect Presets"),
87 wxICON_EXCLAMATION,
88 NULL);
89 return;
90 }
91
92 f.Write(params);
93 if (f.Error())
94 {
96 XO("Error writing to file: \"%s\"").Format( path ),
97 XO("Error Saving Effect Presets"),
98 wxICON_EXCLAMATION,
99 NULL);
100 }
101
102 f.Close();
103
104
105 //SetWindowTitle();
106
107}
108
110 const EffectPlugin &plugin, EffectSettings &settings) const
111{
112 wxString params;
113
114 auto path = SelectFile(FileNames::Operation::Presets,
115 XO("Import Effect Parameters"),
116 wxEmptyString,
117 wxEmptyString,
118 wxEmptyString,
119 PresetTypes(),
120 wxFD_OPEN | wxRESIZE_BORDER,
121 nullptr);
122 if (path.empty()) {
123 return {};
124 }
125
126 wxFFile f(path);
127 if (!f.IsOpened())
128 return {};
129
130 OptionalMessage result{};
131
132 if (f.ReadAll(&params)) {
133 wxString ident = params.BeforeFirst(':');
134 params = params.AfterFirst(':');
135
136 auto commandId = plugin.GetSquashedName(plugin.GetSymbol().Internal());
137
138 if (ident != commandId) {
139 // effect identifiers are a sensible length!
140 // must also have some params.
141 if ((params.Length() < 2 ) || (ident.Length() < 2) ||
142 (ident.Length() > 30))
143 {
145 /* i18n-hint %s will be replaced by a file name */
146 XO("%s: is not a valid presets file.\n")
147 .Format(wxFileNameFromPath(path)));
148 }
149 else
150 {
152 /* i18n-hint %s will be replaced by a file name */
153 XO("%s: is for a different Effect, Generator or Analyzer.\n")
154 .Format(wxFileNameFromPath(path)));
155 }
156 return {};
157 }
158 result = plugin.LoadSettingsFromString(params, settings);
159 }
160
161 //SetWindowTitle();
162
163 return result;
164}
165
167{
168}
wxT("CloseDown"))
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
static const FileNames::FileTypes & PresetTypes()
EffectDistortionSettings params
Definition: Distortion.cpp:77
std::optional< std::unique_ptr< EffectSettingsAccess::Message > > OptionalMessage
XO("Cut/Copy/Paste")
static CommandHandlerObject & ident(AudacityProject &project)
FilePath SelectFile(FileNames::Operation op, const TranslatableString &message, const FilePath &default_path, const FilePath &default_filename, const FileExtension &default_extension, const FileTypes &fileTypes, int flags, wxWindow *parent)
Definition: SelectFile.cpp:17
static Settings & settings()
Definition: TrackInfo.cpp:83
bool ValidateUI(const EffectPlugin &context, EffectSettings &) const override
void ExportPresets(const EffectPlugin &plugin, const EffectSettings &settings) const override
int ShowClientInterface(const EffectPlugin &plugin, wxWindow &parent, wxDialog &dialog, EffectEditor *pEditor, bool forceModal) const override
bool CloseUI() const override
void ShowOptions(const EffectPlugin &plugin) const override
OptionalMessage ImportPresets(const EffectPlugin &plugin, EffectSettings &settings) const override
virtual ComponentInterfaceSymbol GetSymbol() const =0
const wxString & Internal() const
static Identifier GetSquashedName(const Identifier &ident)
A utility that strips spaces and CamelCases a name.
Factory of instances of an effect.
Definition: EffectPlugin.h:36
virtual bool SaveSettingsAsString(const EffectSettings &settings, wxString &parms) const =0
virtual OptionalMessage LoadSettingsFromString(const wxString &parms, EffectSettings &settings) const =0
static int DoMessageBox(const EffectPlugin &plugin, const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
std::vector< FileType > FileTypes
Definition: FileNames.h:75
FILES_API const FileType AllFiles
Definition: FileNames.h:70
Abstract base class used in importing a file.
static result_type Call(Arguments &&...arguments)
Null check of the installed function is done for you.
Externalized state of a plug-in.