from kivy.uix.stacklayout import StackLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import ListProperty, StringProperty
-
-import math
+from ..lock import Lock
__all__ = ["ActionList",
"ActionListIcons", "ActionListIcon",
"ActionListDescriptions", "ActionListDescription"]
+actionlist_lock = Lock("playlist")
+
class ActionList(RelativeLayout):
action_title = StringProperty("")
action_list = ListProperty([])
else:
icon = " "
action_list.append([icon, action])
- self.action_list = action_list
+ with actionlist_lock:
+ self.action_list = action_list
class ActionListIcons(StackLayout):
def __init__(self, **kwargs):
parent.bind(action_list=self.update_actionlist_icons)
def update_actionlist_icons(self, instance, actionlist):
- for icon in self.icons:
- self.remove_widget(icon)
- self.icons = []
- for icon, description in actionlist:
- icon_label = ActionListIcon(text=icon)
- self.add_widget(icon_label)
- self.icons.append(icon_label)
+ icons_length = len(self.icons)
+ index = -1
+ for index, [icon, description] in enumerate(actionlist):
+ if index >= icons_length:
+ icon_label = ActionListIcon(text=icon)
+ self.add_widget(icon_label)
+ self.icons.append(icon_label)
+ else:
+ self.icons[index].text = icon
+
+ if index+1 < icons_length:
+ self.clear_widgets(children=self.icons[index+1:icons_length])
+ del(self.icons[index+1:icons_length])
class ActionListIcon(Label):
def __init__(self, text='', **kwargs):
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
+ parent.bind(font_size=self.update_font_size)
+ parent.bind(labels_height=self.update_height)
+
+ def update_height(self, instance, height):
+ self.height = height
+
+ def update_font_size(self, instance, font_size):
+ self.font_size = font_size
class ActionListDescriptions(StackLayout):
def __init__(self, **kwargs):
parent.bind(action_list=self.update_actionlist_descriptions)
def update_actionlist_descriptions(self, instance, actionlist):
- for description in self.descriptions:
- self.remove_widget(description)
- self.descriptions = []
- for icon, description in actionlist:
- description_label = ActionListDescription(text=description)
- self.add_widget(description_label)
- self.descriptions.append(description_label)
+ descriptions_length = len(self.descriptions)
+ index = -1
+ for index, [icon, description] in enumerate(actionlist):
+ if index >= descriptions_length:
+ description_label = ActionListDescription(text=description)
+ self.add_widget(description_label)
+ self.descriptions.append(description_label)
+ else:
+ self.descriptions[index].text = description
+
+ if index+1 < descriptions_length:
+ self.clear_widgets(
+ children=self.descriptions[index+1:descriptions_length])
+ del(self.descriptions[index+1:descriptions_length])
class ActionListDescription(Label):
def __init__(self, text='', **kwargs):
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
+ parent.bind(font_size=self.update_font_size)
+ parent.bind(labels_height=self.update_height)
+
+ def update_height(self, instance, height):
+ self.height = height
+ def update_font_size(self, instance, font_size):
+ self.font_size = font_size
from kivy.properties import ListProperty
from kivy.clock import Clock
from ..helpers import duration_to_min_sec
-
-import math
+from ..lock import Lock
__all__ = ["PlayList",
"PlayListIcons", "PlayListIcon",
"PlayListNames", "PlayListName",
"PlayListTimes", "PlayListTime"]
+playlist_lock = Lock("playlist")
+
class PlayList(RelativeLayout):
playlist = ListProperty([])
playlist.append(["⏸", music_file.name, time_info, False])
else:
playlist.append(["⏵", music_file.name, time_info, True])
- self.playlist = playlist
+ with playlist_lock:
+ self.playlist = playlist
class PlayListIcons(StackLayout):
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)
+ icons_length = len(self.icons)
+ index = -1
+ for index, [icon, filename, time_info, playing] in enumerate(playlist):
+ if index >= icons_length:
+ icon_label = PlayListIcon(text=icon)
+ self.add_widget(icon_label)
+ self.icons.append(icon_label)
+ else:
+ self.icons[index].text = icon
+
+ if index+1 < icons_length:
+ self.clear_widgets(children=self.icons[index+1:icons_length])
+ del(self.icons[index+1:icons_length])
class PlayListIcon(Label):
def __init__(self, text='', **kwargs):
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
+ parent.bind(font_size=self.update_font_size)
+ parent.bind(labels_height=self.update_height)
+
+ def update_height(self, instance, height):
+ self.height = height
+ def update_font_size(self, instance, font_size):
+ self.font_size = font_size
class PlayListNames(StackLayout):
def __init__(self, **kwargs):
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)
+ names_length = len(self.names)
+ index = -1
+ for index, [icon, filename, time_info, playing] in enumerate(playlist):
+ if index >= names_length:
+ name_label = PlayListName(text=filename, is_playing=playing)
+ self.add_widget(name_label)
+ self.names.append(name_label)
+ else:
+ self.names[index].text = filename
+
+ if index+1 < names_length:
+ self.clear_widgets(children=self.names[index+1:names_length])
+ del(self.names[index+1:names_length])
class PlayListName(Label):
def __init__(self, text='', is_playing=False, **kwargs):
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
+ parent.bind(font_size=self.update_font_size)
+ parent.bind(labels_height=self.update_height)
+
+ def update_height(self, instance, height):
+ self.height = height
+
+ def update_font_size(self, instance, font_size):
+ self.font_size = font_size
class PlayListTimes(StackLayout):
def __init__(self, **kwargs):
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)
+ times_length = len(self.times)
+ index = -1
+ for index, [icon, filename, time_info, playing] in enumerate(playlist):
+ if index >= times_length:
+ time_label = PlayListTime(text=time_info)
+ self.add_widget(time_label)
+ self.times.append(time_label)
+ else:
+ self.times[index].text = time_info
+
+ if index+1 < times_length:
+ self.clear_widgets(children=self.times[index+1:times_length])
+ del(self.times[index+1:times_length])
class PlayListTime(Label):
def __init__(self, text='', **kwargs):
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
+ parent.bind(font_size=self.update_font_size)
+ parent.bind(labels_height=self.update_height)
+
+ def update_height(self, instance, height):
+ self.height = height
+
+ def update_font_size(self, instance, font_size):
+ self.font_size = font_size
<ActionList>:
size_hint: None, None
labels_height: self.parent.max_height or 1
+ font_size: math.ceil(2 * math.sqrt(self.parent.key_size or 10))
canvas:
Color:
rgba: 250./255, 250./255, 250./255, 1
id: action_list_title
font_name: "Ubuntu"
bold: True
- font_size: math.ceil(2 * math.sqrt(self.parent.parent.key_size or 10))
+ font_size: self.parent.font_size
color: 0, 0, 0, 1
text: self.parent.action_title
text_size: None, self.parent.height
size_hint: None, None
size: self.texture_size[0], self.parent.height
ActionListIcons:
+ font_size: self.parent.font_size
+ labels_height: self.parent.labels_height
orientation: 'lr-tb'
size_hint: 0.02, 0.9
pos_hint: { 'x': 0, 'top': 0.9 }
ActionListDescriptions:
+ font_size: self.parent.font_size
+ labels_height: self.parent.labels_height
orientation: 'lr-tb'
size_hint: 0.98, 0.9
pos_hint: { 'x': 0.02, 'top': 0.9 }
<ActionListIcon>:
+ font_size: self.parent and self.parent.font_size or 10
+ height: self.parent and self.parent.labels_height or 0
font_name: "Symbola"
color: 0, 0, 0, 1
text_size: None, None
width: self.texture_size[0]
<ActionListDescription>:
+ font_size: self.parent and self.parent.font_size or 10
+ height: self.parent and self.parent.labels_height or 0
font_name: "Ubuntu"
color: 0, 0, 0, 1
text_size: self.width, None
<PlayList>:
size_hint: None, None
labels_height: self.parent.max_height or 1
+ font_size: math.ceil(2 * math.sqrt(self.parent.key_size or 10))
canvas:
Color:
rgba: 250./255, 250./255, 250./255, 1
pos: 0, 0
size: self.width, self.height
PlayListIcons:
+ font_size: self.parent.font_size
+ labels_height: self.parent.labels_height
orientation: 'lr-tb'
size_hint: 0.05, 1
pos_hints: { 'x': 0, 'top': 0 }
PlayListNames:
+ font_size: self.parent.font_size
+ labels_height: self.parent.labels_height
orientation: 'lr-tb'
pos_hint: { 'x': 0.05, 'bottom': 0 }
size_hint: 0.65, 1
PlayListTimes:
+ font_size: self.parent.font_size
+ labels_height: self.parent.labels_height
orientation: 'lr-tb'
pos_hint: { 'x': 0.7, 'bottom': 0 }
size_hint: 0.30, 1
<PlayListIcon>:
+ font_size: self.parent and self.parent.font_size or 10
+ height: self.parent and self.parent.labels_height or 0
font_name: "Symbola"
color: 0, 0, 0, 1
text_size: None, None
width: self.texture_size[0]
<PlayListName>:
+ font_size: self.parent and self.parent.font_size or 10
+ height: self.parent and self.parent.labels_height or 0
font_name: "Ubuntu"
color: 0, 0, 0, 1
text_size: self.width, None
size_hint: 1, None
<PlayListTime>:
+ font_size: self.parent and self.parent.font_size or 10
+ height: self.parent and self.parent.labels_height or 0
canvas.before:
Color:
rgba: 250./255, 250./255, 250./255, 1