234 lines
9.8 KiB
Dart
234 lines
9.8 KiB
Dart
import 'package:bottom_sheet_bar/bottom_sheet_bar.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import '../../controller/bottom_sheet_controller.dart';
|
|
import '../../controller/gallery_controller.dart';
|
|
import '../../models/config.dart';
|
|
import '../../models/gallery_album.dart';
|
|
import '../../models/media_file.dart';
|
|
import '../album_categories_view/album_categories_view.dart';
|
|
import '../album_view/album_page.dart';
|
|
import '../album_view/album_medias_view.dart';
|
|
import 'picker_appbar.dart';
|
|
import 'reload_gallery.dart';
|
|
|
|
class GalleryPickerView extends StatefulWidget {
|
|
final Config? config;
|
|
final Function(List<MediaFile> selectedMedia) onSelect;
|
|
final Widget Function(String tag, MediaFile media, BuildContext context)?
|
|
heroBuilder;
|
|
final Widget Function(List<MediaFile> media, BuildContext context)?
|
|
multipleMediaBuilder;
|
|
final bool startWithRecent;
|
|
final BottomSheetBarController? sheetController;
|
|
final List<MediaFile>? initSelectedMedia;
|
|
final List<MediaFile>? extraRecentMedia;
|
|
final bool singleMedia;
|
|
const GalleryPickerView(
|
|
{super.key,
|
|
this.config,
|
|
required this.onSelect,
|
|
this.initSelectedMedia,
|
|
this.extraRecentMedia,
|
|
this.singleMedia = false,
|
|
this.sheetController,
|
|
this.heroBuilder,
|
|
this.multipleMediaBuilder,
|
|
this.startWithRecent = false});
|
|
|
|
@override
|
|
State<GalleryPickerView> createState() => _GalleryPickerState();
|
|
}
|
|
|
|
class _GalleryPickerState extends State<GalleryPickerView> {
|
|
late PhoneGalleryController galleryController;
|
|
BottomSheetController? bottomSheetController;
|
|
late PageController _scrollController;
|
|
bool noPhotoSeleceted = true;
|
|
late Config config;
|
|
@override
|
|
void initState() {
|
|
_scrollController =
|
|
PageController(initialPage: widget.startWithRecent ? 0 : 1);
|
|
if (GetInstance().isRegistered<PhoneGalleryController>()) {
|
|
galleryController = Get.find<PhoneGalleryController>();
|
|
config = galleryController.config;
|
|
} else {
|
|
galleryController = Get.put(PhoneGalleryController(widget.config,
|
|
onSelect: widget.onSelect,
|
|
heroBuilder: widget.heroBuilder,
|
|
multipleMediasBuilder: widget.multipleMediaBuilder,
|
|
initSelectedMedias: widget.initSelectedMedia,
|
|
extraRecentMedia: widget.extraRecentMedia,
|
|
isRecent: widget.startWithRecent));
|
|
config = galleryController.config;
|
|
}
|
|
|
|
if (widget.sheetController != null) {
|
|
if (GetInstance().isRegistered<BottomSheetController>()) {
|
|
bottomSheetController = Get.find<BottomSheetController>();
|
|
} else {
|
|
bottomSheetController =
|
|
Get.put(BottomSheetController(widget.sheetController!));
|
|
}
|
|
bottomSheetController!.galleryController = galleryController;
|
|
}
|
|
if (!galleryController.isInitialized) {
|
|
galleryController.initializeAlbums();
|
|
}
|
|
if (galleryController.isRecent) {
|
|
_scrollController = PageController(initialPage: 0);
|
|
}
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
GalleryAlbum? selectedAlbum;
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
double width = MediaQuery.of(context).size.width;
|
|
return GetBuilder<PhoneGalleryController>(builder: (controller) {
|
|
if (controller.selectedAlbum == null && selectedAlbum != null) {
|
|
_scrollController = PageController(initialPage: 1);
|
|
}
|
|
selectedAlbum = controller.selectedAlbum;
|
|
return GetInstance().isRegistered<PhoneGalleryController>()
|
|
? controller.selectedAlbum == null
|
|
? Scaffold(
|
|
backgroundColor: config.backgroundColor,
|
|
appBar: PickerAppBar(
|
|
controller: controller,
|
|
bottomSheetController: bottomSheetController,
|
|
),
|
|
body: Column(
|
|
children: [
|
|
Container(
|
|
width: width,
|
|
height: 48,
|
|
color: config.appbarColor,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
Container(
|
|
decoration: controller.isRecent
|
|
? BoxDecoration(
|
|
border: Border(
|
|
bottom: BorderSide(
|
|
color: config.underlineColor,
|
|
width: 3.0,
|
|
),
|
|
))
|
|
: null,
|
|
height: 48,
|
|
width: width / 2,
|
|
child: TextButton(
|
|
onPressed: () {
|
|
_scrollController.animateTo(0,
|
|
duration:
|
|
const Duration(milliseconds: 50),
|
|
curve: Curves.easeIn);
|
|
setState(() {
|
|
controller.isRecent = true;
|
|
controller.switchPickerMode(false);
|
|
});
|
|
},
|
|
child: Text(config.recents,
|
|
style: controller.isRecent
|
|
? config.selectedMenuStyle
|
|
: config.unselectedMenuStyle)),
|
|
),
|
|
Container(
|
|
decoration: !controller.isRecent
|
|
? BoxDecoration(
|
|
border: Border(
|
|
bottom: BorderSide(
|
|
color: config.underlineColor,
|
|
width: 3.0,
|
|
),
|
|
))
|
|
: null,
|
|
height: 48,
|
|
width: width / 2,
|
|
child: TextButton(
|
|
onPressed: () {
|
|
_scrollController.animateTo(width,
|
|
duration:
|
|
const Duration(milliseconds: 50),
|
|
curve: Curves.easeIn);
|
|
controller.isRecent = false;
|
|
controller.switchPickerMode(false);
|
|
},
|
|
child: Text(
|
|
config.gallery,
|
|
style: controller.isRecent
|
|
? config.unselectedMenuStyle
|
|
: config.selectedMenuStyle,
|
|
)),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Expanded(
|
|
child: PageView(
|
|
controller: _scrollController,
|
|
onPageChanged: (value) {
|
|
if (value == 0) {
|
|
controller.isRecent = true;
|
|
controller.switchPickerMode(false);
|
|
} else {
|
|
controller.isRecent = false;
|
|
controller.switchPickerMode(false);
|
|
}
|
|
},
|
|
scrollDirection: Axis.horizontal,
|
|
children: [
|
|
controller.isInitialized
|
|
? AlbumMediasView(
|
|
galleryAlbum: controller.recent!,
|
|
controller: controller,
|
|
singleMedia: widget.singleMedia)
|
|
: const Center(
|
|
child: CircularProgressIndicator(
|
|
color: Colors.grey,
|
|
)),
|
|
AlbumCategoriesView(controller)
|
|
]),
|
|
),
|
|
],
|
|
),
|
|
)
|
|
: AlbumPage(
|
|
controller: controller,
|
|
album: controller.selectedAlbum!,
|
|
singleMedia: widget.singleMedia,
|
|
bottomSheetController: bottomSheetController,
|
|
)
|
|
: ReloadGallery(
|
|
config,
|
|
onpressed: () async {
|
|
if (widget.sheetController != null) {
|
|
bottomSheetController =
|
|
Get.put(BottomSheetController(widget.sheetController!));
|
|
}
|
|
galleryController = Get.put(PhoneGalleryController(config,
|
|
onSelect: widget.onSelect,
|
|
heroBuilder: widget.heroBuilder,
|
|
initSelectedMedias: widget.initSelectedMedia,
|
|
extraRecentMedia: widget.extraRecentMedia,
|
|
multipleMediasBuilder: widget.multipleMediaBuilder,
|
|
isRecent: widget.startWithRecent));
|
|
await controller.initializeAlbums();
|
|
if (bottomSheetController != null) {
|
|
bottomSheetController!.galleryController = galleryController;
|
|
}
|
|
setState(() {});
|
|
},
|
|
);
|
|
});
|
|
}
|
|
}
|