3
public class BeatBox.SideTreeView : TreeView {
6
TreeStore sideTreeModel;
9
TreeIter play_queue_iter;
10
TreeIter already_played_iter;
13
TreeIter internet_iter;
14
TreeIter playlist_iter;
15
TreeIter smart_playlist_iter;
17
//for playlist right click
20
MenuItem smartPlaylistNew;
21
MenuItem playlistEdit;
22
MenuItem playlistRemove;
24
Widget current_widget;
26
public SideTreeView(LibraryManager lmm, LibraryWindow lww) {
33
TreeSelection selected = this.get_selection();
34
selected.set_mode(SelectionMode.MULTIPLE);
37
public void buildUI() {
38
/* 0: playlist, smart playlist, etc.
39
* 1: the widget to show in relation
42
sideTreeModel = new TreeStore(3, typeof(GLib.Object), typeof(Widget), typeof(string));
43
this.set_model(sideTreeModel);
44
this.set_headers_visible(false);
45
this.set_level_indentation(30);
46
this.show_expanders = false;
48
TreeViewColumn col = new TreeViewColumn();
50
this.insert_column(col, 0);
52
col = new TreeViewColumn();
54
this.insert_column(col, 1);
56
this.insert_column_with_data_func(-1, "title", new CellRendererPixbuf(), smartPixTextColumnData);
57
var cell_renderer_text = new Gtk.CellRendererText();
58
this.get_column(2).pack_end(cell_renderer_text, true);
59
this.get_column(2).set_attributes(cell_renderer_text, "text", 2, null);
62
foreach(TreeViewColumn tvc in this.get_columns()) {
63
if(index == 0 || index == 1)
69
this.button_press_event.connect(sideListClick);
70
this.get_selection().changed.connect(sideListSelectionChange);
73
//playlist right click menu
74
playlistMenu = new Menu();
75
playlistNew = new MenuItem.with_label("New Playlist");
76
smartPlaylistNew = new MenuItem.with_label("New Smart Playlist");
77
playlistEdit = new MenuItem.with_label("Edit");
78
playlistRemove = new MenuItem.with_label("Remove");
79
playlistMenu.append(playlistNew);
80
playlistMenu.append(smartPlaylistNew);
81
playlistMenu.append(playlistEdit);
82
playlistMenu.append(playlistRemove);
83
playlistNew.activate.connect(playlistMenuNewClicked);
84
smartPlaylistNew.activate.connect(smartPlaylistMenuNewClicked);
85
playlistEdit.activate.connect(playlistMenuEditClicked);
86
playlistRemove.activate.connect(playlistMenuRemoveClicked);
87
playlistMenu.show_all();
92
public void smartPixTextColumnData(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) {
95
tree_model.get(iter, 0, out o, 2, out title);
97
if(cell is CellRendererText) {
99
tree_model.get(iter, 2, out text);
100
((CellRendererText)cell).text = text;
102
else if(cell is CellRendererPixbuf && title == "Song Info") {
103
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock(Gtk.Stock.INFO, IconSize.MENU);
105
else if(cell is CellRendererPixbuf && title == "Library") {
106
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("folder-music", IconSize.MENU);
108
else if(cell is CellRendererPixbuf && title == "Queue") {
109
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("media-audio", IconSize.MENU);
111
else if(cell is CellRendererPixbuf && title == "Already Played") {
112
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("emblem-urgent", IconSize.MENU);
114
else if(cell is CellRendererPixbuf && o is SmartPlaylist) {
115
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("playlist-automatic", IconSize.MENU);
117
else if(cell is CellRendererPixbuf && o is Playlist) {
118
((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("playlist", IconSize.MENU);
122
Gdk.Pixbuf get_pixbuf_from_stock (string stock_id, Gtk.IconSize size)
126
pixbuf = this.render_icon(stock_id, size, null);
129
stdout.printf("null\n");
134
public void addBasicItems() {
135
stdout.printf("basic\n");
136
//sideTreeModel.append(out info_iter, null);
137
//sideTreeModel.set(info_iter, 0, null, 1, null, 2, "Information");
139
//sideTreeModel.append(out internet_iter, null);
140
//sideTreeModel.set(internet_iter, 0, null, 1, null, 2, "Internet");
142
//sideTreeModel.append(out smart_playlist_iter, null);
143
//sideTreeModel.set(smart_playlist_iter, 0, null, 1, null, 2, "Smart Playlists");
145
//sideTreeModel.append(out playlist_iter, null);
146
//sideTreeModel.set(playlist_iter, 0, null, 1, null, 2, "Playlists");
147
//sideTreeModel.set(playlist_iter, 0, null, 1, null, 2, "Playlists");
150
public TreeIter addItem(TreeIter? parent, GLib.Object? o, Widget w, string name) {
151
if(name == "Library") {
152
sideTreeModel.append(out library_iter, parent);
153
sideTreeModel.set(library_iter, 0, o, 1, w, 2, name);
156
else if(name == "Queue") {
157
sideTreeModel.append(out play_queue_iter, parent);
158
sideTreeModel.set(play_queue_iter, 0, o, 1, w, 2, name);
159
return play_queue_iter;
161
else if(name == "Already Played") {
162
sideTreeModel.append(out already_played_iter, parent);
163
sideTreeModel.set(already_played_iter, 0, o, 1, w, 2, name);
164
return already_played_iter;
168
sideTreeModel.append(out item, parent);
169
sideTreeModel.set(item, 0, o, 1, w, 2, name);
171
this.expand_to_path(sideTreeModel.get_path(item));
177
public Widget getSelectedWidget() {
178
TreeSelection selected = this.get_selection();
179
selected.set_mode(SelectionMode.SINGLE);
182
selected.get_selected (out model, out iter);
183
selected.set_mode(SelectionMode.MULTIPLE);
186
sideTreeModel.get(iter, 1, out w);
190
public Widget getWidget(TreeIter iter) {
192
sideTreeModel.get(iter, 1, out w);
196
public TreeIter get_library_iter() {
200
public TreeIter get_play_queue_iter() {
201
return play_queue_iter;
204
public TreeIter get_already_played_iter() {
205
return already_played_iter;
208
/*public TreeIter get_playlist_iter() {
209
return playlist_iter;
212
public TreeIter get_smart_playlist_iter() {
213
return smart_playlist_iter;
216
public TreeIter get_internet_iter() {
217
return internet_iter;
220
public TreeIter get_info_iter() {
224
public Widget get_current_widget() {
225
return current_widget;
228
public void updatePlayQueue() {
230
sideTreeModel.get(play_queue_iter, 1, out w);
231
((MusicTreeView)w).populateView(lm.queue(), false);
234
public void updateAlreadyPlayed() {
236
sideTreeModel.get(already_played_iter, 1, out w);
237
((MusicTreeView)w).populateView(lm.already_played(), false);
240
public virtual void sideListSelectionChange() {
241
sideTreeModel.foreach(updateView);
244
public virtual bool sideListClick(Gdk.EventButton event) {
245
if(event.type == Gdk.EventType.BUTTON_PRESS && event.button == 3) { //right click
246
// select one based on mouse position
249
TreeViewColumn column;
253
this.get_path_at_pos((int)event.x, (int)event.y, out path, out column, out cell_x, out cell_y);
255
if(!sideTreeModel.get_iter(out iter, path))
259
sideTreeModel.get(iter, 0, out id);
261
sideTreeModel.get(iter, 2, out name);
264
sideTreeModel.iter_parent(out parent, iter);
265
if(sideTreeModel.iter_is_valid(parent)) {
267
sideTreeModel.get(parent, 2, out parent_name);
269
if(parent_name == "Library" && id > 0) {
270
playlistMenu.popup (null, null, null, 3, get_current_event_time());
275
if(name == "Library") {
276
//show library right click menu
278
else if(name == "Play Queue") {
279
//show play queue right click menu
281
else if(name == "Playlists") {
282
playlistMenu.popup (null, null, null, 2, get_current_event_time());
289
else if(event.type == Gdk.EventType.BUTTON_PRESS && event.button == 1) {
290
/* All of this happens before selection_changed event, so do
291
* pre-requisites here. Examples are refreshing smart playlist,
292
* opening pandora if it isn't yet, etc.
296
TreeViewColumn column;
300
this.get_path_at_pos((int)event.x, (int)event.y, out path, out column, out cell_x, out cell_y);
302
if(!sideTreeModel.get_iter(out item, path))
306
sideTreeModel.get(item, 0, out o);
308
sideTreeModel.get(item, 1, out w);
310
sideTreeModel.get(item, 2, out name);
312
//searchField.text = (search != null) ? search : "";
315
sideTreeModel.iter_parent(out parent, item);
317
if(sideTreeModel.iter_is_valid(parent)) {
319
sideTreeModel.get(parent, 2, out parent_name);
321
if(parent_name == "Information") {
324
else if(parent_name == "Internet") {
327
else if(parent_name == "Smart Playlists") {
328
MusicTreeView mtv = (MusicTreeView)w;
329
mtv.populateView(lm.songs_from_smart_playlist(mtv.relative_id), false);
331
else if(parent_name == "Playlists") {
336
if(name == "Library") {
339
else if(name == "Queue") {
340
MusicTreeView mtv = (MusicTreeView)w;
341
mtv.populateView(lm.queue(), false);
343
else if(name == "Already Played") {
344
MusicTreeView mtv = (MusicTreeView)w;
345
mtv.populateView(lm.already_played(), false);
355
public void resetView() {
356
this.get_selection().unselect_all();
357
this.get_selection().select_iter(library_iter);
358
sideTreeModel.foreach(updateView);
361
public bool updateView(TreeModel model, TreePath path, TreeIter item) {
363
model.get(item, 1, out w);
366
if(this.get_selection().iter_is_selected(item)) {
368
this.current_widget = w;
379
//smart playlist context menu
380
public virtual void smartPlaylistMenuNewClicked() {
381
SmartPlaylistEditor spe = new SmartPlaylistEditor(new SmartPlaylist());
382
spe.playlist_saved.connect(smartPlaylistEditorSaved);
385
public virtual void smartPlaylistEditorSaved(SmartPlaylist sp) {
389
// TODO: loop through children to find where id = old
390
sideTreeModel.get_iter_from_string(out edit, "4:" + (sp.rowid - 1).to_string());
391
sideTreeModel.set(edit, 0, sp, 2, sp.name);
394
//add playlist to list
395
lm.add_smart_playlist(sp);
396
lw.addSideListItem(sp);
400
//playlist context menu
401
public virtual void playlistMenuNewClicked() {
402
PlaylistNameWindow pnw = new PlaylistNameWindow(new Playlist());
403
pnw.playlist_saved.connect(playlistNameWindowSaved);
406
public virtual void playlistNameWindowSaved(Playlist p) {
411
// TODO: loop through children to find where id = old
412
sideTreeModel.get_iter_from_string(out edit, "4:" + (p.rowid - 1).to_string());
413
sideTreeModel.set(edit, 0, p, 2, p.name);
416
//add playlist to list
418
lw.addSideListItem(p);
422
public virtual void playlistMenuEditClicked() {
423
TreeSelection selected = this.get_selection();
424
selected.set_mode(SelectionMode.SINGLE);
427
selected.get_selected (out model, out iter);
428
selected.set_mode(SelectionMode.MULTIPLE);
431
sideTreeModel.get(iter, 0, out o);
434
PlaylistNameWindow pnw = new PlaylistNameWindow(((Playlist)o));
435
pnw.playlist_saved.connect(playlistNameWindowSaved);
437
else if(o is SmartPlaylist) {
438
SmartPlaylistEditor spe = new SmartPlaylistEditor((SmartPlaylist)o);
439
spe.playlist_saved.connect(smartPlaylistEditorSaved);
443
public virtual void playlistMenuRemoveClicked() {
444
TreeSelection selected = this.get_selection();
445
selected.set_mode(SelectionMode.SINGLE);
448
selected.get_selected (out model, out iter);
449
selected.set_mode(SelectionMode.MULTIPLE);
452
sideTreeModel.get(iter, 0, out o);
454
sideTreeModel.get(iter, 1, out w);
457
lm.remove_playlist(((Playlist)o).rowid);
458
else if(o is SmartPlaylist)
459
lm.remove_smart_playlist(((SmartPlaylist)o).rowid);
462
sideTreeModel.remove(iter);
463
sideTreeModel.foreach(updateView);