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