From f80ea32de46c717020cba30acbab48ee4b9435e5 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 21 Dec 2024 17:02:13 +0600 Subject: [PATCH] refactor: use Appbar titlebar throughout the app --- lib/components/titlebar/titlebar.dart | 222 ++++++------------ lib/components/track_tile/track_options.dart | 2 + lib/components/tracks_view/track_view.dart | 14 +- lib/modules/player/player.dart | 16 +- lib/pages/artist/artist.dart | 4 +- lib/pages/connect/connect.dart | 3 +- lib/pages/connect/control/control.dart | 2 +- .../getting_started/getting_started.dart | 4 +- lib/pages/home/feed/feed_section.dart | 4 +- lib/pages/home/genres/genre_playlists.dart | 4 +- lib/pages/home/genres/genres.dart | 3 +- lib/pages/home/home.dart | 2 +- lib/pages/lastfm_login/lastfm_login.dart | 2 +- lib/pages/library/library.dart | 33 ++- lib/pages/library/local_folder.dart | 7 +- .../playlist_generate/playlist_generate.dart | 5 +- .../playlist_generate_result.dart | 2 +- lib/pages/lyrics/lyrics.dart | 2 +- lib/pages/mobile_login/mobile_login.dart | 4 +- lib/pages/profile/profile.dart | 4 +- lib/pages/search/search.dart | 2 +- lib/pages/settings/about.dart | 4 +- lib/pages/settings/blacklist.dart | 5 +- lib/pages/settings/logs.dart | 6 +- lib/pages/settings/settings.dart | 3 +- lib/pages/stats/albums/albums.dart | 3 +- lib/pages/stats/artists/artists.dart | 3 +- lib/pages/stats/fees/fees.dart | 3 +- lib/pages/stats/minutes/minutes.dart | 3 +- lib/pages/stats/playlists/playlists.dart | 3 +- lib/pages/stats/stats.dart | 2 +- lib/pages/stats/streams/streams.dart | 3 +- lib/pages/track/track.dart | 2 +- 33 files changed, 149 insertions(+), 232 deletions(-) diff --git a/lib/components/titlebar/titlebar.dart b/lib/components/titlebar/titlebar.dart index a3d0978c..282a734d 100644 --- a/lib/components/titlebar/titlebar.dart +++ b/lib/components/titlebar/titlebar.dart @@ -1,89 +1,56 @@ 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:shadcn_flutter/shadcn_flutter.dart' + show AppBar, WidgetExtension; import 'package:spotube/components/titlebar/titlebar_buttons.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; - import 'package:window_manager/window_manager.dart'; -class PageWindowTitleBar extends StatefulHookConsumerWidget - implements PreferredSizeWidget { - final Widget? leading; +class TitleBar extends HookConsumerWidget implements PreferredSizeWidget { final bool automaticallyImplyLeading; - final List? actions; + final List trailing; + final List leading; + final Widget? child; + final Widget? title; + final Widget? header; // small widget placed on top of title + final Widget? subtitle; // small widget placed below title + final bool + trailingExpanded; // expand the trailing instead of the main content + final AlignmentGeometry alignment; final Color? backgroundColor; final Color? foregroundColor; - final IconThemeData? actionsIconTheme; - final bool? centerTitle; - final double? titleSpacing; - final double toolbarOpacity; - final double? leadingWidth; - final TextStyle? toolbarTextStyle; - final TextStyle? titleTextStyle; - final double? titleWidth; - final Widget? title; + final double? leadingGap; + final double? trailingGap; + final EdgeInsetsGeometry? padding; + final double? height; + final bool useSafeArea; + final double? surfaceBlur; + final double? surfaceOpacity; - final bool _sliver; - - const PageWindowTitleBar({ + const TitleBar({ super.key, - this.actions, + this.automaticallyImplyLeading = true, + this.trailing = const [], + this.leading = const [], this.title, - this.toolbarOpacity = 1, + this.header, + this.subtitle, + this.child, + this.trailingExpanded = false, + this.alignment = Alignment.center, + this.padding, this.backgroundColor, - this.actionsIconTheme, - this.automaticallyImplyLeading = false, - this.centerTitle, this.foregroundColor, - this.leading, - this.leadingWidth, - this.titleSpacing, - this.titleTextStyle, - this.titleWidth, - this.toolbarTextStyle, - }) : _sliver = false, - pinned = false, - floating = false, - snap = false, - stretch = false; + this.leadingGap, + this.trailingGap, + this.height, + this.surfaceBlur, + this.surfaceOpacity, + this.useSafeArea = true, + }); - final bool pinned; - final bool floating; - final bool snap; - final bool stretch; - - const PageWindowTitleBar.sliver({ - super.key, - this.actions, - this.title, - this.backgroundColor, - this.actionsIconTheme, - this.automaticallyImplyLeading = false, - this.centerTitle, - this.foregroundColor, - this.leading, - this.leadingWidth, - this.titleSpacing, - this.titleTextStyle, - this.titleWidth, - this.toolbarTextStyle, - this.pinned = false, - this.floating = false, - this.snap = false, - this.stretch = false, - }) : _sliver = true, - toolbarOpacity = 1; - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); - - @override - ConsumerState createState() => _PageWindowTitleBarState(); -} - -class _PageWindowTitleBarState extends ConsumerState { - void onDrag(details) { + void onDrag(WidgetRef ref) { final systemTitleBar = ref.read(userPreferencesProvider.select((s) => s.systemTitleBar)); if (kIsDesktop && !systemTitleBar) { @@ -92,86 +59,53 @@ class _PageWindowTitleBarState extends ConsumerState { } @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); + Widget build(BuildContext context, ref) { + final hasLeadingOrCanPop = leading.isNotEmpty || Navigator.canPop(context); - if (widget._sliver) { - return SliverLayoutBuilder( + return SizedBox( + height: height ?? 56, + child: LayoutBuilder( builder: (context, constraints) { final hasFullscreen = - mediaQuery.size.width == constraints.crossAxisExtent; - final hasLeadingOrCanPop = - widget.leading != null || Navigator.canPop(context); + MediaQuery.sizeOf(context).width == constraints.maxWidth; - return SliverPadding( - padding: EdgeInsets.only( - left: kIsMacOS && hasFullscreen && hasLeadingOrCanPop ? 65 : 0, - ), - sliver: SliverAppBar( - leading: widget.leading, - automaticallyImplyLeading: widget.automaticallyImplyLeading, - actions: [ - ...?widget.actions, - WindowTitleBarButtons(foregroundColor: widget.foregroundColor), + return GestureDetector( + onHorizontalDragStart: (_) => onDrag(ref), + onVerticalDragStart: (_) => onDrag(ref), + child: AppBar( + leading: leading.isEmpty && + automaticallyImplyLeading && + Navigator.canPop(context) + ? [ + const BackButton(), + ] + : leading, + trailing: [ + ...trailing, + WindowTitleBarButtons(foregroundColor: foregroundColor), ], - backgroundColor: widget.backgroundColor, - foregroundColor: widget.foregroundColor, - actionsIconTheme: widget.actionsIconTheme, - centerTitle: widget.centerTitle, - titleSpacing: widget.titleSpacing, - leadingWidth: widget.leadingWidth, - toolbarTextStyle: widget.toolbarTextStyle, - titleTextStyle: widget.titleTextStyle, - title: SizedBox( - width: double.infinity, // workaround to force dragging - child: widget.title ?? const Text(""), - ), - pinned: widget.pinned, - floating: widget.floating, - snap: widget.snap, - stretch: widget.stretch, - ), + title: title, + header: header, + subtitle: subtitle, + trailingExpanded: trailingExpanded, + alignment: alignment, + padding: padding, + backgroundColor: backgroundColor, + leadingGap: leadingGap, + trailingGap: trailingGap, + height: height, + surfaceBlur: surfaceBlur, + surfaceOpacity: surfaceOpacity, + useSafeArea: useSafeArea, + child: child, + ).withPadding( + left: kIsMacOS && hasFullscreen && hasLeadingOrCanPop ? 65 : 0), ); }, - ); - } - - return LayoutBuilder(builder: (context, constrains) { - final hasFullscreen = mediaQuery.size.width == constrains.maxWidth; - final hasLeadingOrCanPop = - widget.leading != null || Navigator.canPop(context); - - return GestureDetector( - onHorizontalDragStart: onDrag, - onVerticalDragStart: onDrag, - child: Padding( - padding: EdgeInsets.only( - left: kIsMacOS && hasFullscreen && hasLeadingOrCanPop ? 65 : 0, - ), - child: AppBar( - 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, - title: SizedBox( - width: double.infinity, // workaround to force dragging - child: widget.title ?? const Text(""), - ), - alignment: widget.centerTitle == true - ? Alignment.center - : Alignment.centerLeft, - leadingGap: widget.leadingWidth, - ), - ), - ); - }); + ), + ); } + + @override + Size get preferredSize => Size.fromHeight(height ?? 56.0); } diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index 28a85fd1..c40ddd2a 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; + import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotify/spotify.dart' hide Offset; import 'package:spotube/collections/assets.gen.dart'; @@ -344,6 +345,7 @@ class TrackOptions extends HookConsumerWidget { leading: const Icon(SpotubeIcons.album), child: Column( mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(context.l10n.go_to_album), Text( diff --git a/lib/components/tracks_view/track_view.dart b/lib/components/tracks_view/track_view.dart index 2a3f5237..fa6011e0 100644 --- a/lib/components/tracks_view/track_view.dart +++ b/lib/components/tracks_view/track_view.dart @@ -20,14 +20,14 @@ class TrackView extends HookConsumerWidget { return Scaffold( appBar: kIsDesktop - ? const PageWindowTitleBar( + ? const TitleBar( backgroundColor: Colors.transparent, - foregroundColor: Colors.white, - leadingWidth: 400, - leading: Align( - alignment: Alignment.centerLeft, - child: BackButton(color: Colors.white), - ), + leading: [ + Align( + alignment: Alignment.centerLeft, + child: BackButton(color: Colors.white), + ) + ], ) : null, extendBodyBehindAppBar: true, diff --git a/lib/modules/player/player.dart b/lib/modules/player/player.dart index a79934d9..3f19fbf0 100644 --- a/lib/modules/player/player.dart +++ b/lib/modules/player/player.dart @@ -138,15 +138,15 @@ class PlayerView extends HookConsumerWidget { child: ForceDraggableWidget( child: Padding( padding: EdgeInsets.only(top: topPadding), - child: PageWindowTitleBar( + child: TitleBar( backgroundColor: Colors.transparent, - foregroundColor: titleTextColor, - toolbarOpacity: 1, - leading: IconButton( - icon: const Icon(SpotubeIcons.angleDown, size: 18), - onPressed: panelController.close, - ), - actions: [ + leading: [ + IconButton( + icon: const Icon(SpotubeIcons.angleDown, size: 18), + onPressed: panelController.close, + ) + ], + trailing: [ if (currentTrack is YoutubeSourcedTrack) TextButton.icon( icon: Assets.logos.songlinkTransparent.image( diff --git a/lib/pages/artist/artist.dart b/lib/pages/artist/artist.dart index 70ad72de..9e8b5be4 100644 --- a/lib/pages/artist/artist.dart +++ b/lib/pages/artist/artist.dart @@ -30,8 +30,8 @@ class ArtistPage extends HookConsumerWidget { return SafeArea( bottom: false, child: Scaffold( - appBar: const PageWindowTitleBar( - leading: BackButton(), + appBar: const TitleBar( + leading: [BackButton()], backgroundColor: Colors.transparent, ), extendBodyBehindAppBar: true, diff --git a/lib/pages/connect/connect.dart b/lib/pages/connect/connect.dart index d3b0d0cb..1a5dfb31 100644 --- a/lib/pages/connect/connect.dart +++ b/lib/pages/connect/connect.dart @@ -23,10 +23,9 @@ class ConnectPage extends HookConsumerWidget { final discoveredDevices = connectClients.asData?.value.services; return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( automaticallyImplyLeading: true, title: Text(context.l10n.devices), - titleSpacing: 0, ), body: ListTileTheme( shape: RoundedRectangleBorder( diff --git a/lib/pages/connect/control/control.dart b/lib/pages/connect/control/control.dart index cae0bd1b..03406546 100644 --- a/lib/pages/connect/control/control.dart +++ b/lib/pages/connect/control/control.dart @@ -88,7 +88,7 @@ class ConnectControlPage extends HookConsumerWidget { return SafeArea( child: Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(resolvedService!.name), automaticallyImplyLeading: true, ), diff --git a/lib/pages/getting_started/getting_started.dart b/lib/pages/getting_started/getting_started.dart index 0159a77f..6a8141d0 100644 --- a/lib/pages/getting_started/getting_started.dart +++ b/lib/pages/getting_started/getting_started.dart @@ -43,9 +43,9 @@ class GettingStarting extends HookConsumerWidget { return Theme( data: themeData, child: Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( backgroundColor: Colors.transparent, - actions: [ + trailing: [ ListenableBuilder( listenable: pageController, builder: (context, _) { diff --git a/lib/pages/home/feed/feed_section.dart b/lib/pages/home/feed/feed_section.dart index bcfc0b81..0249d865 100644 --- a/lib/pages/home/feed/feed_section.dart +++ b/lib/pages/home/feed/feed_section.dart @@ -23,11 +23,9 @@ class HomeFeedSectionPage extends HookConsumerWidget { return Skeletonizer( enabled: homeFeedSection.isLoading, child: Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(section.title ?? ""), - centerTitle: false, automaticallyImplyLeading: true, - titleSpacing: 0, ), body: CustomScrollView( slivers: [ diff --git a/lib/pages/home/genres/genre_playlists.dart b/lib/pages/home/genres/genre_playlists.dart index 04658965..ec478617 100644 --- a/lib/pages/home/genres/genre_playlists.dart +++ b/lib/pages/home/genres/genre_playlists.dart @@ -40,8 +40,8 @@ class GenrePlaylistsPage extends HookConsumerWidget { return Scaffold( appBar: kIsDesktop - ? const PageWindowTitleBar( - leading: BackButton(color: Colors.white), + ? const TitleBar( + leading: [BackButton(color: Colors.white)], backgroundColor: Colors.transparent, foregroundColor: Colors.white, ) diff --git a/lib/pages/home/genres/genres.dart b/lib/pages/home/genres/genres.dart index 4846d633..ed9d9351 100644 --- a/lib/pages/home/genres/genres.dart +++ b/lib/pages/home/genres/genres.dart @@ -25,10 +25,9 @@ class GenrePage extends HookConsumerWidget { final mediaQuery = MediaQuery.of(context); return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.explore_genres), automaticallyImplyLeading: true, - titleSpacing: 0, ), body: SafeArea( top: false, diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index efdca4f7..eede8dfd 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -34,7 +34,7 @@ class HomePage extends HookConsumerWidget { return SafeArea( bottom: false, child: Scaffold( - appBar: kIsMobile || kIsMacOS ? null : const PageWindowTitleBar(), + appBar: kIsMobile || kIsMacOS ? null : const TitleBar(), body: CustomScrollView( controller: controller, slivers: [ diff --git a/lib/pages/lastfm_login/lastfm_login.dart b/lib/pages/lastfm_login/lastfm_login.dart index 8107e627..2611d771 100644 --- a/lib/pages/lastfm_login/lastfm_login.dart +++ b/lib/pages/lastfm_login/lastfm_login.dart @@ -27,7 +27,7 @@ class LastFMLoginPage extends HookConsumerWidget { final isLoading = useState(false); return Scaffold( - appBar: const PageWindowTitleBar(leading: BackButton()), + appBar: const TitleBar(leading: [BackButton()]), body: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), diff --git a/lib/pages/library/library.dart b/lib/pages/library/library.dart index 02152f3d..dbab9a87 100644 --- a/lib/pages/library/library.dart +++ b/lib/pages/library/library.dart @@ -37,19 +37,21 @@ class LibraryPage extends HookConsumerWidget { 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); - }, - ), - ], - ), + TitleBar( + leading: [ + TabList( + index: index.value, + children: [ + for (final child in children) + TabButton( + child: child, + onPressed: () { + index.value = children.indexOf(child); + }, + ), + ], + ) + ], ) ], child: IndexedStack( @@ -60,11 +62,6 @@ class LibraryPage extends HookConsumerWidget { UserDownloads(), UserArtists(), UserAlbums(), - // Text("UserPlaylists()"), - // Text("UserLocalTracks()"), - // Text("UserDownloads()"), - // Text("UserArtists()"), - // Text("UserAlbums()"), ], ), ), diff --git a/lib/pages/library/local_folder.dart b/lib/pages/library/local_folder.dart index c2848b24..478eac5e 100644 --- a/lib/pages/library/local_folder.dart +++ b/lib/pages/library/local_folder.dart @@ -93,9 +93,8 @@ class LocalLibraryPage extends HookConsumerWidget { return SafeArea( bottom: false, child: Scaffold( - appBar: PageWindowTitleBar( - leading: const BackButton(), - centerTitle: true, + appBar: TitleBar( + leading: const [BackButton()], title: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -120,7 +119,7 @@ class LocalLibraryPage extends HookConsumerWidget { ], ), backgroundColor: Colors.transparent, - actions: [ + trailing: [ if (isCache) ...[ IconButton( iconSize: 16, diff --git a/lib/pages/library/playlist_generate/playlist_generate.dart b/lib/pages/library/playlist_generate/playlist_generate.dart index b62013c5..63565362 100644 --- a/lib/pages/library/playlist_generate/playlist_generate.dart +++ b/lib/pages/library/playlist_generate/playlist_generate.dart @@ -231,10 +231,9 @@ class PlaylistGeneratorPage extends HookConsumerWidget { final controller = useScrollController(); return Scaffold( - appBar: PageWindowTitleBar( - leading: const BackButton(), + appBar: TitleBar( + leading: const [BackButton()], title: Text(context.l10n.generate_playlist), - centerTitle: true, ), body: Scrollbar( controller: controller, diff --git a/lib/pages/library/playlist_generate/playlist_generate_result.dart b/lib/pages/library/playlist_generate/playlist_generate_result.dart index 3bdc3b52..f44cbee7 100644 --- a/lib/pages/library/playlist_generate/playlist_generate_result.dart +++ b/lib/pages/library/playlist_generate/playlist_generate_result.dart @@ -48,7 +48,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { (generatedPlaylist.asData?.value.length ?? 0); return Scaffold( - appBar: const PageWindowTitleBar(leading: BackButton()), + appBar: const TitleBar(leading: [BackButton()]), body: generatedPlaylist.isLoading ? Center( child: Column( diff --git a/lib/pages/lyrics/lyrics.dart b/lib/pages/lyrics/lyrics.dart index 0f4f9473..48005f6e 100644 --- a/lib/pages/lyrics/lyrics.dart +++ b/lib/pages/lyrics/lyrics.dart @@ -146,7 +146,7 @@ class LyricsPage extends HookConsumerWidget { child: Scaffold( extendBodyBehindAppBar: true, appBar: !kIsMacOS - ? PageWindowTitleBar( + ? TitleBar( backgroundColor: Colors.transparent, title: tabbar, ) diff --git a/lib/pages/mobile_login/mobile_login.dart b/lib/pages/mobile_login/mobile_login.dart index c45c2184..fa818dc8 100644 --- a/lib/pages/mobile_login/mobile_login.dart +++ b/lib/pages/mobile_login/mobile_login.dart @@ -24,8 +24,8 @@ class WebViewLogin extends HookConsumerWidget { } return Scaffold( - appBar: const PageWindowTitleBar( - leading: BackButton(color: Colors.white), + appBar: const TitleBar( + leading: [BackButton(color: Colors.white)], backgroundColor: Colors.transparent, ), extendBodyBehindAppBar: true, diff --git a/lib/pages/profile/profile.dart b/lib/pages/profile/profile.dart index 9e51793d..b4d72b53 100644 --- a/lib/pages/profile/profile.dart +++ b/lib/pages/profile/profile.dart @@ -42,11 +42,9 @@ class ProfilePage extends HookConsumerWidget { return SafeArea( child: Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.profile), - titleSpacing: 0, automaticallyImplyLeading: true, - centerTitle: false, ), body: Skeletonizer( enabled: me.isLoading, diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index d5de12f0..c413df68 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -88,7 +88,7 @@ class SearchPage extends HookConsumerWidget { bottom: false, child: Scaffold( appBar: kIsDesktop && !kIsMacOS - ? const PageWindowTitleBar(automaticallyImplyLeading: true) + ? const TitleBar(automaticallyImplyLeading: true) : null, body: auth.asData?.value == null ? const AnonymousFallback() diff --git a/lib/pages/settings/about.dart b/lib/pages/settings/about.dart index 1357c52f..491cdcf6 100644 --- a/lib/pages/settings/about.dart +++ b/lib/pages/settings/about.dart @@ -29,8 +29,8 @@ class AboutSpotube extends HookConsumerWidget { const colon = Text(":"); return Scaffold( - appBar: PageWindowTitleBar( - leading: const BackButton(), + appBar: TitleBar( + leading: const [BackButton()], title: Text(context.l10n.about_spotube), ), body: SingleChildScrollView( diff --git a/lib/pages/settings/blacklist.dart b/lib/pages/settings/blacklist.dart index 1f018dab..57a8b6fe 100644 --- a/lib/pages/settings/blacklist.dart +++ b/lib/pages/settings/blacklist.dart @@ -44,10 +44,9 @@ class BlackListPage extends HookConsumerWidget { ); return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.blacklist), - centerTitle: true, - leading: const BackButton(), + leading: const [BackButton()], ), body: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/pages/settings/logs.dart b/lib/pages/settings/logs.dart index 6ccbe32f..0f1260aa 100644 --- a/lib/pages/settings/logs.dart +++ b/lib/pages/settings/logs.dart @@ -21,10 +21,10 @@ class LogsPage extends HookConsumerWidget { final logsQuery = ref.watch(logsProvider); return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.logs), - leading: const BackButton(), - actions: [ + leading: const [BackButton()], + trailing: [ IconButton( icon: const Icon(SpotubeIcons.clipboard), iconSize: 16, diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 8bce4bcf..a7355812 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -28,9 +28,8 @@ class SettingsPage extends HookConsumerWidget { return SafeArea( bottom: false, child: Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.settings), - centerTitle: true, automaticallyImplyLeading: true, ), body: Scrollbar( diff --git a/lib/pages/stats/albums/albums.dart b/lib/pages/stats/albums/albums.dart index e14a2f32..b424cd70 100644 --- a/lib/pages/stats/albums/albums.dart +++ b/lib/pages/stats/albums/albums.dart @@ -25,9 +25,8 @@ class StatsAlbumsPage extends HookConsumerWidget { final albumsData = topAlbums.asData?.value.items ?? []; return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( automaticallyImplyLeading: true, - centerTitle: false, title: Text(context.l10n.albums), ), body: Skeletonizer( diff --git a/lib/pages/stats/artists/artists.dart b/lib/pages/stats/artists/artists.dart index 436bbb57..468ddabb 100644 --- a/lib/pages/stats/artists/artists.dart +++ b/lib/pages/stats/artists/artists.dart @@ -28,9 +28,8 @@ class StatsArtistsPage extends HookConsumerWidget { () => topTracks.asData?.value.artists ?? [], [topTracks.asData?.value]); return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( automaticallyImplyLeading: true, - centerTitle: false, title: Text(context.l10n.artists), ), body: Skeletonizer( diff --git a/lib/pages/stats/fees/fees.dart b/lib/pages/stats/fees/fees.dart index da62fb30..1bbcb103 100644 --- a/lib/pages/stats/fees/fees.dart +++ b/lib/pages/stats/fees/fees.dart @@ -41,9 +41,8 @@ class StatsStreamFeesPage extends HookConsumerWidget { ); return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( automaticallyImplyLeading: true, - centerTitle: false, title: Text(context.l10n.streaming_fees_hypothetical), ), body: CustomScrollView( diff --git a/lib/pages/stats/minutes/minutes.dart b/lib/pages/stats/minutes/minutes.dart index 3ad0984b..f6cfafca 100644 --- a/lib/pages/stats/minutes/minutes.dart +++ b/lib/pages/stats/minutes/minutes.dart @@ -28,9 +28,8 @@ class StatsMinutesPage extends HookConsumerWidget { final tracksData = topTracks.asData?.value.items ?? []; return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.minutes_listened), - centerTitle: false, automaticallyImplyLeading: true, ), body: Skeletonizer( diff --git a/lib/pages/stats/playlists/playlists.dart b/lib/pages/stats/playlists/playlists.dart index 4e83b0a2..53885570 100644 --- a/lib/pages/stats/playlists/playlists.dart +++ b/lib/pages/stats/playlists/playlists.dart @@ -26,9 +26,8 @@ class StatsPlaylistsPage extends HookConsumerWidget { final playlistsData = topPlaylists.asData?.value.items ?? []; return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( automaticallyImplyLeading: true, - centerTitle: false, title: Text(context.l10n.playlists), ), body: Skeletonizer( diff --git a/lib/pages/stats/stats.dart b/lib/pages/stats/stats.dart index b2dc03c2..9c35df63 100644 --- a/lib/pages/stats/stats.dart +++ b/lib/pages/stats/stats.dart @@ -16,7 +16,7 @@ class StatsPage extends HookConsumerWidget { return SafeArea( bottom: false, child: Scaffold( - appBar: kIsMacOS || kIsMobile ? null : const PageWindowTitleBar(), + appBar: kIsMacOS || kIsMobile ? null : const TitleBar(), body: CustomScrollView( slivers: [ if (kIsMacOS) const SliverGap(20), diff --git a/lib/pages/stats/streams/streams.dart b/lib/pages/stats/streams/streams.dart index 059366e0..b835b3a6 100644 --- a/lib/pages/stats/streams/streams.dart +++ b/lib/pages/stats/streams/streams.dart @@ -28,9 +28,8 @@ class StatsStreamsPage extends HookConsumerWidget { final tracksData = topTracks.asData?.value.items ?? []; return Scaffold( - appBar: PageWindowTitleBar( + appBar: TitleBar( title: Text(context.l10n.streamed_songs), - centerTitle: false, automaticallyImplyLeading: true, ), body: Skeletonizer( diff --git a/lib/pages/track/track.dart b/lib/pages/track/track.dart index 84c53b74..30f2e998 100644 --- a/lib/pages/track/track.dart +++ b/lib/pages/track/track.dart @@ -53,7 +53,7 @@ class TrackPage extends HookConsumerWidget { } return Scaffold( - appBar: const PageWindowTitleBar( + appBar: const TitleBar( automaticallyImplyLeading: true, backgroundColor: Colors.transparent, ),