diff --git a/src/ui/app.rs b/src/ui/app.rs index c011ddc..9f38f44 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -410,8 +410,12 @@ impl eframe::App for App { { match crate::infrastructure::persistence::load_session() { Ok(data) => { + let probe = FfprobeGateway; // Restaura projeto único - if let Some(project) = data.single_project { + if let Some(mut project) = data.single_project { + // Re-executa ffprobe para garantir que existing_tracks + // está atualizado independentemente do que foi salvo. + let _ = LoadMediaInfo::execute(&mut project, &probe); self.pending_source = Some(project.source.path.clone()); self.pending_output = @@ -421,12 +425,20 @@ impl eframe::App for App { self.project = Some(project); } // Restaura itens do lote (estado resetado para Idle) + // Re-executa ffprobe em cada projeto para popular + // existing_tracks que podem estar vazios na sessão salva. if !data.batch_projects.is_empty() { use crate::ui::components::batch_panel::BatchItem; self.batch_items = data .batch_projects .into_iter() - .map(BatchItem::new) + .map(|mut project| { + let _ = LoadMediaInfo::execute( + &mut project, + &probe, + ); + BatchItem::new(project) + }) .collect(); } let single_ok = self.project.is_some(); @@ -568,10 +580,14 @@ impl eframe::App for App { let events = self.batch_panel.ui(ui, &self.batch_items, is_processing); for event in events { match event { - BatchPanelEvent::AddItem(project) => { + BatchPanelEvent::AddItem(mut project) => { + let probe = FfprobeGateway; + let _ = LoadMediaInfo::execute(&mut project, &probe); self.batch_items.push(BatchItem::new(project)); } - BatchPanelEvent::EditItem(idx, project) => { + BatchPanelEvent::EditItem(idx, mut project) => { + let probe = FfprobeGateway; + let _ = LoadMediaInfo::execute(&mut project, &probe); if let Some(item) = self.batch_items.get_mut(idx) { item.project = project; item.state = ExecutionState::Idle; diff --git a/src/ui/components/batch_panel.rs b/src/ui/components/batch_panel.rs index 9dc8f2f..4bd4f58 100644 --- a/src/ui/components/batch_panel.rs +++ b/src/ui/components/batch_panel.rs @@ -11,7 +11,8 @@ use crate::ui::components::{ // ── Tipos públicos ───────────────────────────────────────────────────────────── -/// Um item no carrinho de lote — projeto completo com estado individual de execução. +/// Um item na fila +/// de lote — projeto completo com estado individual de execução. pub struct BatchItem { pub project: Project, pub state: ExecutionState, @@ -30,11 +31,11 @@ impl BatchItem { /// Eventos emitidos pelo `BatchPanel` para o `App`. pub enum BatchPanelEvent { - /// Novo projeto confirmado pelo usuário — adicionar ao carrinho. + /// Novo projeto confirmado pelo usuário — adicionar à fila. AddItem(Project), /// Substituir o projeto de um item existente (edição confirmada). EditItem(usize, Project), - /// Remover item do carinho pelo índice. + /// Remover item da fila pelo índice. RemoveItem(usize), /// Iniciar o processamento sequencial de todos os itens aguardando. ProcessAll, @@ -58,7 +59,7 @@ struct PendingSubtitle { // ── BatchPanel ───────────────────────────────────────────────────────────────── -/// Painel de modo lote: exibe o carrinho de projetos e um formulário inline +/// Painel de modo lote: exibe a fila de projetos e um formulário inline /// para adicionar ou editar itens sem abandonar a aba. pub struct BatchPanel { // Estado do formulário de adição / edição @@ -138,18 +139,18 @@ impl BatchPanel { ui.heading("Modo Lote"); ui.label( egui::RichText::new( - "Adicione múltiplos projetos ao carrinho e processe-os sequencialmente.", + "Adicione múltiplos projetos à fila e processe-os sequencialmente.", ) .weak() .italics(), ); ui.add_space(8.0); - // ── Lista de itens do carrinho ───────────────────────────────────────── + // ── Lista de itens da fila ───────────────────────────────────────── if items.is_empty() && !self.form_open { ui.label( egui::RichText::new( - "Nenhum item no carrinho. Clique em \"+ Adicionar item\" para começar.", + "Nenhum item na fila. Clique em \"+ Adicionar item\" para começar.", ) .weak() .italics(), @@ -289,7 +290,7 @@ impl BatchPanel { .fill(egui::Color32::DARK_RED), ) .on_hover_text( - "Interrompe o item em execução; os demais permanecem no carrinho.", + "Interrompe o item em execução; os demais permanecem na fila.", ) .clicked() { @@ -485,7 +486,7 @@ impl BatchPanel { let confirm_label = if is_edit { "Salvar alterações" } else { - "Adicionar ao carrinho" + "Adicionar à fila" }; if ui