~elementary-apps/noise/trunk

« back to all changes in this revision

Viewing changes to src/Widgets/SideTreeView.vala

  • Committer: Scott Ringwelski
  • Date: 2011-02-10 21:30:53 UTC
  • Revision ID: sgringwe@mtu.edu-20110210213053-d3c7mnexeref3cwj
sexy icons, sexy waf

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
using Gtk;
 
2
 
 
3
public class BeatBox.SideTreeView : TreeView {
 
4
        LibraryManager lm;
 
5
        LibraryWindow lw;
 
6
        TreeStore sideTreeModel;
 
7
        
 
8
        TreeIter library_iter;
 
9
        TreeIter play_queue_iter;
 
10
        TreeIter already_played_iter;
 
11
        
 
12
        TreeIter info_iter;
 
13
        TreeIter internet_iter;
 
14
        TreeIter playlist_iter;
 
15
        TreeIter smart_playlist_iter;
 
16
        
 
17
        //for playlist right click
 
18
        Menu playlistMenu;
 
19
        MenuItem playlistNew;
 
20
        MenuItem smartPlaylistNew;
 
21
        MenuItem playlistEdit;
 
22
        MenuItem playlistRemove;
 
23
        
 
24
        Widget current_widget;
 
25
        
 
26
        public SideTreeView(LibraryManager lmm, LibraryWindow lww) {
 
27
                this.lm = lmm;
 
28
                this.lw = lww;
 
29
                
 
30
                buildUI();
 
31
                
 
32
                //set as multiple
 
33
                TreeSelection selected = this.get_selection();
 
34
                selected.set_mode(SelectionMode.MULTIPLE);
 
35
        }
 
36
        
 
37
        public void buildUI() {
 
38
                /* 0: playlist, smart playlist, etc.
 
39
                 * 1: the widget to show in relation
 
40
                 * 2: name to display
 
41
                 */
 
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;
 
47
                
 
48
                TreeViewColumn col = new TreeViewColumn();
 
49
                col.title = "object";
 
50
                this.insert_column(col, 0);
 
51
                
 
52
                col = new TreeViewColumn();
 
53
                col.title = "widget";
 
54
                this.insert_column(col, 1);
 
55
                
 
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);
 
60
                
 
61
                int index = 0;
 
62
                foreach(TreeViewColumn tvc in this.get_columns()) {
 
63
                        if(index == 0 || index == 1)
 
64
                                tvc.visible = false;
 
65
                        
 
66
                        ++index;
 
67
                }
 
68
                
 
69
                this.button_press_event.connect(sideListClick);
 
70
                this.get_selection().changed.connect(sideListSelectionChange);
 
71
                this.expand_all();
 
72
                
 
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();
 
88
                
 
89
                this.show_all();
 
90
        }
 
91
        
 
92
        public void smartPixTextColumnData(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) {
 
93
                GLib.Object o = null;
 
94
                string title = "";
 
95
                tree_model.get(iter, 0, out o, 2, out title);
 
96
                
 
97
                if(cell is CellRendererText) {
 
98
                        string text;
 
99
                        tree_model.get(iter, 2, out text);
 
100
                        ((CellRendererText)cell).text = text;
 
101
                }
 
102
                else if(cell is CellRendererPixbuf && title == "Song Info") {
 
103
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock(Gtk.Stock.INFO, IconSize.MENU);
 
104
                }
 
105
                else if(cell is CellRendererPixbuf && title == "Library") {
 
106
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("folder-music", IconSize.MENU);
 
107
                }
 
108
                else if(cell is CellRendererPixbuf && title == "Queue") {
 
109
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("media-audio", IconSize.MENU);
 
110
                }
 
111
                else if(cell is CellRendererPixbuf && title == "Already Played") {
 
112
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("emblem-urgent", IconSize.MENU);
 
113
                }
 
114
                else if(cell is CellRendererPixbuf && o is SmartPlaylist) {
 
115
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("playlist-automatic", IconSize.MENU);
 
116
                }
 
117
                else if(cell is CellRendererPixbuf && o is Playlist) {
 
118
                        ((CellRendererPixbuf)cell).pixbuf = get_pixbuf_from_stock("playlist", IconSize.MENU);
 
119
                }
 
120
        }
 
121
        
 
122
        Gdk.Pixbuf get_pixbuf_from_stock (string stock_id, Gtk.IconSize size)
 
123
        {
 
124
          Gdk.Pixbuf pixbuf;
 
125
         
 
126
          pixbuf = this.render_icon(stock_id, size, null);
 
127
          
 
128
          if(pixbuf == null)
 
129
                stdout.printf("null\n");
 
130
          
 
131
          return pixbuf;
 
132
        }
 
133
        
 
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");
 
138
                
 
139
                //sideTreeModel.append(out internet_iter, null);
 
140
                //sideTreeModel.set(internet_iter, 0, null, 1, null, 2, "Internet");
 
141
                
 
142
                //sideTreeModel.append(out smart_playlist_iter, null);
 
143
                //sideTreeModel.set(smart_playlist_iter, 0, null, 1, null, 2, "Smart Playlists");
 
144
                
 
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");
 
148
        }
 
149
        
 
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);
 
154
                        return library_iter;
 
155
                }
 
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;
 
160
                }
 
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;
 
165
                }
 
166
                else {
 
167
                        TreeIter item;
 
168
                        sideTreeModel.append(out item, parent);
 
169
                        sideTreeModel.set(item, 0, o, 1, w, 2, name);
 
170
                        
 
171
                        this.expand_to_path(sideTreeModel.get_path(item));
 
172
                        
 
173
                        return item;
 
174
                }
 
175
        }
 
176
        
 
177
        public Widget getSelectedWidget() {
 
178
                TreeSelection selected = this.get_selection();
 
179
                selected.set_mode(SelectionMode.SINGLE);
 
180
                TreeModel model;
 
181
                TreeIter iter;
 
182
                selected.get_selected (out model, out iter);
 
183
                selected.set_mode(SelectionMode.MULTIPLE);
 
184
                
 
185
                Widget w;
 
186
                sideTreeModel.get(iter, 1, out w);
 
187
                return w;
 
188
        }
 
189
        
 
190
        public Widget getWidget(TreeIter iter) {
 
191
                Widget w;
 
192
                sideTreeModel.get(iter, 1, out w);
 
193
                return w;
 
194
        }
 
195
        
 
196
        public TreeIter get_library_iter() {
 
197
                return library_iter;
 
198
        }
 
199
        
 
200
        public TreeIter get_play_queue_iter() {
 
201
                return play_queue_iter;
 
202
        }
 
203
        
 
204
        public TreeIter get_already_played_iter() {
 
205
                return already_played_iter;
 
206
        }
 
207
        
 
208
        /*public TreeIter get_playlist_iter() {
 
209
                return playlist_iter;
 
210
        }
 
211
        
 
212
        public TreeIter get_smart_playlist_iter() {
 
213
                return smart_playlist_iter;
 
214
        }
 
215
        
 
216
        public TreeIter get_internet_iter() {
 
217
                return internet_iter;
 
218
        }
 
219
        
 
220
        public TreeIter get_info_iter() {
 
221
                return info_iter;
 
222
        }*/
 
223
        
 
224
        public Widget get_current_widget() {
 
225
                return current_widget;
 
226
        }
 
227
        
 
228
        public void updatePlayQueue() {
 
229
                Widget w;
 
230
                sideTreeModel.get(play_queue_iter, 1, out w);
 
231
                ((MusicTreeView)w).populateView(lm.queue(), false);
 
232
        }
 
233
        
 
234
        public void updateAlreadyPlayed() {
 
235
                Widget w;
 
236
                sideTreeModel.get(already_played_iter, 1, out w);
 
237
                ((MusicTreeView)w).populateView(lm.already_played(), false);
 
238
        }
 
239
        
 
240
        public virtual void sideListSelectionChange() {
 
241
                sideTreeModel.foreach(updateView);
 
242
        }
 
243
        
 
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
 
247
                        TreeIter iter;
 
248
                        TreePath path;
 
249
                        TreeViewColumn column;
 
250
                        int cell_x;
 
251
                        int cell_y;
 
252
                        
 
253
                        this.get_path_at_pos((int)event.x, (int)event.y, out path, out column, out cell_x, out cell_y);
 
254
                        
 
255
                        if(!sideTreeModel.get_iter(out iter, path))
 
256
                                return false;
 
257
                        
 
258
                        int id;
 
259
                        sideTreeModel.get(iter, 0, out id);
 
260
                        string name;
 
261
                        sideTreeModel.get(iter, 2, out name);
 
262
                        
 
263
                        TreeIter parent;
 
264
                        sideTreeModel.iter_parent(out parent, iter);
 
265
                        if(sideTreeModel.iter_is_valid(parent)) {
 
266
                                string parent_name;
 
267
                                sideTreeModel.get(parent, 2, out parent_name);
 
268
                                
 
269
                                if(parent_name == "Library" && id > 0) {
 
270
                                        playlistMenu.popup (null, null, null, 3, get_current_event_time());
 
271
                                        return false;
 
272
                                }
 
273
                        }
 
274
                        else {
 
275
                                if(name == "Library") {
 
276
                                        //show library right click menu
 
277
                                }
 
278
                                else if(name == "Play Queue") {
 
279
                                        //show play queue right click menu
 
280
                                }
 
281
                                else if(name == "Playlists") {
 
282
                                        playlistMenu.popup (null, null, null, 2, get_current_event_time());
 
283
                                        return false;
 
284
                                }
 
285
                        }
 
286
                        
 
287
                        return false;
 
288
                }
 
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.
 
293
                         */
 
294
                        TreeIter item;
 
295
                        TreePath path;
 
296
                        TreeViewColumn column;
 
297
                        int cell_x;
 
298
                        int cell_y;
 
299
                        
 
300
                        this.get_path_at_pos((int)event.x, (int)event.y, out path, out column, out cell_x, out cell_y);
 
301
                        
 
302
                        if(!sideTreeModel.get_iter(out item, path))
 
303
                                return false;
 
304
                        
 
305
                        GLib.Object o;
 
306
                        sideTreeModel.get(item, 0, out o);
 
307
                        Widget w;
 
308
                        sideTreeModel.get(item, 1, out w);
 
309
                        string name;
 
310
                        sideTreeModel.get(item, 2, out name);
 
311
                        
 
312
                        //searchField.text = (search != null) ? search : "";
 
313
                        
 
314
                        TreeIter parent;
 
315
                        sideTreeModel.iter_parent(out parent, item);
 
316
                        
 
317
                        if(sideTreeModel.iter_is_valid(parent)) {
 
318
                                string parent_name;
 
319
                                sideTreeModel.get(parent, 2, out parent_name);
 
320
                                
 
321
                                if(parent_name == "Information") {
 
322
                                        
 
323
                                }
 
324
                                else if(parent_name == "Internet") {
 
325
                                        
 
326
                                }
 
327
                                else if(parent_name == "Smart Playlists") {
 
328
                                        MusicTreeView mtv = (MusicTreeView)w;
 
329
                                        mtv.populateView(lm.songs_from_smart_playlist(mtv.relative_id), false);
 
330
                                }
 
331
                                else if(parent_name == "Playlists") {
 
332
                                        
 
333
                                }
 
334
                        }
 
335
                        else {
 
336
                                if(name == "Library") {
 
337
                                        
 
338
                                }
 
339
                                else if(name == "Queue") {
 
340
                                        MusicTreeView mtv = (MusicTreeView)w;
 
341
                                        mtv.populateView(lm.queue(), false);
 
342
                                }
 
343
                                else if(name == "Already Played") {
 
344
                                        MusicTreeView mtv = (MusicTreeView)w;
 
345
                                        mtv.populateView(lm.already_played(), false);
 
346
                                }
 
347
                        }
 
348
                        
 
349
                        return false;
 
350
                }
 
351
                
 
352
                return false;
 
353
        }
 
354
        
 
355
        public void resetView() {
 
356
                this.get_selection().unselect_all();
 
357
                this.get_selection().select_iter(library_iter);
 
358
                sideTreeModel.foreach(updateView);
 
359
        }
 
360
        
 
361
        public bool updateView(TreeModel model, TreePath path, TreeIter item) {
 
362
                Widget w;
 
363
                model.get(item, 1, out w);
 
364
                
 
365
                if(w != null) {
 
366
                        if(this.get_selection().iter_is_selected(item)) {
 
367
                                w.show();
 
368
                                this.current_widget = w;
 
369
                        }
 
370
                        else
 
371
                                w.hide();
 
372
                }
 
373
                        
 
374
                return false;
 
375
        }
 
376
        
 
377
        
 
378
        
 
379
        //smart playlist context menu
 
380
        public virtual void smartPlaylistMenuNewClicked() {
 
381
                SmartPlaylistEditor spe = new SmartPlaylistEditor(new SmartPlaylist());
 
382
                spe.playlist_saved.connect(smartPlaylistEditorSaved);
 
383
        }
 
384
        
 
385
        public virtual void smartPlaylistEditorSaved(SmartPlaylist sp) {
 
386
                if(sp.rowid > 0) {
 
387
                        //edit name
 
388
                        TreeIter edit;
 
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);
 
392
                }
 
393
                else {
 
394
                        //add playlist to list
 
395
                        lm.add_smart_playlist(sp);
 
396
                        lw.addSideListItem(sp);
 
397
                }
 
398
        }
 
399
        
 
400
        //playlist context menu
 
401
        public virtual void playlistMenuNewClicked() {
 
402
                PlaylistNameWindow pnw = new PlaylistNameWindow(new Playlist());
 
403
                pnw.playlist_saved.connect(playlistNameWindowSaved);
 
404
        }
 
405
        
 
406
        public virtual void playlistNameWindowSaved(Playlist p) {
 
407
                if(p.rowid > 0) {
 
408
                        //edit name
 
409
                        TreeIter edit;
 
410
                        
 
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);
 
414
                }
 
415
                else {
 
416
                        //add playlist to list
 
417
                        lm.add_playlist(p);
 
418
                        lw.addSideListItem(p);
 
419
                }
 
420
        }
 
421
        
 
422
        public virtual void playlistMenuEditClicked() {
 
423
                TreeSelection selected = this.get_selection();
 
424
                selected.set_mode(SelectionMode.SINGLE);
 
425
                TreeModel model;
 
426
                TreeIter iter;
 
427
                selected.get_selected (out model, out iter);
 
428
                selected.set_mode(SelectionMode.MULTIPLE);
 
429
                
 
430
                GLib.Object o;
 
431
                sideTreeModel.get(iter, 0, out o);
 
432
                
 
433
                if(o is Playlist) {
 
434
                        PlaylistNameWindow pnw = new PlaylistNameWindow(((Playlist)o));
 
435
                        pnw.playlist_saved.connect(playlistNameWindowSaved);
 
436
                }
 
437
                else if(o is SmartPlaylist) {
 
438
                        SmartPlaylistEditor spe = new SmartPlaylistEditor((SmartPlaylist)o);
 
439
                        spe.playlist_saved.connect(smartPlaylistEditorSaved);
 
440
                }
 
441
        }
 
442
        
 
443
        public virtual void playlistMenuRemoveClicked() {
 
444
                TreeSelection selected = this.get_selection();
 
445
                selected.set_mode(SelectionMode.SINGLE);
 
446
                TreeModel model;
 
447
                TreeIter iter;
 
448
                selected.get_selected (out model, out iter);
 
449
                selected.set_mode(SelectionMode.MULTIPLE);
 
450
                
 
451
                GLib.Object o;
 
452
                sideTreeModel.get(iter, 0, out o);
 
453
                Widget w;
 
454
                sideTreeModel.get(iter, 1, out w);
 
455
                
 
456
                if(o is Playlist)
 
457
                        lm.remove_playlist(((Playlist)o).rowid);
 
458
                else if(o is SmartPlaylist)
 
459
                        lm.remove_smart_playlist(((SmartPlaylist)o).rowid);
 
460
                
 
461
                w.destroy();
 
462
                sideTreeModel.remove(iter);
 
463
                sideTreeModel.foreach(updateView);
 
464
        }
 
465
}