~gg-lp/music-app/music-app

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * Copyright (C) 2013, 2014, 2015
 *      Andrew Hayzen <ahayzen@gmail.com>
 *      Daniel Holm <d.holmen@gmail.com>
 *      Victor Thompson <victor.thompson@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import QtMultimedia 5.0
import QtQuick 2.3
import Ubuntu.Components 1.1
import Ubuntu.Components.ListItems 1.0 as ListItem
import Ubuntu.Components.Popups 1.0
import QtQuick.LocalStorage 2.0
import "meta-database.js" as Library
import "playlists.js" as Playlists
import "common"


/* NOTE:
* Text is barly visible as of right now and a bug report has been filed:
* https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1225778
*
* Wait until the bug is resolved, or move on to use other stuff then ListItems.
*/

// Page that will be used when adding tracks to playlists
MusicPage {
    id: addToPlaylistPage
    objectName: "addToPlaylistPage"
    // TRANSLATORS: this appears in the header with limited space (around 20 characters)
    title: i18n.tr("Select playlist")
    searchable: true
    searchResultsCount: addToPlaylistModelFilter.count
    state: "default"
    states: [
        PageHeadState {
            name: "default"
            head: addToPlaylistPage.head
            actions: [
                Action {
                    enabled: allSongsModel.count > 0
                    objectName: "newPlaylistButton"
                    iconName: "add"
                    onTriggered: {
                        customdebug("New playlist.")
                        PopupUtils.open(newPlaylistDialog, mainView)
                    }
                },
                Action {
                    enabled: playlistModel.model.count > 0 && allSongsModel.count > 0
                    iconName: "search"
                    onTriggered: addToPlaylistPage.state = "search"
                }
            ]
        },
        SearchHeadState {
            id: searchHeader
            thisPage: addToPlaylistPage
        }
    ]

    property var chosenElements: []
    property var page

    onVisibleChanged: {
        // Load the playlistmodel if it hasn't loaded or is empty
        if (visible && (!playlistModel.completed || playlistModel.model.count === 0)) {
            playlistModel.canLoad = true  // ensure the model canLoad
            playlistModel.filterPlaylists()
        }
    }

    CardView {
        id: addtoPlaylistView
        itemWidth: units.gu(12)
        model: SortFilterModel {
            // Sorting disabled as it is incorrect on first run (due to workers?)
            // and SQL sorts the data correctly
            id: addToPlaylistModelFilter
            model: playlistModel.model
            filter.property: "name"
            filter.pattern: new RegExp(searchHeader.query, "i")
            filterCaseSensitivity: Qt.CaseInsensitive
        }
        objectName: "addToPlaylistCardView"
        delegate: Card {
            id: playlist
            coverSources: Playlists.getPlaylistCovers(playlist.name)
            objectName: "addToPlaylistCardItem" + index
            property string name: model.name
            property string count: model.count

            primaryText: playlist.name
            secondaryText: i18n.tr("%1 song", "%1 songs", playlist.count).arg(playlist.count)

            onClicked: {
                Playlists.addToPlaylistList(name, chosenElements)

                // Check that the parent parent page is not being refiltered
                if (page !== undefined && page.page !== undefined && page.page.title === i18n.tr("Playlists")) {
                    page.page.changed = true
                } else {
                    playlistModel.filterPlaylists();
                }

                if (Library.recentContainsPlaylist(name)) {
                    // Check that the parent parent page is not being refiltered
                    if (page !== undefined && page.page !== undefined && page.page.title === i18n.tr("Recent")) {
                        page.page.changed = true
                    } else {
                        recentModel.filterRecent()
                    }
                }

                if (page !== undefined && name === page.line2 && page.playlistChanged !== undefined) {
                    page.playlistChanged = true
                    page.covers = Playlists.getPlaylistCovers(name)
                }

                musicToolbar.goBack();  // go back to the previous page
            }
        }
    }
}