diff --git a/lib/components/playbutton_card.dart b/lib/components/playbutton_card.dart index 0b942564..f781066e 100644 --- a/lib/components/playbutton_card.dart +++ b/lib/components/playbutton_card.dart @@ -33,7 +33,7 @@ class PlaybuttonCard extends HookWidget { @override Widget build(BuildContext context) { - final unescapeHtml = description?.unescapeHtml().cleanHtml(); + final unescapeHtml = description?.unescapeHtml().cleanHtml() ?? ""; return Container( width: 150, @@ -42,6 +42,7 @@ class PlaybuttonCard extends HookWidget { children: [ UniversalImage( path: imageUrl, + height: 150, fit: BoxFit.cover, ), StatedWidget.builder( @@ -95,13 +96,11 @@ class PlaybuttonCard extends HookWidget { overflow: TextOverflow.ellipsis, ), ), - subtitle: unescapeHtml == null - ? null - : Text( - unescapeHtml, - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), + subtitle: Text( + unescapeHtml.isEmpty ? "\n" : unescapeHtml, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), onPressed: onTap, ), ); diff --git a/lib/components/titlebar/titlebar.dart b/lib/components/titlebar/titlebar.dart index 76a5ec8a..a3d0978c 100644 --- a/lib/components/titlebar/titlebar.dart +++ b/lib/components/titlebar/titlebar.dart @@ -1,5 +1,6 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide AppBar; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' show AppBar; import 'package:spotube/components/titlebar/titlebar_buttons.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; @@ -148,29 +149,26 @@ class _PageWindowTitleBarState extends ConsumerState { left: kIsMacOS && hasFullscreen && hasLeadingOrCanPop ? 65 : 0, ), child: AppBar( - leading: widget.leading, - automaticallyImplyLeading: widget.automaticallyImplyLeading, - actions: [ + leading: [ + if (widget.leading != null) widget.leading!, + if (widget.leading == null && + widget.automaticallyImplyLeading && + Navigator.canPop(context)) + const BackButton(), + ], + trailing: [ ...?widget.actions, WindowTitleBarButtons(foregroundColor: widget.foregroundColor), ], backgroundColor: widget.backgroundColor, - foregroundColor: widget.foregroundColor, - actionsIconTheme: widget.actionsIconTheme, - centerTitle: widget.centerTitle, - titleSpacing: widget.titleSpacing, - toolbarOpacity: widget.toolbarOpacity, - leadingWidth: widget.leadingWidth, - toolbarTextStyle: widget.toolbarTextStyle, - titleTextStyle: widget.titleTextStyle, title: SizedBox( width: double.infinity, // workaround to force dragging child: widget.title ?? const Text(""), ), - scrolledUnderElevation: 0, - shadowColor: Colors.transparent, - forceMaterialTransparency: true, - elevation: 0, + alignment: widget.centerTitle == true + ? Alignment.center + : Alignment.centerLeft, + leadingGap: widget.leadingWidth, ), ), ); diff --git a/lib/pages/library/library.dart b/lib/pages/library/library.dart index a0bc1bb7..02152f3d 100644 --- a/lib/pages/library/library.dart +++ b/lib/pages/library/library.dart @@ -1,5 +1,7 @@ -import 'package:flutter/material.dart' hide Image; +import 'package:flutter/material.dart' show Badge; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/modules/library/user_local_tracks.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; @@ -7,7 +9,6 @@ import 'package:spotube/modules/library/user_albums.dart'; import 'package:spotube/modules/library/user_artists.dart'; import 'package:spotube/modules/library/user_downloads.dart'; import 'package:spotube/modules/library/user_playlists.dart'; -import 'package:spotube/components/themed_button_tab_bar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/download_manager_provider.dart'; @@ -18,40 +19,53 @@ class LibraryPage extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final downloadingCount = ref.watch(downloadManagerProvider).$downloadCount; + final index = useState(0); - return DefaultTabController( - length: 5, - child: SafeArea( - bottom: false, - child: Scaffold( - appBar: PageWindowTitleBar( - centerTitle: true, - leading: ThemedButtonsTabBar( - tabs: [ - Tab(text: " ${context.l10n.playlists} "), - Tab(text: " ${context.l10n.local_tab} "), - Tab( - child: Badge( - isLabelVisible: downloadingCount > 0, - label: Text(downloadingCount.toString()), - child: Text(" ${context.l10n.downloads} "), + final children = [ + Text(context.l10n.playlists), + Text(context.l10n.local_tab), + Badge( + isLabelVisible: downloadingCount > 0, + label: Text(downloadingCount.toString()), + child: Text(context.l10n.downloads), + ), + Text(context.l10n.artists), + Text(context.l10n.albums), + ]; + + return SafeArea( + bottom: false, + child: Scaffold( + headers: [ + PageWindowTitleBar( + leading: TabList( + index: index.value, + children: [ + for (final child in children) + TabButton( + child: child, + onPressed: () { + index.value = children.indexOf(child); + }, ), - ), - Tab(text: " ${context.l10n.artists} "), - Tab(text: " ${context.l10n.albums} "), ], ), - leadingWidth: double.infinity, - ), - body: const TabBarView( - children: [ - UserPlaylists(), - UserLocalTracks(), - UserDownloads(), - UserArtists(), - UserAlbums(), - ], - ), + ) + ], + child: IndexedStack( + index: index.value, + children: const [ + UserPlaylists(), + UserLocalTracks(), + UserDownloads(), + UserArtists(), + UserAlbums(), + // Text("UserPlaylists()"), + // Text("UserLocalTracks()"), + // Text("UserDownloads()"), + // Text("UserArtists()"), + // Text("UserAlbums()"), + ], ), ), );