implement moving of tracks in queue
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user