Compare commits

..

5 Commits

Author SHA1 Message Date
Keith Edmunds
2f13099bda Don't allow cart click while that cart is playing. 2022-10-25 07:46:14 +01:00
Keith Edmunds
9ccff3db20 Specify colour of cart progress bars 2022-10-23 22:37:06 +01:00
Keith Edmunds
ef9b1e7ce5 Remove redundant debug logging 2022-10-23 16:29:38 +01:00
Keith Edmunds
5e770b3975 Cart progress bar tweaks 2022-10-23 16:29:03 +01:00
Keith Edmunds
6c92401ad6 Put progress bars on playing cart buttons. 2022-10-23 16:17:43 +01:00
3 changed files with 48 additions and 4 deletions

View File

@ -16,6 +16,7 @@ class Config(object):
COLOUR_BITRATE_OK = "#dcedc8" COLOUR_BITRATE_OK = "#dcedc8"
COLOUR_CART_ERROR = "#dc3545" COLOUR_CART_ERROR = "#dc3545"
COLOUR_CART_PLAYING = "#248f24" COLOUR_CART_PLAYING = "#248f24"
COLOUR_CART_PROGRESSBAR = "#000000"
COLOUR_CART_READY = "#ffc107" COLOUR_CART_READY = "#ffc107"
COLOUR_CART_UNCONFIGURED = "#f2f2f2" COLOUR_CART_UNCONFIGURED = "#f2f2f2"
COLOUR_CURRENT_HEADER = "#d4edda" COLOUR_CURRENT_HEADER = "#d4edda"

View File

@ -7,10 +7,11 @@ import sys
import threading import threading
from datetime import datetime, timedelta from datetime import datetime, timedelta
from time import sleep
from typing import List, Optional from typing import List, Optional
from PyQt5.QtCore import QDate, QEvent, Qt, QSize, QTime, QTimer from PyQt5.QtCore import QDate, QEvent, Qt, QSize, QTime, QTimer
from PyQt5.QtGui import QColor, QPalette, QFont from PyQt5.QtGui import QColor, QFont, QPalette, QResizeEvent
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QApplication, QApplication,
QDialog, QDialog,
@ -22,6 +23,7 @@ from PyQt5.QtWidgets import (
QMainWindow, QMainWindow,
QMessageBox, QMessageBox,
QPushButton, QPushButton,
QProgressBar,
) )
from dbconfig import engine, Session from dbconfig import engine, Session
@ -57,6 +59,10 @@ class CartButton(QPushButton):
super().__init__(parent) super().__init__(parent)
self.parent = parent self.parent = parent
self.cart_id = cart.id self.cart_id = cart.id
if cart.path and cart.enabled and not cart.duration:
tags = helpers.get_tags(cart.path)
cart.duration = tags['duration']
self.duration = cart.duration
self.path = cart.path self.path = cart.path
self.player = None self.player = None
self.is_playing = False self.is_playing = False
@ -68,6 +74,17 @@ class CartButton(QPushButton):
self.setFont(font) self.setFont(font)
self.setObjectName("cart_" + str(cart.cart_number)) self.setObjectName("cart_" + str(cart.cart_number))
self.pgb = QProgressBar(self, textVisible=False)
self.pgb.setVisible(False)
palette = self.pgb.palette()
palette.setColor(QPalette.Highlight,
QColor(Config.COLOUR_CART_PROGRESSBAR))
self.pgb.setPalette(palette)
self.pgb.setGeometry(0, 0, self.width(), 10)
self.pgb.setMinimum(0)
self.pgb.setMaximum(1)
self.pgb.setValue(0)
def __repr__(self) -> str: def __repr__(self) -> str:
return ( return (
f"<CartButton(cart_id={self.cart_id} " f"<CartButton(cart_id={self.cart_id} "
@ -84,6 +101,11 @@ class CartButton(QPushButton):
return super().event(event) return super().event(event)
def resizeEvent(self, event: QResizeEvent) -> None:
"""Resize progess bar when button size changes"""
self.pgb.setGeometry(0, 0, self.width(), 10)
class TrackData: class TrackData:
def __init__(self, track): def __init__(self, track):
@ -144,6 +166,7 @@ class Window(QMainWindow, Ui_MainWindow):
"""Configure button with cart data""" """Configure button with cart data"""
btn.setEnabled(False) btn.setEnabled(False)
btn.pgb.setVisible(False)
if cart.path: if cart.path:
if helpers.file_is_readable(cart.path): if helpers.file_is_readable(cart.path):
colour = Config.COLOUR_CART_READY colour = Config.COLOUR_CART_READY
@ -152,6 +175,7 @@ class Window(QMainWindow, Ui_MainWindow):
btn.player.audio_set_volume(Config.VOLUME_VLC_DEFAULT) btn.player.audio_set_volume(Config.VOLUME_VLC_DEFAULT)
if cart.enabled: if cart.enabled:
btn.setEnabled(True) btn.setEnabled(True)
btn.pgb.setVisible(True)
else: else:
colour = Config.COLOUR_CART_ERROR colour = Config.COLOUR_CART_ERROR
else: else:
@ -164,13 +188,20 @@ class Window(QMainWindow, Ui_MainWindow):
"""Handle cart click""" """Handle cart click"""
btn = self.sender() btn = self.sender()
if helpers.file_is_readable(btn.path): if helpers.file_is_readable(btn.path):
# Don't allow clicks while we're playing
btn.setEnabled(False)
btn.player.play() btn.player.play()
btn.is_playing = True btn.is_playing = True
colour = Config.COLOUR_CART_PLAYING colour = Config.COLOUR_CART_PLAYING
thread = threading.Thread(target=self.cart_progressbar,
args=(btn,))
thread.start()
else: else:
colour = Config.COLOUR_CART_ERROR colour = Config.COLOUR_CART_ERROR
btn.setStyleSheet("background-color: " + colour + ";\n") btn.setStyleSheet("background-color: " + colour + ";\n")
btn.pgb.minimum = 0
def cart_edit(self, btn: CartButton, event: QEvent): def cart_edit(self, btn: CartButton, event: QEvent):
"""Handle context menu for cart button""" """Handle context menu for cart button"""
@ -223,6 +254,16 @@ class Window(QMainWindow, Ui_MainWindow):
# Configure button # Configure button
self.cart_configure(cart, btn) self.cart_configure(cart, btn)
def cart_progressbar(self, btn: CartButton) -> None:
"""Manage progress bar"""
ms = 0
btn.pgb.setMaximum(btn.duration)
while ms <= btn.duration:
btn.pgb.setValue(ms)
ms += 100
sleep(0.1)
def cart_tick(self) -> None: def cart_tick(self) -> None:
"""Cart clock actions""" """Cart clock actions"""
@ -234,11 +275,13 @@ class Window(QMainWindow, Ui_MainWindow):
if not btn.player.is_playing(): if not btn.player.is_playing():
# Cart has finished playing # Cart has finished playing
btn.is_playing = False btn.is_playing = False
btn.setEnabled(True)
# Setting to position 0 doesn't seem to work # Setting to position 0 doesn't seem to work
btn.player = self.music.VLC.media_player_new(btn.path) btn.player = self.music.VLC.media_player_new(btn.path)
btn.player.audio_set_volume(Config.VOLUME_VLC_DEFAULT) btn.player.audio_set_volume(Config.VOLUME_VLC_DEFAULT)
colour = Config.COLOUR_CART_READY colour = Config.COLOUR_CART_READY
btn.setStyleSheet("background-color: " + colour + ";\n") btn.setStyleSheet("background-color: " + colour + ";\n")
btn.pgb.setValue(0)
def clear_selection(self) -> None: def clear_selection(self) -> None:
""" Clear selected row""" """ Clear selected row"""
@ -1111,7 +1154,8 @@ class Window(QMainWindow, Ui_MainWindow):
""" """
Carry out clock tick actions. Carry out clock tick actions.
The Time of Day clock is updated every tick (500ms). The Time of Day clock and any cart progress bars are updated
every tick (500ms).
All other timers are updated every second. As the timer displays All other timers are updated every second. As the timer displays
have a one-second resolution, updating every 500ms can result in have a one-second resolution, updating every 500ms can result in
@ -1120,6 +1164,7 @@ class Window(QMainWindow, Ui_MainWindow):
Actions required: Actions required:
- Update TOD clock - Update TOD clock
- Call cart_tick
- If track is playing: - If track is playing:
update track clocks time and colours update track clocks time and colours
- Else: - Else:

View File

@ -823,7 +823,6 @@ class PlaylistTab(QTableWidget):
def scroll_current_to_top(self) -> None: def scroll_current_to_top(self) -> None:
"""Scroll currently-playing row to top""" """Scroll currently-playing row to top"""
log.debug("KAE: playlists.scroll_current_to_top()")
current_row = self._get_current_track_row() current_row = self._get_current_track_row()
log.debug(f"KAE: playlists.scroll_current_to_top(), {current_row=}") log.debug(f"KAE: playlists.scroll_current_to_top(), {current_row=}")
self._scroll_to_top(current_row) self._scroll_to_top(current_row)
@ -831,7 +830,6 @@ class PlaylistTab(QTableWidget):
def scroll_next_to_top(self) -> None: def scroll_next_to_top(self) -> None:
"""Scroll nextly-playing row to top""" """Scroll nextly-playing row to top"""
log.debug("KAE: playlists.scroll_next_to_top()")
next_row = self._get_next_track_row() next_row = self._get_next_track_row()
log.debug(f"KAE: playlists.scroll_next_to_top(), {next_row=}") log.debug(f"KAE: playlists.scroll_next_to_top(), {next_row=}")
self._scroll_to_top(next_row) self._scroll_to_top(next_row)