From b72f560e5a0924c19ad062d2b67c18724600b954 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Fri, 5 Apr 2019 00:27:20 +0200 Subject: [PATCH] implement moving of tracks in queue --- src/commands.rs | 4 ++++ src/ui/listview.rs | 28 ++++++++++++++++++++++++---- src/ui/queue.rs | 2 +- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 6301a1e..f1981ac 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -55,6 +55,7 @@ impl CommandManager { self.register_command("search", None); self.register_command("move", None); + self.register_command("shift", None); self.register_command("play", None); self.register_command("queue", None); self.register_command("delete", None); @@ -315,6 +316,9 @@ impl CommandManager { kb.insert("h".into(), "move left".into()); kb.insert("l".into(), "move right".into()); + kb.insert("Shift+Up".into(), "shift up".into()); + kb.insert("Shift+Down".into(), "shift down".into()); + kb } diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 37a0b0e..d8b28eb 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -20,6 +20,7 @@ pub struct ListView { last_size: Vec2, scrollbar: ScrollBase, queue: Arc, + shiftable: bool, } impl ListView { @@ -31,9 +32,15 @@ impl ListView { last_size: Vec2::new(0, 0), scrollbar: ScrollBase::new(), queue, + shiftable: false, } } + pub fn shiftable(mut self) -> Self { + self.shiftable = true; + self + } + pub fn get_selected_index(&self) -> usize { self.selected } @@ -48,6 +55,11 @@ impl ListView { let new = self.selected as i32 + delta; self.move_focus_to(max(new, 0) as usize); } + + pub fn swap(&mut self, a: usize, b: usize) { + let mut content = self.content.write().expect("can't writelock content"); + content.swap(a, b); + } } impl View for ListView { @@ -196,23 +208,31 @@ impl ViewExt for ListView { return Ok(CommandResult::Consumed(None)); } - if cmd == "move" { + if cmd == "move" || cmd == "shift" { if let Some(dir) = args.get(0) { - let amount: i32 = args + let amount: usize = args .get(1) .unwrap_or(&"1".to_string()) .parse() .map_err(|e| format!("{:?}", e))?; + let shift = cmd == "shift" && self.shiftable; + let selected = self.selected; let len = self.content.read().unwrap().len(); if dir == "up" && self.selected > 0 { - self.move_focus(-amount); + if shift { + self.swap(selected, selected.saturating_sub(amount)); + } + self.move_focus(-(amount as i32)); return Ok(CommandResult::Consumed(None)); } if dir == "down" && self.selected < len.saturating_sub(1) { - self.move_focus(amount); + if shift { + self.swap(selected, min(selected + amount as usize, len - 1)); + } + self.move_focus(amount as i32); return Ok(CommandResult::Consumed(None)); } } diff --git a/src/ui/queue.rs b/src/ui/queue.rs index 54306a3..0e5e46d 100644 --- a/src/ui/queue.rs +++ b/src/ui/queue.rs @@ -22,7 +22,7 @@ pub struct QueueView { impl QueueView { pub fn new(queue: Arc, playlists: Arc) -> QueueView { - let list = ListView::new(queue.queue.clone(), queue.clone()); + let list = ListView::new(queue.queue.clone(), queue.clone()).shiftable(); QueueView { list,