~lsr.sid.team/lsr.sid/trunk

« back to all changes in this revision

Viewing changes to lsrsidmodules/gui.py

  • Committer: daniel at xn--ngel-5qa
  • Date: 2010-10-19 05:40:05 UTC
  • Revision ID: daniel@xn--ngel-5qa.de-20101019054005-inph63gn4dpeuohf
shuffle playback mode; shuffling playlist should now work reasonable fast

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
import gtk.glade
27
27
import gettext
28
28
import random
 
29
import string
29
30
 
30
31
import starscale
31
32
import sidinfo
44
45
 COLUMN_COPYRIGHT,
45
46
 COLUMN_SUBSONGS,
46
47
 COLUMN_DEFAULT_SONG,
47
 
 COLUMN_PATH
48
 
) = range(8)
 
48
 COLUMN_PATH,
 
49
 COLUMN_HASH
 
50
) = range(9)
49
51
 
50
52
(
51
53
 COLUMN_DIRNAME,
64
66
 COLUMN_ARTISTS_LENGTH,
65
67
 COLUMN_ARTISTS_PATH,
66
68
) = range(4)
 
69
 
 
70
 
 
71
 
67
72
class GUI(object):
68
73
    
69
74
    def __init__(self, main):
120
125
        self.starscale.connect("rating-changed", self.starscale_rating_changed_db)
121
126
        
122
127
        
 
128
        ## tbShuffle
 
129
        w, h = gtk.icon_size_lookup(self.glade.get_widget("toolbar1").get_icon_size())
 
130
        self.tbShuffle = self.glade.get_widget("tbShuffle")
 
131
        img = gtk.Image()
 
132
        pb = gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(helpers.install_dir(), "images", "badaman_dice.png"), w, h)
 
133
        img.set_from_pixbuf(pb)
 
134
        self.tbShuffle.set_icon_widget(img)
 
135
        
123
136
        ## HScale
124
137
        self.scale = self.glade.get_widget("hscale1")
125
138
        self.scale.set_update_policy(gtk.UPDATE_CONTINUOUS)
147
160
                
148
161
        ## Playlist
149
162
        self.tvplaylist = gtk.TreeView()
 
163
        #~ self.tvplaylist.set_fixed_height_mode(40)
150
164
        self.tvplaylist.connect("row_activated", self.tvplaylist_rowactivated_cb)
151
165
        self.tvplaylist.enable_model_drag_dest([('text/plain', 0, 0)], gtk.gdk.ACTION_COPY)
152
166
        self.tvplaylist.connect("drag-data-received", self.tvplaylist_drag_data_received)
363
377
            gobject.TYPE_INT,
364
378
            gobject.TYPE_INT,
365
379
            gobject.TYPE_STRING,
 
380
            gobject.TYPE_STRING,
 
381
            gobject.TYPE_STRING
366
382
       )
367
383
        
368
384
        treeview.set_model(model)
452
468
            COLUMN_SUBSONGS, sid.subsongs,
453
469
            COLUMN_DEFAULT_SONG, sid.startsong,
454
470
            COLUMN_PATH, self.escape(sid.path),
 
471
            COLUMN_HASH, sid.hash
455
472
        )
456
473
    def next_prev_track(self, relation):
 
474
        model = self.tvplaylist.get_model()
 
475
        number_of_rows = model.iter_n_children(None)
 
476
        
457
477
        if self.now_playing_iter:
458
 
            model = self.tvplaylist.get_model()
459
478
            path = model.get_path(self.now_playing_iter)
460
 
            if not path: return
461
 
            try:
462
 
                next_iter = model.get_iter(path[0] + relation)
463
 
            except ValueError:
464
 
                return
 
479
            if self.tbShuffle.get_active():
 
480
                next_iter = model.get_iter(random.randint(0, number_of_rows-1))
 
481
            else:
 
482
                if not path: return
 
483
                try:
 
484
                    next_iter = model.get_iter(path[0] + relation)
 
485
                except ValueError:
 
486
                    return
 
487
            
465
488
            path = model.get(next_iter, COLUMN_PATH)[0]
466
489
            sid = self.main.database.get_sid(path) #sidinfo.get_md5_hash(path)
467
490
            self.main.play(sid)
471
494
        self.main.events.disconnect_event("playback-stopped", self.playback_stopped_cb)
472
495
        self.main.quit()
473
496
        gtk.main_quit()
 
497
        
474
498
    #
475
499
    # CALLBACKS
476
500
    #
485
509
        logging.info("… done")
486
510
        self.quit()
487
511
        os.execv(sys.argv[0], sys.argv)
488
 
    
 
512
       
 
513
   
489
514
    def mnuShuffle_activate_cb(self, widget):
490
515
        model = self.tvplaylist.get_model()
491
516
        number_of_rows = model.iter_n_children(None)
492
517
        
493
 
        model.set_default_sort_func(lambda *args: random.randint(-30000, 30000)) 
494
 
        model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
495
 
        model.set_default_sort_func(lambda *args: random.randint(-30000, 30000)) 
496
 
        model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
497
 
        return 
498
 
        
499
 
        self.tvplaylist.freeze_child_notify()
500
 
        self.tvplaylist.set_model(None)
 
518
        l = []
 
519
 
 
520
        model.set_default_sort_func(lambda *a: 0) 
 
521
        model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
 
522
 
 
523
        #~ self.tvplaylist.freeze_child_notify()
501
524
        iter = model.get_iter_first()
502
 
        #~ c=0.0
503
525
        while iter:
504
 
            #~ if c%100 == 0: 
505
 
                #~ print((c/number_of_rows)*100.0)
506
 
            #~ c+=1.0
507
 
            new_pos = random.randint(0, number_of_rows-1)
508
 
            model.swap(iter, model.iter_nth_child(None, new_pos))
 
526
            #~ iter = model.iter_nth_child(None, random.randint(0, number_of_rows-1))
 
527
            l.append(model.get(iter, *xrange(0, COLUMN_HASH+1)))
509
528
            iter = model.iter_next(iter)
510
 
        self.tvplaylist.set_model(model)
511
 
        self.tvplaylist.thaw_child_notify()
512
 
        
 
529
 
 
530
        model.clear()
 
531
        #~ for i in range(0, 100):
 
532
        random.shuffle(l)
 
533
        for i in l:
 
534
            iter_new = model.append()
 
535
            model.set (iter_new,
 
536
            COLUMN_INDICATOR, i[0],
 
537
            COLUMN_ARTIST, i[1],
 
538
            COLUMN_TITLE, i[2],
 
539
            COLUMN_LENGTH, i[3],
 
540
            COLUMN_COPYRIGHT, i[4],
 
541
            COLUMN_SUBSONGS, i[5],
 
542
            COLUMN_DEFAULT_SONG, i[6],
 
543
            COLUMN_PATH, i[7],
 
544
            COLUMN_HASH, i[8],
 
545
            )
 
546
            
 
547
 
513
548
    
514
549
    def mnuBestRated_activate_cb(self, widget):
515
550
        sids = self.main.database.get_best_rated()
795
830
            data = [data]
796
831
 
797
832
        self.tvplaylist.freeze_child_notify()
798
 
        model.set_default_sort_func(lambda *args: -1) 
 
833
        model.set_default_sort_func(lambda *args: 0) 
799
834
        model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
800
835
 
801
836
 
803
838
        data.sort(reverse=not not drop_info)
804
839
        for sids in self.main.database.iter_sids(data, 999):
805
840
            self.tvplaylist.thaw_child_notify()
 
841
            #~ while gtk.events_pending(): gtk.main_iteration()
806
842
            for sid in sids:
807
843
                if drop_info:
808
844
                    path, position = drop_info
819
855
                            sid.subsongs,
820
856
                            sid.startsong,
821
857
                            self.escape(sid.path),
 
858
                            sid.hash
822
859
                            )
823
860
                        )
824
861
                        #~ self.lsR.events.raise_event("add_song_to_playlist", datum, path[0], 0)
833
870
                            sid.subsongs,
834
871
                            sid.startsong,
835
872
                            self.escape(sid.path),
 
873
                            sid.hash
836
874
                            )
837
875
                        )
838
876
                        #~ self.lsR.events.raise_event("add_song_to_playlist", datum, path[0], 1)
973
1011
        
974
1012
    def tbPrev_clicked_cb(self, widget):
975
1013
        self.next_prev_track(-1)
 
1014
    def tbShuffle_toggled_cb(self, widget):
 
1015
        pass
976
1016
        
977
1017
    def tbPlayStop_clicked_cb(self, widget):
978
1018
        if self.main.playsid.playing: