from kivy.uix.label import Label from kivy.uix.stacklayout import StackLayout from kivy.uix.relativelayout import RelativeLayout from kivy.properties import ListProperty from kivy.clock import Clock from ..helpers import duration_to_min_sec import math __all__ = ["PlayList", "PlayListIcons", "PlayListIcon", "PlayListNames", "PlayListName", "PlayListTimes", "PlayListTime"] class PlayList(RelativeLayout): playlist = ListProperty([]) def __init__(self, **kwargs): super(PlayList, self).__init__(**kwargs) Clock.schedule_interval(self.update_playlist, 0.5) def update_playlist(self, dt): if self.parent is None or 'Mapping' not in self.parent.ids: return True open_files = self.parent.ids['Mapping'].open_files playlist = [] for music_file in open_files.values(): if not music_file.is_in_use(): continue time_info = "{}/{}".format( duration_to_min_sec(music_file.sound_position), duration_to_min_sec(music_file.sound_duration)) if music_file.is_loaded_paused(): playlist.append(["⏸", music_file.name, time_info, False]) else: playlist.append(["⏵", music_file.name, time_info, True]) self.playlist = playlist class PlayListIcons(StackLayout): def __init__(self, **kwargs): super(PlayListIcons, self).__init__(**kwargs) self.icons = [] def on_parent(self, instance, parent): parent.bind(playlist=self.update_playlist_icons) def update_playlist_icons(self, instance, playlist): for icon in self.icons: self.remove_widget(icon) self.icons = [] for icon, filename, time_info, playing in playlist: icon_label = PlayListIcon(text=icon) self.add_widget(icon_label) self.icons.append(icon_label) class PlayListIcon(Label): def __init__(self, text='', **kwargs): super(PlayListIcon, self).__init__(**kwargs) self.text = text def on_parent(self, instance, parent): if parent is not None: self.font_size = math.ceil(2 * math.sqrt(parent.parent.parent.key_size)) self.height = parent.parent.labels_height class PlayListNames(StackLayout): def __init__(self, **kwargs): super(PlayListNames, self).__init__(**kwargs) self.names = [] def on_parent(self, instance, parent): parent.bind(playlist=self.update_playlist_names) def update_playlist_names(self, instance, playlist): for name in self.names: self.remove_widget(name) self.names = [] for icon, filename, time_info, playing in playlist: name_label = PlayListName(text=filename, is_playing=playing) self.add_widget(name_label) self.names.append(name_label) class PlayListName(Label): def __init__(self, text='', is_playing=False, **kwargs): super(PlayListName, self).__init__(**kwargs) self.text = text self.bold = is_playing def on_parent(self, instance, parent): if parent is not None: self.font_size = math.ceil(2 * math.sqrt(parent.parent.parent.key_size)) self.height = parent.parent.labels_height class PlayListTimes(StackLayout): def __init__(self, **kwargs): super(PlayListTimes, self).__init__(**kwargs) self.times = [] def on_parent(self, instance, parent): parent.bind(playlist=self.update_playlist_times) def update_playlist_times(self, instance, playlist): for time in self.times: self.remove_widget(time) self.times = [] for icon, filename, time_info, playing in playlist: time_label = PlayListTime(text=time_info) self.add_widget(time_label) self.times.append(time_label) class PlayListTime(Label): def __init__(self, text='', **kwargs): super(PlayListTime, self).__init__(**kwargs) self.text = text def on_parent(self, instance, parent): if parent is not None: self.font_size = math.ceil(2 * math.sqrt(parent.parent.parent.key_size)) self.height = parent.parent.labels_height