fix shuffle not shuffling away first element

and fix dragging selected song not dragging all selected elements but rather only those that pass current filter/search, which was not intended.
This commit is contained in:
Mark
2023-12-31 14:16:18 +01:00
parent 7f33d2daf8
commit 8a9ee5c9cf
10 changed files with 121 additions and 80 deletions

View File

@@ -1106,6 +1106,8 @@ impl Gui {
}
}
GuiAction::SendToServer(cmd) => {
#[cfg(debug_assertions)]
eprintln!("[DEBUG] Sending command to server: {cmd:?}");
if let Err(e) = cmd.to_bytes(&mut self.connection) {
eprintln!("Error sending command to server: {e}");
}

View File

@@ -2157,7 +2157,7 @@ mod selected {
let lock = self.0.lock().unwrap();
let (sel_artists, sel_albums, sel_songs) = &*lock;
let mut out = vec![];
for (artist, singles, albums, _) in &lb.library_filtered {
for (artist, singles, albums) in &lb.library_sorted {
let artist_selected = sel_artists.contains(artist);
let mut local_artist_owned = vec![];
let mut local_artist = if artist_selected {
@@ -2165,13 +2165,13 @@ mod selected {
} else {
&mut out
};
for (song, _) in singles {
for song in singles {
let song_selected = sel_songs.contains(song);
if song_selected {
local_artist.push(QueueContent::Song(*song).into());
}
}
for (album, songs, _) in albums {
for (album, songs) in albums {
let album_selected = sel_albums.contains(album);
let mut local_album_owned = vec![];
let local_album = if album_selected {
@@ -2179,7 +2179,7 @@ mod selected {
} else {
&mut local_artist
};
for (song, _) in songs {
for song in songs {
let song_selected = sel_songs.contains(song);
if song_selected {
local_album.push(QueueContent::Song(*song).into());

View File

@@ -408,7 +408,7 @@ impl GuiElem for QueueEmptySpaceDragHandler {
self
}
fn dragged(&mut self, dragged: Dragging) -> Vec<GuiAction> {
dragged_add_to_queue(dragged, |q, _| Command::QueueAdd(vec![], q))
dragged_add_to_queue(dragged, |q| Command::QueueAdd(vec![], q))
}
}
@@ -623,9 +623,9 @@ impl GuiElem for QueueSong {
if !self.always_copy {
let mut p = self.path.clone();
let insert_below = self.insert_below;
dragged_add_to_queue(dragged, move |q, i| {
dragged_add_to_queue(dragged, move |q| {
if let Some(j) = p.pop() {
Command::QueueInsert(p.clone(), if insert_below { j + 1 } else { j } + i, q)
Command::QueueInsert(p.clone(), if insert_below { j + 1 } else { j }, q)
} else {
Command::QueueAdd(p.clone(), q)
}
@@ -782,13 +782,11 @@ impl GuiElem for QueueFolder {
if !self.always_copy {
if self.insert_into {
let p = self.path.clone();
dragged_add_to_queue(dragged, move |q, _| Command::QueueAdd(p.clone(), q))
dragged_add_to_queue(dragged, move |q| Command::QueueAdd(p.clone(), q))
} else {
let mut p = self.path.clone();
let j = p.pop().unwrap_or(0);
dragged_add_to_queue(dragged, move |q, i| {
Command::QueueInsert(p.clone(), j + i, q)
})
dragged_add_to_queue(dragged, move |q| Command::QueueInsert(p.clone(), j, q))
}
} else {
vec![]
@@ -850,9 +848,7 @@ impl GuiElem for QueueIndentEnd {
}
fn dragged(&mut self, dragged: Dragging) -> Vec<GuiAction> {
let (p, j) = self.path_insert.clone();
dragged_add_to_queue(dragged, move |q, i| {
Command::QueueInsert(p.clone(), j + i, q)
})
dragged_add_to_queue(dragged, move |q| Command::QueueInsert(p.clone(), j, q))
}
}
@@ -1004,7 +1000,7 @@ impl GuiElem for QueueLoop {
if !self.always_copy {
let mut p = self.path.clone();
p.push(0);
dragged_add_to_queue(dragged, move |q, _| Command::QueueAdd(p.clone(), q))
dragged_add_to_queue(dragged, move |q| Command::QueueAdd(p.clone(), q))
} else {
vec![]
}
@@ -1130,7 +1126,7 @@ impl GuiElem for QueueRandom {
fn dragged(&mut self, dragged: Dragging) -> Vec<GuiAction> {
if !self.always_copy {
let p = self.path.clone();
dragged_add_to_queue(dragged, move |q, _| Command::QueueAdd(p.clone(), q))
dragged_add_to_queue(dragged, move |q| Command::QueueAdd(p.clone(), q))
} else {
vec![]
}
@@ -1257,22 +1253,22 @@ impl GuiElem for QueueShuffle {
if !self.always_copy {
let mut p = self.path.clone();
p.push(0);
dragged_add_to_queue(dragged, move |q, _| Command::QueueAdd(p.clone(), q))
dragged_add_to_queue(dragged, move |q| Command::QueueAdd(p.clone(), q))
} else {
vec![]
}
}
}
fn dragged_add_to_queue<F: FnMut(Queue, usize) -> Command + 'static>(
fn dragged_add_to_queue<F: FnOnce(Vec<Queue>) -> Command + 'static>(
dragged: Dragging,
mut f: F,
f: F,
) -> Vec<GuiAction> {
match dragged {
Dragging::Artist(id) => {
vec![GuiAction::Build(Box::new(move |db| {
if let Some(q) = add_to_queue_artist_by_id(id, db) {
vec![GuiAction::SendToServer(f(q, 0))]
vec![GuiAction::SendToServer(f(vec![q]))]
} else {
vec![]
}
@@ -1281,7 +1277,7 @@ fn dragged_add_to_queue<F: FnMut(Queue, usize) -> Command + 'static>(
Dragging::Album(id) => {
vec![GuiAction::Build(Box::new(move |db| {
if let Some(q) = add_to_queue_album_by_id(id, db) {
vec![GuiAction::SendToServer(f(q, 0))]
vec![GuiAction::SendToServer(f(vec![q]))]
} else {
vec![]
}
@@ -1289,16 +1285,12 @@ fn dragged_add_to_queue<F: FnMut(Queue, usize) -> Command + 'static>(
}
Dragging::Song(id) => {
let q = QueueContent::Song(id).into();
vec![GuiAction::SendToServer(f(q, 0))]
vec![GuiAction::SendToServer(f(vec![q]))]
}
Dragging::Queue(q) => {
vec![GuiAction::SendToServer(f(q, 0))]
vec![GuiAction::SendToServer(f(vec![q]))]
}
Dragging::Queues(q) => q
.into_iter()
.enumerate()
.map(|(i, q)| GuiAction::SendToServer(f(q, i)))
.collect(),
Dragging::Queues(q) => vec![GuiAction::SendToServer(f(q))],
}
}