From d69d894e2748685851fe16a05df41c97497d3f54 Mon Sep 17 00:00:00 2001 From: ananyaaa66 Date: Tue, 31 Mar 2026 23:01:13 +0530 Subject: [PATCH] feat: Add predefined label icons for common torrent categories (#108) - Create label_icon_mapper.dart with mappings for video, audio, games, books, software, tv, anime, etc. - Update LabelTile to use getLabelIcon() for context-specific icons - Falls back to default label icon for custom/unrecognized labels Closes #108 --- .../dumb_widgets/label_tile_widget.dart | 3 +- lib/utils/label_icon_mapper.dart | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 lib/utils/label_icon_mapper.dart diff --git a/lib/ui/widgets/dumb_widgets/label_tile_widget.dart b/lib/ui/widgets/dumb_widgets/label_tile_widget.dart index d3a0d2e..1355c3b 100644 --- a/lib/ui/widgets/dumb_widgets/label_tile_widget.dart +++ b/lib/ui/widgets/dumb_widgets/label_tile_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rutorrentflutter/theme/app_state_notifier.dart'; import 'package:rutorrentflutter/ui/widgets/smart_widgets/Drawer/drawer_viewmodel.dart'; +import 'package:rutorrentflutter/utils/label_icon_mapper.dart'; class LabelTile extends StatelessWidget { final DrawerViewModel model; @@ -15,7 +16,7 @@ class LabelTile extends StatelessWidget { child: ListTile( dense: true, leading: Icon( - Icons.label_important_outline, + getLabelIcon(label), color: isSelected ? Colors.white : !AppStateNotifier.isDarkModeOn diff --git a/lib/utils/label_icon_mapper.dart b/lib/utils/label_icon_mapper.dart new file mode 100644 index 0000000..a68f9f1 --- /dev/null +++ b/lib/utils/label_icon_mapper.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// Maps predefined label names (lowercase) to specific icons. +/// This provides visual identification of common torrent categories +/// in the drawer's Labels section, similar to the ruTorrent web interface. +const Map _labelIconMap = { + 'video': Icons.movie_outlined, + 'videos': Icons.movie_outlined, + 'movie': Icons.movie_outlined, + 'movies': Icons.movie_outlined, + 'film': Icons.movie_outlined, + 'films': Icons.movie_outlined, + 'audio': Icons.music_note_outlined, + 'music': Icons.music_note_outlined, + 'songs': Icons.music_note_outlined, + 'tv': Icons.tv_outlined, + 'television': Icons.tv_outlined, + 'tv shows': Icons.tv_outlined, + 'series': Icons.tv_outlined, + 'games': Icons.sports_esports_outlined, + 'game': Icons.sports_esports_outlined, + 'gaming': Icons.sports_esports_outlined, + 'books': Icons.menu_book_outlined, + 'book': Icons.menu_book_outlined, + 'ebooks': Icons.menu_book_outlined, + 'ebook': Icons.menu_book_outlined, + 'software': Icons.computer_outlined, + 'apps': Icons.computer_outlined, + 'application': Icons.computer_outlined, + 'applications': Icons.computer_outlined, + 'documents': Icons.description_outlined, + 'document': Icons.description_outlined, + 'docs': Icons.description_outlined, + 'images': Icons.image_outlined, + 'image': Icons.image_outlined, + 'photos': Icons.image_outlined, + 'photo': Icons.image_outlined, + 'pictures': Icons.image_outlined, + 'anime': Icons.animation_outlined, + 'podcast': Icons.podcasts_outlined, + 'podcasts': Icons.podcasts_outlined, + 'sports': Icons.sports_outlined, + 'sport': Icons.sports_outlined, + 'adult': Icons.eighteen_up_rating_outlined, + 'xxx': Icons.eighteen_up_rating_outlined, + 'linux': Icons.computer_outlined, + 'iso': Icons.album_outlined, +}; + +/// Returns the appropriate icon for a given label name. +/// Falls back to [Icons.label_important_outline] for unrecognized labels. +IconData getLabelIcon(String label) { + return _labelIconMap[label.toLowerCase().trim()] ?? + Icons.label_important_outline; +}