def __init__(self): self.duration = 0.0 # Druation of current song. self.posBarPressed = False # Set song position from backend in slider. self.posBarDownVal = -1 Page.__init__(self); self.cfg.get_backend().connect(Signals.VOLUME_CHANGED,self.volume_changed) self.cfg.get_backend().connect(Signals.RANDOM_CHANGED,self.random_changed) self.cfg.get_backend().connect(Signals.REPEAT_CHANGED,self.repeat_changed) self.cfg.get_backend().connect(Signals.SONG_CHANGED,self.song_changed) self.cfg.get_backend().connect(Signals.POS_CHANGED,self.pos_changed) self.cfg.get_backend().connect(Signals.STATE_CHANGED,self.state_changed) self.btn_prev = ImageButton(gtk.STOCK_MEDIA_PREVIOUS) self.btnbox.add(self.btn_prev) self.btn_stop = ImageButton(gtk.STOCK_MEDIA_STOP) self.btnbox.add(self.btn_stop) self.btn_pause = ImageButton(gtk.STOCK_MEDIA_PAUSE) self.btnbox.add(self.btn_pause) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) self.btn_next = ImageButton(gtk.STOCK_MEDIA_NEXT) self.btnbox.add(self.btn_next) self.btn_play.connect("clicked", self.btn_clicked) self.btn_stop.connect("clicked", self.btn_clicked) self.btn_prev.connect("clicked", self.btn_clicked) self.btn_next.connect("clicked", self.btn_clicked) self.btn_pause.connect("clicked", self.btn_clicked) self.volevent = False
def __init__(self): self.model = gtk.ListStore(object,str,str,str) Page.__init__(self) self.cfg = PythmConfig() self.btn_connect = ImageButton(gtk.STOCK_CONNECT) self.btnbox.add(self.btn_connect) self.btn_connect.connect("clicked",self.btn_connect_clicked) self.btn_start = ImageButton(gtk.STOCK_EXECUTE) self.btnbox.add(self.btn_start) self.btn_start.connect("clicked",self.btn_start_clicked) self.btn_stop = ImageButton(gtk.STOCK_STOP) self.btnbox.add(self.btn_stop) self.btn_stop.connect("clicked",self.btn_stop_clicked) self.btn_refresh = ImageButton(gtk.STOCK_REFRESH) self.btnbox.add(self.btn_refresh) self.btn_refresh.connect("clicked",self.btn_refresh_clicked) self.mgr = BackendManager() if self.cfg.get_backend() != None: self.start_backend(self.cfg.get_backend()) self.refresh() self.row_selected(None) self.set_sensitive(True)
def __init__(self): #id, artist, title, album, ('>' when playing) self.model = gtk.ListStore(object,str,str,str,str) Page.__init__(self) self.cfg.get_backend().connect(Signals.PL_CHANGED,self.load_list) self.cfg.get_backend().connect(Signals.SONG_CHANGED,self.song_changed) self.btn_up = ImageButton(gtk.STOCK_GO_UP) self.btnbox.add(self.btn_up) self.btn_down = ImageButton(gtk.STOCK_GO_DOWN) self.btnbox.add(self.btn_down) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) #self.btn_del = ImageButton(gtk.STOCK_REMOVE) #self.btnbox.add(self.btn_del) self.btn_clear = ImageButton(gtk.STOCK_CLEAR) self.btnbox.add(self.btn_clear) self.btn_up.connect("clicked",self.clicked_up) self.btn_down.connect("clicked",self.clicked_down) self.btn_play.connect("clicked",self.clicked_play) #self.btn_del.connect("clicked",self.clicked_del) self.btn_clear.connect("clicked",self.clicked_clear)
def __init__(self): self.model = gtk.ListStore(object, str) Page.__init__(self) self.btn_up = ImageButton(gtk.STOCK_GO_UP) self.btnbox.add(self.btn_up) self.btn_up.connect("clicked", self.btn_up_clicked) self.btn_open = ImageButton(gtk.STOCK_OPEN) self.btnbox.add(self.btn_open) self.btn_open.connect("clicked", self.btn_open_clicked) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) self.btn_play.connect("clicked", self.btn_play_clicked) self.path = None self.btn_adddir = ImageButton(gtk.STOCK_ADD) self.btnbox.add(self.btn_adddir) self.btn_adddir.connect("clicked", self.btn_adddir_clicked) self.path = None self.cfg.get_backend().connect(Signals.BROWSER_CHANGED, self.browser_changed)
class PagePlay(Page): def __init__(self): self.duration = 0.0 # Druation of current song. self.posBarPressed = False # Set song position from backend in slider. self.posBarDownVal = -1 Page.__init__(self); self.cfg.get_backend().connect(Signals.VOLUME_CHANGED,self.volume_changed) self.cfg.get_backend().connect(Signals.RANDOM_CHANGED,self.random_changed) self.cfg.get_backend().connect(Signals.REPEAT_CHANGED,self.repeat_changed) self.cfg.get_backend().connect(Signals.SONG_CHANGED,self.song_changed) self.cfg.get_backend().connect(Signals.POS_CHANGED,self.pos_changed) self.cfg.get_backend().connect(Signals.STATE_CHANGED,self.state_changed) self.btn_prev = ImageButton(gtk.STOCK_MEDIA_PREVIOUS) self.btnbox.add(self.btn_prev) self.btn_stop = ImageButton(gtk.STOCK_MEDIA_STOP) self.btnbox.add(self.btn_stop) self.btn_pause = ImageButton(gtk.STOCK_MEDIA_PAUSE) self.btnbox.add(self.btn_pause) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) self.btn_next = ImageButton(gtk.STOCK_MEDIA_NEXT) self.btnbox.add(self.btn_next) self.btn_play.connect("clicked", self.btn_clicked) self.btn_stop.connect("clicked", self.btn_clicked) self.btn_prev.connect("clicked", self.btn_clicked) self.btn_next.connect("clicked", self.btn_clicked) self.btn_pause.connect("clicked", self.btn_clicked) self.volevent = False def btn_clicked(self,widget): if widget == self.btn_next: self.cfg.get_backend().next() elif widget == self.btn_play: self.cfg.get_backend().play() elif widget == self.btn_stop: self.cfg.get_backend().stop() elif widget == self.btn_pause: self.cfg.get_backend().pause() elif widget == self.btn_prev: self.cfg.get_backend().prev() def state_changed(self,newstate): if newstate == State.STOPPED: self.btn_stop.set_sensitive(False) self.btn_play.set_sensitive(True) self.btn_pause.set_sensitive(True) elif newstate == State.PAUSED: self.btn_stop.set_sensitive(True) self.btn_play.set_sensitive(True) self.btn_pause.set_sensitive(False) else: self.btn_stop.set_sensitive(True) self.btn_play.set_sensitive(False) self.btn_pause.set_sensitive(True) def song_changed(self,newplentry): self.songlabel.set_label(str(newplentry)) if newplentry.length > 0: self.pos_scale.set_range(0,newplentry.length) self.duration = newplentry.length self.pos_changed(0) def pos_changed(self,newPos): newPos = int(newPos) # Set the new value in the controls. if (not self.posBarPressed): self.pos_scale.set_value(newPos) self.set_times_label(newPos) def random_changed(self,newRand): self.random.set_active(newRand) def repeat_changed(self,newRept): self.repeat.set_active(newRept) def volume_changed(self,newVolume): self.volevent = True self.vol_scale.set_value(newVolume) self.volevent = False def set_times_label(self, position): """ Set the times label string based on current and total duration. """ lbl = format_time(position) + " / " + format_time(self.duration) self.timelabel.set_label(lbl) def content(self): #track info vbox = gtk.VBox() self.songlabel = gtk.Label("") vbox.pack_start(self.songlabel,True,True,0) self.timelabel = gtk.Label("0:00 / 0:00") vbox.pack_start(self.timelabel,True,True,0) #pos slider hbox2 = gtk.HBox() hbox2.set_border_width(20) #hbox2.pack_start(gtk.Label("Pos."),False,False,0) self.pos_scale = gtk.HScale(); self.pos_scale.set_property("draw-value",False) self.pos_scale.set_value_pos(1) self.pos_scale.connect("button-press-event", self.on_pos_press) self.pos_scale.connect("button-release-event", self.on_pos_release) #self.pos_scale.connect("value-changed",self.on_pos_change) self.pos_scale.set_increments(5,10) self.pos_scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) hbox2.add(self.pos_scale) vbox.add(hbox2) #volume,random,repeat hbox = gtk.HBox() hbox.set_border_width(10) hbox.pack_start(gtk.Label("Vol."),False,False,0) self.vol_scale = gtk.HScale(); self.vol_scale.set_range(0,100) self.vol_scale.set_property("draw-value",True) self.vol_scale.set_digits(0) self.vol_scale.set_value_pos(1) self.vol_scale.connect("value-changed",self.on_volume_change) self.vol_scale.set_increments(5,10) self.vol_scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) hbox.add(self.vol_scale) vbox.add(hbox) #random, repeat hbox3 = gtk.HBox() self.random = gtk.CheckButton(label="random") hbox3.pack_start(self.random,True,False,0) self.repeat = gtk.CheckButton(label="repeat") hbox3.pack_start(self.repeat,True,False,0) self.random.connect("toggled",self.on_random) self.repeat.connect("toggled",self.on_repeat) vbox.add(hbox3) return vbox def on_random(self,widget): self.cfg.get_backend().set_random(widget.get_active()) def on_repeat(self,widget): self.cfg.get_backend().set_repeat(widget.get_active()) def on_volume_change(self,range): if self.volevent == False: self.cfg.get_backend().set_volume(range.get_value()) def on_pos_press(self, widget, event): """ Event when the position slider is touched. Set a flag to ignore position updates from the backend. This makes using the control easier. """ self.posBarPressed = True self.posBarDownVal = widget.get_value() def on_pos_release(self, widget, event): """ Event when the position slider is released. Release position update ignore. Seek song to new position. """ self.posBarPressed = False if (widget.get_value() != self.posBarDownVal): self.cfg.get_backend().seek(widget.get_value())
class PageList(Page): def __init__(self): #id, artist, title, album, ('>' when playing) self.model = gtk.ListStore(object,str,str,str,str) Page.__init__(self) self.cfg.get_backend().connect(Signals.PL_CHANGED,self.load_list) self.cfg.get_backend().connect(Signals.SONG_CHANGED,self.song_changed) self.btn_up = ImageButton(gtk.STOCK_GO_UP) self.btnbox.add(self.btn_up) self.btn_down = ImageButton(gtk.STOCK_GO_DOWN) self.btnbox.add(self.btn_down) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) #self.btn_del = ImageButton(gtk.STOCK_REMOVE) #self.btnbox.add(self.btn_del) self.btn_clear = ImageButton(gtk.STOCK_CLEAR) self.btnbox.add(self.btn_clear) self.btn_up.connect("clicked",self.clicked_up) self.btn_down.connect("clicked",self.clicked_down) self.btn_play.connect("clicked",self.clicked_play) #self.btn_del.connect("clicked",self.clicked_del) self.btn_clear.connect("clicked",self.clicked_clear) def clicked_clear(self,widget): self.cfg.get_backend().clear() def clicked_up(self,widget): plid = self.get_selected_plid() if plid != None: self.cfg.get_backend().up(plid) def clicked_down(self,widget): plid = self.get_selected_plid() if plid != None: self.cfg.get_backend().down(plid) def clicked_play(self,widget): plid = self.get_selected_plid() if plid != None: self.cfg.get_backend().play(plid) """ def clicked_del(self,widget): plid = self.get_selected_plid() if plid != None: self.cfg.get_backend().remove(plid) """ def get_selected_plid(self): iter = self.tv.get_selection().get_selected()[1] if iter is not None: return self.model.get_value(iter,0) return None def song_changed(self,song): self.model.foreach(self.ch_song,song) def ch_song(self,model,path,iter,song): if model.get_value(iter,0)==song.id: model.set_value(iter,4,">") else: model.set_value(iter,4,"") def load_list(self,pl): self.model.clear() for p in pl: self.model.append([p.id,p.artist,p.title,p.album,""]) def content(self): vbox = gtk.VBox() self.tv = gtk.TreeView(self.model) #TODO enable multi select on list #selm = self.tv.get_selection() #selm.set_mode(gtk.SELECTION_MULTIPLE) listfont = self.cfg.get("pythm","listfont",None) col_rendr = gtk.CellRendererText() if listfont is not None: col_rendr.set_property("font-desc", pango.FontDescription(listfont)) #ptt play state # stat_rendr= gtk.CellRendererPixbuf() # col_state = gtk.TreeViewColumn("") # col_state.add_attribute(stat_rendr,'pixbuf',4) col_state = gtk.TreeViewColumn("",col_rendr,text=4) self.tv.append_column(col_state) col_title = gtk.TreeViewColumn("Title",col_rendr,text=2) col_title.set_resizable(True) self.tv.append_column(col_title) col_artist = gtk.TreeViewColumn("Artist",col_rendr,text=1) col_artist.set_resizable(True) self.tv.append_column(col_artist) sc = get_scrolled_widget() sc.add(self.tv) vbox.pack_start(sc,True,True,0) return vbox
class PageBackend(Page): def __init__(self): self.model = gtk.ListStore(object,str,str,str) Page.__init__(self) self.cfg = PythmConfig() self.btn_connect = ImageButton(gtk.STOCK_CONNECT) self.btnbox.add(self.btn_connect) self.btn_connect.connect("clicked",self.btn_connect_clicked) self.btn_start = ImageButton(gtk.STOCK_EXECUTE) self.btnbox.add(self.btn_start) self.btn_start.connect("clicked",self.btn_start_clicked) self.btn_stop = ImageButton(gtk.STOCK_STOP) self.btnbox.add(self.btn_stop) self.btn_stop.connect("clicked",self.btn_stop_clicked) self.btn_refresh = ImageButton(gtk.STOCK_REFRESH) self.btnbox.add(self.btn_refresh) self.btn_refresh.connect("clicked",self.btn_refresh_clicked) self.mgr = BackendManager() if self.cfg.get_backend() != None: self.start_backend(self.cfg.get_backend()) self.refresh() self.row_selected(None) self.set_sensitive(True) def start_backend(self,backend): if self.mgr.start(backend,self.gtkcallback): self.mgr.connect(backend) def btn_start_clicked(self,btn): self.start_backend(self.get_selected()) self.refresh() def btn_stop_clicked(self,btn): self.mgr.stop(self.get_selected()) self.refresh() def btn_connect_clicked(self,btn): self.mgr.connect(self.get_selected()) self.refresh() def btn_refresh_clicked(self,btn): self.refresh() def refresh(self): self.model.clear() for backend in self.mgr.get_backends(): status = "inactive" if backend.is_started(): status = "active" conn = "connected" if not backend.is_connected(): conn ="disconnected" self.model.append([backend,backend.name,status,conn]) def row_selected(self,path): backend = self.get_selected() if backend != None: self.btn_start.set_sensitive(not backend.is_started()) self.btn_stop.set_sensitive(backend.is_started()) self.btn_connect.set_sensitive(backend.is_started() and not backend.is_connected()) else: self.btn_start.set_sensitive(False) self.btn_stop.set_sensitive(False) self.btn_connect.set_sensitive(False) def check_disabled(self,state): """overwritten""" pass def get_selected(self): iter = self.tv.get_selection().get_selected()[1] if iter is not None: return self.model.get_value(iter,0) return None def content(self): vbox = gtk.VBox() self.tv = gtk.TreeView(self.model) self.tv.get_selection().connect("changed", self.row_selected) colname = gtk.TreeViewColumn("Backend",gtk.CellRendererText(),text=1) colstatus = gtk.TreeViewColumn("State",gtk.CellRendererText(),text=2) colconnected = gtk.TreeViewColumn("Connected",gtk.CellRendererText(),text=3) self.tv.append_column(colname) self.tv.append_column(colstatus) self.tv.append_column(colconnected) sc = gtk.ScrolledWindow() sc.set_property("vscrollbar-policy",gtk.POLICY_AUTOMATIC) sc.set_property("hscrollbar-policy",gtk.POLICY_AUTOMATIC) sc.add(self.tv) vbox.pack_start(sc,False,False,0) return vbox def gtkcallback(self,func,*args): """ callback method for signals of backend (out of gtk-thread) """ gobject.idle_add(func,*args)
class PageBrowse(Page): def __init__(self): self.model = gtk.ListStore(object, str) Page.__init__(self) self.btn_up = ImageButton(gtk.STOCK_GO_UP) self.btnbox.add(self.btn_up) self.btn_up.connect("clicked", self.btn_up_clicked) self.btn_open = ImageButton(gtk.STOCK_OPEN) self.btnbox.add(self.btn_open) self.btn_open.connect("clicked", self.btn_open_clicked) self.btn_play = ImageButton(gtk.STOCK_MEDIA_PLAY) self.btnbox.add(self.btn_play) self.btn_play.connect("clicked", self.btn_play_clicked) self.path = None self.btn_adddir = ImageButton(gtk.STOCK_ADD) self.btnbox.add(self.btn_adddir) self.btn_adddir.connect("clicked", self.btn_adddir_clicked) self.path = None self.cfg.get_backend().connect(Signals.BROWSER_CHANGED, self.browser_changed) def btn_adddir_clicked(self, btn): entry = self.get_selected_entry() if entry != None: if entry.isDir: self.cfg.get_backend().add_dir(entry.id) else: self.cfg.get_backend().add(entry.id) # else load the current dir (entry == None) else: self.cfg.get_backend().add_dir(self.path) def btn_up_clicked(self, btn): self.cfg.get_backend().browse_up(self.path) def btn_open_clicked(self, btn): self.add_selected_entry() def btn_play_clicked(self, btn): self.btn_adddir_clicked(btn) # TODO make it play from here ! self.cfg.get_backend().play() def browser_changed(self, path, list): self.path = path self.model.clear() for f in list: self.model.append([f, f.caption]) if self.cfg.get("pythm", "showpath", False) == "False": self.tv.get_column(0).set_title(os.path.basename(path).replace("_", "__")) else: self.tv.get_column(0).set_title( path.replace(self.cfg.get(CFG_SECTION_BROWSER, CFG_SETTING_MUSICDIR, ""), "<MusicDir>").replace( "_", "__" ) ) def row_activated(self, tv, path, view_column): self.add_selected_entry() def get_selected_entry(self): iter = self.tv.get_selection().get_selected()[1] if iter is not None: return self.model.get_value(iter, 0) return None def add_selected_entry(self): entry = self.get_selected_entry() if entry != None: if entry.isDir: self.cfg.get_backend().browse(entry.id) else: self.cfg.get_backend().add(entry.id) def content(self): vbox = gtk.VBox() self.tv = gtk.TreeView(self.model) self.tv.connect("row_activated", self.row_activated) browsefont = self.cfg.get("pythm", "browsefont", None) col_rendr = gtk.CellRendererText() if browsefont is not None: col_rendr.set_property("font-desc", pango.FontDescription(browsefont)) col_file = gtk.TreeViewColumn("<MusicDir>", col_rendr, text=1) self.tv.append_column(col_file) sc = get_scrolled_widget() sc.add(self.tv) vbox.pack_start(sc, True, True, 0) return vbox