Add seeking
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user