mc_gallery/lib/features/home/views/image_carousel/image_carousel_view_model.dart

65 lines
2.5 KiB
Dart
Raw Normal View History

2022-12-22 11:17:08 +00:00
import 'package:carousel_slider/carousel_controller.dart';
2022-12-20 20:52:24 +00:00
import 'package:flutter/foundation.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
2022-12-25 21:17:59 +00:00
import 'package:mc_gallery/features/home/views/image_carousel/image_carousel_view.dart';
2022-12-20 20:52:24 +00:00
import '/features/core/abstracts/base_view_model.dart';
import '/features/home/services/images_service.dart';
import '/locator.dart';
2022-12-25 00:55:53 +00:00
import '../../data/models/image_model.dart';
2022-12-20 20:52:24 +00:00
class ImageCarouselViewModel extends BaseViewModel {
ImageCarouselViewModel({
required ImagesService imagesService,
2022-12-25 21:17:59 +00:00
}) : _imagesService = imagesService;
2022-12-20 20:52:24 +00:00
final ImagesService _imagesService;
2022-12-22 11:17:08 +00:00
late final ValueNotifier<ImageModel> _currentImageModelNotifier;
ValueListenable<ImageModel> get currentImageModelListenable => _currentImageModelNotifier;
final CarouselController carouselController = CarouselController();
2022-12-20 20:52:24 +00:00
@override
2023-01-01 12:04:22 +00:00
Future<void> initialise(bool Function() mounted, [Object? arguments]) async {
_currentImageModelNotifier = ValueNotifier(
_imagesService.imageModels
.elementAt((arguments! as ImageCarouselViewArguments).imageIndexKey),
);
2022-12-25 21:17:59 +00:00
log.info('Initialized with image: ${_currentImageModelNotifier.value.imageIndex}');
2022-12-20 20:52:24 +00:00
super.initialise(mounted, arguments);
}
@override
Future<void> dispose() async {
super.dispose();
}
2022-12-22 11:17:08 +00:00
void swipedTo({required int newIndex}) {
_currentImageModelNotifier.value = _imagesService.imageModelAt(index: newIndex);
2022-12-25 21:17:59 +00:00
log.info('Swiped to image: ${_currentImageModelNotifier.value.imageIndex}');
2022-12-22 11:17:08 +00:00
}
void onPreviousPressed() => carouselController.previousPage();
void onNextPressed() => carouselController.nextPage();
String get currentImageUrl => currentImageModelListenable.value.uri.toString();
String get currentImageKey => currentImageModelListenable.value.imageIndex.toString();
String get currentImageName => currentImageModelListenable.value.imageName;
int get currentImageIndex => currentImageModelListenable.value.imageIndex;
int get numberOfImages => _imagesService.numberOfImages;
2022-12-21 22:40:39 +00:00
2022-12-20 20:52:24 +00:00
double? downloadProgressValue({required DownloadProgress progress}) =>
progress.totalSize != null ? progress.downloaded / progress.totalSize! : null;
2022-12-21 22:40:39 +00:00
bool get hasPreviousImage =>
2022-12-22 11:17:08 +00:00
currentImageModelListenable.value.imageIndex > _imagesService.firstAvailableImageIndex;
2022-12-21 22:40:39 +00:00
bool get hasNextImage =>
2022-12-22 11:17:08 +00:00
currentImageModelListenable.value.imageIndex < _imagesService.lastAvailableImageIndex;
2022-12-21 22:40:39 +00:00
2022-12-20 20:52:24 +00:00
static ImageCarouselViewModel get locate => Locator.locate();
}