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:spotube/collections/spotube_icons.dart';
class SideBarTiles {
final IconData icon;
@ -7,8 +8,8 @@ class SideBarTiles {
}
List<SideBarTiles> sidebarTileList = [
SideBarTiles(icon: Icons.home_rounded, title: "Browse"),
SideBarTiles(icon: Icons.search_rounded, title: "Search"),
SideBarTiles(icon: Icons.library_books_rounded, title: "Library"),
SideBarTiles(icon: Icons.music_note_rounded, title: "Lyrics")
SideBarTiles(icon: SpotubeIcons.home, title: "Browse"),
SideBarTiles(icon: SpotubeIcons.search, title: "Search"),
SideBarTiles(icon: SpotubeIcons.library, title: "Library"),
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:hooks_riverpod/hooks_riverpod.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/shared/playbutton_card.dart';
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
@ -72,7 +73,7 @@ class UserAlbums extends HookConsumerWidget {
children: [
PlatformTextField(
onChanged: (value) => searchText.value = value,
prefixIcon: Icons.filter_alt_outlined,
prefixIcon: SpotubeIcons.filter,
placeholder: 'Filter Albums...',
),
const SizedBox(height: 20),

View File

@ -6,6 +6,7 @@ import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.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/waypoint.dart';
import 'package:spotube/components/artist/artist_card.dart';
@ -63,7 +64,7 @@ class UserArtists extends HookConsumerWidget {
color: PlatformTheme.of(context).scaffoldBackgroundColor!,
child: PlatformTextField(
onChanged: (value) => searchText.value = value,
prefixIcon: Icons.filter_alt_outlined,
prefixIcon: SpotubeIcons.filter,
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:platform_ui/platform_ui.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/shimmers/shimmer_track_tile.dart';
import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
@ -208,9 +209,7 @@ class UserLocalTracks extends HookConsumerWidget {
children: [
const Text("Play"),
Icon(
isPlaylistPlaying
? Icons.stop_rounded
: Icons.play_arrow_rounded,
isPlaylistPlaying ? SpotubeIcons.stop : SpotubeIcons.play,
)
],
),
@ -226,7 +225,7 @@ class UserLocalTracks extends HookConsumerWidget {
),
const SizedBox(width: 10),
PlatformFilledButton(
child: const Icon(Icons.refresh_rounded),
child: const Icon(SpotubeIcons.refresh),
onPressed: () {
ref.refresh(localTracksProvider);
},

View File

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

View File

@ -1,8 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.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/pages/lyrics/synced_lyrics.dart';
@ -80,7 +80,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
mainAxisSize: MainAxisSize.min,
children: [
PlatformIconButton(
icon: const Icon(Icons.remove_rounded),
icon: const Icon(SpotubeIcons.remove),
onPressed: () {
controller.text = "${getValue() - 25}ms";
},
@ -100,7 +100,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
),
),
PlatformIconButton(
icon: const Icon(Icons.add_rounded),
icon: const Icon(SpotubeIcons.add),
onPressed: () {
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:platform_ui/platform_ui.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/player/player_queue.dart';
import 'package:spotube/components/player/sibling_tracks_sheet.dart';
@ -53,7 +54,7 @@ class PlayerActions extends HookConsumerWidget {
mainAxisAlignment: mainAxisAlignment,
children: [
PlatformIconButton(
icon: const Icon(Icons.queue_music_rounded),
icon: const Icon(SpotubeIcons.queue),
tooltip: 'Queue',
onPressed: playback.playlist != null
? () {
@ -79,7 +80,7 @@ class PlayerActions extends HookConsumerWidget {
),
if (!isLocalTrack)
PlatformIconButton(
icon: const Icon(Icons.alt_route_rounded),
icon: const Icon(SpotubeIcons.alternativeRoute),
tooltip: "Alternative Track Sources",
onPressed: playback.track != null
? () {
@ -116,9 +117,7 @@ class PlayerActions extends HookConsumerWidget {
PlatformIconButton(
tooltip: 'Download track',
icon: Icon(
isDownloaded
? Icons.download_done_rounded
: Icons.download_rounded,
isDownloaded ? SpotubeIcons.done : SpotubeIcons.download,
),
onPressed: playback.track != null
? () => downloader.addToQueue(playback.track!)

View File

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

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.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/provider/spotify_provider.dart';
import 'package:spotube/services/queries/queries.dart';
@ -138,7 +139,7 @@ class PlaylistCreateDialog extends HookConsumerWidget {
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.add_box_rounded, size: 40),
Icon(SpotubeIcons.addFilled, size: 40),
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:platform_ui/platform_ui.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/hooks/use_breakpoints.dart';
import 'package:spotube/provider/auth_provider.dart';
@ -175,7 +176,7 @@ class Sidebar extends HookConsumerWidget {
),
windowsFooterItems: [
fluent_ui.PaneItemAction(
icon: const fluent_ui.Icon(fluent_ui.FluentIcons.settings),
icon: const Icon(SpotubeIcons.settings),
onTap: () => goToSettings(context),
),
],
@ -192,8 +193,6 @@ class SidebarFooter extends HookConsumerWidget {
@override
Widget build(BuildContext context, ref) {
final auth = ref.watch(authProvider);
return SizedBox(
width: 256,
child: HookBuilder(
@ -268,7 +267,7 @@ class SidebarFooter extends HookConsumerWidget {
),
),
PlatformIconButton(
icon: const Icon(Icons.settings_outlined),
icon: const Icon(SpotubeIcons.settings),
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:platform_ui/platform_ui.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/hooks/use_breakpoints.dart';
import 'package:spotube/provider/downloader_provider.dart';
@ -48,7 +49,7 @@ class SpotubeNavigationBar extends HookConsumerWidget {
},
),
const PlatformBottomNavigationBarItem(
icon: Icons.settings_rounded,
icon: SpotubeIcons.settings,
label: "Settings",
)
],

View File

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

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:popover/popover.dart';
import 'package:spotube/collections/spotube_icons.dart';
class CompactSearch extends HookWidget {
final ValueChanged<String>? onChanged;
@ -13,7 +14,7 @@ class CompactSearch extends HookWidget {
Key? key,
this.onChanged,
this.placeholder = "Search...",
this.icon = Icons.search,
this.icon = SpotubeIcons.search,
this.iconColor,
}) : 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:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/hooks/use_palette_color.dart';
import 'package:spotube/provider/auth_provider.dart';
import 'package:spotube/provider/spotify_provider.dart';
@ -38,10 +39,7 @@ class HeartButton extends ConsumerWidget {
return PlatformIconButton(
tooltip: tooltip,
icon: Icon(
icon ??
(!isLiked
? Icons.favorite_outline_rounded
: Icons.favorite_rounded),
icon ?? (!isLiked ? SpotubeIcons.heart : SpotubeIcons.heartFilled),
color: isLiked ? Colors.pink : color,
),
onPressed: onPressed,

View File

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

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/library/user_local_tracks.dart';
class SortTracksDropdown extends StatelessWidget {
@ -48,7 +49,7 @@ class SortTracksDropdown extends StatelessWidget {
],
onSelected: onChanged,
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:hooks_riverpod/hooks_riverpod.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/shimmers/shimmer_track_tile.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart';
@ -70,7 +71,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
if (showShare)
PlatformIconButton(
icon: Icon(
Icons.share_rounded,
SpotubeIcons.share,
color: color?.titleTextColor,
),
onPressed: onShare,
@ -79,7 +80,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
PlatformIconButton(
tooltip: "Shuffle",
icon: Icon(
Icons.shuffle,
SpotubeIcons.shuffle,
color: color?.titleTextColor,
),
onPressed: onShuffledPlay,
@ -90,7 +91,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
backgroundColor: PlatformTheme.of(context).primaryColor,
onPressed: tracksSnapshot.data != null ? onPlay : null,
icon: Icon(
isPlaying ? Icons.stop_rounded : Icons.play_arrow_rounded,
isPlaying ? SpotubeIcons.stop : SpotubeIcons.play,
color: PlatformTextTheme.of(context).body?.color,
),
),
@ -167,7 +168,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
borderColor: color?.titleTextColor,
prefixIconColor: 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:platform_ui/platform_ui.dart';
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/heart_button.dart';
import 'package:spotube/components/shared/links/link_text.dart';
@ -236,13 +237,13 @@ class TrackTile extends HookConsumerWidget {
),
),
Padding(
padding: const EdgeInsets.all(8.0).copyWith(left: 0),
padding: const EdgeInsets.all(8.0),
child: PlatformIconButton(
icon: Icon(
playback.track?.id != null &&
playback.track?.id == track.value.id
? Icons.pause_rounded
: Icons.play_arrow_rounded,
? SpotubeIcons.pause
: SpotubeIcons.play,
color: Colors.white,
),
backgroundColor: PlatformTheme.of(context).primaryColor,
@ -323,10 +324,10 @@ class TrackTile extends HookConsumerWidget {
Action(
icon: toggler.item1
? const Icon(
Icons.favorite_rounded,
SpotubeIcons.heartFilled,
color: Colors.pink,
)
: const Icon(Icons.favorite_border_rounded),
: const Icon(SpotubeIcons.heart),
text: const PlatformText("Save as favorite"),
onPressed: () {
toggler.item2.mutate(Tuple2(spotify, toggler.item1));
@ -334,7 +335,7 @@ class TrackTile extends HookConsumerWidget {
),
if (auth.isLoggedIn)
Action(
icon: const Icon(Icons.add_box_rounded),
icon: const Icon(SpotubeIcons.addFilled),
text: const PlatformText("Add To playlist"),
onPressed: actionAddToPlaylist,
),
@ -345,7 +346,7 @@ class TrackTile extends HookConsumerWidget {
? const Center(
child: PlatformCircularProgressIndicator(),
)
: const Icon(Icons.remove_circle_outline_rounded),
: const Icon(SpotubeIcons.removeFilled),
text: const PlatformText("Remove from playlist"),
onPressed: () {
removingTrack.value = track.value.uri;
@ -353,7 +354,7 @@ class TrackTile extends HookConsumerWidget {
},
),
Action(
icon: const Icon(Icons.share_rounded),
icon: const Icon(SpotubeIcons.share),
text: const PlatformText("Share"),
onPressed: () {
actionShare(track.value);
@ -361,7 +362,7 @@ class TrackTile extends HookConsumerWidget {
),
Action(
icon: Icon(
Icons.playlist_remove_rounded,
SpotubeIcons.playlistRemove,
color: isBlackListed ? Colors.white : Colors.red[400],
),
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:platform_ui/platform_ui.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/playlist_add_track_dialog.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart';
@ -139,7 +140,8 @@ class TracksTableView extends HookConsumerWidget {
value: "download",
child: Row(
children: [
const Icon(Icons.file_download_outlined),
const Icon(SpotubeIcons.download),
const SizedBox(width: 5),
PlatformText(
"Download ${selectedTracks.isNotEmpty ? "(${selectedTracks.length})" : ""}",
),
@ -152,7 +154,8 @@ class TracksTableView extends HookConsumerWidget {
value: "add-to-playlist",
child: Row(
children: [
const Icon(Icons.playlist_add_rounded),
const Icon(SpotubeIcons.playlistAdd),
const SizedBox(width: 5),
PlatformText(
"Add (${selectedTracks.length}) to Playlist",
),
@ -193,7 +196,7 @@ class TracksTableView extends HookConsumerWidget {
default:
}
},
child: const Icon(Icons.more_vert),
child: const Icon(SpotubeIcons.moreVertical),
),
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:platform_ui/platform_ui.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/page_window_title_bar.dart';
import 'package:spotube/components/shared/track_table/track_tile.dart';
@ -229,7 +230,7 @@ class ArtistPage extends HookConsumerWidget {
PlatformIconButton(
tooltip: "Add to blacklisted artists",
icon: Icon(
Icons.person_remove_rounded,
SpotubeIcons.userRemove,
color: !isBlackListed
? Colors.red[400]
: Colors.white,
@ -257,7 +258,7 @@ class ArtistPage extends HookConsumerWidget {
},
),
PlatformIconButton(
icon: const Icon(Icons.share_rounded),
icon: const Icon(SpotubeIcons.share),
onPressed: () async {
await Clipboard.setData(
ClipboardData(
@ -343,8 +344,8 @@ class ArtistPage extends HookConsumerWidget {
child: PlatformIconButton(
icon: Icon(
isPlaylistPlaying
? Icons.stop_rounded
: Icons.play_arrow_rounded,
? SpotubeIcons.stop
: SpotubeIcons.play,
color: Colors.white,
),
onPressed: () =>

View File

@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.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/spotube_marquee_text.dart';
import 'package:spotube/components/lyrics/lyric_delay_adjust_dialog.dart';
@ -92,7 +93,7 @@ class SyncedLyrics extends HookConsumerWidget {
alignment: Alignment.centerRight,
child: PlatformFilledButton(
child: const Icon(
Icons.av_timer_rounded,
SpotubeIcons.clock,
size: 16,
),
onPressed: () async {

View File

@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.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_controls.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart';
@ -192,7 +193,7 @@ class PlayerView extends HookConsumerWidget {
extraActions: [
PlatformIconButton(
tooltip: "Open Lyrics",
icon: const Icon(Icons.lyrics_rounded),
icon: const Icon(SpotubeIcons.lyrics),
onPressed: () {
GoRouter.of(context).pop();
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:platform_ui/platform_ui.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/shared/shimmers/shimmer_playbutton_card.dart';
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
@ -92,7 +93,7 @@ class SearchPage extends HookConsumerWidget {
ref.read(searchTermStateProvider.notifier).state =
value;
},
prefixIcon: Icons.search_rounded,
prefixIcon: SpotubeIcons.search,
prefixIconColor: PlatformProperty.only(
ios:
PlatformTheme.of(context).textTheme?.caption?.color,

View File

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

View File

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

View File

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

View File

@ -484,6 +484,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
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:
dependency: "direct main"
description: flutter
@ -524,6 +531,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
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:
dependency: "direct main"
description:

View File

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

View File

@ -5,8 +5,8 @@
// 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.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/main.dart';
@ -20,7 +20,7 @@ void main() {
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.tap(find.byIcon(SpotubeIcons.add));
await tester.pump();
// Verify that our counter has incremented.