Skip to content

Commit

Permalink
fix: Context menu not updated while switching playback mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Losses committed Nov 26, 2024
1 parent dff7b2c commit 3dca3b9
Show file tree
Hide file tree
Showing 11 changed files with 126 additions and 123 deletions.
26 changes: 19 additions & 7 deletions lib/providers/status.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ import '../utils/theme_color_manager.dart';
const lastQueueIndexKey = 'last_queue_index';

class PlaybackStatusProvider with ChangeNotifier {
PlaybackStatus? _playbackStatus;
final PlaybackStatus _playbackStatus =
PlaybackStatus(state: "Stopped", ready: false);

PlaybackStatus? get playbackStatus => _playbackStatus;
PlaybackStatus get playbackStatus => _playbackStatus;

late StreamSubscription<RustSignal<PlaybackStatus>> subscription;

Expand Down Expand Up @@ -44,10 +45,21 @@ class PlaybackStatusProvider with ChangeNotifier {

void _updatePlaybackStatus(RustSignal<PlaybackStatus> signal) {
final newStatus = signal.message;
if (_playbackStatus == null ||
!_isPlaybackStatusEqual(_playbackStatus!, newStatus)) {
final bool isNewTrack = _playbackStatus?.id != newStatus.id;
_playbackStatus = newStatus;
if (!_isPlaybackStatusEqual(_playbackStatus, newStatus)) {
final bool isNewTrack = _playbackStatus.id != newStatus.id;

_playbackStatus.state = newStatus.state;
_playbackStatus.progressSeconds = newStatus.progressSeconds;
_playbackStatus.progressPercentage = newStatus.progressPercentage;
_playbackStatus.artist = newStatus.artist;
_playbackStatus.album = newStatus.album;
_playbackStatus.title = newStatus.title;
_playbackStatus.duration = newStatus.duration;
_playbackStatus.index = newStatus.index;
_playbackStatus.id = newStatus.id;
_playbackStatus.playbackMode = newStatus.playbackMode;
_playbackStatus.ready = newStatus.ready;
_playbackStatus.coverArtPath = newStatus.coverArtPath;

if (isNewTrack && newStatus.state != "Stopped") {
ThemeColorManager().handleCoverArtColorChange(newStatus.id);
Expand Down Expand Up @@ -75,6 +87,6 @@ class PlaybackStatusProvider with ChangeNotifier {
}

bool get notReady {
return playbackStatus?.ready == null || playbackStatus!.ready == false;
return playbackStatus.ready == false;
}
}
12 changes: 5 additions & 7 deletions lib/screens/cover_wall/widgets/cover_art_page_progress_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ class CoverArtPageProgressBar extends StatefulWidget {
});

@override
CoverArtPageProgressBarState createState() =>
CoverArtPageProgressBarState();
CoverArtPageProgressBarState createState() => CoverArtPageProgressBarState();
}

class CoverArtPageProgressBarState extends State<CoverArtPageProgressBar> {
Expand Down Expand Up @@ -49,9 +48,8 @@ class CoverArtPageProgressBarState extends State<CoverArtPageProgressBar> {
children: [
Expanded(
child: Slider(
value: status != null ? status.progressPercentage * 100 : 0,
onChanged:
status != null && !notReady ? (v) => _onSeek(v, status) : null,
value: status.progressPercentage * 100,
onChanged: !notReady ? (v) => _onSeek(v, status) : null,
style: const SliderThemeData(useThumbBall: false),
),
),
Expand All @@ -63,12 +61,12 @@ class CoverArtPageProgressBarState extends State<CoverArtPageProgressBar> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
formatTime(status?.progressSeconds ?? 0),
formatTime(status.progressSeconds),
style: typography.caption
?.apply(shadows: widget.shadows, fontSizeFactor: 0.9),
),
Text(
'-${formatTime((status?.duration ?? 0) - (status?.progressSeconds ?? 0))}',
'-${formatTime((status.duration) - (status.progressSeconds))}',
style: typography.caption
?.apply(shadows: widget.shadows, fontSizeFactor: 0.9),
),
Expand Down
21 changes: 10 additions & 11 deletions lib/screens/cover_wall/widgets/large_screen_playing_track.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,15 @@ class LargeScreenPlayingTrack extends StatelessWidget {

final Typography typography = theme.typography;

return Selector<PlaybackStatusProvider,
(String?, String?, String?, String?)>(
return Selector<PlaybackStatusProvider, (String, String, String, String)>(
selector: (context, playbackStatusProvider) => (
playbackStatusProvider.playbackStatus?.coverArtPath,
playbackStatusProvider.playbackStatus?.artist,
playbackStatusProvider.playbackStatus?.album,
playbackStatusProvider.playbackStatus?.title,
playbackStatusProvider.playbackStatus.coverArtPath,
playbackStatusProvider.playbackStatus.artist,
playbackStatusProvider.playbackStatus.album,
playbackStatusProvider.playbackStatus.title,
),
builder: (context, p, child) {
if (p.$1 == null) return Container();
if (p.$1 == "") return Container();
return Container(
padding: const EdgeInsets.fromLTRB(
48, 48, 48, playbackControllerHeight + 48),
Expand All @@ -46,7 +45,7 @@ class LargeScreenPlayingTrack extends StatelessWidget {
boxShadow: axShadow(9),
),
child: CoverArt(
key: p.$1 != null ? Key(p.$1.toString()) : null,
key: p.$1.isNotEmpty ? Key(p.$1.toString()) : null,
path: p.$1,
size: 120,
),
Expand All @@ -57,16 +56,16 @@ class LargeScreenPlayingTrack extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
p.$3 ?? S.of(context).unknownAlbum,
p.$3.isNotEmpty ? S.of(context).unknownAlbum : p.$3,
style: typography.bodyLarge?.apply(shadows: shadows),
),
Text(
p.$4 ?? S.of(context).unknownTrack,
p.$4.isNotEmpty ? S.of(context).unknownTrack : p.$4,
style: typography.subtitle?.apply(shadows: shadows),
),
const SizedBox(height: 12),
Text(
p.$2 ?? S.of(context).unknownArtist,
p.$2.isNotEmpty ? S.of(context).unknownArtist : p.$2,
style: typography.body?.apply(shadows: shadows),
),
const SizedBox(height: 28),
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/tray_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class TrayManager {
final s = S.of(context);
final status = Provider.of<PlaybackStatusProvider>(context, listen: false);
final bool playing =
!status.notReady && status.playbackStatus?.state == "Playing";
!status.notReady && status.playbackStatus.state == "Playing";

final locale = appTheme.locale;
final suppressRefresh = path == _cachedPath &&
Expand Down
20 changes: 10 additions & 10 deletions lib/widgets/playback_controller/constants/controller_items.dart
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ List<ControllerEntry> controllerItems = [
final statusProvider =
Provider.of<PlaybackStatusProvider>(context, listen: false);

if (statusProvider.playbackStatus?.state == "Playing") {
if (statusProvider.playbackStatus.state == "Playing") {
return Symbols.pause;
} else {
return Symbols.play_arrow;
Expand All @@ -130,7 +130,7 @@ List<ControllerEntry> controllerItems = [

if (notReady) return;

if (statusProvider.playbackStatus?.state == "Playing") {
if (statusProvider.playbackStatus.state == "Playing") {
playPause();
} else {
playPlay();
Expand All @@ -141,7 +141,7 @@ List<ControllerEntry> controllerItems = [
Provider.of<PlaybackStatusProvider>(context, listen: false);
final status = statusProvider.playbackStatus;

return status?.state == "Playing"
return status.state == "Playing"
? S.of(context).pause
: S.of(context).play;
},
Expand All @@ -153,7 +153,7 @@ List<ControllerEntry> controllerItems = [

return PlayPauseButton(
disabled: notReady,
state: status?.state ?? "Stopped",
state: status.state,
shadows: shadows,
);
},
Expand All @@ -164,11 +164,11 @@ List<ControllerEntry> controllerItems = [
final notReady = statusProvider.notReady;

return MenuFlyoutItem(
leading: status?.state == "Playing"
leading: status.state == "Playing"
? const Icon(Symbols.pause)
: const Icon(Symbols.play_arrow),
text: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
status?.state == "Playing"
status.state == "Playing"
? Text(S.of(context).pause)
: Text(S.of(context).play),
const ShortcutText('Ctrl+P'),
Expand All @@ -177,7 +177,7 @@ List<ControllerEntry> controllerItems = [
? null
: () {
Navigator.pop(context);
status?.state == "Playing" ? playPause() : playPlay();
status.state == "Playing" ? playPause() : playPlay();
},
);
},
Expand Down Expand Up @@ -298,7 +298,7 @@ List<ControllerEntry> controllerItems = [
Provider.of<PlaybackStatusProvider>(context, listen: false);

final PlaybackMode currentMode = PlaybackModeExtension.fromValue(
statusProvider.playbackStatus?.playbackMode ?? 0,
statusProvider.playbackStatus.playbackMode,
);

return modeToIcon(currentMode);
Expand All @@ -311,7 +311,7 @@ List<ControllerEntry> controllerItems = [
final status = statusProvider.playbackStatus;

final currentMode =
PlaybackModeExtension.fromValue(status?.playbackMode ?? 0);
PlaybackModeExtension.fromValue(status.playbackMode);

return modeToLabel(context, currentMode);
},
Expand All @@ -332,7 +332,7 @@ List<ControllerEntry> controllerItems = [
final status = statusProvider.playbackStatus;

final currentMode =
PlaybackModeExtension.fromValue(status?.playbackMode ?? 0);
PlaybackModeExtension.fromValue(status.playbackMode);

// Retrieve disabled modes
List<dynamic>? storedDisabledModes = await SettingsManager()
Expand Down
Loading

0 comments on commit 3dca3b9

Please sign in to comment.