예제 #1
0
    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
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
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())
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
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