feat: centralized icon collection with new icon set and nav bar labels hidden

This commit is contained in:
Kingkor Roy Tirtho 2023-01-08 12:08:45 +06:00
parent 6902060cdd
commit e7acb9ed5c
32 changed files with 240 additions and 108 deletions

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:spotube/collections/spotube_icons.dart';
class SideBarTiles { class SideBarTiles {
final IconData icon; final IconData icon;
@ -7,8 +8,8 @@ class SideBarTiles {
} }
List<SideBarTiles> sidebarTileList = [ List<SideBarTiles> sidebarTileList = [
SideBarTiles(icon: Icons.home_rounded, title: "Browse"), SideBarTiles(icon: SpotubeIcons.home, title: "Browse"),
SideBarTiles(icon: Icons.search_rounded, title: "Search"), SideBarTiles(icon: SpotubeIcons.search, title: "Search"),
SideBarTiles(icon: Icons.library_books_rounded, title: "Library"), SideBarTiles(icon: SpotubeIcons.library, title: "Library"),
SideBarTiles(icon: Icons.music_note_rounded, title: "Lyrics") SideBarTiles(icon: SpotubeIcons.music, title: "Lyrics")
]; ];

View File

@ -0,0 +1,61 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
abstract class SpotubeIcons {
static const home = FluentIcons.home;
static const search = FeatherIcons.search;
static const library = FluentIcons.library;
static const music = FeatherIcons.music;
static const play = FluentIcons.play;
static const pause = FeatherIcons.pause;
static const skipForward = FeatherIcons.skipForward;
static const skipBack = FeatherIcons.skipBack;
static const stop = FeatherIcons.square;
static const filter = FeatherIcons.filter;
static const refresh = FeatherIcons.refreshCw;
static const settings = FeatherIcons.settings;
static const shuffle = FeatherIcons.shuffle;
static const repeat = FluentIcons.repeat_all;
static const repeatOne = FluentIcons.repeat_one;
static const remove = FeatherIcons.minus;
static const removeFilled = FeatherIcons.minusCircle;
static const add = FeatherIcons.plus;
static const addFilled = FeatherIcons.plusSquare;
static const heart = FeatherIcons.heart;
static const heartFilled = Icons.favorite_rounded;
static const queue = Icons.queue_music_rounded;
static const download = FeatherIcons.download;
static const done = FeatherIcons.checkCircle;
static const alternativeRoute = Icons.alt_route_rounded;
static const sort = Icons.sort_rounded;
static const moreVertical = FeatherIcons.moreVertical;
static const moreHorizontal = FeatherIcons.moreHorizontal;
static const share = FeatherIcons.share2;
static const playlistAdd = Icons.playlist_add_rounded;
static const playlistRemove = Icons.playlist_remove_rounded;
static const trash = FeatherIcons.trash2;
static const clock = FeatherIcons.clock;
static const lyrics = Icons.lyrics_rounded;
static const logout = FeatherIcons.logOut;
static const login = FeatherIcons.logIn;
static const dashboard = FeatherIcons.grid;
static const darkMode = FeatherIcons.moon;
static const platform = FeatherIcons.smartphone;
static const palette = Icons.palette_outlined;
static const colorBucket = Icons.format_color_fill_rounded;
static const album = FeatherIcons.disc;
static const artist = FeatherIcons.user;
static const audioQuality = Icons.multitrack_audio_rounded;
static const fastForward = FeatherIcons.fastForward;
static const angleRight = FeatherIcons.chevronRight;
static const angleLeft = FeatherIcons.chevronLeft;
static const shoppingBag = FeatherIcons.shoppingBag;
static const screenSearch = Icons.screen_search_desktop_outlined;
static const save = FeatherIcons.save;
static const barChart = FeatherIcons.barChart2;
static const folder = FeatherIcons.folder;
static const update = FeatherIcons.refreshCcw;
static const info = FeatherIcons.info;
static const userRemove = FeatherIcons.userX;
}

View File

@ -5,6 +5,7 @@ import 'package:collection/collection.dart';
import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/album/album_card.dart'; import 'package:spotube/components/album/album_card.dart';
import 'package:spotube/components/shared/playbutton_card.dart'; import 'package:spotube/components/shared/playbutton_card.dart';
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'; import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
@ -72,7 +73,7 @@ class UserAlbums extends HookConsumerWidget {
children: [ children: [
PlatformTextField( PlatformTextField(
onChanged: (value) => searchText.value = value, onChanged: (value) => searchText.value = value,
prefixIcon: Icons.filter_alt_outlined, prefixIcon: SpotubeIcons.filter,
placeholder: 'Filter Albums...', placeholder: 'Filter Albums...',
), ),
const SizedBox(height: 20), const SizedBox(height: 20),

View File

@ -6,6 +6,7 @@ import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart'; import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
import 'package:spotube/components/shared/waypoint.dart'; import 'package:spotube/components/shared/waypoint.dart';
import 'package:spotube/components/artist/artist_card.dart'; import 'package:spotube/components/artist/artist_card.dart';
@ -63,7 +64,7 @@ class UserArtists extends HookConsumerWidget {
color: PlatformTheme.of(context).scaffoldBackgroundColor!, color: PlatformTheme.of(context).scaffoldBackgroundColor!,
child: PlatformTextField( child: PlatformTextField(
onChanged: (value) => searchText.value = value, onChanged: (value) => searchText.value = value,
prefixIcon: Icons.filter_alt_outlined, prefixIcon: SpotubeIcons.filter,
placeholder: 'Filter artists...', placeholder: 'Filter artists...',
), ),
), ),

View File

@ -13,6 +13,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/compact_search.dart'; import 'package:spotube/components/shared/compact_search.dart';
import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart'; import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart';
import 'package:spotube/components/shared/sort_tracks_dropdown.dart'; import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
@ -208,9 +209,7 @@ class UserLocalTracks extends HookConsumerWidget {
children: [ children: [
const Text("Play"), const Text("Play"),
Icon( Icon(
isPlaylistPlaying isPlaylistPlaying ? SpotubeIcons.stop : SpotubeIcons.play,
? Icons.stop_rounded
: Icons.play_arrow_rounded,
) )
], ],
), ),
@ -226,7 +225,7 @@ class UserLocalTracks extends HookConsumerWidget {
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
PlatformFilledButton( PlatformFilledButton(
child: const Icon(Icons.refresh_rounded), child: const Icon(SpotubeIcons.refresh),
onPressed: () { onPressed: () {
ref.refresh(localTracksProvider); ref.refresh(localTracksProvider);
}, },

View File

@ -6,6 +6,7 @@ import 'package:collection/collection.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/playlist/playlist_create_dialog.dart'; import 'package:spotube/components/playlist/playlist_create_dialog.dart';
import 'package:spotube/components/shared/playbutton_card.dart'; import 'package:spotube/components/shared/playbutton_card.dart';
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'; import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
@ -99,7 +100,7 @@ class UserPlaylists extends HookConsumerWidget {
PlatformTextField( PlatformTextField(
onChanged: (value) => searchText.value = value, onChanged: (value) => searchText.value = value,
placeholder: "Filter your playlists...", placeholder: "Filter your playlists...",
prefixIcon: Icons.filter_alt_outlined, prefixIcon: SpotubeIcons.filter,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
if (playlistsQuery.isLoading || !playlistsQuery.hasData) if (playlistsQuery.isLoading || !playlistsQuery.hasData)

View File

@ -1,8 +1,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/root/sidebar.dart'; import 'package:spotube/components/root/sidebar.dart';
import 'package:spotube/pages/lyrics/synced_lyrics.dart'; import 'package:spotube/pages/lyrics/synced_lyrics.dart';
@ -80,7 +80,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.remove_rounded), icon: const Icon(SpotubeIcons.remove),
onPressed: () { onPressed: () {
controller.text = "${getValue() - 25}ms"; controller.text = "${getValue() - 25}ms";
}, },
@ -100,7 +100,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
), ),
), ),
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.add_rounded), icon: const Icon(SpotubeIcons.add),
onPressed: () { onPressed: () {
controller.text = "${getValue() + 25}ms"; controller.text = "${getValue() + 25}ms";
}, },

View File

@ -4,6 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/library/user_local_tracks.dart'; import 'package:spotube/components/library/user_local_tracks.dart';
import 'package:spotube/components/player/player_queue.dart'; import 'package:spotube/components/player/player_queue.dart';
import 'package:spotube/components/player/sibling_tracks_sheet.dart'; import 'package:spotube/components/player/sibling_tracks_sheet.dart';
@ -53,7 +54,7 @@ class PlayerActions extends HookConsumerWidget {
mainAxisAlignment: mainAxisAlignment, mainAxisAlignment: mainAxisAlignment,
children: [ children: [
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.queue_music_rounded), icon: const Icon(SpotubeIcons.queue),
tooltip: 'Queue', tooltip: 'Queue',
onPressed: playback.playlist != null onPressed: playback.playlist != null
? () { ? () {
@ -79,7 +80,7 @@ class PlayerActions extends HookConsumerWidget {
), ),
if (!isLocalTrack) if (!isLocalTrack)
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.alt_route_rounded), icon: const Icon(SpotubeIcons.alternativeRoute),
tooltip: "Alternative Track Sources", tooltip: "Alternative Track Sources",
onPressed: playback.track != null onPressed: playback.track != null
? () { ? () {
@ -116,9 +117,7 @@ class PlayerActions extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: 'Download track', tooltip: 'Download track',
icon: Icon( icon: Icon(
isDownloaded isDownloaded ? SpotubeIcons.done : SpotubeIcons.download,
? Icons.download_done_rounded
: Icons.download_rounded,
), ),
onPressed: playback.track != null onPressed: playback.track != null
? () => downloader.addToQueue(playback.track!) ? () => downloader.addToQueue(playback.track!)

View File

@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/hooks/playback_hooks.dart'; import 'package:spotube/hooks/playback_hooks.dart';
import 'package:spotube/collections/intents.dart'; import 'package:spotube/collections/intents.dart';
import 'package:spotube/models/logger.dart'; import 'package:spotube/models/logger.dart';
@ -143,7 +144,7 @@ class PlayerControls extends HookConsumerWidget {
? "Unshuffle playlist" ? "Unshuffle playlist"
: "Shuffle playlist", : "Shuffle playlist",
icon: Icon( icon: Icon(
Icons.shuffle_rounded, SpotubeIcons.shuffle,
color: playback.isShuffled color: playback.isShuffled
? PlatformTheme.of(context).primaryColor ? PlatformTheme.of(context).primaryColor
: null, : null,
@ -157,7 +158,7 @@ class PlayerControls extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: "Previous track", tooltip: "Previous track",
icon: Icon( icon: Icon(
Icons.skip_previous_rounded, SpotubeIcons.skipBack,
color: iconColor, color: iconColor,
), ),
onPressed: () { onPressed: () {
@ -175,8 +176,8 @@ class PlayerControls extends HookConsumerWidget {
) )
: Icon( : Icon(
playback.isPlaying playback.isPlaying
? Icons.pause_rounded ? SpotubeIcons.pause
: Icons.play_arrow_rounded, : SpotubeIcons.play,
color: iconColor, color: iconColor,
), ),
onPressed: Actions.handler<PlayPauseIntent>( onPressed: Actions.handler<PlayPauseIntent>(
@ -187,7 +188,7 @@ class PlayerControls extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: "Next track", tooltip: "Next track",
icon: Icon( icon: Icon(
Icons.skip_next_rounded, SpotubeIcons.skipForward,
color: iconColor, color: iconColor,
), ),
onPressed: () => onNext(), onPressed: () => onNext(),
@ -195,7 +196,7 @@ class PlayerControls extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: "Stop playback", tooltip: "Stop playback",
icon: Icon( icon: Icon(
Icons.stop_rounded, SpotubeIcons.stop,
color: iconColor, color: iconColor,
), ),
onPressed: playback.track != null onPressed: playback.track != null
@ -213,8 +214,8 @@ class PlayerControls extends HookConsumerWidget {
!playback.isLoop ? "Loop Track" : "Repeat playlist", !playback.isLoop ? "Loop Track" : "Repeat playlist",
icon: Icon( icon: Icon(
playback.isLoop playback.isLoop
? Icons.repeat_one_rounded ? SpotubeIcons.repeatOne
: Icons.repeat_rounded, : SpotubeIcons.repeat,
), ),
onPressed: onPressed:
playback.track == null || playback.playlist == null playback.track == null || playback.playlist == null

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/player/player_track_details.dart'; import 'package:spotube/components/player/player_track_details.dart';
import 'package:spotube/hooks/playback_hooks.dart'; import 'package:spotube/hooks/playback_hooks.dart';
import 'package:spotube/hooks/use_palette_color.dart'; import 'package:spotube/hooks/use_palette_color.dart';
@ -83,7 +84,7 @@ class PlayerOverlay extends HookConsumerWidget {
children: [ children: [
IconButton( IconButton(
icon: Icon( icon: Icon(
Icons.skip_previous_rounded, SpotubeIcons.skipBack,
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
), ),
onPressed: () { onPressed: () {
@ -94,8 +95,8 @@ class PlayerOverlay extends HookConsumerWidget {
return IconButton( return IconButton(
icon: Icon( icon: Icon(
ref.read(playbackProvider).isPlaying ref.read(playbackProvider).isPlaying
? Icons.pause_rounded ? SpotubeIcons.pause
: Icons.play_arrow_rounded, : SpotubeIcons.play,
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
), ),
onPressed: Actions.handler<PlayPauseIntent>( onPressed: Actions.handler<PlayPauseIntent>(
@ -107,7 +108,7 @@ class PlayerOverlay extends HookConsumerWidget {
), ),
IconButton( IconButton(
icon: Icon( icon: Icon(
Icons.skip_next_rounded, SpotubeIcons.skipForward,
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
), ),
onPressed: () => onNext(), onPressed: () => onNext(),

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/root/sidebar.dart'; import 'package:spotube/components/root/sidebar.dart';
import 'package:spotube/provider/spotify_provider.dart'; import 'package:spotube/provider/spotify_provider.dart';
import 'package:spotube/services/queries/queries.dart'; import 'package:spotube/services/queries/queries.dart';
@ -138,7 +139,7 @@ class PlaylistCreateDialog extends HookConsumerWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: const [ children: const [
Icon(Icons.add_box_rounded, size: 40), Icon(SpotubeIcons.addFilled, size: 40),
PlatformText("Create Playlist", style: TextStyle(fontSize: 20)), PlatformText("Create Playlist", style: TextStyle(fontSize: 20)),
], ],
), ),

View File

@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/side_bar_tiles.dart'; import 'package:spotube/collections/side_bar_tiles.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/hooks/use_breakpoints.dart'; import 'package:spotube/hooks/use_breakpoints.dart';
import 'package:spotube/provider/auth_provider.dart'; import 'package:spotube/provider/auth_provider.dart';
@ -175,7 +176,7 @@ class Sidebar extends HookConsumerWidget {
), ),
windowsFooterItems: [ windowsFooterItems: [
fluent_ui.PaneItemAction( fluent_ui.PaneItemAction(
icon: const fluent_ui.Icon(fluent_ui.FluentIcons.settings), icon: const Icon(SpotubeIcons.settings),
onTap: () => goToSettings(context), onTap: () => goToSettings(context),
), ),
], ],
@ -192,8 +193,6 @@ class SidebarFooter extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final auth = ref.watch(authProvider);
return SizedBox( return SizedBox(
width: 256, width: 256,
child: HookBuilder( child: HookBuilder(
@ -268,7 +267,7 @@ class SidebarFooter extends HookConsumerWidget {
), ),
), ),
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.settings_outlined), icon: const Icon(SpotubeIcons.settings),
onPressed: () => Sidebar.goToSettings(context)), onPressed: () => Sidebar.goToSettings(context)),
], ],
)); ));

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/side_bar_tiles.dart'; import 'package:spotube/collections/side_bar_tiles.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/root/sidebar.dart'; import 'package:spotube/components/root/sidebar.dart';
import 'package:spotube/hooks/use_breakpoints.dart'; import 'package:spotube/hooks/use_breakpoints.dart';
import 'package:spotube/provider/downloader_provider.dart'; import 'package:spotube/provider/downloader_provider.dart';
@ -48,7 +49,7 @@ class SpotubeNavigationBar extends HookConsumerWidget {
}, },
), ),
const PlatformBottomNavigationBarItem( const PlatformBottomNavigationBarItem(
icon: Icons.settings_rounded, icon: SpotubeIcons.settings,
label: "Settings", label: "Settings",
) )
], ],

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:popover/popover.dart'; import 'package:popover/popover.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/hooks/use_breakpoints.dart'; import 'package:spotube/hooks/use_breakpoints.dart';
class Action extends StatelessWidget { class Action extends StatelessWidget {
@ -90,7 +91,7 @@ class AdaptiveActions extends HookWidget {
if (breakpoint.isLessThan(breakOn)) { if (breakpoint.isLessThan(breakOn)) {
return PlatformIconButton( return PlatformIconButton(
icon: const Icon(Icons.more_horiz), icon: const Icon(SpotubeIcons.moreHorizontal),
onPressed: () { onPressed: () {
showPopover( showPopover(
context: context, context: context,

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:popover/popover.dart'; import 'package:popover/popover.dart';
import 'package:spotube/collections/spotube_icons.dart';
class CompactSearch extends HookWidget { class CompactSearch extends HookWidget {
final ValueChanged<String>? onChanged; final ValueChanged<String>? onChanged;
@ -13,7 +14,7 @@ class CompactSearch extends HookWidget {
Key? key, Key? key,
this.onChanged, this.onChanged,
this.placeholder = "Search...", this.placeholder = "Search...",
this.icon = Icons.search, this.icon = SpotubeIcons.search,
this.iconColor, this.iconColor,
}) : super(key: key); }) : super(key: key);

View File

@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/hooks/use_palette_color.dart'; import 'package:spotube/hooks/use_palette_color.dart';
import 'package:spotube/provider/auth_provider.dart'; import 'package:spotube/provider/auth_provider.dart';
import 'package:spotube/provider/spotify_provider.dart'; import 'package:spotube/provider/spotify_provider.dart';
@ -38,10 +39,7 @@ class HeartButton extends ConsumerWidget {
return PlatformIconButton( return PlatformIconButton(
tooltip: tooltip, tooltip: tooltip,
icon: Icon( icon: Icon(
icon ?? icon ?? (!isLiked ? SpotubeIcons.heart : SpotubeIcons.heartFilled),
(!isLiked
? Icons.favorite_outline_rounded
: Icons.favorite_rounded),
color: isLiked ? Colors.pink : color, color: isLiked ? Colors.pink : color,
), ),
onPressed: onPressed, onPressed: onPressed,

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/hover_builder.dart'; import 'package:spotube/components/shared/hover_builder.dart';
import 'package:spotube/components/shared/spotube_marquee_text.dart'; import 'package:spotube/components/shared/spotube_marquee_text.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
@ -95,9 +96,7 @@ class PlaybuttonCard extends HookWidget {
), ),
) )
: Icon( : Icon(
isPlaying isPlaying ? SpotubeIcons.pause : SpotubeIcons.play,
? Icons.pause_rounded
: Icons.play_arrow_rounded,
color: Colors.white, color: Colors.white,
), ),
); );

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/library/user_local_tracks.dart'; import 'package:spotube/components/library/user_local_tracks.dart';
class SortTracksDropdown extends StatelessWidget { class SortTracksDropdown extends StatelessWidget {
@ -48,7 +49,7 @@ class SortTracksDropdown extends StatelessWidget {
], ],
onSelected: onChanged, onSelected: onChanged,
tooltip: "Sort tracks", tooltip: "Sort tracks",
child: const Icon(Icons.sort_rounded), child: const Icon(SpotubeIcons.sort),
); );
} }
} }

View File

@ -5,6 +5,7 @@ import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/compact_search.dart'; import 'package:spotube/components/shared/compact_search.dart';
import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart'; import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
@ -70,7 +71,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
if (showShare) if (showShare)
PlatformIconButton( PlatformIconButton(
icon: Icon( icon: Icon(
Icons.share_rounded, SpotubeIcons.share,
color: color?.titleTextColor, color: color?.titleTextColor,
), ),
onPressed: onShare, onPressed: onShare,
@ -79,7 +80,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: "Shuffle", tooltip: "Shuffle",
icon: Icon( icon: Icon(
Icons.shuffle, SpotubeIcons.shuffle,
color: color?.titleTextColor, color: color?.titleTextColor,
), ),
onPressed: onShuffledPlay, onPressed: onShuffledPlay,
@ -90,7 +91,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
backgroundColor: PlatformTheme.of(context).primaryColor, backgroundColor: PlatformTheme.of(context).primaryColor,
onPressed: tracksSnapshot.data != null ? onPlay : null, onPressed: tracksSnapshot.data != null ? onPlay : null,
icon: Icon( icon: Icon(
isPlaying ? Icons.stop_rounded : Icons.play_arrow_rounded, isPlaying ? SpotubeIcons.stop : SpotubeIcons.play,
color: PlatformTextTheme.of(context).body?.color, color: PlatformTextTheme.of(context).body?.color,
), ),
), ),
@ -167,7 +168,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
borderColor: color?.titleTextColor, borderColor: color?.titleTextColor,
prefixIconColor: color?.titleTextColor, prefixIconColor: color?.titleTextColor,
cursorColor: color?.titleTextColor, cursorColor: color?.titleTextColor,
prefixIcon: Icons.search_rounded, prefixIcon: SpotubeIcons.search,
), ),
); );

View File

@ -7,6 +7,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart' hide Image; import 'package:spotify/spotify.dart' hide Image;
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/adaptive/adaptive_popup_menu_button.dart'; import 'package:spotube/components/shared/adaptive/adaptive_popup_menu_button.dart';
import 'package:spotube/components/shared/heart_button.dart'; import 'package:spotube/components/shared/heart_button.dart';
import 'package:spotube/components/shared/links/link_text.dart'; import 'package:spotube/components/shared/links/link_text.dart';
@ -236,13 +237,13 @@ class TrackTile extends HookConsumerWidget {
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.all(8.0).copyWith(left: 0), padding: const EdgeInsets.all(8.0),
child: PlatformIconButton( child: PlatformIconButton(
icon: Icon( icon: Icon(
playback.track?.id != null && playback.track?.id != null &&
playback.track?.id == track.value.id playback.track?.id == track.value.id
? Icons.pause_rounded ? SpotubeIcons.pause
: Icons.play_arrow_rounded, : SpotubeIcons.play,
color: Colors.white, color: Colors.white,
), ),
backgroundColor: PlatformTheme.of(context).primaryColor, backgroundColor: PlatformTheme.of(context).primaryColor,
@ -323,10 +324,10 @@ class TrackTile extends HookConsumerWidget {
Action( Action(
icon: toggler.item1 icon: toggler.item1
? const Icon( ? const Icon(
Icons.favorite_rounded, SpotubeIcons.heartFilled,
color: Colors.pink, color: Colors.pink,
) )
: const Icon(Icons.favorite_border_rounded), : const Icon(SpotubeIcons.heart),
text: const PlatformText("Save as favorite"), text: const PlatformText("Save as favorite"),
onPressed: () { onPressed: () {
toggler.item2.mutate(Tuple2(spotify, toggler.item1)); toggler.item2.mutate(Tuple2(spotify, toggler.item1));
@ -334,7 +335,7 @@ class TrackTile extends HookConsumerWidget {
), ),
if (auth.isLoggedIn) if (auth.isLoggedIn)
Action( Action(
icon: const Icon(Icons.add_box_rounded), icon: const Icon(SpotubeIcons.addFilled),
text: const PlatformText("Add To playlist"), text: const PlatformText("Add To playlist"),
onPressed: actionAddToPlaylist, onPressed: actionAddToPlaylist,
), ),
@ -345,7 +346,7 @@ class TrackTile extends HookConsumerWidget {
? const Center( ? const Center(
child: PlatformCircularProgressIndicator(), child: PlatformCircularProgressIndicator(),
) )
: const Icon(Icons.remove_circle_outline_rounded), : const Icon(SpotubeIcons.removeFilled),
text: const PlatformText("Remove from playlist"), text: const PlatformText("Remove from playlist"),
onPressed: () { onPressed: () {
removingTrack.value = track.value.uri; removingTrack.value = track.value.uri;
@ -353,7 +354,7 @@ class TrackTile extends HookConsumerWidget {
}, },
), ),
Action( Action(
icon: const Icon(Icons.share_rounded), icon: const Icon(SpotubeIcons.share),
text: const PlatformText("Share"), text: const PlatformText("Share"),
onPressed: () { onPressed: () {
actionShare(track.value); actionShare(track.value);
@ -361,7 +362,7 @@ class TrackTile extends HookConsumerWidget {
), ),
Action( Action(
icon: Icon( icon: Icon(
Icons.playlist_remove_rounded, SpotubeIcons.playlistRemove,
color: isBlackListed ? Colors.white : Colors.red[400], color: isBlackListed ? Colors.white : Colors.red[400],
), ),
backgroundColor: isBlackListed ? Colors.red[400] : null, backgroundColor: isBlackListed ? Colors.red[400] : null,

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/dialogs/confirm_download_dialog.dart'; import 'package:spotube/components/shared/dialogs/confirm_download_dialog.dart';
import 'package:spotube/components/shared/dialogs/playlist_add_track_dialog.dart'; import 'package:spotube/components/shared/dialogs/playlist_add_track_dialog.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart'; import 'package:spotube/components/shared/fallbacks/not_found.dart';
@ -139,7 +140,8 @@ class TracksTableView extends HookConsumerWidget {
value: "download", value: "download",
child: Row( child: Row(
children: [ children: [
const Icon(Icons.file_download_outlined), const Icon(SpotubeIcons.download),
const SizedBox(width: 5),
PlatformText( PlatformText(
"Download ${selectedTracks.isNotEmpty ? "(${selectedTracks.length})" : ""}", "Download ${selectedTracks.isNotEmpty ? "(${selectedTracks.length})" : ""}",
), ),
@ -152,7 +154,8 @@ class TracksTableView extends HookConsumerWidget {
value: "add-to-playlist", value: "add-to-playlist",
child: Row( child: Row(
children: [ children: [
const Icon(Icons.playlist_add_rounded), const Icon(SpotubeIcons.playlistAdd),
const SizedBox(width: 5),
PlatformText( PlatformText(
"Add (${selectedTracks.length}) to Playlist", "Add (${selectedTracks.length}) to Playlist",
), ),
@ -193,7 +196,7 @@ class TracksTableView extends HookConsumerWidget {
default: default:
} }
}, },
child: const Icon(Icons.more_vert), child: const Icon(SpotubeIcons.moreVertical),
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
], ],

View File

@ -6,6 +6,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/shimmers/shimmer_artist_profile.dart'; import 'package:spotube/components/shared/shimmers/shimmer_artist_profile.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
import 'package:spotube/components/shared/track_table/track_tile.dart'; import 'package:spotube/components/shared/track_table/track_tile.dart';
@ -229,7 +230,7 @@ class ArtistPage extends HookConsumerWidget {
PlatformIconButton( PlatformIconButton(
tooltip: "Add to blacklisted artists", tooltip: "Add to blacklisted artists",
icon: Icon( icon: Icon(
Icons.person_remove_rounded, SpotubeIcons.userRemove,
color: !isBlackListed color: !isBlackListed
? Colors.red[400] ? Colors.red[400]
: Colors.white, : Colors.white,
@ -257,7 +258,7 @@ class ArtistPage extends HookConsumerWidget {
}, },
), ),
PlatformIconButton( PlatformIconButton(
icon: const Icon(Icons.share_rounded), icon: const Icon(SpotubeIcons.share),
onPressed: () async { onPressed: () async {
await Clipboard.setData( await Clipboard.setData(
ClipboardData( ClipboardData(
@ -343,8 +344,8 @@ class ArtistPage extends HookConsumerWidget {
child: PlatformIconButton( child: PlatformIconButton(
icon: Icon( icon: Icon(
isPlaylistPlaying isPlaylistPlaying
? Icons.stop_rounded ? SpotubeIcons.stop
: Icons.play_arrow_rounded, : SpotubeIcons.play,
color: Colors.white, color: Colors.white,
), ),
onPressed: () => onPressed: () =>

View File

@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart'; import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart';
import 'package:spotube/components/shared/spotube_marquee_text.dart'; import 'package:spotube/components/shared/spotube_marquee_text.dart';
import 'package:spotube/components/lyrics/lyric_delay_adjust_dialog.dart'; import 'package:spotube/components/lyrics/lyric_delay_adjust_dialog.dart';
@ -92,7 +93,7 @@ class SyncedLyrics extends HookConsumerWidget {
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
child: PlatformFilledButton( child: PlatformFilledButton(
child: const Icon( child: const Icon(
Icons.av_timer_rounded, SpotubeIcons.clock,
size: 16, size: 16,
), ),
onPressed: () async { onPressed: () async {

View File

@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/player/player_actions.dart'; import 'package:spotube/components/player/player_actions.dart';
import 'package:spotube/components/player/player_controls.dart'; import 'package:spotube/components/player/player_controls.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
@ -192,7 +193,7 @@ class PlayerView extends HookConsumerWidget {
extraActions: [ extraActions: [
PlatformIconButton( PlatformIconButton(
tooltip: "Open Lyrics", tooltip: "Open Lyrics",
icon: const Icon(Icons.lyrics_rounded), icon: const Icon(SpotubeIcons.lyrics),
onPressed: () { onPressed: () {
GoRouter.of(context).pop(); GoRouter.of(context).pop();
GoRouter.of(context).go('/lyrics'); GoRouter.of(context).go('/lyrics');

View File

@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/album/album_card.dart'; import 'package:spotube/components/album/album_card.dart';
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'; import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart'; import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
@ -92,7 +93,7 @@ class SearchPage extends HookConsumerWidget {
ref.read(searchTermStateProvider.notifier).state = ref.read(searchTermStateProvider.notifier).state =
value; value;
}, },
prefixIcon: Icons.search_rounded, prefixIcon: SpotubeIcons.search,
prefixIconColor: PlatformProperty.only( prefixIconColor: PlatformProperty.only(
ios: ios:
PlatformTheme.of(context).textTheme?.caption?.color, PlatformTheme.of(context).textTheme?.caption?.color,

View File

@ -4,6 +4,7 @@ import 'package:collection/collection.dart';
import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
import 'package:spotube/provider/blacklist_provider.dart'; import 'package:spotube/provider/blacklist_provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -50,7 +51,7 @@ class BlackListPage extends HookConsumerWidget {
child: PlatformTextField( child: PlatformTextField(
onChanged: (value) => searchText.value = value, onChanged: (value) => searchText.value = value,
placeholder: "Search", placeholder: "Search",
prefixIcon: Icons.search_rounded, prefixIcon: SpotubeIcons.search,
), ),
), ),
ListView.builder( ListView.builder(
@ -63,8 +64,7 @@ class BlackListPage extends HookConsumerWidget {
title: PlatformText("${item.name} (${item.type.name})"), title: PlatformText("${item.name} (${item.type.name})"),
subtitle: PlatformText.caption(item.id), subtitle: PlatformText.caption(item.id),
trailing: PlatformIconButton( trailing: PlatformIconButton(
icon: Icon(Icons.delete_forever_rounded, icon: Icon(SpotubeIcons.trash, color: Colors.red[400]),
color: Colors.red[400]),
onPressed: () { onPressed: () {
ref ref
.read(BlackListNotifier.provider.notifier) .read(BlackListNotifier.provider.notifier)

View File

@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart'; import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/components/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/components/shared/adaptive/adaptive_list_tile.dart'; import 'package:spotube/components/shared/adaptive/adaptive_list_tile.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
@ -69,7 +70,7 @@ class SettingsPage extends HookConsumerWidget {
if (auth.isAnonymous) if (auth.isAnonymous)
AdaptiveListTile( AdaptiveListTile(
leading: Icon( leading: Icon(
Icons.login_rounded, SpotubeIcons.login,
color: PlatformTheme.of(context).primaryColor, color: PlatformTheme.of(context).primaryColor,
), ),
title: SizedBox( title: SizedBox(
@ -105,7 +106,7 @@ class SettingsPage extends HookConsumerWidget {
Builder(builder: (context) { Builder(builder: (context) {
Auth auth = ref.watch(authProvider); Auth auth = ref.watch(authProvider);
return PlatformListTile( return PlatformListTile(
leading: const Icon(Icons.logout_rounded), leading: const Icon(SpotubeIcons.logout),
title: SizedBox( title: SizedBox(
height: 50, height: 50,
width: 180, width: 180,
@ -140,7 +141,7 @@ class SettingsPage extends HookConsumerWidget {
?.copyWith(fontWeight: FontWeight.bold), ?.copyWith(fontWeight: FontWeight.bold),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.dashboard_rounded), leading: const Icon(SpotubeIcons.dashboard),
title: const PlatformText("Layout Mode"), title: const PlatformText("Layout Mode"),
subtitle: const PlatformText( subtitle: const PlatformText(
"Override responsive layout mode settings", "Override responsive layout mode settings",
@ -175,7 +176,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.dark_mode_outlined), leading: const Icon(SpotubeIcons.darkMode),
title: const PlatformText("Theme"), title: const PlatformText("Theme"),
trailing: (context, update) => trailing: (context, update) =>
PlatformDropDownMenu<ThemeMode>( PlatformDropDownMenu<ThemeMode>(
@ -203,7 +204,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.ad_units_rounded), leading: const Icon(SpotubeIcons.platform),
title: const PlatformText("Mimic Platform"), title: const PlatformText("Mimic Platform"),
trailing: (context, update) => trailing: (context, update) =>
DropdownButton<TargetPlatform>( DropdownButton<TargetPlatform>(
@ -239,7 +240,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.palette_outlined), leading: const Icon(SpotubeIcons.palette),
title: const PlatformText("Accent Color Scheme"), title: const PlatformText("Accent Color Scheme"),
contentPadding: const EdgeInsets.symmetric( contentPadding: const EdgeInsets.symmetric(
horizontal: 15, horizontal: 15,
@ -253,7 +254,7 @@ class SettingsPage extends HookConsumerWidget {
onTap: pickColorScheme(ColorSchemeType.accent), onTap: pickColorScheme(ColorSchemeType.accent),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.format_color_fill_rounded), leading: const Icon(SpotubeIcons.colorBucket),
title: const PlatformText("Background Color Scheme"), title: const PlatformText("Background Color Scheme"),
contentPadding: const EdgeInsets.symmetric( contentPadding: const EdgeInsets.symmetric(
horizontal: 15, horizontal: 15,
@ -267,7 +268,7 @@ class SettingsPage extends HookConsumerWidget {
onTap: pickColorScheme(ColorSchemeType.background), onTap: pickColorScheme(ColorSchemeType.background),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.album_rounded), leading: const Icon(SpotubeIcons.album),
title: const PlatformText("Rotating Album Art"), title: const PlatformText("Rotating Album Art"),
trailing: PlatformSwitch( trailing: PlatformSwitch(
value: preferences.rotatingAlbumArt, value: preferences.rotatingAlbumArt,
@ -283,7 +284,7 @@ class SettingsPage extends HookConsumerWidget {
?.copyWith(fontWeight: FontWeight.bold), ?.copyWith(fontWeight: FontWeight.bold),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.multitrack_audio_rounded), leading: const Icon(SpotubeIcons.audioQuality),
title: const PlatformText("Audio Quality"), title: const PlatformText("Audio Quality"),
trailing: (context, update) => trailing: (context, update) =>
PlatformDropDownMenu<AudioQuality>( PlatformDropDownMenu<AudioQuality>(
@ -310,7 +311,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
if (kIsMobile) if (kIsMobile)
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.download_for_offline_rounded), leading: const Icon(SpotubeIcons.download),
title: const PlatformText( title: const PlatformText(
"Pre download and play", "Pre download and play",
), ),
@ -325,7 +326,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.fast_forward_rounded), leading: const Icon(SpotubeIcons.fastForward),
title: const PlatformText( title: const PlatformText(
"Skip non-music segments (SponsorBlock)", "Skip non-music segments (SponsorBlock)",
), ),
@ -337,7 +338,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.playlist_remove_rounded), leading: const Icon(SpotubeIcons.playlistRemove),
title: const PlatformText("Blacklist"), title: const PlatformText("Blacklist"),
subtitle: const PlatformText( subtitle: const PlatformText(
"Blacklisted tracks and artists", "Blacklisted tracks and artists",
@ -345,7 +346,7 @@ class SettingsPage extends HookConsumerWidget {
onTap: () { onTap: () {
GoRouter.of(context).push("/settings/blacklist"); GoRouter.of(context).push("/settings/blacklist");
}, },
trailing: const Icon(Icons.chevron_right_rounded), trailing: const Icon(SpotubeIcons.angleRight),
), ),
PlatformText( PlatformText(
" Search", " Search",
@ -354,7 +355,7 @@ class SettingsPage extends HookConsumerWidget {
?.copyWith(fontWeight: FontWeight.bold), ?.copyWith(fontWeight: FontWeight.bold),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.shopping_bag_rounded), leading: const Icon(SpotubeIcons.shoppingBag),
title: const PlatformText("Market Place"), title: const PlatformText("Market Place"),
subtitle: PlatformText.caption( subtitle: PlatformText.caption(
"Recommendation Country", "Recommendation Country",
@ -382,7 +383,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.screen_search_desktop_rounded), leading: const Icon(SpotubeIcons.screenSearch),
title: const SizedBox( title: const SizedBox(
height: 50, height: 50,
width: 200, width: 200,
@ -401,7 +402,7 @@ class SettingsPage extends HookConsumerWidget {
child: PlatformTextField( child: PlatformTextField(
controller: ytSearchFormatController, controller: ytSearchFormatController,
suffix: PlatformFilledButton( suffix: PlatformFilledButton(
child: const Icon(Icons.save_rounded), child: const Icon(SpotubeIcons.save),
onPressed: () { onPressed: () {
preferences.setYtSearchFormat( preferences.setYtSearchFormat(
ytSearchFormatController.value.text, ytSearchFormatController.value.text,
@ -416,7 +417,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon(Icons.low_priority_rounded), leading: const Icon(SpotubeIcons.barChart),
title: SizedBox( title: SizedBox(
height: 50, height: 50,
width: 180, width: 180,
@ -465,17 +466,17 @@ class SettingsPage extends HookConsumerWidget {
?.copyWith(fontWeight: FontWeight.bold), ?.copyWith(fontWeight: FontWeight.bold),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.file_download_outlined), leading: const Icon(SpotubeIcons.download),
title: const PlatformText("Download Location"), title: const PlatformText("Download Location"),
subtitle: PlatformText(preferences.downloadLocation), subtitle: PlatformText(preferences.downloadLocation),
trailing: PlatformFilledButton( trailing: PlatformFilledButton(
onPressed: pickDownloadLocation, onPressed: pickDownloadLocation,
child: const Icon(Icons.folder_rounded), child: const Icon(SpotubeIcons.folder),
), ),
onTap: pickDownloadLocation, onTap: pickDownloadLocation,
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.lyrics_rounded), leading: const Icon(SpotubeIcons.lyrics),
title: const PlatformText( title: const PlatformText(
"Download lyrics along with the Track"), "Download lyrics along with the Track"),
trailing: PlatformSwitch( trailing: PlatformSwitch(
@ -493,7 +494,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
AdaptiveListTile( AdaptiveListTile(
leading: const Icon( leading: const Icon(
Icons.favorite_border_rounded, SpotubeIcons.heart,
color: Colors.pink, color: Colors.pink,
), ),
title: const SizedBox( title: const SizedBox(
@ -529,7 +530,7 @@ class SettingsPage extends HookConsumerWidget {
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: const [ children: const [
Icon(Icons.favorite_outline_rounded), Icon(SpotubeIcons.heart),
SizedBox(width: 5), SizedBox(width: 5),
PlatformText("Please Sponsor/Donate"), PlatformText("Please Sponsor/Donate"),
], ],
@ -537,7 +538,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.update_rounded), leading: const Icon(SpotubeIcons.update),
title: const PlatformText("Check for Update"), title: const PlatformText("Check for Update"),
trailing: PlatformSwitch( trailing: PlatformSwitch(
value: preferences.checkUpdate, value: preferences.checkUpdate,
@ -546,9 +547,9 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
PlatformListTile( PlatformListTile(
leading: const Icon(Icons.info_outline_rounded), leading: const Icon(SpotubeIcons.info),
title: const PlatformText("About Spotube"), title: const PlatformText("About Spotube"),
trailing: const Icon(Icons.arrow_forward_ios_rounded), trailing: const Icon(SpotubeIcons.angleRight),
onTap: () { onTap: () {
GoRouter.of(context).push("/settings/about"); GoRouter.of(context).push("/settings/about");
}, },

View File

@ -24,14 +24,17 @@ ThemeData darkTheme({
buttonTheme: ButtonThemeData( buttonTheme: ButtonThemeData(
buttonColor: accentMaterialColor, buttonColor: accentMaterialColor,
), ),
iconTheme: IconThemeData(size: 16, color: Colors.grey[50]),
inputDecorationTheme: InputDecorationTheme( inputDecorationTheme: InputDecorationTheme(
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide( borderSide: BorderSide(
color: accentMaterialColor[400]!, color: accentMaterialColor[400]!,
width: 2.0, width: 2.0,
), ),
), ),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide( borderSide: BorderSide(
color: backgroundMaterialColor[800]!, color: backgroundMaterialColor[800]!,
), ),
@ -39,8 +42,15 @@ ThemeData darkTheme({
), ),
navigationRailTheme: NavigationRailThemeData( navigationRailTheme: NavigationRailThemeData(
backgroundColor: backgroundMaterialColor[800], backgroundColor: backgroundMaterialColor[800],
unselectedIconTheme: IconThemeData(color: Colors.grey[300], opacity: 1), unselectedIconTheme: IconThemeData(
selectedIconTheme: IconThemeData(color: backgroundMaterialColor[850]), color: Colors.grey[300],
opacity: 1,
size: 18,
),
selectedIconTheme: IconThemeData(
color: backgroundMaterialColor[850],
size: 18,
),
selectedLabelTextStyle: TextStyle(color: accentMaterialColor[300]), selectedLabelTextStyle: TextStyle(color: accentMaterialColor[300]),
unselectedLabelTextStyle: TextStyle(color: Colors.grey[300]), unselectedLabelTextStyle: TextStyle(color: Colors.grey[300]),
indicatorColor: accentMaterialColor[300], indicatorColor: accentMaterialColor[300],
@ -49,6 +59,19 @@ ThemeData darkTheme({
backgroundColor: backgroundMaterialColor[800], backgroundColor: backgroundMaterialColor[800],
height: 55, height: 55,
indicatorColor: accentMaterialColor[300], indicatorColor: accentMaterialColor[300],
labelBehavior: NavigationDestinationLabelBehavior.alwaysHide,
iconTheme: MaterialStateProperty.resolveWith((states) {
if (states.contains(MaterialState.selected)) {
return IconThemeData(
color: Colors.grey[900],
size: 18,
);
}
return IconThemeData(
color: Colors.grey[300],
size: 18,
);
}),
), ),
cardTheme: CardTheme( cardTheme: CardTheme(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
@ -79,6 +102,7 @@ ThemeData darkTheme({
if (states.contains(MaterialState.selected)) { if (states.contains(MaterialState.selected)) {
return accentMaterialColor[500]; return accentMaterialColor[500];
} }
return null;
}), }),
), ),
tabBarTheme: TabBarTheme( tabBarTheme: TabBarTheme(

View File

@ -50,24 +50,35 @@ ThemeData lightTheme({
iconColor: Colors.grey[850], iconColor: Colors.grey[850],
horizontalTitleGap: 0, horizontalTitleGap: 0,
), ),
iconTheme: const IconThemeData(size: 16),
inputDecorationTheme: InputDecorationTheme( inputDecorationTheme: InputDecorationTheme(
isDense: true,
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide( borderSide: BorderSide(
color: accentMaterialColor[400]!, color: accentMaterialColor[400]!,
width: 2.0, width: 2.0,
), ),
), ),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide( borderSide: BorderSide(
color: Colors.grey[800]!, color: Colors.grey[600]!,
), ),
), ),
), ),
navigationRailTheme: NavigationRailThemeData( navigationRailTheme: NavigationRailThemeData(
backgroundColor: backgroundMaterialColor[100], backgroundColor: backgroundMaterialColor[100],
indicatorColor: accentMaterialColor[300], indicatorColor: accentMaterialColor[300],
selectedIconTheme: IconThemeData(color: accentMaterialColor[850]), selectedIconTheme: IconThemeData(
unselectedIconTheme: IconThemeData(color: Colors.grey[850], opacity: 1), color: accentMaterialColor[850],
size: 18,
),
unselectedIconTheme: IconThemeData(
color: Colors.grey[850],
opacity: 1,
size: 18,
),
unselectedLabelTextStyle: TextStyle( unselectedLabelTextStyle: TextStyle(
color: Colors.grey[850], color: Colors.grey[850],
), ),
@ -77,8 +88,9 @@ ThemeData lightTheme({
height: 55, height: 55,
indicatorColor: accentMaterialColor[300], indicatorColor: accentMaterialColor[300],
iconTheme: MaterialStateProperty.all( iconTheme: MaterialStateProperty.all(
IconThemeData(color: Colors.grey[850]), IconThemeData(color: Colors.grey[850], size: 18),
), ),
labelBehavior: NavigationDestinationLabelBehavior.alwaysHide,
), ),
cardTheme: CardTheme( cardTheme: CardTheme(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
@ -122,6 +134,7 @@ ThemeData lightTheme({
} }
final windowsTheme = fluent_ui.ThemeData.light().copyWith( final windowsTheme = fluent_ui.ThemeData.light().copyWith(
iconTheme: const IconThemeData(size: 16),
buttonTheme: fluent_ui.ButtonThemeData( buttonTheme: fluent_ui.ButtonThemeData(
iconButtonStyle: fluent_ui.ButtonStyle( iconButtonStyle: fluent_ui.ButtonStyle(
iconSize: fluent_ui.ButtonState.all(20), iconSize: fluent_ui.ButtonState.all(20),
@ -129,6 +142,7 @@ final windowsTheme = fluent_ui.ThemeData.light().copyWith(
), ),
); );
final windowsDarkTheme = fluent_ui.ThemeData.dark().copyWith( final windowsDarkTheme = fluent_ui.ThemeData.dark().copyWith(
iconTheme: const IconThemeData(size: 16),
buttonTheme: fluent_ui.ButtonThemeData( buttonTheme: fluent_ui.ButtonThemeData(
iconButtonStyle: fluent_ui.ButtonStyle( iconButtonStyle: fluent_ui.ButtonStyle(
iconSize: fluent_ui.ButtonState.all(20), iconSize: fluent_ui.ButtonState.all(20),
@ -139,14 +153,14 @@ final macosTheme = MacosThemeData.light().copyWith(
pushButtonTheme: const PushButtonThemeData( pushButtonTheme: const PushButtonThemeData(
secondaryColor: Colors.white, secondaryColor: Colors.white,
), ),
iconTheme: const MacosIconThemeData(size: 14), iconTheme: const MacosIconThemeData(size: 16),
typography: MacosTypography(color: Colors.grey[900]!), typography: MacosTypography(color: Colors.grey[900]!),
); );
final macosDarkTheme = MacosThemeData.dark().copyWith( final macosDarkTheme = MacosThemeData.dark().copyWith(
pushButtonTheme: const PushButtonThemeData( pushButtonTheme: const PushButtonThemeData(
secondaryColor: Colors.white, secondaryColor: Colors.white,
), ),
iconTheme: const MacosIconThemeData(size: 14), iconTheme: const MacosIconThemeData(size: 16),
typography: MacosTypography(color: MacosColors.textColor), typography: MacosTypography(color: MacosColors.textColor),
); );
const iosTheme = CupertinoThemeData(brightness: Brightness.light); const iosTheme = CupertinoThemeData(brightness: Brightness.light);
@ -156,6 +170,7 @@ const iosDarkTheme = CupertinoThemeData(
final linuxTheme = AdwaitaThemeData.light().copyWith( final linuxTheme = AdwaitaThemeData.light().copyWith(
primaryColor: const Color(0xFF3582e5), primaryColor: const Color(0xFF3582e5),
iconTheme: const IconThemeData(size: 16),
extensions: [ extensions: [
ShimmerColorTheme( ShimmerColorTheme(
shimmerBackgroundColor: Colors.grey[300], shimmerBackgroundColor: Colors.grey[300],
@ -182,6 +197,7 @@ final linuxTheme = AdwaitaThemeData.light().copyWith(
), ),
); );
final linuxDarkTheme = AdwaitaThemeData.dark().copyWith( final linuxDarkTheme = AdwaitaThemeData.dark().copyWith(
iconTheme: IconThemeData(size: 16, color: Colors.grey[50]),
extensions: [ extensions: [
ShimmerColorTheme( ShimmerColorTheme(
shimmerBackgroundColor: Colors.grey[800], shimmerBackgroundColor: Colors.grey[800],

View File

@ -484,6 +484,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.3" version: "4.0.3"
fluentui_system_icons:
dependency: "direct main"
description:
name: fluentui_system_icons
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.189"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -524,6 +531,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.2" version: "0.0.2"
flutter_feather_icons:
dependency: "direct main"
description:
name: flutter_feather_icons
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0+1"
flutter_hooks: flutter_hooks:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -70,6 +70,8 @@ dependencies:
url: https://github.com/google/flutter-desktop-embedding.git url: https://github.com/google/flutter-desktop-embedding.git
ref: a738913c8ce2c9f47515382d40827e794a334274 ref: a738913c8ce2c9f47515382d40827e794a334274
path: plugins/window_size path: plugins/window_size
flutter_feather_icons: ^2.0.0+1
fluentui_system_icons: ^1.1.189
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

View File

@ -5,8 +5,8 @@
// gestures. You can also use WidgetTester to find child widgets in the widget // gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct. // tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/main.dart'; import 'package:spotube/main.dart';
@ -20,7 +20,7 @@ void main() {
expect(find.text('1'), findsNothing); expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame. // Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add)); await tester.tap(find.byIcon(SpotubeIcons.add));
await tester.pump(); await tester.pump();
// Verify that our counter has incremented. // Verify that our counter has incremented.