-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathyoutube_queue.py
More file actions
183 lines (164 loc) · 6.65 KB
/
Copy pathyoutube_queue.py
File metadata and controls
183 lines (164 loc) · 6.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
"""Cola de YouTube aparte de la lista IPTV: siguiente, quitar y reordenar."""
import tkinter as tk
from tkinter import ttk, messagebox
import app_config
from ui_theme import (
center_window, get_colors, set_window_icon, style_window,
)
from ui_layout import bind_wraplength, bind_tree_stretch, setup_resizable_dialog
def show_youtube_queue(player):
"""Muestra youtube cola."""
if not getattr(player, 'window', None):
return None
existing = getattr(player, '_youtube_queue_win', None)
if existing is not None:
try:
if existing.window.winfo_exists():
existing.window.deiconify()
existing.window.lift()
existing.refresh()
return existing
except tk.TclError:
pass
return YoutubeQueueWindow(player)
class YoutubeQueueWindow:
"""Clase que representa youtubequeuewindow."""
def __init__(self, player):
"""Inicializa YoutubeQueueWindow."""
self.player = player
player._youtube_queue_win = self
colors = get_colors()
window = tk.Toplevel(player.window)
window.title('Cola de YouTube')
setup_resizable_dialog(window, 560, 420, 420, 300)
style_window(window)
set_window_icon(window)
window.transient(player.window)
self.window = window
top = ttk.Frame(window, padding=(12, 10, 12, 6))
top.pack(fill=tk.X)
ttk.Label(top, text='Cola de YouTube', style='PageTitle.TLabel').pack(side=tk.LEFT)
ttk.Button(top, text='Cerrar', command=self.close).pack(side=tk.RIGHT)
intro = ttk.Label(
window,
text='Lo que añadas aquí se reproduce al terminar el vídeo actual. No se mezcla con la lista IPTV.',
style='Muted.TLabel',
wraplength=520,
)
intro.pack(anchor=tk.W, padx=12, pady=(0, 8))
bind_wraplength(window, padding=24)
body = ttk.Frame(window, padding=(12, 0, 12, 12))
body.pack(fill=tk.BOTH, expand=True)
self.tree = ttk.Treeview(
body,
columns=('order',),
show='tree headings',
selectmode='browse',
)
self.tree.heading('#0', text='Título', anchor=tk.W)
self.tree.heading('order', text='#', anchor=tk.CENTER)
self.tree.column('#0', width=420, stretch=True)
self.tree.column('order', width=40, stretch=False, anchor=tk.CENTER)
scroll = ttk.Scrollbar(body, orient=tk.VERTICAL, command=self.tree.yview)
self.tree.configure(yscrollcommand=scroll.set)
scroll.pack(side=tk.RIGHT, fill=tk.Y)
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
bind_tree_stretch(self.tree, stretch_columns=('#0',))
self.tree.tag_configure('empty', foreground=colors['text_muted'])
self.tree.bind('<Double-Button-1>', self._play_selected)
self.tree.bind('<Return>', self._play_selected)
self.tree.bind('<Delete>', lambda e: self._remove_selected())
buttons = ttk.Frame(window, padding=(12, 0, 12, 12))
buttons.pack(fill=tk.X)
ttk.Button(buttons, text='Siguiente', style='Accent.TButton', command=self._play_next).pack(side=tk.LEFT)
ttk.Button(buttons, text='Reproducir', command=self._play_selected).pack(side=tk.LEFT, padx=(8, 0))
ttk.Button(buttons, text='Quitar', command=self._remove_selected).pack(side=tk.LEFT, padx=(8, 0))
ttk.Button(buttons, text='Subir', command=lambda: self._move(-1)).pack(side=tk.LEFT, padx=(8, 0))
ttk.Button(buttons, text='Bajar', command=lambda: self._move(1)).pack(side=tk.LEFT, padx=(8, 0))
ttk.Button(buttons, text='Vaciar', command=self._clear).pack(side=tk.RIGHT)
window.protocol('WM_DELETE_WINDOW', self.close)
self.refresh()
def close(self):
"""Close."""
if getattr(self.player, '_youtube_queue_win', None) is self:
self.player._youtube_queue_win = None
try:
self.window.destroy()
except tk.TclError:
pass
def refresh(self):
"""Refresh."""
if not self.player._widget_exists(self.window):
return
try:
selected = self.tree.selection()
selected_iid = selected[0] if selected else ''
self.tree.delete(*self.tree.get_children())
except tk.TclError:
return
queue = app_config.youtube_queue()
if not queue:
self.tree.insert('', 'end', iid='empty', text='La cola está vacía', values=('',), tags=('empty',))
return
for index, item in enumerate(queue, start=1):
iid = str(index - 1)
self.tree.insert('', 'end', iid=iid, text=item.get('name') or 'YouTube', values=(str(index),))
if selected_iid and self.tree.exists(selected_iid):
self.tree.selection_set(selected_iid)
self.tree.see(selected_iid)
def _selected_index(self):
"""Uso interno: selected index."""
try:
selection = self.tree.selection()
except tk.TclError:
return None
if not selection or selection[0] == 'empty':
return None
try:
return int(selection[0])
except (TypeError, ValueError):
return None
def _play_next(self):
"""Uso interno: play next."""
play = getattr(self.player, 'play_youtube_queue_next', None)
if play:
play()
def _play_selected(self, event=None):
"""Uso interno: play selected."""
index = self._selected_index()
if index is None:
return
play = getattr(self.player, 'play_youtube_queue_index', None)
if play:
play(index)
def _remove_selected(self):
"""Uso interno: remove selected."""
index = self._selected_index()
if index is None:
return
app_config.remove_youtube_queue(index)
self.refresh()
def _move(self, delta):
"""Uso interno: move."""
index = self._selected_index()
if index is None:
return
if not app_config.move_youtube_queue(index, delta):
return
self.refresh()
dest = index + int(delta)
if self.tree.exists(str(dest)):
self.tree.selection_set(str(dest))
self.tree.see(str(dest))
def _clear(self):
"""Uso interno: clear."""
if not app_config.youtube_queue():
return
if not messagebox.askyesno(
'Vaciar cola',
'¿Quitar todos los vídeos de la cola?',
parent=self.window,
):
return
app_config.clear_youtube_queue()
self.refresh()