11use iced:: { Element , Length , Task , Theme } ;
22use log:: { error, info} ;
33
4- use crate :: gui:: components:: { control:: Control , stage_list:: StageList } ;
4+ use crate :: gui:: components:: { control:: Control , preset_bar :: PresetBar , stage_list:: StageList } ;
55use crate :: gui:: config:: { StageConfig , StageType } ;
66use crate :: gui:: messages:: { Message , StageMessage } ;
7+ use crate :: gui:: preset:: { Preset , PresetManager } ;
78use crate :: io:: manager:: ProcessorManager ;
89use crate :: sim:: chain:: AmplifierChain ;
910
10- #[ derive( Debug ) ]
1111pub struct AmplifierApp {
1212 processor_manager : ProcessorManager ,
1313 stages : Vec < StageConfig > ,
1414 selected_stage_type : StageType ,
1515 is_recording : bool ,
16+ preset_manager : PresetManager ,
17+ selected_preset : Option < String > ,
18+ preset_bar : PresetBar ,
19+ new_preset_name : String ,
20+ show_save_input : bool ,
1621}
1722
1823impl AmplifierApp {
1924 pub fn new ( processor_manager : ProcessorManager ) -> Self {
20- Self {
25+ let preset_manager = PresetManager :: new ( "./presets" ) . unwrap_or_else ( |e| {
26+ error ! ( "Failed to create preset manager: {e}" ) ;
27+ // Create an empty preset manager as fallback
28+ PresetManager :: new ( std:: env:: temp_dir ( ) . join ( "rustortion_presets_fallback" ) )
29+ . expect ( "Failed to create fallback preset manager" )
30+ } ) ;
31+
32+ let presets = preset_manager. get_presets ( ) ;
33+ let selected_preset = presets. first ( ) . map ( |p| p. name . clone ( ) ) ;
34+ let preset_bar = PresetBar :: new ( presets, selected_preset. clone ( ) ) ;
35+
36+ // Load the first preset if available
37+ let stages = if let Some ( preset_name) = & selected_preset {
38+ preset_manager
39+ . get_preset_by_name ( preset_name)
40+ . map ( |p| p. stages . clone ( ) )
41+ . unwrap_or_default ( )
42+ } else {
43+ Vec :: new ( )
44+ } ;
45+
46+ let app = Self {
2147 processor_manager,
22- stages : Vec :: new ( ) ,
48+ stages,
2349 selected_stage_type : StageType :: default ( ) ,
2450 is_recording : false ,
25- }
51+ preset_manager,
52+ selected_preset,
53+ preset_bar,
54+ new_preset_name : String :: new ( ) ,
55+ show_save_input : false ,
56+ } ;
57+
58+ // Update the processor chain with the loaded preset
59+ app. update_processor_chain ( ) ;
60+
61+ app
2662 }
2763
2864 pub fn update ( & mut self , message : Message ) -> Task < Message > {
@@ -55,6 +91,103 @@ impl AmplifierApp {
5591 Message :: StageTypeSelected ( stage_type) => {
5692 self . selected_stage_type = stage_type;
5793 }
94+ Message :: PresetSelected ( preset_name) => {
95+ if let Some ( preset) = self . preset_manager . get_preset_by_name ( & preset_name) {
96+ self . stages = preset. stages . clone ( ) ;
97+ self . selected_preset = Some ( preset_name. clone ( ) ) ;
98+ self . preset_bar
99+ . set_selected_preset ( Some ( preset_name. clone ( ) ) ) ;
100+ should_update_chain = true ;
101+ info ! ( "Loaded preset: {preset_name}" ) ;
102+ }
103+ }
104+ Message :: ShowSavePreset => {
105+ self . show_save_input = true ;
106+ self . preset_bar . show_save_input ( true ) ;
107+ }
108+ Message :: CancelSavePreset => {
109+ self . show_save_input = false ;
110+ self . new_preset_name . clear ( ) ;
111+ self . preset_bar . show_save_input ( false ) ;
112+ }
113+ Message :: PresetNameChanged ( name) => {
114+ self . new_preset_name = name. clone ( ) ;
115+ self . preset_bar . set_new_preset_name ( name) ;
116+ }
117+ Message :: SavePreset => {
118+ if !self . new_preset_name . trim ( ) . is_empty ( ) {
119+ let preset = Preset :: new ( self . new_preset_name . clone ( ) , self . stages . clone ( ) ) ;
120+
121+ match self . preset_manager . save_preset ( & preset) {
122+ Ok ( ( ) ) => {
123+ info ! ( "Saved preset: {}" , self . new_preset_name) ;
124+ self . selected_preset = Some ( self . new_preset_name . clone ( ) ) ;
125+ self . preset_bar
126+ . update_presets ( self . preset_manager . get_presets ( ) ) ;
127+ self . preset_bar
128+ . set_selected_preset ( Some ( self . new_preset_name . clone ( ) ) ) ;
129+ self . show_save_input = false ;
130+ self . preset_bar . show_save_input ( false ) ;
131+ self . new_preset_name . clear ( ) ;
132+ }
133+ Err ( e) => {
134+ error ! ( "Failed to save preset: {e}" ) ;
135+ }
136+ }
137+ }
138+ }
139+ Message :: UpdateCurrentPreset => {
140+ if let Some ( ref preset_name) = self . selected_preset {
141+ let preset = Preset :: new ( preset_name. clone ( ) , self . stages . clone ( ) ) ;
142+
143+ match self . preset_manager . save_preset ( & preset) {
144+ Ok ( ( ) ) => {
145+ info ! ( "Updated preset: {preset_name}" ) ;
146+ self . preset_bar
147+ . update_presets ( self . preset_manager . get_presets ( ) ) ;
148+ }
149+ Err ( e) => {
150+ error ! ( "Failed to update preset: {e}" ) ;
151+ }
152+ }
153+ }
154+ }
155+ Message :: DeletePreset ( preset_name) => {
156+ match self . preset_manager . delete_preset ( & preset_name) {
157+ Ok ( ( ) ) => {
158+ info ! ( "Deleted preset: {preset_name}" ) ;
159+ self . preset_bar
160+ . update_presets ( self . preset_manager . get_presets ( ) ) ;
161+
162+ // Clear selection if we deleted the current preset
163+ if self . selected_preset . as_ref ( ) == Some ( & preset_name) {
164+ self . selected_preset = None ;
165+ self . preset_bar . set_selected_preset ( None ) ;
166+ // Optionally load the first available preset or clear stages
167+ if let Some ( first_preset) = self . preset_manager . get_presets ( ) . first ( ) {
168+ self . stages = first_preset. stages . clone ( ) ;
169+ self . selected_preset = Some ( first_preset. name . clone ( ) ) ;
170+ self . preset_bar
171+ . set_selected_preset ( Some ( first_preset. name . clone ( ) ) ) ;
172+ } else {
173+ self . stages . clear ( ) ;
174+ }
175+
176+ should_update_chain = true ;
177+ }
178+ }
179+ Err ( e) => {
180+ error ! ( "Failed to delete preset: {e}" ) ;
181+ }
182+ }
183+ }
184+ Message :: ConfirmOverwritePreset => {
185+ self . save_current_preset ( ) ;
186+ self . preset_bar . hide_overwrite_confirmation ( ) ;
187+ }
188+ Message :: CancelOverwritePreset => {
189+ self . preset_bar . hide_overwrite_confirmation ( ) ;
190+ }
58191 Message :: StartRecording => match self . processor_manager . enable_recording ( ) {
59192 Ok ( ( ) ) => {
60193 self . is_recording = true ;
@@ -149,6 +282,26 @@ impl AmplifierApp {
149282 }
150283 }
151284
285+ fn save_current_preset ( & mut self ) {
286+ let preset = Preset :: new ( self . new_preset_name . clone ( ) , self . stages . clone ( ) ) ;
287+
288+ match self . preset_manager . save_preset ( & preset) {
289+ Ok ( ( ) ) => {
290+ info ! ( "Saved preset: {}" , self . new_preset_name) ;
291+ self . selected_preset = Some ( self . new_preset_name . clone ( ) ) ;
292+ self . preset_bar
293+ . update_presets ( self . preset_manager . get_presets ( ) ) ;
294+ self . preset_bar
295+ . set_selected_preset ( Some ( self . new_preset_name . clone ( ) ) ) ;
296+ self . show_save_input = false ;
297+ self . preset_bar . show_save_input ( false ) ;
298+ self . new_preset_name . clear ( ) ;
299+ }
300+ Err ( e) => {
301+ error ! ( "Failed to save preset: {e}" ) ;
302+ }
303+ }
304+ }
152305 fn update_processor_chain ( & self ) {
153306 let sample_rate = self . processor_manager . sample_rate ( ) ;
154307 let chain = build_amplifier_chain ( & self . stages , sample_rate) ;
@@ -160,6 +313,7 @@ impl AmplifierApp {
160313
161314 container (
162315 column ! [
316+ self . preset_bar. view( ) ,
163317 StageList :: new( & self . stages) . view( ) ,
164318 Control :: new( self . selected_stage_type, self . is_recording) . view( )
165319 ]
0 commit comments