Added volume fade graph.
This commit is contained in:
parent
af0d715423
commit
4eb3a98c95
@ -48,6 +48,9 @@ class Config(object):
|
|||||||
DISPLAY_SQL = False
|
DISPLAY_SQL = False
|
||||||
ERRORS_FROM = ['noreply@midnighthax.com']
|
ERRORS_FROM = ['noreply@midnighthax.com']
|
||||||
ERRORS_TO = ['kae@midnighthax.com']
|
ERRORS_TO = ['kae@midnighthax.com']
|
||||||
|
FADE_CURVE_BACKGROUND = "lightyellow"
|
||||||
|
FADE_CURVE_FOREGROUND = "blue"
|
||||||
|
FADE_CURVE_MS_BEFORE_FADE = 5000
|
||||||
FADE_STEPS = 20
|
FADE_STEPS = 20
|
||||||
FADE_TIME = 3000
|
FADE_TIME = 3000
|
||||||
HIDE_AFTER_PLAYING_OFFSET = 5000
|
HIDE_AFTER_PLAYING_OFFSET = 5000
|
||||||
@ -77,7 +80,7 @@ class Config(object):
|
|||||||
SCROLL_TOP_MARGIN = 3
|
SCROLL_TOP_MARGIN = 3
|
||||||
TEXT_NO_TRACK_NO_NOTE = "[Section header]"
|
TEXT_NO_TRACK_NO_NOTE = "[Section header]"
|
||||||
TOD_TIME_FORMAT = "%H:%M:%S"
|
TOD_TIME_FORMAT = "%H:%M:%S"
|
||||||
TIMER_MS = 500
|
TIMER_MS = 100
|
||||||
TRACK_TIME_FORMAT = "%H:%M:%S"
|
TRACK_TIME_FORMAT = "%H:%M:%S"
|
||||||
VOLUME_VLC_DEFAULT = 75
|
VOLUME_VLC_DEFAULT = 75
|
||||||
VOLUME_VLC_DROP3db = 65
|
VOLUME_VLC_DROP3db = 65
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import numpy as np
|
||||||
import os
|
import os
|
||||||
import psutil
|
import psutil
|
||||||
import shutil
|
import shutil
|
||||||
|
|||||||
@ -3,17 +3,17 @@
|
|||||||
from log import log
|
from log import log
|
||||||
from os.path import basename
|
from os.path import basename
|
||||||
import argparse
|
import argparse
|
||||||
import matplotlib # type: ignore
|
|
||||||
import os
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import pyqtgraph as pg # type: ignore
|
||||||
import stackprinter # type: ignore
|
import stackprinter # type: ignore
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
import icons_rc
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from pygame import mixer
|
from pygame import mixer
|
||||||
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg # type: ignore
|
|
||||||
from matplotlib.figure import Figure # type: ignore
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import (
|
from typing import (
|
||||||
Callable,
|
Callable,
|
||||||
@ -143,78 +143,63 @@ class CartButton(QPushButton):
|
|||||||
self.pgb.setGeometry(0, 0, self.width(), 10)
|
self.pgb.setGeometry(0, 0, self.width(), 10)
|
||||||
|
|
||||||
|
|
||||||
class PlaylistTrack:
|
class FadeCurve:
|
||||||
"""
|
GraphWidget = None
|
||||||
Used to provide a single reference point for specific playlist tracks,
|
|
||||||
typically the previous, current and next track.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self, track):
|
||||||
"""
|
"""
|
||||||
Only initialises data structure. Call set_plr to populate.
|
Set up fade graph array
|
||||||
|
|
||||||
Do NOT store row_number here - that changes if tracks are reordered
|
|
||||||
in playlist (add, remove, drag/drop) and we shouldn't care about row
|
|
||||||
number: that's the playlist's problem.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.artist: Optional[str] = None
|
audio = helpers.get_audio_segment(track.path)
|
||||||
self.duration: Optional[int] = None
|
if not audio:
|
||||||
self.end_time: Optional[datetime] = None
|
return None
|
||||||
self.fade_at: Optional[int] = None
|
|
||||||
self.fade_length: Optional[int] = None
|
|
||||||
self.path: Optional[str] = None
|
|
||||||
self.playlist_id: Optional[int] = None
|
|
||||||
self.playlist_tab: Optional[PlaylistTab] = None
|
|
||||||
self.plr_id: Optional[int] = None
|
|
||||||
self.silence_at: Optional[int] = None
|
|
||||||
self.start_gap: Optional[int] = None
|
|
||||||
self.start_time: Optional[datetime] = None
|
|
||||||
self.title: Optional[str] = None
|
|
||||||
self.track_id: Optional[int] = None
|
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
# Start point of curve is Config.FADE_CURVE_MS_BEFORE_FADE
|
||||||
return (
|
# milliseconds before fade starts to silence
|
||||||
f"<PlaylistTrack(title={self.title}, artist={self.artist}, "
|
self.start_ms = max(
|
||||||
f"playlist_id={self.playlist_id}>"
|
0, track.fade_at - Config.FADE_CURVE_MS_BEFORE_FADE - 1)
|
||||||
|
self.end_ms = track.silence_at
|
||||||
|
self.audio_segment = audio[self.start_ms:self.end_ms]
|
||||||
|
self.graph_array = np.array(self.audio_segment.get_array_of_samples())
|
||||||
|
|
||||||
|
# Calculate the factor to map milliseconds of track to array
|
||||||
|
self.ms_to_array_factor = (
|
||||||
|
len(self.graph_array) / (self.end_ms - self.start_ms)
|
||||||
)
|
)
|
||||||
|
|
||||||
def set_plr(self, session: scoped_session, plr: PlaylistRows,
|
self.region = None
|
||||||
tab: PlaylistTab) -> None:
|
|
||||||
"""
|
|
||||||
Update with new plr information
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.playlist_tab = tab
|
def clear(self) -> None:
|
||||||
|
"""Clear the current graph"""
|
||||||
|
|
||||||
session.add(plr)
|
if self.GraphWidget:
|
||||||
track = plr.track
|
self.GraphWidget.clear()
|
||||||
|
|
||||||
self.artist = track.artist
|
def plot(self):
|
||||||
self.duration = track.duration
|
self.curve = self.GraphWidget.plot(self.graph_array)
|
||||||
self.end_time = None
|
self.curve.setPen(Config.FADE_CURVE_FOREGROUND)
|
||||||
self.fade_at = track.fade_at
|
|
||||||
self.path = track.path
|
|
||||||
self.playlist_id = plr.playlist_id
|
|
||||||
self.plr_id = plr.id
|
|
||||||
self.silence_at = track.silence_at
|
|
||||||
self.start_gap = track.start_gap
|
|
||||||
self.start_time = None
|
|
||||||
self.title = track.title
|
|
||||||
self.track_id = track.id
|
|
||||||
|
|
||||||
if track.silence_at and track.fade_at:
|
def tick(self, play_position) -> None:
|
||||||
self.fade_length = track.silence_at - track.fade_at
|
"""Update volume fade curve"""
|
||||||
|
|
||||||
def start(self) -> None:
|
if not self.GraphWidget:
|
||||||
"""
|
return
|
||||||
Called when track starts playing
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.start_time = datetime.now()
|
ms_of_graph = play_position - self.start_ms
|
||||||
if self.duration:
|
if ms_of_graph < 0:
|
||||||
self.end_time = (
|
return
|
||||||
self.start_time + timedelta(milliseconds=self.duration))
|
|
||||||
|
if self.region is None:
|
||||||
|
# Create the region now that we're into fade
|
||||||
|
self.region = pg.LinearRegionItem(
|
||||||
|
[0, 0],
|
||||||
|
bounds=[0, len(self.graph_array)]
|
||||||
|
)
|
||||||
|
self.GraphWidget.addItem(self.region)
|
||||||
|
|
||||||
|
# Update region position
|
||||||
|
self.region.setRegion([0, ms_of_graph * self.ms_to_array_factor])
|
||||||
|
|
||||||
|
|
||||||
class ImportTrack(QObject):
|
class ImportTrack(QObject):
|
||||||
@ -253,17 +238,6 @@ class ImportTrack(QObject):
|
|||||||
self.finished.emit(self.playlist)
|
self.finished.emit(self.playlist)
|
||||||
|
|
||||||
|
|
||||||
class MplCanvas(FigureCanvasQTAgg):
|
|
||||||
"""
|
|
||||||
From https://www.pythonguis.com/tutorials/plotting-matplotlib/
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, parent=None, width=5, height=4, dpi=100):
|
|
||||||
fig = Figure(figsize=(width, height), dpi=dpi)
|
|
||||||
# self.axes = fig.add_subplot(111)
|
|
||||||
super(MplCanvas, self).__init__(fig)
|
|
||||||
|
|
||||||
|
|
||||||
class MusicMusterSignals(QObject):
|
class MusicMusterSignals(QObject):
|
||||||
"""
|
"""
|
||||||
Class for all MusicMuster signals. See:
|
Class for all MusicMuster signals. See:
|
||||||
@ -275,6 +249,84 @@ class MusicMusterSignals(QObject):
|
|||||||
set_next_track_signal = pyqtSignal(int, int)
|
set_next_track_signal = pyqtSignal(int, int)
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistTrack:
|
||||||
|
"""
|
||||||
|
Used to provide a single reference point for specific playlist tracks,
|
||||||
|
typically the previous, current and next track.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""
|
||||||
|
Only initialises data structure. Call set_plr to populate.
|
||||||
|
|
||||||
|
Do NOT store row_number here - that changes if tracks are reordered
|
||||||
|
in playlist (add, remove, drag/drop) and we shouldn't care about row
|
||||||
|
number: that's the playlist's problem.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.artist: Optional[str] = None
|
||||||
|
self.duration: Optional[int] = None
|
||||||
|
self.end_time: Optional[datetime] = None
|
||||||
|
self.fade_at: Optional[int] = None
|
||||||
|
self.fade_curve: Optional[FadeCurve] = None
|
||||||
|
self.fade_length: Optional[int] = None
|
||||||
|
self.path: Optional[str] = None
|
||||||
|
self.playlist_id: Optional[int] = None
|
||||||
|
self.playlist_tab: Optional[PlaylistTab] = None
|
||||||
|
self.plr_id: Optional[int] = None
|
||||||
|
self.silence_at: Optional[int] = None
|
||||||
|
self.start_gap: Optional[int] = None
|
||||||
|
self.start_time: Optional[datetime] = None
|
||||||
|
self.title: Optional[str] = None
|
||||||
|
self.track_id: Optional[int] = None
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return (
|
||||||
|
f"<PlaylistTrack(title={self.title}, artist={self.artist}, "
|
||||||
|
f"playlist_id={self.playlist_id}>"
|
||||||
|
)
|
||||||
|
|
||||||
|
def set_plr(self, session: scoped_session, plr: PlaylistRows,
|
||||||
|
tab: PlaylistTab) -> None:
|
||||||
|
"""
|
||||||
|
Update with new plr information
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not plr.track:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.playlist_tab = tab
|
||||||
|
session.add(plr)
|
||||||
|
track = plr.track
|
||||||
|
|
||||||
|
self.artist = track.artist
|
||||||
|
self.duration = track.duration
|
||||||
|
self.end_time = None
|
||||||
|
self.fade_at = track.fade_at
|
||||||
|
self.fade_graph = FadeCurve(track)
|
||||||
|
self.path = track.path
|
||||||
|
self.playlist_id = plr.playlist_id
|
||||||
|
self.plr_id = plr.id
|
||||||
|
self.silence_at = track.silence_at
|
||||||
|
self.start_gap = track.start_gap
|
||||||
|
self.start_time = None
|
||||||
|
self.title = track.title
|
||||||
|
self.track_id = track.id
|
||||||
|
|
||||||
|
if track.silence_at and track.fade_at:
|
||||||
|
self.fade_length = track.silence_at - track.fade_at
|
||||||
|
|
||||||
|
def start(self) -> None:
|
||||||
|
"""
|
||||||
|
Called when track starts playing
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.start_time = datetime.now()
|
||||||
|
if self.duration:
|
||||||
|
self.end_time = (
|
||||||
|
self.start_time + timedelta(milliseconds=self.duration))
|
||||||
|
|
||||||
|
|
||||||
class Window(QMainWindow, Ui_MainWindow):
|
class Window(QMainWindow, Ui_MainWindow):
|
||||||
def __init__(self, parent=None, *args, **kwargs) -> None:
|
def __init__(self, parent=None, *args, **kwargs) -> None:
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@ -303,7 +355,10 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
self.txtSearch.setHidden(True)
|
self.txtSearch.setHidden(True)
|
||||||
self.hide_played_tracks = False
|
self.hide_played_tracks = False
|
||||||
mixer.init()
|
mixer.init()
|
||||||
matplotlib.use('QtAgg')
|
self.widgetFadeVolume.hideAxis('bottom')
|
||||||
|
self.widgetFadeVolume.hideAxis('left')
|
||||||
|
self.widgetFadeVolume.setBackground(Config.FADE_CURVE_BACKGROUND)
|
||||||
|
FadeCurve.GraphWidget = self.widgetFadeVolume
|
||||||
|
|
||||||
self.visible_playlist_tab: Callable[[], PlaylistTab] = \
|
self.visible_playlist_tab: Callable[[], PlaylistTab] = \
|
||||||
self.tabPlaylist.currentWidget
|
self.tabPlaylist.currentWidget
|
||||||
@ -315,6 +370,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
else:
|
else:
|
||||||
self.carts_init()
|
self.carts_init()
|
||||||
self.enable_play_next_controls()
|
self.enable_play_next_controls()
|
||||||
|
self.clock_counter = 0
|
||||||
self.timer.start(Config.TIMER_MS)
|
self.timer.start(Config.TIMER_MS)
|
||||||
self.connect_signals_slots()
|
self.connect_signals_slots()
|
||||||
|
|
||||||
@ -766,6 +822,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
- Tell playlist_tab track has finished
|
- Tell playlist_tab track has finished
|
||||||
- Reset PlaylistTrack objects
|
- Reset PlaylistTrack objects
|
||||||
- Reset clocks
|
- Reset clocks
|
||||||
|
- Reset fade graph
|
||||||
- Update headers
|
- Update headers
|
||||||
- Enable controls
|
- Enable controls
|
||||||
"""
|
"""
|
||||||
@ -778,6 +835,9 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
if self.current_track.playlist_tab:
|
if self.current_track.playlist_tab:
|
||||||
self.current_track.playlist_tab.play_ended()
|
self.current_track.playlist_tab.play_ended()
|
||||||
|
|
||||||
|
# Reset fade graph
|
||||||
|
self.current_track.fade_graph.clear()
|
||||||
|
|
||||||
# Reset PlaylistTrack objects
|
# Reset PlaylistTrack objects
|
||||||
if self.current_track.track_id:
|
if self.current_track.track_id:
|
||||||
self.previous_track = self.current_track
|
self.previous_track = self.current_track
|
||||||
@ -1250,9 +1310,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|
||||||
# Show closing volume graph
|
# Show closing volume graph
|
||||||
sc = MplCanvas(self, width=2, height=2, dpi=100)
|
self.current_track.fade_graph.plot()
|
||||||
# sc.axes.plot([0, 1, 2, 3, 4], [10, 1, 20, 3, 40])
|
|
||||||
self.horizontalLayout_graph.addWidget(sc)
|
|
||||||
|
|
||||||
# Tell database to record it as played
|
# Tell database to record it as played
|
||||||
Playdates(session, self.current_track.track_id)
|
Playdates(session, self.current_track.track_id)
|
||||||
@ -1538,7 +1596,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
def set_next_plr_id(self, next_plr_id: Optional[int],
|
def set_next_plr_id(self, next_plr_id: Optional[int],
|
||||||
playlist_tab: PlaylistTab) -> None:
|
playlist_tab: PlaylistTab) -> None:
|
||||||
"""
|
"""
|
||||||
Set passed plr_id as next track to play, or clear next track if None
|
Set passed plr_id as next track to play, or clear next track if None
|
||||||
|
|
||||||
Actions required:
|
Actions required:
|
||||||
- Update self.next_track PlaylistTrack structure
|
- Update self.next_track PlaylistTrack structure
|
||||||
@ -1615,6 +1673,11 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
"""
|
"""
|
||||||
Carry out clock tick actions.
|
Carry out clock tick actions.
|
||||||
|
|
||||||
|
self.clock_counter is incrememted at each tick (100ms), and this
|
||||||
|
value is used to determine the actions to take.
|
||||||
|
|
||||||
|
The Fade Volume graph is updated every 100ms.
|
||||||
|
|
||||||
The Time of Day clock and any cart progress bars are updated
|
The Time of Day clock and any cart progress bars are updated
|
||||||
every tick (500ms).
|
every tick (500ms).
|
||||||
|
|
||||||
@ -1624,6 +1687,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
updating. That looks odd.
|
updating. That looks odd.
|
||||||
|
|
||||||
Actions required:
|
Actions required:
|
||||||
|
- Update Fade Volume graph
|
||||||
- Update TOD clock
|
- Update TOD clock
|
||||||
- Call cart_tick
|
- Call cart_tick
|
||||||
- If track is playing:
|
- If track is playing:
|
||||||
@ -1632,74 +1696,78 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
run stop_track
|
run stop_track
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Update TOD clock
|
# Update volume fade curve
|
||||||
self.lblTOD.setText(datetime.now().strftime(Config.TOD_TIME_FORMAT))
|
if self.current_track.track_id and self.current_track.fade_graph:
|
||||||
# Update carts
|
self.current_track.fade_graph.tick(self.music.get_playtime())
|
||||||
self.cart_tick()
|
|
||||||
|
|
||||||
self.even_tick = not self.even_tick
|
if self.clock_counter % 2 == 0:
|
||||||
if not self.even_tick:
|
# Update TOD clock
|
||||||
return
|
self.lblTOD.setText(datetime.now().strftime(
|
||||||
if not self.playing:
|
Config.TOD_TIME_FORMAT))
|
||||||
return
|
# Update carts
|
||||||
|
self.cart_tick()
|
||||||
|
|
||||||
# If track is playing, update track clocks time and colours
|
if self.clock_counter % 5 == 0:
|
||||||
# There is a discrete time between starting playing a track and
|
if not self.playing:
|
||||||
# player.is_playing() returning True, so assume playing if less
|
return
|
||||||
# than Config.PLAY_SETTLE microseconds have passed since
|
|
||||||
# starting play.
|
|
||||||
if self.music.player and self.current_track.start_time and (
|
|
||||||
self.music.player.is_playing() or
|
|
||||||
(datetime.now() - self.current_track.start_time)
|
|
||||||
< timedelta(microseconds=Config.PLAY_SETTLE)):
|
|
||||||
playtime = self.music.get_playtime()
|
|
||||||
time_to_fade = (self.current_track.fade_at - playtime)
|
|
||||||
time_to_silence = (
|
|
||||||
self.current_track.silence_at - playtime)
|
|
||||||
time_to_end = (self.current_track.duration - playtime)
|
|
||||||
|
|
||||||
# Elapsed time
|
# If track is playing, update track clocks time and colours
|
||||||
self.label_elapsed_timer.setText(helpers.ms_to_mmss(playtime))
|
# There is a discrete time between starting playing a track and
|
||||||
|
# player.is_playing() returning True, so assume playing if less
|
||||||
|
# than Config.PLAY_SETTLE microseconds have passed since
|
||||||
|
# starting play.
|
||||||
|
if self.music.player and self.current_track.start_time and (
|
||||||
|
self.music.player.is_playing() or
|
||||||
|
(datetime.now() - self.current_track.start_time)
|
||||||
|
< timedelta(microseconds=Config.PLAY_SETTLE)):
|
||||||
|
playtime = self.music.get_playtime()
|
||||||
|
time_to_fade = (self.current_track.fade_at - playtime)
|
||||||
|
time_to_silence = (
|
||||||
|
self.current_track.silence_at - playtime)
|
||||||
|
time_to_end = (self.current_track.duration - playtime)
|
||||||
|
|
||||||
# Time to fade
|
# Elapsed time
|
||||||
self.label_fade_timer.setText(helpers.ms_to_mmss(time_to_fade))
|
self.label_elapsed_timer.setText(helpers.ms_to_mmss(playtime))
|
||||||
|
|
||||||
# If silent in the next 5 seconds, put warning colour on
|
# Time to fade
|
||||||
# time to silence box and enable play controls
|
self.label_fade_timer.setText(helpers.ms_to_mmss(time_to_fade))
|
||||||
if time_to_silence <= 5500:
|
|
||||||
self.frame_silent.setStyleSheet(
|
# If silent in the next 5 seconds, put warning colour on
|
||||||
f"background: {Config.COLOUR_ENDING_TIMER}"
|
# time to silence box and enable play controls
|
||||||
|
if time_to_silence <= 5500:
|
||||||
|
self.frame_silent.setStyleSheet(
|
||||||
|
f"background: {Config.COLOUR_ENDING_TIMER}"
|
||||||
|
)
|
||||||
|
self.enable_play_next_controls()
|
||||||
|
# Set warning colour on time to silence box when fade starts
|
||||||
|
elif time_to_fade <= 500:
|
||||||
|
self.frame_silent.setStyleSheet(
|
||||||
|
f"background: {Config.COLOUR_WARNING_TIMER}"
|
||||||
|
)
|
||||||
|
# Five seconds before fade starts, set warning colour on
|
||||||
|
# time to silence box and enable play controls
|
||||||
|
elif time_to_fade <= 5500:
|
||||||
|
self.frame_fade.setStyleSheet(
|
||||||
|
f"background: {Config.COLOUR_WARNING_TIMER}"
|
||||||
|
)
|
||||||
|
self.enable_play_next_controls()
|
||||||
|
else:
|
||||||
|
self.frame_silent.setStyleSheet("")
|
||||||
|
self.frame_fade.setStyleSheet("")
|
||||||
|
|
||||||
|
self.label_silent_timer.setText(
|
||||||
|
helpers.ms_to_mmss(time_to_silence)
|
||||||
)
|
)
|
||||||
self.enable_play_next_controls()
|
|
||||||
# Set warning colour on time to silence box when fade starts
|
# Time to end
|
||||||
elif time_to_fade <= 500:
|
self.label_end_timer.setText(helpers.ms_to_mmss(time_to_end))
|
||||||
self.frame_silent.setStyleSheet(
|
|
||||||
f"background: {Config.COLOUR_WARNING_TIMER}"
|
# Autoplay next track
|
||||||
)
|
# if time_to_silence <= 1500:
|
||||||
# Five seconds before fade starts, set warning colour on
|
# self.play_next()
|
||||||
# time to silence box and enable play controls
|
|
||||||
elif time_to_fade <= 5500:
|
|
||||||
self.frame_fade.setStyleSheet(
|
|
||||||
f"background: {Config.COLOUR_WARNING_TIMER}"
|
|
||||||
)
|
|
||||||
self.enable_play_next_controls()
|
|
||||||
else:
|
else:
|
||||||
self.frame_silent.setStyleSheet("")
|
if self.playing:
|
||||||
self.frame_fade.setStyleSheet("")
|
self.stop_playing()
|
||||||
|
|
||||||
self.label_silent_timer.setText(
|
|
||||||
helpers.ms_to_mmss(time_to_silence)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Time to end
|
|
||||||
self.label_end_timer.setText(helpers.ms_to_mmss(time_to_end))
|
|
||||||
|
|
||||||
# Autoplay next track
|
|
||||||
# if time_to_silence <= 1500:
|
|
||||||
# self.play_next()
|
|
||||||
else:
|
|
||||||
if self.playing:
|
|
||||||
self.stop_playing()
|
|
||||||
|
|
||||||
def update_headers(self) -> None:
|
def update_headers(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
36650
app/ui/icons_rc.py
36650
app/ui/icons_rc.py
File diff suppressed because it is too large
Load Diff
@ -349,6 +349,12 @@ padding-left: 8px;</string>
|
|||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QFrame" name="InfoFooterFrame">
|
<widget class="QFrame" name="InfoFooterFrame">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">background-color: rgb(192, 191, 188)</string>
|
<string notr="true">background-color: rgb(192, 191, 188)</string>
|
||||||
</property>
|
</property>
|
||||||
@ -440,18 +446,11 @@ padding-left: 8px;</string>
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_graph">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetDefaultConstraint</enum>
|
|
||||||
</property>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame_elapsed">
|
<widget class="QFrame" name="frame_elapsed">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>152</width>
|
||||||
<height>112</height>
|
<height>112</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -503,7 +502,7 @@ padding-left: 8px;</string>
|
|||||||
<widget class="QFrame" name="frame_fade">
|
<widget class="QFrame" name="frame_fade">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>152</width>
|
||||||
<height>112</height>
|
<height>112</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -549,10 +548,26 @@ padding-left: 8px;</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame_silent">
|
<widget class="PlotWidget" name="widgetFadeVolume" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QFrame" name="frame_silent">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>152</width>
|
||||||
<height>112</height>
|
<height>112</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -601,7 +616,7 @@ padding-left: 8px;</string>
|
|||||||
<widget class="QFrame" name="frame_end">
|
<widget class="QFrame" name="frame_end">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>152</width>
|
||||||
<height>112</height>
|
<height>112</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -1155,6 +1170,12 @@ padding-left: 8px;</string>
|
|||||||
<header>infotabs</header>
|
<header>infotabs</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>PlotWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>pyqtgraph</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="icons.qrc"/>
|
<include location="icons.qrc"/>
|
||||||
|
|||||||
@ -179,6 +179,7 @@ class Ui_MainWindow(object):
|
|||||||
self.tabInfolist.setObjectName("tabInfolist")
|
self.tabInfolist.setObjectName("tabInfolist")
|
||||||
self.gridLayout_4.addWidget(self.splitter, 4, 0, 1, 1)
|
self.gridLayout_4.addWidget(self.splitter, 4, 0, 1, 1)
|
||||||
self.InfoFooterFrame = QtWidgets.QFrame(parent=self.centralwidget)
|
self.InfoFooterFrame = QtWidgets.QFrame(parent=self.centralwidget)
|
||||||
|
self.InfoFooterFrame.setMaximumSize(QtCore.QSize(16777215, 16777215))
|
||||||
self.InfoFooterFrame.setStyleSheet("background-color: rgb(192, 191, 188)")
|
self.InfoFooterFrame.setStyleSheet("background-color: rgb(192, 191, 188)")
|
||||||
self.InfoFooterFrame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
self.InfoFooterFrame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||||
self.InfoFooterFrame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
self.InfoFooterFrame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||||
@ -214,11 +215,8 @@ class Ui_MainWindow(object):
|
|||||||
self.btnPreview.setObjectName("btnPreview")
|
self.btnPreview.setObjectName("btnPreview")
|
||||||
self.gridLayout.addWidget(self.btnPreview, 1, 0, 1, 2)
|
self.gridLayout.addWidget(self.btnPreview, 1, 0, 1, 2)
|
||||||
self.horizontalLayout.addWidget(self.FadeStopInfoFrame)
|
self.horizontalLayout.addWidget(self.FadeStopInfoFrame)
|
||||||
self.horizontalLayout_graph = QtWidgets.QHBoxLayout()
|
|
||||||
self.horizontalLayout_graph.setObjectName("horizontalLayout_graph")
|
|
||||||
self.horizontalLayout.addLayout(self.horizontalLayout_graph)
|
|
||||||
self.frame_elapsed = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
self.frame_elapsed = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
||||||
self.frame_elapsed.setMinimumSize(QtCore.QSize(0, 112))
|
self.frame_elapsed.setMinimumSize(QtCore.QSize(152, 112))
|
||||||
self.frame_elapsed.setStyleSheet("")
|
self.frame_elapsed.setStyleSheet("")
|
||||||
self.frame_elapsed.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
self.frame_elapsed.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||||
self.frame_elapsed.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
self.frame_elapsed.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||||
@ -242,7 +240,7 @@ class Ui_MainWindow(object):
|
|||||||
self.verticalLayout_4.addWidget(self.label_elapsed_timer)
|
self.verticalLayout_4.addWidget(self.label_elapsed_timer)
|
||||||
self.horizontalLayout.addWidget(self.frame_elapsed)
|
self.horizontalLayout.addWidget(self.frame_elapsed)
|
||||||
self.frame_fade = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
self.frame_fade = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
||||||
self.frame_fade.setMinimumSize(QtCore.QSize(0, 112))
|
self.frame_fade.setMinimumSize(QtCore.QSize(152, 112))
|
||||||
self.frame_fade.setStyleSheet("")
|
self.frame_fade.setStyleSheet("")
|
||||||
self.frame_fade.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
self.frame_fade.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||||
self.frame_fade.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
self.frame_fade.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||||
@ -264,8 +262,17 @@ class Ui_MainWindow(object):
|
|||||||
self.label_fade_timer.setObjectName("label_fade_timer")
|
self.label_fade_timer.setObjectName("label_fade_timer")
|
||||||
self.verticalLayout_2.addWidget(self.label_fade_timer)
|
self.verticalLayout_2.addWidget(self.label_fade_timer)
|
||||||
self.horizontalLayout.addWidget(self.frame_fade)
|
self.horizontalLayout.addWidget(self.frame_fade)
|
||||||
|
self.widgetFadeVolume = PlotWidget(parent=self.InfoFooterFrame)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(1)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.widgetFadeVolume.sizePolicy().hasHeightForWidth())
|
||||||
|
self.widgetFadeVolume.setSizePolicy(sizePolicy)
|
||||||
|
self.widgetFadeVolume.setMinimumSize(QtCore.QSize(0, 0))
|
||||||
|
self.widgetFadeVolume.setObjectName("widgetFadeVolume")
|
||||||
|
self.horizontalLayout.addWidget(self.widgetFadeVolume)
|
||||||
self.frame_silent = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
self.frame_silent = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
||||||
self.frame_silent.setMinimumSize(QtCore.QSize(0, 112))
|
self.frame_silent.setMinimumSize(QtCore.QSize(152, 112))
|
||||||
self.frame_silent.setStyleSheet("")
|
self.frame_silent.setStyleSheet("")
|
||||||
self.frame_silent.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
self.frame_silent.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||||
self.frame_silent.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
self.frame_silent.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||||
@ -288,7 +295,7 @@ class Ui_MainWindow(object):
|
|||||||
self.verticalLayout_5.addWidget(self.label_silent_timer)
|
self.verticalLayout_5.addWidget(self.label_silent_timer)
|
||||||
self.horizontalLayout.addWidget(self.frame_silent)
|
self.horizontalLayout.addWidget(self.frame_silent)
|
||||||
self.frame_end = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
self.frame_end = QtWidgets.QFrame(parent=self.InfoFooterFrame)
|
||||||
self.frame_end.setMinimumSize(QtCore.QSize(0, 112))
|
self.frame_end.setMinimumSize(QtCore.QSize(152, 112))
|
||||||
self.frame_end.setStyleSheet("")
|
self.frame_end.setStyleSheet("")
|
||||||
self.frame_end.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
self.frame_end.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||||
self.frame_end.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
self.frame_end.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||||
@ -615,3 +622,4 @@ class Ui_MainWindow(object):
|
|||||||
self.actionSearch_title_in_Songfacts.setText(_translate("MainWindow", "Search title in Songfacts"))
|
self.actionSearch_title_in_Songfacts.setText(_translate("MainWindow", "Search title in Songfacts"))
|
||||||
self.actionSearch_title_in_Songfacts.setShortcut(_translate("MainWindow", "Ctrl+S"))
|
self.actionSearch_title_in_Songfacts.setShortcut(_translate("MainWindow", "Ctrl+S"))
|
||||||
from infotabs import InfoTabs
|
from infotabs import InfoTabs
|
||||||
|
from pyqtgraph import PlotWidget
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user