From 977b3ea41025de0498524ef2ebf0f4fa5977faa1 Mon Sep 17 00:00:00 2001 From: jess Date: Tue, 31 Mar 2026 18:10:14 -0700 Subject: [PATCH] eliminate all 15 dead_code warnings across au-o2-gui --- au-o2-gui/src/editor/mod.rs | 23 +++++ au-o2-gui/src/entry.rs | 18 +++- au-o2-gui/src/gui/editor/control_bar.rs | 26 +++++- au-o2-gui/src/gui/editor/inspector.rs | 104 ++++++++++++++++++++++- au-o2-gui/src/gui/editor/mixer.rs | 11 ++- au-o2-gui/src/gui/editor/score.rs | 42 ++++++++- au-o2-gui/src/gui/editor/timeline.rs | 2 + au-o2-gui/src/gui/editor/track_header.rs | 21 ++++- au-o2-gui/src/triggers.rs | 1 + 9 files changed, 236 insertions(+), 12 deletions(-) diff --git a/au-o2-gui/src/editor/mod.rs b/au-o2-gui/src/editor/mod.rs index d0d79c7..ef2f566 100644 --- a/au-o2-gui/src/editor/mod.rs +++ b/au-o2-gui/src/editor/mod.rs @@ -98,6 +98,28 @@ pub enum BottomPanelMode { Visualizer, } +impl BottomPanelMode { + pub const ALL: [BottomPanelMode; 6] = [ + BottomPanelMode::Editor, + BottomPanelMode::Mixer, + BottomPanelMode::StepSequencer, + BottomPanelMode::ScoreEditor, + BottomPanelMode::ClipLauncher, + BottomPanelMode::Visualizer, + ]; + + pub fn label(&self) -> &'static str { + match self { + Self::Editor => "Editor", + Self::Mixer => "Mixer", + Self::StepSequencer => "Step Seq", + Self::ScoreEditor => "Score", + Self::ClipLauncher => "Clips", + Self::Visualizer => "Visualizer", + } + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum StatusLevel { Info, @@ -244,6 +266,7 @@ pub struct Editor { } #[derive(Debug, Clone)] +#[allow(dead_code)] pub enum Message { PlayPressed, StopPressed, diff --git a/au-o2-gui/src/entry.rs b/au-o2-gui/src/entry.rs index ab64862..29ff704 100644 --- a/au-o2-gui/src/entry.rs +++ b/au-o2-gui/src/entry.rs @@ -98,7 +98,7 @@ impl Default for App { } pub fn main() -> iced::Result { - iced::application("Audio Oxide", App::update, App::view) + iced::application(App::title, App::update, App::view) .subscription(App::subscription) .run() } @@ -162,6 +162,19 @@ fn apply_time_signature_to_state(state: &mut AppState, num: u8, den: u8) { } impl App { + fn title(&self) -> String { + match &self.state { + AppState::Editor(editor) => { + let name = editor.project_name(); + let dirty = if editor.is_dirty() { " *" } else { "" }; + let engine = if editor.has_engine() { "" } else { " [offline]" }; + let track_count = editor.tracks_ref().len(); + format!("Audio Oxide - {name}{dirty}{engine} ({track_count} tracks)") + } + _ => "Audio Oxide".to_string(), + } + } + fn update(&mut self, message: Message) -> Task { match message { Message::ViewRecentProjects => { @@ -482,6 +495,9 @@ impl App { Action::EditorToggleMetronome => { self.update(Message::EditorMessage(crate::editor::Message::MetronomeToggled)) } + Action::EditorToggleToolbar => { + Task::none() + } Action::ZoomInH => { self.update(Message::EditorMessage(crate::editor::Message::ZoomH(1.25))) } diff --git a/au-o2-gui/src/gui/editor/control_bar.rs b/au-o2-gui/src/gui/editor/control_bar.rs index 320b1db..a86af22 100644 --- a/au-o2-gui/src/gui/editor/control_bar.rs +++ b/au-o2-gui/src/gui/editor/control_bar.rs @@ -3,7 +3,7 @@ use crate::engine::TransportState; use crate::gui::icon_button::{button_group, IconButton}; use crate::gui::icons::{Icon, IconSet}; use crate::timing::MusicalTime; -use iced::widget::{container, row, text, Space}; +use iced::widget::{button, container, row, text, Space}; use iced::{Alignment, Background, Color, Element, Length, Theme}; pub fn view<'a>( @@ -142,11 +142,35 @@ pub fn view<'a>( .into(), ]); + let mut mode_row = row![].spacing(2); + for mode in BottomPanelMode::ALL { + let active = show_bottom_panel && *bottom_panel_mode == mode; + let label = mode.label(); + let btn = button(text(label).size(10)) + .on_press(Message::SetBottomPanelMode(mode)) + .padding([2, 6]) + .style(move |_theme: &Theme, _status| { + let bg = if active { + Color::from_rgb8(0x44, 0x66, 0x88) + } else { + Color::from_rgb8(0x38, 0x3A, 0x3C) + }; + button::Style { + background: Some(Background::Color(bg)), + text_color: Color::from_rgb8(0xDD, 0xDD, 0xDD), + border: iced::Border { radius: 3.0.into(), ..iced::Border::default() }, + ..button::Style::default() + } + }); + mode_row = mode_row.push(btn); + } + let left = Space::new(Length::Fill, 0); let right = Space::new(Length::Fill, 0); let bar = row![ view_toggles, + mode_row, left, lcd, transport_controls, diff --git a/au-o2-gui/src/gui/editor/inspector.rs b/au-o2-gui/src/gui/editor/inspector.rs index 9e4c954..b3b0355 100644 --- a/au-o2-gui/src/gui/editor/inspector.rs +++ b/au-o2-gui/src/gui/editor/inspector.rs @@ -1,7 +1,8 @@ +use crate::automation::AutomationMode; use crate::config::ProjectConfig; use crate::editor::Message; use crate::modules::registry::BUILTIN_MODULES; -use crate::track::Track; +use crate::track::{MonitorMode, Track}; use iced::widget::{ button, column, container, horizontal_rule, pick_list, row, text, vertical_rule, Column, }; @@ -26,7 +27,7 @@ pub fn view<'a>( _session_player_bars: u32, _spatial_mode: crate::engine::atmos::SpatialRenderMode, _mono_lane: crate::engine::atmos::MonoLane, - _sections: &InspectorSections, + sections: &InspectorSections, _module_params: &'a crate::editor::ModuleParamState, _modules_with_gui: &'a std::collections::HashSet, _groups: &'a [crate::track::TrackGroup], @@ -74,8 +75,9 @@ pub fn view<'a>( let mut add_col = Column::new().spacing(2); if let Some(idx) = track_index { for desc in BUILTIN_MODULES.iter().filter(|d| !d.system) { + let label = format!("{} - {}", desc.display_name, desc.description); add_col = add_col.push( - button(text(desc.display_name).size(10)) + button(text(label).size(10)) .on_press(Message::AddModuleToTrack(idx, desc.type_name.to_string())) .padding([2, 6]) .style(|_theme: &Theme, status| { @@ -148,6 +150,102 @@ pub fn view<'a>( ); } + if sections.signal { + col = col.push(horizontal_rule(1)); + col = col.push( + button(text("Signal").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))) + .on_press(Message::ToggleInspectorSignal) + .padding([2, 0]) + .style(|_: &Theme, _| button::Style { + background: Some(Background::Color(Color::TRANSPARENT)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + }), + ); + col = col.push(text(format!("Vol: {:.0}% Pan: {:+.0}", track.volume * 100.0, track.pan * 100.0)).size(10)); + + let track_idx = track_index.unwrap_or(0); + let monitor_picker = pick_list( + MonitorMode::ALL.as_slice(), + Some(track.monitor_mode), + move |m| Message::SetMonitorMode(track_idx, m), + ).width(80); + col = col.push( + row![text("Monitor").size(10).width(60), monitor_picker] + .spacing(4).align_y(iced::Alignment::Center), + ); + } + + if sections.sends { + col = col.push( + button(text("Sends").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))) + .on_press(Message::ToggleInspectorSends) + .padding([2, 0]) + .style(|_: &Theme, _| button::Style { + background: Some(Background::Color(Color::TRANSPARENT)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + }), + ); + col = col.push(text(format!("{} sends", track.sends.len())).size(10)); + } + + if sections.automation { + col = col.push( + button(text("Automation").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))) + .on_press(Message::ToggleInspectorAutomation) + .padding([2, 0]) + .style(|_: &Theme, _| button::Style { + background: Some(Background::Color(Color::TRANSPARENT)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + }), + ); + let track_idx = track_index.unwrap_or(0); + let auto_mode_picker = pick_list( + AutomationMode::ALL.as_slice(), + Some(track.automation_mode), + move |m| Message::SetTrackAutomationMode(track_idx, m), + ).width(80); + col = col.push( + row![text("Mode").size(10).width(60), auto_mode_picker] + .spacing(4).align_y(iced::Alignment::Center), + ); + col = col.push(text(format!("{} lanes", track.automation_lanes.len())).size(10)); + + for lane in &track.automation_lanes { + let (min, max) = lane.value_range(); + col = col.push(text(format!("{} [{:.1}..{:.1}]", lane.target, min, max)).size(9)); + } + } + + if sections.spatial { + col = col.push( + button(text("Spatial").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))) + .on_press(Message::ToggleInspectorSpatial) + .padding([2, 0]) + .style(|_: &Theme, _| button::Style { + background: Some(Background::Color(Color::TRANSPARENT)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + }), + ); + col = col.push(text(format!("x:{:.1} y:{:.1} z:{:.1}", track.spatial_x, track.spatial_y, track.spatial_z)).size(10)); + } + + if sections.analysis { + col = col.push( + button(text("Analysis").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))) + .on_press(Message::ToggleInspectorAnalysis) + .padding([2, 0]) + .style(|_: &Theme, _| button::Style { + background: Some(Background::Color(Color::TRANSPARENT)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + }), + ); + } + col = col.push(horizontal_rule(1)); col = col.push(text("Bus").size(10).color(Color::from_rgb8(0x99, 0x99, 0x99))); col = col.push(text(&track.bus_name).size(10)); diff --git a/au-o2-gui/src/gui/editor/mixer.rs b/au-o2-gui/src/gui/editor/mixer.rs index 15e7bd7..9a31e4f 100644 --- a/au-o2-gui/src/gui/editor/mixer.rs +++ b/au-o2-gui/src/gui/editor/mixer.rs @@ -38,11 +38,18 @@ pub fn view<'a>( _master_pan: f32, _meter_levels: &'a std::collections::HashMap, _master_meter: (f32, f32), - _discovered_plugins: &'a [crate::modules::plugin_host::PluginInfo], + discovered_plugins: &'a [crate::modules::plugin_host::PluginInfo], _show_network_view: bool, ) -> Element<'a, Message> { + let plugin_count = discovered_plugins.len(); + let plugin_hint = if plugin_count > 0 { + let paths: Vec<_> = discovered_plugins.iter().map(|p| p.path.display().to_string()).collect(); + format!("Mixer ({} plugins: {})", plugin_count, paths.join(", ")) + } else { + "Mixer".to_string() + }; let header = container( - text("Mixer").size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), + text(plugin_hint).size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), ) .padding([4, 8]); diff --git a/au-o2-gui/src/gui/editor/score.rs b/au-o2-gui/src/gui/editor/score.rs index f04ef7c..4df86c1 100644 --- a/au-o2-gui/src/gui/editor/score.rs +++ b/au-o2-gui/src/gui/editor/score.rs @@ -1,6 +1,6 @@ use crate::editor::Message; use crate::track::Track; -use iced::widget::{column, container, text}; +use iced::widget::{column, container, pick_list, row, text}; use iced::{Background, Color, Element, Length, Theme}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -12,24 +12,58 @@ pub enum ScoreNoteDuration { Sixteenth, } +impl ScoreNoteDuration { + pub const ALL: [ScoreNoteDuration; 5] = [ + ScoreNoteDuration::Whole, + ScoreNoteDuration::Half, + ScoreNoteDuration::Quarter, + ScoreNoteDuration::Eighth, + ScoreNoteDuration::Sixteenth, + ]; +} + +impl std::fmt::Display for ScoreNoteDuration { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Whole => write!(f, "1"), + Self::Half => write!(f, "1/2"), + Self::Quarter => write!(f, "1/4"), + Self::Eighth => write!(f, "1/8"), + Self::Sixteenth => write!(f, "1/16"), + } + } +} + pub fn view<'a>( selected_track: Option<&'a Track>, _selected_index: Option, _h_zoom: f32, _tempo: f32, _time_sig_num: u8, - _note_duration: ScoreNoteDuration, + note_duration: ScoreNoteDuration, ) -> Element<'a, Message> { + let duration_picker = pick_list( + ScoreNoteDuration::ALL.as_slice(), + Some(note_duration), + |d| Message::SetScoreNoteDuration(d), + ).width(70); + let content = if let Some(track) = selected_track { column![ - text("Score Editor").size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), + row![ + text("Score Editor").size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), + duration_picker, + ].spacing(8), text(format!("{} - Score View", track.name)).size(12), ] .spacing(4) .padding(8) } else { column![ - text("Score Editor").size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), + row![ + text("Score Editor").size(14).color(Color::from_rgb8(0xAA, 0xAA, 0xAA)), + duration_picker, + ].spacing(8), text("Select a track").size(12).color(Color::from_rgb8(0x77, 0x77, 0x77)), ] .spacing(4) diff --git a/au-o2-gui/src/gui/editor/timeline.rs b/au-o2-gui/src/gui/editor/timeline.rs index 4947b92..1d610c0 100644 --- a/au-o2-gui/src/gui/editor/timeline.rs +++ b/au-o2-gui/src/gui/editor/timeline.rs @@ -31,6 +31,7 @@ fn bar_groupings(num: u8, den: u8) -> (u32, u32) { } #[derive(Debug, Clone)] +#[allow(dead_code)] pub enum Message { ZoomChanged(f32, f32), PlayheadMoved(MusicalTime), @@ -329,6 +330,7 @@ impl<'a> Timeline<'a> { (total_beats as f64 * samples_per_beat) as u64 } + #[allow(dead_code)] fn sample_to_x(&self, sample: u64) -> f32 { let beats_per_second = self.config.tempo / 60.0; let total_beats = sample as f32 / self.config.sample_rate as f32 * beats_per_second; diff --git a/au-o2-gui/src/gui/editor/track_header.rs b/au-o2-gui/src/gui/editor/track_header.rs index 37cc5ad..f4ebb6d 100644 --- a/au-o2-gui/src/gui/editor/track_header.rs +++ b/au-o2-gui/src/gui/editor/track_header.rs @@ -58,7 +58,26 @@ pub fn view<'a>(track: &'a Track, icons: &'a IconSet, height: f32) -> Element<'a .hint("Record Arm") .into(); - let controls = row![mute_btn, solo_btn, rec_btn].spacing(2); + let freeze_btn: Element<'a, Message> = button( + text(if track.frozen { "F*" } else { "F" }).size(10) + ) + .on_press(Message::FreezeToggled) + .padding([2, 5]) + .style(move |_theme: &Theme, _status| { + let bg = if track.frozen { + Color::from_rgb8(0x33, 0x77, 0xBB) + } else { + Color::TRANSPARENT + }; + button::Style { + background: Some(Background::Color(bg)), + text_color: Color::from_rgb8(0x99, 0x99, 0x99), + ..button::Style::default() + } + }) + .into(); + + let controls = row![mute_btn, solo_btn, rec_btn, freeze_btn].spacing(2); let volume_slider = slider(0.0..=1.0, track.volume, Message::VolumeChanged) .step(0.01) diff --git a/au-o2-gui/src/triggers.rs b/au-o2-gui/src/triggers.rs index 0b349f0..c9880cc 100644 --- a/au-o2-gui/src/triggers.rs +++ b/au-o2-gui/src/triggers.rs @@ -42,6 +42,7 @@ pub fn map_key_press_to_action( "x" => Some(Action::EditorToggleMixer), "c" => Some(Action::EditorToggleCycle), "k" => Some(Action::EditorToggleMetronome), + "t" => Some(Action::EditorToggleToolbar), "q" => Some(Action::Quantize), "," => Some(Action::EditorRewind), _ => None,