msansm1/rss-podcast-dlpublic Fork
⑂ 901512c
Commits
⬇ Clone ▾
git clone https://git.rickub.com/msansm1/rss-podcast-dl.git
git clone ssh://git@rickub.com/msansm1/rss-podcast-dl.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

Fix: Correction bug de formulaire - champs reinitialises a chaque frame

msansm1 committed 2026-07-03T22:37:01+02:00 Browse files
901512c parent: 6f287ca
modified src/config/app_state.rs +47 -0
@@ -17,8 +17,22 @@ pub struct AppState {
1717 pub current_feed: Option<usize>,
1818 /// Whether the add feed dialog is visible
1919 pub show_add_feed_dialog: bool,
20+ /// Temporary storage for new feed name during add
21+ pub new_feed_name: String,
22+ /// Temporary storage for new feed URL during add
23+ pub new_feed_url: String,
24+ /// Temporary storage for new feed download path during add
25+ pub new_feed_download_path: String,
2026 /// Whether the edit feed dialog is visible
2127 pub show_edit_feed_dialog: bool,
28+ /// Temporary storage for edit feed name
29+ pub edit_feed_name: String,
30+ /// Temporary storage for edit feed URL
31+ pub edit_feed_url: String,
32+ /// Temporary storage for edit feed download path
33+ pub edit_feed_download_path: String,
34+ /// Temporary storage for edit feed enabled state
35+ pub edit_feed_enabled: bool,
2236 /// Index of the feed being edited (if any)
2337 pub editing_feed_index: Option<usize>,
2438 /// Whether a synchronization is currently in progress
@@ -42,7 +56,14 @@ impl AppState {
4256 feeds: Vec::new(),
4357 current_feed: None,
4458 show_add_feed_dialog: false,
59+ new_feed_name: String::new(),
60+ new_feed_url: String::new(),
61+ new_feed_download_path: String::new(),
4562 show_edit_feed_dialog: false,
63+ edit_feed_name: String::new(),
64+ edit_feed_url: String::new(),
65+ edit_feed_download_path: String::new(),
66+ edit_feed_enabled: true,
4667 editing_feed_index: None,
4768 sync_in_progress: false,
4869 download_progress: HashMap::new(),
@@ -191,6 +212,32 @@ impl AppState {
191212 pub fn get_download_progress(&self, feed_id: &str) -> f32 {
192213 *self.download_progress.get(feed_id).unwrap_or(&0.0)
193214 }
215+
216+ /// Clears the new feed form fields
217+ pub fn clear_new_feed_form(&mut self) {
218+ self.new_feed_name.clear();
219+ self.new_feed_url.clear();
220+ self.new_feed_download_path.clear();
221+ }
222+
223+ /// Loads feed data into edit form fields
224+ pub fn load_edit_feed_form(&mut self, index: usize) {
225+ if let Some(feed) = self.feeds.get(index) {
226+ self.edit_feed_name = feed.name.clone();
227+ self.edit_feed_url = feed.url.clone();
228+ self.edit_feed_download_path = feed.download_path.to_string_lossy().to_string();
229+ self.edit_feed_enabled = feed.enabled;
230+ }
231+ }
232+
233+ /// Clears the edit feed form fields
234+ pub fn clear_edit_feed_form(&mut self) {
235+ self.edit_feed_name.clear();
236+ self.edit_feed_url.clear();
237+ self.edit_feed_download_path.clear();
238+ self.edit_feed_enabled = true;
239+ self.editing_feed_index = None;
240+ }
194241 }
195242
196243 #[cfg(test)]
@@ -17,8 +17,22 @@ pub struct AppState {
17 pub current_feed: Option<usize>,17 pub current_feed: Option<usize>,
18 /// Whether the add feed dialog is visible18 /// Whether the add feed dialog is visible
19 pub show_add_feed_dialog: bool,19 pub show_add_feed_dialog: bool,
20+ /// Temporary storage for new feed name during add
21+ pub new_feed_name: String,
22+ /// Temporary storage for new feed URL during add
23+ pub new_feed_url: String,
24+ /// Temporary storage for new feed download path during add
25+ pub new_feed_download_path: String,
20 /// Whether the edit feed dialog is visible26 /// Whether the edit feed dialog is visible
21 pub show_edit_feed_dialog: bool,27 pub show_edit_feed_dialog: bool,
28+ /// Temporary storage for edit feed name
29+ pub edit_feed_name: String,
30+ /// Temporary storage for edit feed URL
31+ pub edit_feed_url: String,
32+ /// Temporary storage for edit feed download path
33+ pub edit_feed_download_path: String,
34+ /// Temporary storage for edit feed enabled state
35+ pub edit_feed_enabled: bool,
22 /// Index of the feed being edited (if any)36 /// Index of the feed being edited (if any)
23 pub editing_feed_index: Option<usize>,37 pub editing_feed_index: Option<usize>,
24 /// Whether a synchronization is currently in progress38 /// Whether a synchronization is currently in progress
@@ -42,7 +56,14 @@ impl AppState {
42 feeds: Vec::new(),56 feeds: Vec::new(),
43 current_feed: None,57 current_feed: None,
44 show_add_feed_dialog: false,58 show_add_feed_dialog: false,
59+ new_feed_name: String::new(),
60+ new_feed_url: String::new(),
61+ new_feed_download_path: String::new(),
45 show_edit_feed_dialog: false,62 show_edit_feed_dialog: false,
63+ edit_feed_name: String::new(),
64+ edit_feed_url: String::new(),
65+ edit_feed_download_path: String::new(),
66+ edit_feed_enabled: true,
46 editing_feed_index: None,67 editing_feed_index: None,
47 sync_in_progress: false,68 sync_in_progress: false,
48 download_progress: HashMap::new(),69 download_progress: HashMap::new(),
@@ -191,6 +212,32 @@ impl AppState {
191 pub fn get_download_progress(&self, feed_id: &str) -> f32 {212 pub fn get_download_progress(&self, feed_id: &str) -> f32 {
192 *self.download_progress.get(feed_id).unwrap_or(&0.0)213 *self.download_progress.get(feed_id).unwrap_or(&0.0)
193 }214 }
215+
216+ /// Clears the new feed form fields
217+ pub fn clear_new_feed_form(&mut self) {
218+ self.new_feed_name.clear();
219+ self.new_feed_url.clear();
220+ self.new_feed_download_path.clear();
221+ }
222+
223+ /// Loads feed data into edit form fields
224+ pub fn load_edit_feed_form(&mut self, index: usize) {
225+ if let Some(feed) = self.feeds.get(index) {
226+ self.edit_feed_name = feed.name.clone();
227+ self.edit_feed_url = feed.url.clone();
228+ self.edit_feed_download_path = feed.download_path.to_string_lossy().to_string();
229+ self.edit_feed_enabled = feed.enabled;
230+ }
231+ }
232+
233+ /// Clears the edit feed form fields
234+ pub fn clear_edit_feed_form(&mut self) {
235+ self.edit_feed_name.clear();
236+ self.edit_feed_url.clear();
237+ self.edit_feed_download_path.clear();
238+ self.edit_feed_enabled = true;
239+ self.editing_feed_index = None;
240+ }
194 }241 }
195 242
196 #[cfg(test)]243 #[cfg(test)]
modified src/ui/add_feed_dialog.rs +11 -8
@@ -14,9 +14,6 @@ pub fn draw_add_feed_dialog(state: &mut AppState, ui: &mut Ui) {
1414 }
1515
1616 let show_dialog = RefCell::new(state.show_add_feed_dialog);
17- let mut name = String::new();
18- let mut url = String::new();
19- let mut download_path = String::new();
2017
2118 egui::Window::new("Ajouter un flux RSS")
2219 .open(&mut *show_dialog.borrow_mut())
@@ -27,30 +24,36 @@ pub fn draw_add_feed_dialog(state: &mut AppState, ui: &mut Ui) {
2724 ui.separator();
2825
2926 ui.label("Nom du podcast");
30- ui.text_edit_singleline(&mut name);
27+ ui.text_edit_singleline(&mut state.new_feed_name);
3128
3229 ui.label("URL du flux RSS");
33- ui.text_edit_singleline(&mut url);
30+ ui.text_edit_singleline(&mut state.new_feed_url);
3431
3532 ui.label("Dossier de téléchargement");
36- ui.text_edit_singleline(&mut download_path);
33+ ui.text_edit_singleline(&mut state.new_feed_download_path);
3734
3835 ui.separator();
3936
4037 // Validation
41- let valid = !url.is_empty() && !download_path.is_empty();
38+ let valid = !state.new_feed_url.is_empty() && !state.new_feed_download_path.is_empty();
4239
4340 ui.horizontal(|ui| {
4441 if valid && ui.button("Ajouter").clicked() {
45- let feed = Feed::new(url.clone(), name.clone(), PathBuf::from(download_path.clone()));
42+ let feed = Feed::new(
43+ state.new_feed_url.clone(),
44+ state.new_feed_name.clone(),
45+ PathBuf::from(state.new_feed_download_path.clone())
46+ );
4647 state.add_feed(feed);
4748 super::super::config::storage::save_feeds_default(&state.feeds).ok();
49+ state.clear_new_feed_form();
4850 *show_dialog.borrow_mut() = false;
4951 } else {
5052 ui.label("Veuillez remplir tous les champs");
5153 }
5254
5355 if ui.button("Annuler").clicked() {
56+ state.clear_new_feed_form();
5457 *show_dialog.borrow_mut() = false;
5558 }
5659 });
@@ -14,9 +14,6 @@ pub fn draw_add_feed_dialog(state: &mut AppState, ui: &mut Ui) {
14 }14 }
15 15
16 let show_dialog = RefCell::new(state.show_add_feed_dialog);16 let show_dialog = RefCell::new(state.show_add_feed_dialog);
17- let mut name = String::new();
18- let mut url = String::new();
19- let mut download_path = String::new();
20 17
21 egui::Window::new("Ajouter un flux RSS")18 egui::Window::new("Ajouter un flux RSS")
22 .open(&mut *show_dialog.borrow_mut())19 .open(&mut *show_dialog.borrow_mut())
@@ -27,30 +24,36 @@ pub fn draw_add_feed_dialog(state: &mut AppState, ui: &mut Ui) {
27 ui.separator();24 ui.separator();
28 25
29 ui.label("Nom du podcast");26 ui.label("Nom du podcast");
30- ui.text_edit_singleline(&mut name);27+ ui.text_edit_singleline(&mut state.new_feed_name);
31 28
32 ui.label("URL du flux RSS");29 ui.label("URL du flux RSS");
33- ui.text_edit_singleline(&mut url);30+ ui.text_edit_singleline(&mut state.new_feed_url);
34 31
35 ui.label("Dossier de téléchargement");32 ui.label("Dossier de téléchargement");
36- ui.text_edit_singleline(&mut download_path);33+ ui.text_edit_singleline(&mut state.new_feed_download_path);
37 34
38 ui.separator();35 ui.separator();
39 36
40 // Validation37 // Validation
41- let valid = !url.is_empty() && !download_path.is_empty();38+ let valid = !state.new_feed_url.is_empty() && !state.new_feed_download_path.is_empty();
42 39
43 ui.horizontal(|ui| {40 ui.horizontal(|ui| {
44 if valid && ui.button("Ajouter").clicked() {41 if valid && ui.button("Ajouter").clicked() {
45- let feed = Feed::new(url.clone(), name.clone(), PathBuf::from(download_path.clone()));42+ let feed = Feed::new(
43+ state.new_feed_url.clone(),
44+ state.new_feed_name.clone(),
45+ PathBuf::from(state.new_feed_download_path.clone())
46+ );
46 state.add_feed(feed);47 state.add_feed(feed);
47 super::super::config::storage::save_feeds_default(&state.feeds).ok();48 super::super::config::storage::save_feeds_default(&state.feeds).ok();
49+ state.clear_new_feed_form();
48 *show_dialog.borrow_mut() = false;50 *show_dialog.borrow_mut() = false;
49 } else {51 } else {
50 ui.label("Veuillez remplir tous les champs");52 ui.label("Veuillez remplir tous les champs");
51 }53 }
52 54
53 if ui.button("Annuler").clicked() {55 if ui.button("Annuler").clicked() {
56+ state.clear_new_feed_form();
54 *show_dialog.borrow_mut() = false;57 *show_dialog.borrow_mut() = false;
55 }58 }
56 });59 });
modified src/ui/feed_edit_dialog.rs +17 -22
@@ -15,59 +15,54 @@ pub fn draw_edit_feed_dialog(state: &mut AppState, ui: &mut Ui) {
1515 };
1616
1717 if editing_index >= state.feeds.len() {
18- state.editing_feed_index = None;
19- state.show_edit_feed_dialog = false;
18+ state.clear_edit_feed_form();
2019 return;
2120 }
2221
22+ // Load form data on first open
23+ if state.edit_feed_name.is_empty() && state.editing_feed_index == Some(editing_index) {
24+ state.load_edit_feed_form(editing_index);
25+ }
26+
2327 let show_dialog = RefCell::new(state.show_edit_feed_dialog);
24- let name = state.feeds[editing_index].name.clone();
25- let url = state.feeds[editing_index].url.clone();
26- let download_path = state.feeds[editing_index].download_path.to_string_lossy().to_string();
27- let enabled = state.feeds[editing_index].enabled;
28-
29- let mut name = name;
30- let mut url = url;
31- let mut download_path = download_path;
32- let mut enabled = enabled;
3328
3429 egui::Window::new("Éditer le flux")
3530 .open(&mut *show_dialog.borrow_mut())
3631 .resizable(false)
3732 .show(ui.ctx(), |ui| {
3833 ui.vertical(|ui| {
39- ui.label(format!("Éditer: {}", name));
34+ ui.label(format!("Éditer: {}", state.edit_feed_name));
4035 ui.separator();
4136
4237 ui.label("Nom du podcast");
43- ui.text_edit_singleline(&mut name);
38+ ui.text_edit_singleline(&mut state.edit_feed_name);
4439
4540 ui.label("URL du flux RSS");
46- ui.text_edit_singleline(&mut url);
41+ ui.text_edit_singleline(&mut state.edit_feed_url);
4742
4843 ui.label("Dossier de téléchargement");
49- ui.text_edit_singleline(&mut download_path);
44+ ui.text_edit_singleline(&mut state.edit_feed_download_path);
5045
51- ui.checkbox(&mut enabled, "Activé");
46+ ui.checkbox(&mut state.edit_feed_enabled, "Activé");
5247
5348 ui.separator();
5449
5550 ui.horizontal(|ui| {
5651 if ui.button("Sauvegarder").clicked() {
57- state.feeds[editing_index].name = name.clone();
58- state.feeds[editing_index].url = url.clone();
59- state.feeds[editing_index].download_path = PathBuf::from(download_path.clone());
60- state.feeds[editing_index].enabled = enabled;
52+ state.feeds[editing_index].name = state.edit_feed_name.clone();
53+ state.feeds[editing_index].url = state.edit_feed_url.clone();
54+ state.feeds[editing_index].download_path = PathBuf::from(state.edit_feed_download_path.clone());
55+ state.feeds[editing_index].enabled = state.edit_feed_enabled;
6156
6257 super::super::config::storage::save_feeds_default(&state.feeds).ok();
6358 state.set_info("Flux modifié".to_string());
59+ state.clear_edit_feed_form();
6460 *show_dialog.borrow_mut() = false;
65- state.editing_feed_index = None;
6661 }
6762
6863 if ui.button("Annuler").clicked() {
64+ state.clear_edit_feed_form();
6965 *show_dialog.borrow_mut() = false;
70- state.editing_feed_index = None;
7166 }
7267 });
7368 });
@@ -15,59 +15,54 @@ pub fn draw_edit_feed_dialog(state: &mut AppState, ui: &mut Ui) {
15 };15 };
16 16
17 if editing_index >= state.feeds.len() {17 if editing_index >= state.feeds.len() {
18- state.editing_feed_index = None;18+ state.clear_edit_feed_form();
19- state.show_edit_feed_dialog = false;
20 return;19 return;
21 }20 }
22 21
22+ // Load form data on first open
23+ if state.edit_feed_name.is_empty() && state.editing_feed_index == Some(editing_index) {
24+ state.load_edit_feed_form(editing_index);
25+ }
26+
23 let show_dialog = RefCell::new(state.show_edit_feed_dialog);27 let show_dialog = RefCell::new(state.show_edit_feed_dialog);
24- let name = state.feeds[editing_index].name.clone();
25- let url = state.feeds[editing_index].url.clone();
26- let download_path = state.feeds[editing_index].download_path.to_string_lossy().to_string();
27- let enabled = state.feeds[editing_index].enabled;
28-
29- let mut name = name;
30- let mut url = url;
31- let mut download_path = download_path;
32- let mut enabled = enabled;
33 28
34 egui::Window::new("Éditer le flux")29 egui::Window::new("Éditer le flux")
35 .open(&mut *show_dialog.borrow_mut())30 .open(&mut *show_dialog.borrow_mut())
36 .resizable(false)31 .resizable(false)
37 .show(ui.ctx(), |ui| {32 .show(ui.ctx(), |ui| {
38 ui.vertical(|ui| {33 ui.vertical(|ui| {
39- ui.label(format!("Éditer: {}", name));34+ ui.label(format!("Éditer: {}", state.edit_feed_name));
40 ui.separator();35 ui.separator();
41 36
42 ui.label("Nom du podcast");37 ui.label("Nom du podcast");
43- ui.text_edit_singleline(&mut name);38+ ui.text_edit_singleline(&mut state.edit_feed_name);
44 39
45 ui.label("URL du flux RSS");40 ui.label("URL du flux RSS");
46- ui.text_edit_singleline(&mut url);41+ ui.text_edit_singleline(&mut state.edit_feed_url);
47 42
48 ui.label("Dossier de téléchargement");43 ui.label("Dossier de téléchargement");
49- ui.text_edit_singleline(&mut download_path);44+ ui.text_edit_singleline(&mut state.edit_feed_download_path);
50 45
51- ui.checkbox(&mut enabled, "Activé");46+ ui.checkbox(&mut state.edit_feed_enabled, "Activé");
52 47
53 ui.separator();48 ui.separator();
54 49
55 ui.horizontal(|ui| {50 ui.horizontal(|ui| {
56 if ui.button("Sauvegarder").clicked() {51 if ui.button("Sauvegarder").clicked() {
57- state.feeds[editing_index].name = name.clone();52+ state.feeds[editing_index].name = state.edit_feed_name.clone();
58- state.feeds[editing_index].url = url.clone();53+ state.feeds[editing_index].url = state.edit_feed_url.clone();
59- state.feeds[editing_index].download_path = PathBuf::from(download_path.clone());54+ state.feeds[editing_index].download_path = PathBuf::from(state.edit_feed_download_path.clone());
60- state.feeds[editing_index].enabled = enabled;55+ state.feeds[editing_index].enabled = state.edit_feed_enabled;
61 56
62 super::super::config::storage::save_feeds_default(&state.feeds).ok();57 super::super::config::storage::save_feeds_default(&state.feeds).ok();
63 state.set_info("Flux modifié".to_string());58 state.set_info("Flux modifié".to_string());
59+ state.clear_edit_feed_form();
64 *show_dialog.borrow_mut() = false;60 *show_dialog.borrow_mut() = false;
65- state.editing_feed_index = None;
66 }61 }
67 62
68 if ui.button("Annuler").clicked() {63 if ui.button("Annuler").clicked() {
64+ state.clear_edit_feed_form();
69 *show_dialog.borrow_mut() = false;65 *show_dialog.borrow_mut() = false;
70- state.editing_feed_index = None;
71 }66 }
72 });67 });
73 });68 });
modified src/ui/feed_list.rs +1 -0
@@ -62,6 +62,7 @@ fn draw_feed_item(state: &mut AppState, ui: &mut Ui, index: usize) {
6262 // Edit button
6363 if ui.button("✏️").on_hover_text("Éditer").clicked() {
6464 state.editing_feed_index = Some(index);
65+ state.load_edit_feed_form(index);
6566 state.show_edit_feed_dialog = true;
6667 }
6768
@@ -62,6 +62,7 @@ fn draw_feed_item(state: &mut AppState, ui: &mut Ui, index: usize) {
62 // Edit button62 // Edit button
63 if ui.button("✏️").on_hover_text("Éditer").clicked() {63 if ui.button("✏️").on_hover_text("Éditer").clicked() {
64 state.editing_feed_index = Some(index);64 state.editing_feed_index = Some(index);
65+ state.load_edit_feed_form(index);
65 state.show_edit_feed_dialog = true;66 state.show_edit_feed_dialog = true;
66 }67 }
67 68
modified src/ui/home.rs +1 -0
@@ -37,6 +37,7 @@ pub fn draw_home(state: &mut AppState, ui: &mut Ui) {
3737 fn draw_action_buttons(state: &mut AppState, ui: &mut Ui) {
3838 ui.horizontal(|ui| {
3939 if ui.button("📥 Ajouter un flux").clicked() {
40+ state.clear_new_feed_form();
4041 state.show_add_feed_dialog = true;
4142 }
4243
@@ -37,6 +37,7 @@ pub fn draw_home(state: &mut AppState, ui: &mut Ui) {
37 fn draw_action_buttons(state: &mut AppState, ui: &mut Ui) {37 fn draw_action_buttons(state: &mut AppState, ui: &mut Ui) {
38 ui.horizontal(|ui| {38 ui.horizontal(|ui| {
39 if ui.button("📥 Ajouter un flux").clicked() {39 if ui.button("📥 Ajouter un flux").clicked() {
40+ state.clear_new_feed_form();
40 state.show_add_feed_dialog = true;41 state.show_add_feed_dialog = true;
41 }42 }
42 43