Skip to content

Commit

Permalink
feat: action when adding duplicated tracks to playlist
Browse files Browse the repository at this point in the history
+ undo button
closes #120
  • Loading branch information
MSOB7YY committed Feb 4, 2024
1 parent d0aaf86 commit 5c832b0
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 4 deletions.
127 changes: 124 additions & 3 deletions lib/controller/playlist_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'dart:io';

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:namida/core/icon_fonts/broken_icons.dart';
import 'package:path/path.dart' as p;
import 'package:playlist_manager/playlist_manager.dart';

Expand All @@ -20,6 +19,8 @@ import 'package:namida/core/constants.dart';
import 'package:namida/core/enums.dart';
import 'package:namida/core/extensions.dart';
import 'package:namida/core/functions.dart';
import 'package:namida/core/icon_fonts/broken_icons.dart';
import 'package:namida/core/namida_converter_ext.dart';
import 'package:namida/core/translations/language.dart';
import 'package:namida/ui/widgets/custom_widgets.dart';

Expand Down Expand Up @@ -56,12 +57,132 @@ class PlaylistController extends PlaylistManager<TrackWithDate> {
}

void addTracksToPlaylist(Playlist playlist, List<Track> tracks, {TrackSource source = TrackSource.local}) async {
final newtracks = tracks.mapped((e) => TrackWithDate(
Iterable<TrackWithDate> convertTracks(List<Track> trs) => trs.map((e) => TrackWithDate(
dateAdded: currentTimeMS,
track: e,
source: source,
));
super.addTracksToPlaylistRaw(playlist, newtracks);
final oldTracksList = List<TrackWithDate>.from(playlist.tracks); // for undo
int addedTracksLength = tracks.length;

if (playlist.tracks.any((element) => tracks.contains(element.track))) {
TrackWithDate convertTrack(Track e) => TrackWithDate(
dateAdded: currentTimeMS,
track: e,
source: source,
);
final action = await _showDuplicatedDialogAction();
switch (action) {
case PlaylistAddDuplicateAction.justAddEverything:
playlist.tracks.addAll(convertTracks(tracks));
break;
case PlaylistAddDuplicateAction.addAllAndRemoveOldOnes:
final currentTracks = <Track, List<int>>{};
playlist.tracks.loop((e, index) => currentTracks.addForce(e.track, index));

final indicesToRemove = <int>[];
tracks.loop((e, _) {
// -- removing same tracks existing in playlist
final indexesInPlaylist = currentTracks[e];
if (indexesInPlaylist != null) {
indicesToRemove.addAll(indexesInPlaylist);
}
});
indicesToRemove.sortByReverse((e) => e);
indicesToRemove.loop((indexToRemove, _) => playlist.tracks.removeAt(indexToRemove));
playlist.tracks.addAll(convertTracks(tracks));
break;
case PlaylistAddDuplicateAction.addOnlyMissing:
final currentTracks = <Track, int>{};
playlist.tracks.loop((e, index) => currentTracks[e.track] = index);
tracks.loop((e, _) {
if (currentTracks[e] == null) {
playlist.tracks.add(convertTrack(e));
} else {
addedTracksLength--;
}
});

break;
default:
addedTracksLength = 0;
return;
}
} else {
playlist.tracks.addAll(convertTracks(tracks));
}

snackyy(
message: "${lang.ADDED} ${addedTracksLength.displayTrackKeyword}",
displaySeconds: 2,
button: TextButton(
onPressed: () async {
updatePropertyInPlaylist(playlist.name, tracks: oldTracksList, modifiedDate: currentTimeMS);
Get.closeAllSnackbars();
},
child: Text(lang.UNDO),
),
);

super.addTracksToPlaylistRaw(playlist, [] /* added manually */);
}

Future<PlaylistAddDuplicateAction?> _showDuplicatedDialogAction() async {
final action = Rxn<PlaylistAddDuplicateAction>();
await NamidaNavigator.inst.navigateDialog(
onDismissing: () {
action.close();
},
dialog: CustomBlurryDialog(
normalTitleStyle: true,
title: lang.CONFIRM,
actions: [
TextButton(
onPressed: () {
action.value = null;
NamidaNavigator.inst.closeDialog();
},
child: Text(lang.CANCEL),
),
Obx(
() => NamidaButton(
enabled: action.value != null,
text: lang.CONFIRM,
onPressed: NamidaNavigator.inst.closeDialog,
),
),
],
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
lang.DUPLICATED_ITEMS_ADDING,
style: Get.textTheme.displayMedium,
),
Column(
children: PlaylistAddDuplicateAction.values
.map(
(e) => Padding(
padding: const EdgeInsets.all(3.0),
child: Obx(
() => ListTileWithCheckMark(
active: action.value == e,
title: e.toText(),
onTap: () => action.value = e,
),
),
),
)
.toList(),
),
],
),
),
),
);
return action.value;
}

Future<bool> favouriteButtonOnPressed(Track track) async {
Expand Down
6 changes: 6 additions & 0 deletions lib/core/enums.dart
Original file line number Diff line number Diff line change
Expand Up @@ -350,3 +350,9 @@ enum SetMusicAsAction {
notification,
alarm,
}

enum PlaylistAddDuplicateAction {
justAddEverything,
addAllAndRemoveOldOnes,
addOnlyMissing,
}
9 changes: 9 additions & 0 deletions lib/core/namida_converter_ext.dart
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,10 @@ extension YTHomePagesUils on YTHomePages {
String toText() => _NamidaConverters.inst.getTitle(this);
}

extension PlaylistAddDuplicateActionUtils on PlaylistAddDuplicateAction {
String toText() => _NamidaConverters.inst.getTitle(this);
}

extension WidgetsPagess on Widget {
NamidaRoute toNamidaRoute() {
String name = '';
Expand Down Expand Up @@ -1486,6 +1490,11 @@ class _NamidaConverters {
SetMusicAsAction.notification: lang.NOTIFICATION,
SetMusicAsAction.alarm: lang.ALARM,
},
PlaylistAddDuplicateAction: {
PlaylistAddDuplicateAction.justAddEverything: lang.ADD_ALL,
PlaylistAddDuplicateAction.addAllAndRemoveOldOnes: lang.ADD_ALL_AND_REMOVE_OLD_ONES,
PlaylistAddDuplicateAction.addOnlyMissing: lang.ADD_ONLY_MISSING,
},
};

// ====================================================
Expand Down
5 changes: 5 additions & 0 deletions lib/core/translations/keys.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ abstract class LanguageKeys {

String get ABOUT => _getKey('ABOUT');
String get ACTIVE => _getKey('ACTIVE');
String get ADD_ALL => _getKey('ADD_ALL');
String get ADD_ALL_AND_REMOVE_OLD_ONES => _getKey('ADD_ALL_AND_REMOVE_OLD_ONES');
String get ADD_AS_A_NEW_PLAYLIST => _getKey('ADD_AS_A_NEW_PLAYLIST');
String get ADD_AUDIO_TO_LOCAL_LIBRARY => _getKey('ADD_AUDIO_TO_LOCAL_LIBRARY');
String get ADD_FOLDER => _getKey('ADD_FOLDER');
Expand All @@ -21,6 +23,7 @@ abstract class LanguageKeys {
String get ADD_TO_PLAYLIST => _getKey('ADD_TO_PLAYLIST');
String get ADD => _getKey('ADD');
String get ADDED => _getKey('ADDED');
String get ADD_ONLY_MISSING => _getKey('ADD_ONLY_MISSING');
String get ADVANCED_SETTINGS_SUBTITLE => _getKey('ADVANCED_SETTINGS_SUBTITLE');
String get ADVANCED_SETTINGS => _getKey('ADVANCED_SETTINGS');
String get ADVANCED => _getKey('ADVANCED');
Expand Down Expand Up @@ -168,6 +171,7 @@ abstract class LanguageKeys {
String get DOWNLOADS_METADATA_TAGS_SUBTITLE => _getKey('DOWNLOADS_METADATA_TAGS_SUBTITLE');
String get DO_NOTHING => _getKey('DO_NOTHING');
String get DUCK_AUDIO => _getKey('DUCK_AUDIO');
String get DUPLICATED_ITEMS_ADDING => _getKey('DUPLICATED_ITEMS_ADDING');
String get DUPLICATED_TRACKS => _getKey('DUPLICATED_TRACKS');
String get DURATION => _getKey('DURATION');
String get EDGE_COLORS_SWITCHING => _getKey('EDGE_COLORS_SWITCHING');
Expand Down Expand Up @@ -548,6 +552,7 @@ abstract class LanguageKeys {
String get STATS => _getKey('STATS');
String get STOP_AFTER_THIS_TRACK => _getKey('STOP_AFTER_THIS_TRACK');
String get STOP => _getKey('STOP');
String get STOP_AFTER_THIS_VIDEO => _getKey('STOP_AFTER_THIS_VIDEO');
String get STORAGE_PERMISSION_DENIED_SUBTITLE => _getKey('STORAGE_PERMISSION_DENIED_SUBTITLE');
String get STORAGE_PERMISSION_DENIED => _getKey('STORAGE_PERMISSION_DENIED');
String get SUBSCRIBE => _getKey('SUBSCRIBE');
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ dependencies:
playlist_manager:
git:
url: https://github.com/namidaco/playlist_manager
ref: 8ddc4ac8476d0960016f73fd7d2d50dcaf754245
ref: 4c22343d4dddce59958f2fb9d3b31ad9cd4bcc0e
history_manager:
git:
url: https://github.com/namidaco/history_manager
Expand Down

0 comments on commit 5c832b0

Please sign in to comment.