use gio::prelude::*; use gtk::prelude::*; use gtk::Orientation; use rodio::Sink; use std::env::args; use std::fs::File; use std::io::BufReader; const SPACING: i32 = 16; fn build_ui(application: >k::Application) { let window = gtk::ApplicationWindow::new(application); window.set_title("lull"); window.set_border_width(SPACING as u32); window.set_position(gtk::WindowPosition::Center); window.set_default_size(256, 256); let vertical = gtk::Box::new(Orientation::Vertical, SPACING); vertical.set_homogeneous(true); window.add(&vertical); let device = rodio::default_output_device().unwrap(); let mut data_dir = dirs::data_dir().expect("Couldn't find user data directory"); data_dir.push("ruin/lull"); if !data_dir.exists() { std::fs::create_dir_all(&data_dir).expect("Couldn't create lull data directory"); } let paths = std::fs::read_dir(&data_dir) .expect("Couldn't read from lull data directory"); for path in paths { let path = path.unwrap().path(); let name: &str = path.file_stem().unwrap().to_str().unwrap(); let file = File::open(&path) .expect("Couldn't open audio file"); let source = rodio::Decoder::new(BufReader::new(file)) .expect("Couldn't decode audio"); let sink = Sink::new(&device); sink.append(source); sink.pause(); let row = gtk::Box::new(Orientation::Horizontal, SPACING); row.set_homogeneous(true); let label = gtk::Label::new(Some(name)); row.add(&label); let adjustment = gtk::Adjustment::new( 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 ); let slider = gtk::Scale::new( Orientation::Horizontal, Some(&adjustment) ); slider.set_draw_value(false); slider.connect_value_changed(move |scale| { let volume = scale.get_value(); println!("volume: {}", volume); if volume == 0. { sink.pause(); } else { sink.play(); sink.set_volume(volume as f32); } }); row.add(&slider); vertical.add(&row); } let row_add = gtk::Box::new(Orientation::Horizontal, SPACING); row_add.set_homogeneous(true); let button_open_dir = gtk::Button::with_label("add more"); row_add.add(&button_open_dir); vertical.add(&row_add); window.show_all(); } fn main() { let application = gtk::Application::new( Some("dev.tinybird.max.lull"), Default::default() ).expect("Initialization failed..."); application.connect_activate(|app| { build_ui(app); }); application.run(&args().collect::>()); }