Exemple #1
0
class Timeline(Frame):
    def __init__(self, w, *args, **kwargs):

        super().__init__(w, *args, **kwargs)

        #___

        self.state_txt_time1 = StringVar()
        self.state_txt_time1.set(INIT_TIME)

        self.txt_time1 = Label(self,
            textvariable=self.state_txt_time1,
            background=config.colors["BG"],
            font=font.nametofont("font_small_size"))
        self.txt_time1.grid(row=0, column=0, sticky="sw")

        #___

        self.state_txt_song = StringVar()
        self.state_txt_song.set(INIT_SONG)

        self.txt_song = Label(self,
            textvariable=self.state_txt_song,
            background=config.colors["BG"])
        self.txt_song.grid(row=0, column=1, pady=(0,2))

        #___

        self.state_txt_time2 = StringVar()
        self.state_txt_time2.set(INIT_TIME)

        self.txt_time1 = Label(self,
            textvariable=self.state_txt_time2,
            background=config.colors["BG"],
            font=font.nametofont("font_small_size"))
        self.txt_time1.grid(row=0, column=2, sticky="se")

        #___

        self.state_scale_time = DoubleVar()

        self.scale_time = Scale(self,
            orient="horizontal",
            length=300,
            from_=0, to_=100,
            value=0, variable=self.state_scale_time)
        self.scale_time.grid(row=1, column=0, columnspan=3)

        #___

        #Set time when direct click on the timeline
        self.scale_time.bind("<Button-1>", self._setTimeDirect)

        #___

        self.song_playing = None

    #__________________________________________________

    def _setTimeDirect(self, event):
        self.scale_time.event_generate("<Button-3>", x=event.x, y=event.y)
        return "break"  #Avoid recoil when holding

    #___

    def setNewSong(self, song:Song):
        self.song_playing = song
        self.state_scale_time.set(0)
        self.state_txt_time1.set(INIT_TIME)
        self.state_txt_time2.set(song.getTimeFormat())
        self.state_txt_song.set(song.name if len(song.name) < MAX_LEN_VISIBLE
            else song.name[:MAX_LEN_VISIBLE]+"...")   #Avoid long names

    #___

    '''
    Scale time to Song time
    scale.time -> 100 | x -> song.time | => x = time*100/song.time
    '''
    def getTime(self, song:Song=None) -> int:
        song = self.song_playing if song is None else song
        return round((self.state_scale_time.get() * song.time) / 100)


    '''
    #Song time to Scale time
        #time -> song.time | x -> 100 | => x = time*100/song.time
    '''
    def setTime(self, time:int):
        self.state_scale_time.set((time * 100) / self.song_playing.time)
        self.state_txt_time1.set(Song.timeFormat(time))