annotate foosdk/sdk/foobar2000/SDK/playlist.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "playlist.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class enum_items_callback_func : public playlist_manager::enum_items_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 bool on_item(t_size p_index, const metadb_handle_ptr& p_location, bool b_selected) override { return f(p_index, p_location, b_selected); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 playlist_manager::enum_items_func f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 class enum_items_callback_retrieve_item : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 metadb_handle_ptr m_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 enum_items_callback_retrieve_item() : m_item(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 (void)p_index; (void)b_selected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 PFC_ASSERT(m_item.is_empty());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 m_item = p_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 inline const metadb_handle_ptr & get_item() {return m_item;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class enum_items_callback_retrieve_selection : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 bool m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 enum_items_callback_retrieve_selection() : m_state(false) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 (void)p_index; (void)p_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 m_state = b_selected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 inline bool get_state() {return m_state;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 class enum_items_callback_retrieve_selection_mask : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 bit_array_var & m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 enum_items_callback_retrieve_selection_mask(bit_array_var & p_out) : m_out(p_out) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 (void)p_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 m_out.set(p_index,b_selected);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 class enum_items_callback_retrieve_all_items : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 pfc::list_base_t<metadb_handle_ptr> & m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 enum_items_callback_retrieve_all_items(pfc::list_base_t<metadb_handle_ptr> & p_out) : m_out(p_out) {m_out.remove_all();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 (void)p_index; (void)b_selected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 m_out.add_item(p_location);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 class enum_items_callback_retrieve_selected_items : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 pfc::list_base_t<metadb_handle_ptr> & m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 enum_items_callback_retrieve_selected_items(pfc::list_base_t<metadb_handle_ptr> & p_out) : m_out(p_out) {m_out.remove_all();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 (void)p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if (b_selected) m_out.add_item(p_location);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 class enum_items_callback_count_selection : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 t_size m_counter,m_max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 enum_items_callback_count_selection(t_size p_max) : m_max(p_max), m_counter(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 (void)p_index; (void)p_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (b_selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (++m_counter >= m_max) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 inline t_size get_count() {return m_counter;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 void playlist_manager::playlist_get_all_items(t_size p_playlist,pfc::list_base_t<metadb_handle_ptr> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 playlist_get_items(p_playlist,out, pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void playlist_manager::playlist_get_selected_items(t_size p_playlist,pfc::list_base_t<metadb_handle_ptr> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 enum_items_callback_retrieve_selected_items cb(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 playlist_enum_items(p_playlist,cb,pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 void playlist_manager::playlist_get_selection_mask(t_size p_playlist,bit_array_var & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 enum_items_callback_retrieve_selection_mask cb(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 playlist_enum_items(p_playlist,cb,pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 bool playlist_manager::playlist_is_item_selected(t_size p_playlist,t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 enum_items_callback_retrieve_selection callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 playlist_enum_items(p_playlist,callback,pfc::bit_array_one(p_item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return callback.get_state();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 metadb_handle_ptr playlist_manager::playlist_get_item_handle(t_size playlist, t_size item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 metadb_handle_ptr temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 if (!playlist_get_item_handle(temp, playlist, item)) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 PFC_ASSERT( temp.is_valid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 bool playlist_manager::playlist_get_item_handle(metadb_handle_ptr & p_out,t_size p_playlist,t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 enum_items_callback_retrieve_item callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 playlist_enum_items(p_playlist,callback,pfc::bit_array_one(p_item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 p_out = callback.get_item();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 return p_out.is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 void playlist_manager::g_make_selection_move_permutation(t_size * p_output,t_size p_count,const bit_array & p_selection,int p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 pfc::create_move_items_permutation(p_output,p_count,p_selection,p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 bool playlist_manager::playlist_move_selection(t_size p_playlist,int p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (p_delta==0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 t_size count = playlist_get_item_count(p_playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 pfc::array_t<t_size> order; order.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 pfc::array_t<bool> selection; selection.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 pfc::bit_array_var_table mask(selection.get_ptr(),selection.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 playlist_get_selection_mask(p_playlist, mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 g_make_selection_move_permutation(order.get_ptr(),count,mask,p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 return playlist_reorder_items(p_playlist,order.get_ptr(),count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 //retrieving status
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 t_size playlist_manager::activeplaylist_get_item_count()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 if (playlist == SIZE_MAX) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 else return playlist_get_item_count(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 void playlist_manager::playlist_enum_items(size_t which, enum_items_func f, const bit_array& mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 enum_items_callback_func cb; cb.f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 this->playlist_enum_items(which, cb, mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 void playlist_manager::activeplaylist_enum_items(enum_items_callback & p_callback,const bit_array & p_mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (playlist != SIZE_MAX) playlist_enum_items(playlist,p_callback,p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 void playlist_manager::activeplaylist_enum_items(enum_items_func f, const bit_array& mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 size_t playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 if (playlist != SIZE_MAX) playlist_enum_items(playlist, f, mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 t_size playlist_manager::activeplaylist_get_focus_item()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if (playlist == SIZE_MAX) return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 else return playlist_get_focus_item(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 bool playlist_manager::activeplaylist_get_name(pfc::string_base & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 if (playlist == SIZE_MAX) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 else return playlist_get_name(playlist,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 //modifying playlist
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 bool playlist_manager::activeplaylist_reorder_items(const t_size * order,t_size count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 if (playlist != SIZE_MAX) return playlist_reorder_items(playlist,order,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 void playlist_manager::activeplaylist_set_selection(const bit_array & affected,const bit_array & status)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 if (playlist != SIZE_MAX) playlist_set_selection(playlist,affected,status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 bool playlist_manager::activeplaylist_remove_items(const bit_array & mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 if (playlist != SIZE_MAX) return playlist_remove_items(playlist,mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 bool playlist_manager::activeplaylist_replace_item(t_size p_item,const metadb_handle_ptr & p_new_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 if (playlist != SIZE_MAX) return playlist_replace_item(playlist,p_item,p_new_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 void playlist_manager::activeplaylist_set_focus_item(t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 if (playlist != SIZE_MAX) playlist_set_focus_item(playlist,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 t_size playlist_manager::activeplaylist_insert_items(t_size p_base,const pfc::list_base_const_t<metadb_handle_ptr> & data,const bit_array & p_selection)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 if (playlist != SIZE_MAX) return playlist_insert_items(playlist,p_base,data,p_selection);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 else return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 void playlist_manager::activeplaylist_ensure_visible(t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 if (playlist != SIZE_MAX) playlist_ensure_visible(playlist,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 bool playlist_manager::activeplaylist_rename(const char * p_name,t_size p_name_len)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 if (playlist != SIZE_MAX) return playlist_rename(playlist,p_name,p_name_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 bool playlist_manager::activeplaylist_is_item_selected(t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (playlist != pfc_infinite) return playlist_is_item_selected(playlist,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 metadb_handle_ptr playlist_manager::activeplaylist_get_item_handle(t_size p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 metadb_handle_ptr temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 if (!activeplaylist_get_item_handle(temp, p_item)) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 PFC_ASSERT( temp.is_valid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 bool playlist_manager::activeplaylist_get_item_handle(metadb_handle_ptr & p_out,t_size p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 if (playlist != SIZE_MAX) return playlist_get_item_handle(p_out,playlist,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 void playlist_manager::activeplaylist_move_selection(int p_delta)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (playlist != SIZE_MAX) playlist_move_selection(playlist,p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 void playlist_manager::activeplaylist_get_selection_mask(bit_array_var & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (playlist != SIZE_MAX) playlist_get_selection_mask(playlist,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 void playlist_manager::activeplaylist_get_all_items(pfc::list_base_t<metadb_handle_ptr> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 if (playlist != SIZE_MAX) playlist_get_all_items(playlist,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 void playlist_manager::activeplaylist_get_selected_items(pfc::list_base_t<metadb_handle_ptr> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 if (playlist != SIZE_MAX) playlist_get_selected_items(playlist,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 bool playlist_manager::remove_playlist(t_size idx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 return remove_playlists(pfc::bit_array_one(idx));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 bool playlist_incoming_item_filter::process_location(const char * url,pfc::list_base_t<metadb_handle_ptr> & out,bool filter,const char * p_mask,const char * p_exclude,fb2k::hwnd_t p_parentwnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 return process_locations(pfc::list_single_ref_t<const char*>(url),out,filter,p_mask,p_exclude,p_parentwnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 void playlist_manager::playlist_clear(t_size p_playlist)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 playlist_remove_items(p_playlist, pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 void playlist_manager::activeplaylist_clear()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 if (playlist != SIZE_MAX) playlist_clear(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 bool playlist_manager::playlist_update_content(t_size playlist, metadb_handle_list_cref content, bool bUndoBackup) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 metadb_handle_list old;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 playlist_get_all_items(playlist, old);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if (old.get_size() == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 if (content.get_size() == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 if (bUndoBackup) playlist_undo_backup(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 playlist_add_items(playlist, content, pfc::bit_array_false());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 pfc::avltree_t<metadb_handle::nnptr> itemsOld, itemsNew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 for(t_size walk = 0; walk < old.get_size(); ++walk) itemsOld += old[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 for(t_size walk = 0; walk < content.get_size(); ++walk) itemsNew += content[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 pfc::bit_array_bittable removeMask(old.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 pfc::bit_array_bittable filterMask(content.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 bool gotNew = false, filterNew = false, gotRemove = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 for(t_size walk = 0; walk < content.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 const bool state = !itemsOld.have_item(content[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if (state) gotNew = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 else filterNew = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 filterMask.set(walk, state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 for(t_size walk = 0; walk < old.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 const bool state = !itemsNew.have_item(old[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 if (state) gotRemove = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 removeMask.set(walk, state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 if (!gotNew && !gotRemove) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 if (bUndoBackup) playlist_undo_backup(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 if (gotRemove) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 playlist_remove_items(playlist, removeMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 if (gotNew) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 if (filterNew) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 metadb_handle_list temp(content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 temp.filter_mask(filterMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 playlist_add_items(playlist, temp, pfc::bit_array_false());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 playlist_add_items(playlist, content, pfc::bit_array_false());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 playlist_get_all_items(playlist, old);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 pfc::array_t<t_size> order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 if (pfc::guess_reorder_pattern<pfc::list_base_const_t<metadb_handle_ptr> >(order, old, content)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 playlist_reorder_items(playlist, order.get_ptr(), order.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 bool playlist_manager::playlist_add_items(t_size playlist,const pfc::list_base_const_t<metadb_handle_ptr> & data,const bit_array & p_selection)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 return playlist_insert_items(playlist, SIZE_MAX, data, p_selection) != SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 bool playlist_manager::activeplaylist_add_items(const pfc::list_base_const_t<metadb_handle_ptr> & data,const bit_array & p_selection)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if (playlist != SIZE_MAX) return playlist_add_items(playlist,data,p_selection);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 bool playlist_manager::playlist_insert_items_filter(t_size p_playlist,t_size p_base,const pfc::list_base_const_t<metadb_handle_ptr> & p_data,bool p_select)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 metadb_handle_list temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 if (!playlist_incoming_item_filter::get()->filter_items(p_data,temp))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 return playlist_insert_items(p_playlist,p_base,temp, pfc::bit_array_val(p_select)) != SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 bool playlist_manager::activeplaylist_insert_items_filter(t_size p_base,const pfc::list_base_const_t<metadb_handle_ptr> & p_data,bool p_select)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 if (playlist != SIZE_MAX) return playlist_insert_items_filter(playlist,p_base,p_data,p_select);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 bool playlist_manager::playlist_insert_locations(t_size p_playlist,t_size p_base,const pfc::list_base_const_t<const char*> & p_urls,bool p_select,fb2k::hwnd_t p_parentwnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 metadb_handle_list temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 if (!playlist_incoming_item_filter::get()->process_locations(p_urls,temp,true,0,0,p_parentwnd)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 return playlist_insert_items(p_playlist,p_base,temp, pfc::bit_array_val(p_select)) != SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 bool playlist_manager::activeplaylist_insert_locations(t_size p_base,const pfc::list_base_const_t<const char*> & p_urls,bool p_select,fb2k::hwnd_t p_parentwnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 if (playlist != SIZE_MAX) return playlist_insert_locations(playlist,p_base,p_urls,p_select,p_parentwnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 bool playlist_manager::playlist_add_items_filter(t_size p_playlist,const pfc::list_base_const_t<metadb_handle_ptr> & p_data,bool p_select)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 return playlist_insert_items_filter(p_playlist,SIZE_MAX,p_data,p_select);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 bool playlist_manager::activeplaylist_add_items_filter(const pfc::list_base_const_t<metadb_handle_ptr> & p_data,bool p_select)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 return activeplaylist_insert_items_filter(SIZE_MAX,p_data,p_select);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 bool playlist_manager::playlist_add_locations(t_size p_playlist,const pfc::list_base_const_t<const char*> & p_urls,bool p_select,fb2k::hwnd_t p_parentwnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 return playlist_insert_locations(p_playlist,SIZE_MAX,p_urls,p_select,p_parentwnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 bool playlist_manager::activeplaylist_add_locations(const pfc::list_base_const_t<const char*> & p_urls,bool p_select,fb2k::hwnd_t p_parentwnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 return activeplaylist_insert_locations(SIZE_MAX,p_urls,p_select,p_parentwnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 void playlist_manager::reset_playing_playlist()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 set_playing_playlist(get_active_playlist());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 void playlist_manager::playlist_clear_selection(t_size p_playlist)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 playlist_set_selection(p_playlist, pfc::bit_array_true(), pfc::bit_array_false());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 void playlist_manager::activeplaylist_clear_selection()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 if (playlist != SIZE_MAX) playlist_clear_selection(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 void playlist_manager::activeplaylist_undo_backup()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 if (playlist != SIZE_MAX) playlist_undo_backup(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 bool playlist_manager::activeplaylist_undo_restore()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 if (playlist != SIZE_MAX) return playlist_undo_restore(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 bool playlist_manager::activeplaylist_redo_restore()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 if (playlist != SIZE_MAX) return playlist_redo_restore(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 void playlist_manager::playlist_remove_selection(t_size p_playlist,bool p_crop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 pfc::bit_array_bittable table(playlist_get_item_count(p_playlist));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 playlist_get_selection_mask(p_playlist,table);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 if (p_crop) playlist_remove_items(p_playlist, pfc::bit_array_not(table));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 else playlist_remove_items(p_playlist,table);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 void playlist_manager::activeplaylist_remove_selection(bool p_crop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 if (playlist != SIZE_MAX) playlist_remove_selection(playlist,p_crop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 void playlist_manager::activeplaylist_item_format_title(t_size p_item,titleformat_hook * p_hook,pfc::string_base & out,const service_ptr_t<titleformat_object> & p_script,titleformat_text_filter * p_filter,play_control::t_display_level p_playback_info_level)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 if (playlist == SIZE_MAX) out = "NJET";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 else playlist_item_format_title(playlist,p_item,p_hook,out,p_script,p_filter,p_playback_info_level);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 void playlist_manager::playlist_set_selection_single(t_size p_playlist,t_size p_item,bool p_state)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 playlist_set_selection(p_playlist, pfc::bit_array_one(p_item), pfc::bit_array_val(p_state));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 void playlist_manager::activeplaylist_set_selection_single(t_size p_item,bool p_state)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 if (playlist != SIZE_MAX) playlist_set_selection_single(playlist,p_item,p_state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 t_size playlist_manager::playlist_get_selection_count(t_size p_playlist,t_size p_max)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 enum_items_callback_count_selection callback(p_max);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 playlist_enum_items(p_playlist,callback, pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 return callback.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 t_size playlist_manager::activeplaylist_get_selection_count(t_size p_max)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 if (playlist != SIZE_MAX) return playlist_get_selection_count(playlist,p_max);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 else return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 bool playlist_manager::playlist_get_focus_item_handle(metadb_handle_ptr & p_out,t_size p_playlist)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 t_size index = playlist_get_focus_item(p_playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 if (index == SIZE_MAX) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 return playlist_get_item_handle(p_out,p_playlist,index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 bool playlist_manager::activeplaylist_get_focus_item_handle(metadb_handle_ptr & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 if (playlist != SIZE_MAX) return playlist_get_focus_item_handle(p_out,playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 t_size playlist_manager::find_playlist(const char * p_name,t_size p_name_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 t_size n, m = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 if (!playlist_get_name(n,temp)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 if (stricmp_utf8_ex(temp,temp.length(),p_name,p_name_length) == 0) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 t_size playlist_manager::find_or_create_playlist_unlocked(const char * p_name, t_size p_name_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 t_size n, m = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 if (!playlist_lock_is_present(n) && playlist_get_name(n,temp)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 if (stricmp_utf8_ex(temp,SIZE_MAX,p_name,p_name_length) == 0) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 return create_playlist(p_name,p_name_length, SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 t_size playlist_manager::find_or_create_playlist(const char * p_name,t_size p_name_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 t_size index = find_playlist(p_name,p_name_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 if (index != SIZE_MAX) return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 return create_playlist(p_name,p_name_length, SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 t_size playlist_manager::create_playlist_autoname(t_size p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 static const char new_playlist_text[] = "New Playlist";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 if (find_playlist(new_playlist_text, SIZE_MAX) == SIZE_MAX) return create_playlist(new_playlist_text,SIZE_MAX,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 for(t_size walk = 2; ; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 pfc::string_fixed_t<64> namebuffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 namebuffer << new_playlist_text << " (" << walk << ")";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 if (find_playlist(namebuffer, SIZE_MAX) == SIZE_MAX) return create_playlist(namebuffer,SIZE_MAX,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 bool playlist_manager::activeplaylist_sort_by_format(const char * spec,bool p_sel_only)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 if (playlist != pfc_infinite) return playlist_sort_by_format(playlist,spec,p_sel_only);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 bool playlist_manager::highlight_playing_item()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 t_size playlist,item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 if (!get_playing_item_location(&playlist,&item)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 set_active_playlist(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 playlist_set_focus_item(playlist,item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 playlist_set_selection(playlist, pfc::bit_array_true(), pfc::bit_array_one(item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 playlist_ensure_visible(playlist,item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 void playlist_manager::playlist_get_items(t_size p_playlist,pfc::list_base_t<metadb_handle_ptr> & out,const bit_array & p_mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 enum_items_callback_retrieve_all_items cb(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 playlist_enum_items(p_playlist,cb,p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 void playlist_manager::activeplaylist_get_items(pfc::list_base_t<metadb_handle_ptr> & out,const bit_array & p_mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 if (playlist != pfc_infinite) playlist_get_items(playlist,out,p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 else out.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 void playlist_manager::active_playlist_fix()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 if (playlist == pfc_infinite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 t_size max = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 if (max == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 create_playlist_autoname();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 set_active_playlist(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 class enum_items_callback_remove_list : public playlist_manager::enum_items_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 const metadb_handle_list & m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 bit_array_var & m_table;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 t_size m_found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 enum_items_callback_remove_list(const metadb_handle_list & p_data,bit_array_var & p_table) : m_data(p_data), m_table(p_table), m_found(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected) override
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 (void)b_selected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 bool found = m_data.bsearch_by_pointer(p_location) != pfc_infinite;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 m_table.set(p_index,found);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 if (found) m_found++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 inline t_size get_found() const {return m_found;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 void playlist_manager::remove_items_from_all_playlists(const pfc::list_base_const_t<metadb_handle_ptr> & p_data)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 t_size playlist_num, playlist_max = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 if (playlist_max != pfc_infinite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 metadb_handle_list temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 temp.add_items(p_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 temp.sort_by_pointer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 for(playlist_num = 0; playlist_num < playlist_max; playlist_num++ )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 t_size playlist_item_count = playlist_get_item_count(playlist_num);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 if (playlist_item_count == pfc_infinite) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 pfc::bit_array_bittable table(playlist_item_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 enum_items_callback_remove_list callback(temp,table);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 playlist_enum_items(playlist_num,callback, pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 if (callback.get_found()>0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 playlist_remove_items(playlist_num,table);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 bool playlist_manager::get_all_items(pfc::list_base_t<metadb_handle_ptr> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 t_size n, m = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 if (m == pfc_infinite) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 enum_items_callback_retrieve_all_items callback(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 for(n=0;n<m;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 playlist_enum_items(n,callback,pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 t_uint32 playlist_manager::activeplaylist_lock_get_filter_mask()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 if (playlist == SIZE_MAX) return UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 else return playlist_lock_get_filter_mask(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 bool playlist_manager::activeplaylist_is_undo_available()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 if (playlist == pfc_infinite) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 else return playlist_is_undo_available(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 bool playlist_manager::activeplaylist_is_redo_available()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 if (playlist == pfc_infinite) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 else return playlist_is_redo_available(playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 bool playlist_manager::remove_playlist_user() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 size_t a = this->get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 if (a == SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 // FIX ME implement toast
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 return this->remove_playlist_user(a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 bool playlist_manager::remove_playlist_user(size_t which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 if (this->get_playlist_count() == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 // FIX ME implement toast
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 if (!this->remove_playlist_switch(which)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 // FIX ME implement toast
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 bool playlist_manager::remove_playlist_switch(t_size idx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 bool need_switch = get_active_playlist() == idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 if (remove_playlist(idx))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 if (need_switch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 t_size total = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 if (total > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 if (idx >= total) idx = total-1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 set_active_playlist(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 bool t_playback_queue_item::operator==(const t_playback_queue_item & p_item) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 return m_handle == p_item.m_handle && m_playlist == p_item.m_playlist && m_item == p_item.m_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 bool t_playback_queue_item::operator!=(const t_playback_queue_item & p_item) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 return m_handle != p_item.m_handle || m_playlist != p_item.m_playlist || m_item != p_item.m_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 bool playlist_manager::activeplaylist_execute_default_action(t_size p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 t_size idx = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 if (idx == pfc_infinite) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 else return playlist_execute_default_action(idx,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 class completion_notify_dfd : public completion_notify {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 completion_notify_dfd(const pfc::list_base_const_t<metadb_handle_ptr> & p_data,service_ptr_t<process_locations_notify> p_notify) : m_data(p_data), m_notify(p_notify) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 void on_completion(unsigned p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 switch(p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 case metadb_io::load_info_aborted:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 m_notify->on_aborted();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 m_notify->on_completion(m_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 metadb_handle_list m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 service_ptr_t<process_locations_notify> m_notify;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 void dropped_files_data_impl::to_handles_async_ex(t_uint32 p_op_flags,fb2k::hwnd_t p_parentwnd,service_ptr_t<process_locations_notify> p_notify) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 if (m_is_paths) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 playlist_incoming_item_filter_v2::get()->process_locations_async(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 m_paths,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 p_op_flags,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 p_parentwnd,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 t_uint32 flags = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 if (p_op_flags & playlist_incoming_item_filter_v2::op_flag_background) flags |= metadb_io_v2::op_flag_background;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 if (p_op_flags & playlist_incoming_item_filter_v2::op_flag_delay_ui) flags |= metadb_io_v2::op_flag_delay_ui;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 metadb_io_v2::get()->load_info_async(m_handles,metadb_io::load_info_default,p_parentwnd,flags,new service_impl_t<completion_notify_dfd>(m_handles,p_notify));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 void dropped_files_data_impl::to_handles_async(bool p_filter,fb2k::hwnd_t p_parentwnd,service_ptr_t<process_locations_notify> p_notify) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 to_handles_async_ex(p_filter ? 0 : playlist_incoming_item_filter_v2::op_flag_no_filter,p_parentwnd,p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 bool dropped_files_data_impl::to_handles(pfc::list_base_t<metadb_handle_ptr> & p_out,bool p_filter,fb2k::hwnd_t p_parentwnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 if (m_is_paths) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 return playlist_incoming_item_filter::get()->process_locations(m_paths,p_out,p_filter,NULL,NULL,p_parentwnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 if (metadb_io::get()->load_info_multi(m_handles,metadb_io::load_info_default,p_parentwnd,true) == metadb_io::load_info_aborted) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 p_out = m_handles;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 void playlist_manager::playlist_activate_delta(int p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 const t_size total = get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 if (total > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 t_size active = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 //clip p_delta to -(total-1)...(total-1) range
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 if (p_delta < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 p_delta = - ( (-p_delta) % (t_ssize)total );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 p_delta = p_delta % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 if (p_delta != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 if (active == pfc_infinite) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 //special case when no playlist is active
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 if (p_delta > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 active = (t_size)(p_delta - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 active = (total + p_delta);//p_delta is negative
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 active = (t_size) (active + total + p_delta) % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 set_active_playlist(active % total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 class enum_items_callback_get_selected_count : public playlist_manager::enum_items_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 enum_items_callback_get_selected_count() : m_found() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 t_size get_count() const {return m_found;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 (void)p_index; (void)p_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 if (b_selected) m_found++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 t_size m_found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 t_size playlist_manager::playlist_get_selected_count(t_size p_playlist,bit_array const & p_mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 enum_items_callback_get_selected_count callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 playlist_enum_items(p_playlist,callback,p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 return callback.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 class enum_items_callback_find_item : public playlist_manager::enum_items_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 enum_items_callback_find_item(metadb_handle_ptr p_lookingFor) : m_lookingFor(p_lookingFor) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 t_size result() const {return m_result;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 (void)b_selected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 if (p_location == m_lookingFor) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 m_result = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 metadb_handle_ptr m_lookingFor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 size_t m_result = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 class enum_items_callback_find_item_selected : public playlist_manager::enum_items_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 enum_items_callback_find_item_selected(metadb_handle_ptr p_lookingFor) : m_lookingFor(p_lookingFor) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 t_size result() const {return m_result;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool b_selected) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 if (b_selected && p_location == m_lookingFor) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 m_result = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 metadb_handle_ptr m_lookingFor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 size_t m_result = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 bool playlist_manager::playlist_find_item(t_size p_playlist,metadb_handle_ptr p_item,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 enum_items_callback_find_item callback(p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 playlist_enum_items(p_playlist,callback,pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 t_size result = callback.result();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 if (result == SIZE_MAX) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 p_result = result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 bool playlist_manager::playlist_find_item_selected(t_size p_playlist,metadb_handle_ptr p_item,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 enum_items_callback_find_item_selected callback(p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 playlist_enum_items(p_playlist,callback,pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 t_size result = callback.result();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 if (result == SIZE_MAX) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 p_result = result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 t_size playlist_manager::playlist_set_focus_by_handle(t_size p_playlist,metadb_handle_ptr p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 t_size index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 if (!playlist_find_item(p_playlist,p_item,index)) index = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 playlist_set_focus_item(p_playlist,index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 bool playlist_manager::activeplaylist_find_item(metadb_handle_ptr p_item,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 if (playlist == SIZE_MAX) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 return playlist_find_item(playlist,p_item,p_result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 t_size playlist_manager::activeplaylist_set_focus_by_handle(metadb_handle_ptr p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 t_size playlist = get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 if (playlist == SIZE_MAX) return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 return playlist_set_focus_by_handle(playlist,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 pfc::com_ptr_t<interface IDataObject> playlist_incoming_item_filter::create_dataobject_ex(metadb_handle_list_cref data) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 pfc::com_ptr_t<interface IDataObject> temp; temp.attach( create_dataobject(data) ); PFC_ASSERT( temp.is_valid() ); return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 void playlist_manager_v3::recycler_restore_by_id(t_uint32 id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 t_size which = recycler_find_by_id(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 if (which != ~0) recycler_restore(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 t_size playlist_manager_v3::recycler_find_by_id(t_uint32 id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 const t_size total = recycler_get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 if (id == recycler_get_id(walk)) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 typedef pfc::map_t< const char*, metadb_handle_list, metadb::path_comparator > byPath_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 static void rechapter_worker(playlist_manager* api, byPath_t const& byPath) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 if (byPath.get_count() == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 const size_t numPlaylists = api->get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 for (size_t walkPlaylist = 0; walkPlaylist < numPlaylists; ++walkPlaylist) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 if (!api->playlist_lock_is_present(walkPlaylist)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 auto itemCount = [=] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 return api->playlist_get_item_count(walkPlaylist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 auto itemHandle = [=](size_t item) -> metadb_handle_ptr {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 return api->playlist_get_item_handle(walkPlaylist, item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 for (size_t walkItem = 0; walkItem < itemCount(); ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 auto item = itemHandle(walkItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 auto itemPath = item->get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 auto match = byPath.find(itemPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 if (match.is_valid() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 pfc::avltree_t<uint32_t> subsongs;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 auto base = walkItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 bool bSel = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 for (++walkItem; walkItem < itemCount(); ++walkItem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 auto handle = itemHandle(walkItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 if (metadb::path_compare(itemPath, handle->get_path()) != 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 if (!subsongs.add_item_check(handle->get_subsong_index())) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 bSel = bSel || api->playlist_is_item_selected(walkPlaylist, walkItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 const auto& newItems = match->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 // REMOVE base ... walkItem range and insert newHandles at base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 api->playlist_remove_items(walkPlaylist, pfc::bit_array_range(base, walkItem - base));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 api->playlist_insert_items(walkPlaylist, base, newItems, pfc::bit_array_val(bSel));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 walkItem = base + newItems.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 ++walkItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 void playlist_manager::on_files_rechaptered( metadb_handle_list_cref newHandles ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 pfc::map_t< const char*, metadb_handle_list, metadb::path_comparator > byPath;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 const size_t total = newHandles.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 for( size_t w = 0; w < total; ++w ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 auto handle = newHandles[w];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 byPath[ handle->get_path() ] += handle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 rechapter_worker(this, byPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 void playlist_manager::on_file_rechaptered(const char* path, metadb_handle_list_cref newItems) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 // obsolete method
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 (void)path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 on_files_rechaptered(newItems);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 class process_locations_notify_lambda : public process_locations_notify {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 process_locations_notify::func_t f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 void on_completion(metadb_handle_list_cref p_items) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 PFC_ASSERT(f != nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 f(p_items);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 void on_aborted() override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 process_locations_notify::ptr process_locations_notify::create(func_t arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 PFC_ASSERT(arg != nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 auto ret = fb2k::service_new< process_locations_notify_lambda >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 ret->f = arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 }