From 9b42c88b536b0bf380c5c3315398235d5599cc00 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 2 Aug 2021 21:35:33 +1000 Subject: [PATCH] Refactor part image widget - Separate buttons to upload image from gallery or camera --- lib/widget/full_screen_image.dart | 26 -------- lib/widget/part_detail.dart | 34 ++-------- lib/widget/part_image_widget.dart | 103 ++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 53 deletions(-) delete mode 100644 lib/widget/full_screen_image.dart create mode 100644 lib/widget/part_image_widget.dart diff --git a/lib/widget/full_screen_image.dart b/lib/widget/full_screen_image.dart deleted file mode 100644 index 070b1945..00000000 --- a/lib/widget/full_screen_image.dart +++ /dev/null @@ -1,26 +0,0 @@ - -import 'package:inventree/api.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; - -class FullScreenWidget extends StatelessWidget { - - // Remote URL for image - String _url; - - // App bar title - String _title; - - FullScreenWidget(this._title, this._url); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(_title), - ), - body: InvenTreeAPI().getImage(_url), - ); - } -} \ No newline at end of file diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 95ea3f78..64f9404e 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -19,6 +19,7 @@ import 'package:inventree/widget/dialogs.dart'; import 'package:inventree/widget/fields.dart'; import 'package:inventree/api.dart'; import 'package:inventree/widget/refreshable_state.dart'; +import 'package:inventree/widget/part_image_widget.dart'; import 'location_display.dart'; @@ -132,30 +133,6 @@ class _PartDisplayState extends RefreshableState { } } - void _selectImage() { - - File? _attachment; - - if (!InvenTreeAPI().checkPermission('part', 'change')) { - return; - } - - showFormDialog(L10().selectImage, - key: _editImageKey, - callback: () { - _uploadImage(_attachment); - }, - fields: [ - ImagePickerField( - context, - label: L10().attachImage, - required: true, - onSaved: (attachment) => _attachment = attachment, - ), - ] - ); - } - void _editPartDialog(BuildContext context) { launchApiForm( @@ -204,10 +181,13 @@ class _PartDisplayState extends RefreshableState { onTap: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => FullScreenWidget(part.fullname, part.image)) - ); + MaterialPageRoute( + builder: (context) => PartImageWidget(part) + ) + ).then((value) { + refresh(); + }); }), - onLongPress: _selectImage, ), ); } diff --git a/lib/widget/part_image_widget.dart b/lib/widget/part_image_widget.dart new file mode 100644 index 00000000..6ac18f69 --- /dev/null +++ b/lib/widget/part_image_widget.dart @@ -0,0 +1,103 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +import 'package:inventree/api.dart'; + +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/widget/refreshable_state.dart'; + +class PartImageWidget extends StatefulWidget { + + PartImageWidget(this.part, {Key? key}) : super(key: key); + + final InvenTreePart part; + + @override + _PartImageState createState() => _PartImageState(part); + +} + + +class _PartImageState extends RefreshableState { + + _PartImageState(this.part); + + final InvenTreePart part; + + @override + Future request() async { + await part.reload(); + } + + void uploadFromGallery() async { + + final picker = ImagePicker(); + + final pickedImage = await picker.getImage(source: ImageSource.gallery); + + if (pickedImage != null) { + File? img = File(pickedImage.path); + + await part.uploadImage(img); + + refresh(); + } + } + + void uploadFromCamera() async { + + final picker = ImagePicker(); + + final pickedImage = await picker.getImage(source: ImageSource.camera); + + if (pickedImage != null) { + File? img = File(pickedImage.path); + + await part.uploadImage(img); + + refresh(); + } + + } + + @override + String getAppBarTitle(BuildContext context) => part.fullname; + + @override + List getAppBarActions(BuildContext context) { + + List actions = []; + + if (InvenTreeAPI().checkPermission('part', 'change')) { + + // File upload + actions.add( + IconButton( + icon: FaIcon(FontAwesomeIcons.fileImage), + onPressed: uploadFromGallery, + ) + ); + + // Camera upload + actions.add( + IconButton( + icon: FaIcon(FontAwesomeIcons.camera), + onPressed: uploadFromCamera, + ) + ); + } + + return actions; + } + + @override + Widget getBody(BuildContext context) { + return InvenTreeAPI().getImage(part.image); + } + +} \ No newline at end of file