Add seeking

This commit is contained in:
KoffeinFlummi
2019-03-25 18:29:00 +01:00
parent 992be7c502
commit e6a7d8a693
6 changed files with 130 additions and 7 deletions

View File

@@ -1,6 +1,7 @@
use std::sync::Arc;
use cursive::align::HAlign;
use cursive::event::{Event, EventResult, MouseButton, MouseEvent};
use cursive::theme::{ColorStyle, ColorType, PaletteColor};
use cursive::traits::View;
use cursive::vec::Vec2;
@@ -13,6 +14,7 @@ use spotify::{PlayerEvent, Spotify};
pub struct StatusBar {
queue: Arc<Queue>,
spotify: Arc<Spotify>,
last_size: Vec2,
}
impl StatusBar {
@@ -20,6 +22,7 @@ impl StatusBar {
StatusBar {
queue: queue,
spotify: spotify,
last_size: Vec2::new(0, 0),
}
}
}
@@ -63,6 +66,8 @@ impl View for StatusBar {
if let Some(ref t) = self.queue.get_current() {
let elapsed = self.spotify.get_current_progress();
let elapsed_ms = elapsed.as_secs() as u32 * 1000 + elapsed.subsec_millis();
let formatted_elapsed = format!(
"{:02}:{:02}",
elapsed.as_secs() / 60,
@@ -80,7 +85,7 @@ impl View for StatusBar {
printer.with_color(style_bar, |printer| {
printer.print((0, 0), &"".repeat(printer.size.x));
let duration_width =
(((printer.size.x as u32) * (elapsed.as_secs() as u32)) / t.duration) as usize;
(((printer.size.x as u32) * elapsed_ms) / t.duration) as usize;
printer.print((0, 0), &format!("{}{}", "=".repeat(duration_width), ">"));
});
} else {
@@ -90,7 +95,50 @@ impl View for StatusBar {
}
}
fn layout(&mut self, size: Vec2) {
self.last_size = size;
}
fn required_size(&mut self, constraint: Vec2) -> Vec2 {
Vec2::new(constraint.x, 2)
}
fn on_event(&mut self, event: Event) -> EventResult {
if let Event::Mouse {
offset,
position,
event
} = event {
let position = position - offset;
if position.y == 0 {
if event == MouseEvent::WheelUp {
self.spotify.seek_relative(-500);
}
if event == MouseEvent::WheelDown {
self.spotify.seek_relative(500);
}
if event == MouseEvent::Press(MouseButton::Left) ||
event == MouseEvent::Hold(MouseButton::Left)
{
if let Some(ref t) = self.queue.get_current() {
let f: f32 = position.x as f32 / self.last_size.x as f32;
let new = t.duration as f32 * f;
self.spotify.seek(new as u32);
}
}
} else {
if event == MouseEvent::Press(MouseButton::Left) {
self.queue.toggleplayback();
}
}
EventResult::Consumed(None)
} else {
EventResult::Ignored
}
}
}