aboutsummaryrefslogblamecommitdiff
path: root/music_sampler/app_blocks/playlist.py
blob: b704d4d5077aed6a8f1fa1871f286b912b584ee7 (plain) (tree)




























































































































                                                                                    
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