This commit is contained in:
Broque Thomas 2025-07-29 17:54:17 -07:00
parent 3bde9b3e37
commit 2b82190155
2 changed files with 143 additions and 138 deletions

View file

@ -614,23 +614,24 @@ class MediaPlayer(QWidget):
self.setup_ui() self.setup_ui()
def setup_ui(self): def setup_ui(self):
self.setFixedHeight(70) # Slightly taller for better proportions self.setFixedHeight(85) # More space for better proportions
self.setStyleSheet(""" self.setStyleSheet("""
MediaPlayer { MediaPlayer {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgba(255, 255, 255, 0.05), stop: 0 rgba(26, 26, 26, 0.95),
stop: 0.3 rgba(255, 255, 255, 0.02), stop: 0.5 rgba(18, 18, 18, 0.98),
stop: 1 transparent); stop: 1 rgba(12, 12, 12, 1.0));
border: 1px solid rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px; border-radius: 12px;
margin: 0 8px; margin: 8px 10px;
} }
MediaPlayer:hover { MediaPlayer:hover {
border: 1px solid rgba(29, 185, 84, 0.15); border: 1px solid rgba(29, 185, 84, 0.2);
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgba(29, 185, 84, 0.06), stop: 0 rgba(29, 185, 84, 0.08),
stop: 0.3 rgba(255, 255, 255, 0.03), stop: 0.5 rgba(26, 26, 26, 0.95),
stop: 1 transparent); stop: 1 rgba(18, 18, 18, 1.0));
transform: translateY(-1px);
} }
""") """)
@ -652,213 +653,213 @@ class MediaPlayer(QWidget):
layout.addWidget(self.expanded_content) layout.addWidget(self.expanded_content)
# No track message (shown when no music) # No track message (shown when no music)
self.no_track_label = QLabel("No track playing") self.no_track_label = QLabel("Start playing music to see controls")
self.no_track_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.no_track_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.no_track_label.setStyleSheet(""" self.no_track_label.setStyleSheet("""
QLabel { QLabel {
color: rgba(255, 255, 255, 0.4); color: #6a6a6a;
font-size: 11px; font-size: 12px;
font-weight: 500; font-weight: 400;
padding: 14px; padding: 20px 16px;
background: transparent; background: transparent;
letter-spacing: 0.3px; letter-spacing: 0.2px;
font-family: 'SF Pro Text', -apple-system, sans-serif; font-family: 'Spotify Circular', -apple-system, sans-serif;
line-height: 1.4;
} }
""") """)
layout.addWidget(self.no_track_label) layout.addWidget(self.no_track_label)
def create_header(self): def create_header(self):
header = QWidget() header = QWidget()
layout = QHBoxLayout(header) main_layout = QVBoxLayout(header)
layout.setContentsMargins(0, 0, 0, 0) main_layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(12) main_layout.setSpacing(8)
# Top row: Track info and play button
top_row = QHBoxLayout()
top_row.setContentsMargins(0, 0, 0, 0)
top_row.setSpacing(14)
# Track info (expandable on click) - now with scrolling for long titles # Track info (expandable on click) - now with scrolling for long titles
self.track_info = ScrollingLabel("No track") self.track_info = ScrollingLabel("No track")
self.track_info.setStyleSheet(""" self.track_info.setStyleSheet("""
ScrollingLabel { ScrollingLabel {
color: rgba(255, 255, 255, 0.95); color: #ffffff;
font-size: 13px; font-size: 14px;
font-weight: 600; font-weight: 700;
background: transparent; background: transparent;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-family: 'Spotify Circular', 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: 0.1px; letter-spacing: -0.3px;
padding: 3px 0px; padding: 2px 0px;
line-height: 1.2;
} }
ScrollingLabel:hover { ScrollingLabel:hover {
color: #1ed760; color: #1ed760;
font-weight: 700; text-decoration: underline;
} }
""") """)
self.track_info.setCursor(Qt.CursorShape.PointingHandCursor) self.track_info.setCursor(Qt.CursorShape.PointingHandCursor)
self.track_info.mousePressEvent = self.toggle_expansion self.track_info.mousePressEvent = self.toggle_expansion
# Play/pause button # Play/pause button - more Spotify-like
self.play_pause_btn = QPushButton("") self.play_pause_btn = QPushButton("")
self.play_pause_btn.setFixedSize(36, 36) self.play_pause_btn.setFixedSize(40, 40)
self.play_pause_btn.setStyleSheet(""" self.play_pause_btn.setStyleSheet("""
QPushButton { QPushButton {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #1ed760;
stop: 0 #1ed760,
stop: 1 #1db954);
border: none; border: none;
border-radius: 18px; border-radius: 20px;
color: #000000; color: #000000;
font-size: 14px; font-size: 16px;
font-weight: 900; font-weight: 900;
font-family: Arial, sans-serif; font-family: 'Arial', sans-serif;
} }
QPushButton:hover { QPushButton:hover {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #1fdf64;
stop: 0 #1fdf64, transform: scale(1.04);
stop: 1 #1ed760);
transform: scale(1.06);
} }
QPushButton:pressed { QPushButton:pressed {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #1ca851;
stop: 0 #1ca851, transform: scale(0.96);
stop: 1 #169c46);
transform: scale(0.98);
} }
QPushButton:disabled { QPushButton:disabled {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #535353;
stop: 0 #404040, color: #b3b3b3;
stop: 1 #2a2a2a);
color: #666666;
} }
""") """)
self.play_pause_btn.clicked.connect(self.on_play_pause_clicked) self.play_pause_btn.clicked.connect(self.on_play_pause_clicked)
self.play_pause_btn.setEnabled(False) self.play_pause_btn.setEnabled(False)
layout.addWidget(self.track_info) top_row.addWidget(self.track_info)
layout.addStretch() top_row.addStretch()
layout.addWidget(self.play_pause_btn) top_row.addWidget(self.play_pause_btn)
# Bottom row: Artist info (always visible in collapsed mode)
self.artist_info = QLabel("Unknown Artist")
self.artist_info.setStyleSheet("""
QLabel {
color: #b3b3b3;
font-size: 11px;
font-weight: 400;
background: transparent;
font-family: 'Spotify Circular', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: 0.1px;
margin-top: 1px;
}
""")
main_layout.addLayout(top_row)
main_layout.addWidget(self.artist_info)
return header return header
def create_expanded_content(self): def create_expanded_content(self):
content = QWidget() content = QWidget()
layout = QVBoxLayout(content) layout = QVBoxLayout(content)
layout.setContentsMargins(0, 5, 0, 0) layout.setContentsMargins(0, 2, 0, 0)
layout.setSpacing(8) layout.setSpacing(4)
# Artist and album info # Album info
self.artist_album_label = QLabel("Unknown Artist • Unknown Album") self.album_label = QLabel("Unknown Album")
self.artist_album_label.setStyleSheet(""" self.album_label.setStyleSheet("""
QLabel { QLabel {
color: #a7a7a7; color: #a7a7a7;
font-size: 11px; font-size: 11px;
font-weight: 400; font-weight: 400;
background: transparent; background: transparent;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-family: 'Spotify Circular', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: 0.3px; letter-spacing: 0.1px;
margin-top: 2px;
} }
""") """)
layout.addWidget(self.artist_album_label) layout.addWidget(self.album_label)
# Control buttons # Control buttons - more Spotify-like
controls_layout = QHBoxLayout() controls_layout = QHBoxLayout()
controls_layout.setContentsMargins(0, 0, 0, 0) controls_layout.setContentsMargins(0, 1, 0, 0)
controls_layout.setSpacing(10) controls_layout.setSpacing(6)
# Stop button # Volume control (Spotify style - more prominent)
self.stop_btn = QPushButton("")
self.stop_btn.setFixedSize(28, 28)
self.stop_btn.setStyleSheet("""
QPushButton {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgba(226, 33, 52, 0.15),
stop: 1 rgba(180, 28, 42, 0.15));
border: 1px solid rgba(226, 33, 52, 0.3);
border-radius: 14px;
color: #e22134;
font-size: 11px;
font-weight: 700;
font-family: Arial, sans-serif;
}
QPushButton:hover {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgba(226, 33, 52, 0.25),
stop: 1 rgba(180, 28, 42, 0.25));
border: 1px solid rgba(226, 33, 52, 0.5);
transform: scale(1.05);
}
QPushButton:pressed {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgba(180, 28, 42, 0.3),
stop: 1 rgba(150, 23, 35, 0.3));
transform: scale(0.95);
}
QPushButton:disabled {
background: rgba(100, 100, 100, 0.1);
border: 1px solid rgba(100, 100, 100, 0.2);
color: #666666;
}
""")
self.stop_btn.clicked.connect(self.on_stop_clicked)
self.stop_btn.setEnabled(False)
# Volume control
volume_layout = QHBoxLayout() volume_layout = QHBoxLayout()
volume_layout.setSpacing(8) volume_layout.setSpacing(10)
volume_icon = QLabel("") volume_icon = QLabel("🔊")
volume_icon.setStyleSheet(""" volume_icon.setStyleSheet("""
QLabel { QLabel {
color: #a7a7a7; color: #b3b3b3;
font-size: 12px; font-size: 13px;
font-weight: 600; font-weight: 400;
font-family: Arial, sans-serif; padding: 0px;
padding: 0px 2px;
} }
""") """)
self.volume_slider = QSlider(Qt.Orientation.Horizontal) self.volume_slider = QSlider(Qt.Orientation.Horizontal)
self.volume_slider.setRange(0, 100) self.volume_slider.setRange(0, 100)
self.volume_slider.setValue(70) # Default 70% volume self.volume_slider.setValue(70) # Default 70% volume
self.volume_slider.setFixedWidth(65) self.volume_slider.setFixedWidth(80)
self.volume_slider.setFixedHeight(20)
self.volume_slider.setStyleSheet(""" self.volume_slider.setStyleSheet("""
QSlider::groove:horizontal { QSlider::groove:horizontal {
border: none; border: none;
height: 4px; height: 3px;
background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, background: #4f4f4f;
stop: 0 #383838, border-radius: 1px;
stop: 1 #2a2a2a);
border-radius: 2px;
} }
QSlider::handle:horizontal { QSlider::handle:horizontal {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #ffffff;
stop: 0 #ffffff, border: none;
stop: 1 #e0e0e0);
border: 1px solid rgba(255, 255, 255, 0.3);
width: 12px; width: 12px;
height: 12px; height: 12px;
border-radius: 6px; border-radius: 6px;
margin: -4px 0; margin: -4px 0;
} }
QSlider::handle:horizontal:hover { QSlider::handle:horizontal:hover {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: #1ed760;
stop: 0 #1ed760, transform: scale(1.2);
stop: 1 #1db954);
border: 1px solid rgba(30, 215, 96, 0.5);
transform: scale(1.1);
} }
QSlider::sub-page:horizontal { QSlider::sub-page:horizontal {
background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, background: #1ed760;
stop: 0 #1ed760, border-radius: 1px;
stop: 1 #1db954);
border-radius: 2px;
} }
""") """)
self.volume_slider.valueChanged.connect(self.on_volume_changed) self.volume_slider.valueChanged.connect(self.on_volume_changed)
# Stop button - more visible Spotify style
self.stop_btn = QPushButton("")
self.stop_btn.setFixedSize(32, 32)
self.stop_btn.setStyleSheet("""
QPushButton {
background: rgba(255, 255, 255, 0.08);
border: 1px solid #b3b3b3;
border-radius: 16px;
color: #ffffff;
font-size: 12px;
font-weight: 500;
}
QPushButton:hover {
background: rgba(255, 255, 255, 0.15);
border: 1px solid #ffffff;
color: #ffffff;
transform: scale(1.05);
}
QPushButton:pressed {
background: rgba(255, 255, 255, 0.25);
transform: scale(0.95);
}
QPushButton:disabled {
background: transparent;
border: 1px solid #2a2a2a;
color: #535353;
}
""")
self.stop_btn.clicked.connect(self.on_stop_clicked)
self.stop_btn.setEnabled(False)
volume_layout.addWidget(volume_icon) volume_layout.addWidget(volume_icon)
volume_layout.addWidget(self.volume_slider) volume_layout.addWidget(self.volume_slider)
controls_layout.addWidget(self.stop_btn)
controls_layout.addStretch()
controls_layout.addLayout(volume_layout) controls_layout.addLayout(volume_layout)
controls_layout.addStretch()
controls_layout.addWidget(self.stop_btn)
layout.addLayout(controls_layout) layout.addLayout(controls_layout)
@ -872,11 +873,11 @@ class MediaPlayer(QWidget):
self.is_expanded = not self.is_expanded self.is_expanded = not self.is_expanded
if self.is_expanded: if self.is_expanded:
self.setFixedHeight(125) # Slightly taller for better spacing self.setFixedHeight(145) # More space for the new layout
self.expanded_content.setVisible(True) self.expanded_content.setVisible(True)
self.no_track_label.setVisible(False) self.no_track_label.setVisible(False)
else: else:
self.setFixedHeight(65) # Match the updated collapsed height self.setFixedHeight(85) # Match the updated collapsed height
self.expanded_content.setVisible(False) self.expanded_content.setVisible(False)
def set_track_info(self, track_result): def set_track_info(self, track_result):
@ -892,10 +893,13 @@ class MediaPlayer(QWidget):
self.track_info.setText(track_name) self.track_info.setText(track_name)
# Update artist and album # Update artist and album info
artist = getattr(track_result, 'artist', 'Unknown Artist') artist = getattr(track_result, 'artist', 'Unknown Artist')
album = getattr(track_result, 'album', 'Unknown Album') album = getattr(track_result, 'album', 'Unknown Album')
self.artist_album_label.setText(f"{artist}{album}")
# Update the separate artist and album labels
self.artist_info.setText(artist)
self.album_label.setText(album)
# Enable controls # Enable controls
self.play_pause_btn.setEnabled(True) self.play_pause_btn.setEnabled(True)
@ -918,12 +922,12 @@ class MediaPlayer(QWidget):
"""Update play/pause button state""" """Update play/pause button state"""
self.is_playing = playing self.is_playing = playing
if playing: if playing:
self.play_pause_btn.setText("") self.play_pause_btn.setText("")
# Start scrolling animation when playing # Start scrolling animation when playing
if self.track_info.should_scroll and not self.track_info.is_scrolling: if self.track_info.should_scroll and not self.track_info.is_scrolling:
self.track_info.start_scroll_animation() self.track_info.start_scroll_animation()
else: else:
self.play_pause_btn.setText("") self.play_pause_btn.setText("")
# Optionally stop scrolling when paused (can be customized) # Optionally stop scrolling when paused (can be customized)
# self.track_info.stop_scrolling() # self.track_info.stop_scrolling()
@ -938,8 +942,9 @@ class MediaPlayer(QWidget):
# Update UI # Update UI
self.track_info.setText("No track") self.track_info.setText("No track")
self.artist_album_label.setText("Unknown Artist • Unknown Album") self.artist_info.setText("Unknown Artist")
self.play_pause_btn.setText("") self.album_label.setText("Unknown Album")
self.play_pause_btn.setText("")
self.play_pause_btn.setEnabled(False) self.play_pause_btn.setEnabled(False)
self.stop_btn.setEnabled(False) self.stop_btn.setEnabled(False)