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))