aboutsummaryrefslogtreecommitdiff
path: root/src/event/pl_append_keys.rs
blob: 4a1be79e2e825a58f6ccd29053b9a3074fa18940 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use crate::app::{App, AppResult, SelectedTab};
use crate::browser::FileExtension;
use crossterm::event::{KeyCode, KeyEvent};
use std::path::Path;

pub fn hande_pl_append_keys(key_event: KeyEvent, app: &mut App) -> AppResult<()> {
    match key_event.code {
        KeyCode::Char('q') | KeyCode::Esc => {
            app.playlist_popup = false;
        }

        KeyCode::Char('j') | KeyCode::Down => app.append_list.next(),
        KeyCode::Char('k') | KeyCode::Up => app.append_list.prev(),

        KeyCode::Enter => {
            // name of highlighted playlist in append list
            let pl_name = &app.append_list.get_item_at_current_index();

            match app.selected_tab {
                SelectedTab::Queue => {
                    // Just exit out the menu if no item is selected in the Queue
                    if app.queue_list.list.is_empty() {
                        app.playlist_popup = false;
                        return Ok(());
                    }

                    if let Ok(songs) = app.conn.conn.songs(app.queue_list.index as u32) {
                        let option_song = songs.first();
                        if let Some(song) = option_song {
                            if *pl_name == "Current Playlist" {
                                app.conn.conn.push(&song)?;
                                app.update_queue();
                            } else {
                                app.conn.add_to_playlist(pl_name, &song)?;
                            }
                        }
                    }
                }

                SelectedTab::DirectoryBrowser => {
                    let (t, f) = app.browser.filetree.get(app.browser.selected).unwrap();
                    if t == "file" {
                        let short_path = f;
                        if let Some(full_path) = app.conn.get_full_path(short_path) {
                            let song = app.conn.get_song_with_only_filename(&full_path);

                            if *pl_name == "Current Playlist" {
                                app.conn.conn.push(&song)?;
                                app.update_queue();
                            } else {
                                app.conn.add_to_playlist(pl_name, &song)?;
                            }
                        }
                    } else if t == "directory" {
                        for (t, f) in app.conn.conn.listfiles(f)?.iter() {
                            // dir_vec.push((t, f));
                            if t == "file"
                                && Path::new(&f).has_extension(&[
                                    "mp3", "ogg", "flac", "m4a", "wav", "aac", "opus", "ape",
                                    "wma", "mpc", "aiff", "dff", "mp2", "mka",
                                ])
                            {
                                let full_path = app.conn.get_full_path(f).unwrap_or_default();
                                let song = app.conn.get_song_with_only_filename(&full_path);
                                if *pl_name == "Current Playlist" {
                                    app.conn.conn.push(&song)?;
                                } else {
                                    app.conn.add_to_playlist(pl_name, &song)?;
                                }
                            }
                        }
                    }
                }

                SelectedTab::Playlists => {
                    let playlist_name = app.pl_list.get_item_at_current_index();
                    if *pl_name == "Current Playlist" {
                        app.conn.load_playlist(playlist_name)?;
                        app.update_queue();
                    } else {
                        let songs = app.conn.conn.playlist(playlist_name)?;
                        for song in songs {
                            // We ignore the Err() since there could be songs in playlists, which do not exist in the db anymore.
                            // So instead of panicking, we just ignore if the song does not exists
                            app.conn
                                .add_to_playlist(*pl_name, &song)
                                .unwrap_or_else(|_| {});
                        }
                    }
                }
            }

            // hide the playlist popup
            app.playlist_popup = false;
            app.append_list.index = 0;
        }
        _ => {}
    }

    Ok(())
}