From 73a11dc429b219c6681bbdf31084580656613495 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Mon, 24 Jan 2022 17:55:58 +0600 Subject: [PATCH] Album & Artist names are clickable now Artist & Album text now navigates to the AlbumView/ArtistProfile pages --- lib/components/Album/AlbumView.dart | 2 +- lib/components/Player/Player.dart | 8 ++- lib/components/Shared/LinkText.dart | 50 +++++++++++++++++++ lib/components/Shared/TracksTableView.dart | 16 +++--- lib/helpers/artists-to-clickable-artists.dart | 24 +++++++++ lib/helpers/simple-track-to-track.dart | 2 +- 6 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 lib/components/Shared/LinkText.dart create mode 100644 lib/helpers/artists-to-clickable-artists.dart diff --git a/lib/components/Album/AlbumView.dart b/lib/components/Album/AlbumView.dart index 37019c74..1f13ffc0 100644 --- a/lib/components/Album/AlbumView.dart +++ b/lib/components/Album/AlbumView.dart @@ -8,7 +8,7 @@ import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/SpotifyDI.dart'; class AlbumView extends StatelessWidget { - final Album album; + final AlbumSimple album; const AlbumView(this.album, {Key? key}) : super(key: key); playPlaylist(Playback playback, List tracks, {Track? currentTrack}) { diff --git a/lib/components/Player/Player.dart b/lib/components/Player/Player.dart index e4d4e345..7031b6b1 100644 --- a/lib/components/Player/Player.dart +++ b/lib/components/Player/Player.dart @@ -4,9 +4,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:just_audio/just_audio.dart'; import 'package:spotify/spotify.dart'; +import 'package:spotube/components/Artist/ArtistProfile.dart'; import 'package:spotube/components/Shared/DownloadTrackButton.dart'; import 'package:spotube/components/Player/PlayerControls.dart'; +import 'package:spotube/components/Shared/LinkText.dart'; import 'package:spotube/helpers/artist-to-string.dart'; +import 'package:spotube/helpers/artists-to-clickable-artists.dart'; import 'package:spotube/helpers/search-youtube.dart'; import 'package:spotube/models/GlobalKeyActions.dart'; import 'package:spotube/provider/Playback.dart'; @@ -240,8 +243,9 @@ class _PlayerState extends State with WidgetsBindingObserver { playback.currentTrack?.name ?? "Not playing", style: const TextStyle(fontWeight: FontWeight.bold), ), - Text(artistsToString( - playback.currentTrack?.artists ?? [])) + artistsToClickableArtists( + playback.currentTrack?.artists ?? [], + ) ], ), ), diff --git a/lib/components/Shared/LinkText.dart b/lib/components/Shared/LinkText.dart new file mode 100644 index 00000000..634c96b3 --- /dev/null +++ b/lib/components/Shared/LinkText.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +class LinkText extends StatefulWidget { + final String text; + final TextStyle style; + final TextAlign? textAign; + final TextOverflow? overflow; + final Route route; + + const LinkText( + this.text, + this.route, { + Key? key, + this.textAign, + this.overflow, + this.style = const TextStyle(), + }) : super(key: key); + + @override + State> createState() => _LinkTextState(); +} + +class _LinkTextState extends State> { + bool _hover = false; + bool _tap = false; + + @override + Widget build(BuildContext context) { + return GestureDetector( + child: MouseRegion( + cursor: MaterialStateMouseCursor.clickable, + child: Text( + widget.text, + style: widget.style.copyWith( + decoration: _hover || _tap ? TextDecoration.underline : null, + ), + textAlign: widget.textAign, + overflow: widget.overflow, + ), + onEnter: (event) => setState(() => _hover = true), + onExit: (event) => setState(() => _hover = false), + ), + onTapDown: (event) => setState(() => _tap = true), + onTapUp: (event) => setState(() => _tap = false), + onTap: () { + Navigator.of(context).push(widget.route); + }, + ); + } +} diff --git a/lib/components/Shared/TracksTableView.dart b/lib/components/Shared/TracksTableView.dart index 3e1fc5f9..e566461d 100644 --- a/lib/components/Shared/TracksTableView.dart +++ b/lib/components/Shared/TracksTableView.dart @@ -2,6 +2,10 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:spotify/spotify.dart'; +import 'package:spotube/components/Album/AlbumView.dart'; +import 'package:spotube/components/Artist/ArtistProfile.dart'; +import 'package:spotube/components/Shared/LinkText.dart'; +import 'package:spotube/helpers/artists-to-clickable-artists.dart'; import 'package:spotube/helpers/zero-pad-num-str.dart'; import 'package:spotube/provider/Playback.dart'; @@ -76,12 +80,7 @@ class TracksTableView extends StatelessWidget { ), overflow: TextOverflow.ellipsis, ), - Text( - (track.value.artists ?? []) - .map((e) => e.name) - .join(", "), - overflow: TextOverflow.ellipsis, - ), + artistsToClickableArtists(track.value.artists ?? []), ], ), ), @@ -91,8 +90,11 @@ class TracksTableView extends StatelessWidget { TableCell( child: Padding( padding: const EdgeInsets.all(8.0), - child: Text( + child: LinkText( track.value.album?.name ?? "", + MaterialPageRoute( + builder: (context) => AlbumView(track.value.album!), + ), overflow: TextOverflow.ellipsis, ), ), diff --git a/lib/helpers/artists-to-clickable-artists.dart b/lib/helpers/artists-to-clickable-artists.dart new file mode 100644 index 00000000..94508777 --- /dev/null +++ b/lib/helpers/artists-to-clickable-artists.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:spotify/spotify.dart'; +import 'package:spotube/components/Artist/ArtistProfile.dart'; +import 'package:spotube/components/Shared/LinkText.dart'; + +Widget artistsToClickableArtists(List artists) { + return Row( + children: artists + .asMap() + .entries + .map( + (artist) => LinkText( + (artist.key != artists.length - 1) + ? "${artist.value.name}, " + : artist.value.name!, + MaterialPageRoute( + builder: (context) => ArtistProfile(artist.value.id!), + ), + overflow: TextOverflow.ellipsis, + ), + ) + .toList(), + ); +} diff --git a/lib/helpers/simple-track-to-track.dart b/lib/helpers/simple-track-to-track.dart index 8a6a234a..74c1ba1b 100644 --- a/lib/helpers/simple-track-to-track.dart +++ b/lib/helpers/simple-track-to-track.dart @@ -1,6 +1,6 @@ import 'package:spotify/spotify.dart'; -Track simpleTrackToTrack(TrackSimple trackSmp, Album album) { +Track simpleTrackToTrack(TrackSimple trackSmp, AlbumSimple album) { Track track = Track(); track.name = trackSmp.name; track.album = album;