implement moving of tracks in queue

This commit is contained in:
Henrik Friedrichsen
2019-04-05 00:27:20 +02:00
parent 14c909862f
commit b72f560e5a
3 changed files with 29 additions and 5 deletions

View File

@@ -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
}

View File

@@ -20,6 +20,7 @@ pub struct ListView<I: 'static + ListItem> {
last_size: Vec2,
scrollbar: ScrollBase,
queue: Arc<Queue>,
shiftable: bool,
}
impl<I: ListItem> ListView<I> {
@@ -31,9 +32,15 @@ impl<I: ListItem> ListView<I> {
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<I: ListItem> ListView<I> {
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<I: ListItem> View for ListView<I> {
@@ -196,23 +208,31 @@ impl<I: ListItem> ViewExt for ListView<I> {
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));
}
}

View File

@@ -22,7 +22,7 @@ pub struct QueueView {
impl QueueView {
pub fn new(queue: Arc<Queue>, playlists: Arc<Playlists>) -> QueueView {
let list = ListView::new(queue.queue.clone(), queue.clone());
let list = ListView::new(queue.queue.clone(), queue.clone()).shiftable();
QueueView {
list,