2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-05-05 00:38:54 +00:00

Refactor part image widget

- Separate buttons to upload image from gallery or camera
This commit is contained in:
Oliver 2021-08-02 21:35:33 +10:00
parent 48d5c2e560
commit 9b42c88b53
3 changed files with 110 additions and 53 deletions

View File

@ -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),
);
}
}

View File

@ -19,6 +19,7 @@ import 'package:inventree/widget/dialogs.dart';
import 'package:inventree/widget/fields.dart'; import 'package:inventree/widget/fields.dart';
import 'package:inventree/api.dart'; import 'package:inventree/api.dart';
import 'package:inventree/widget/refreshable_state.dart'; import 'package:inventree/widget/refreshable_state.dart';
import 'package:inventree/widget/part_image_widget.dart';
import 'location_display.dart'; import 'location_display.dart';
@ -132,30 +133,6 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
} }
} }
void _selectImage() {
File? _attachment;
if (!InvenTreeAPI().checkPermission('part', 'change')) {
return;
}
showFormDialog(L10().selectImage,
key: _editImageKey,
callback: () {
_uploadImage(_attachment);
},
fields: <Widget>[
ImagePickerField(
context,
label: L10().attachImage,
required: true,
onSaved: (attachment) => _attachment = attachment,
),
]
);
}
void _editPartDialog(BuildContext context) { void _editPartDialog(BuildContext context) {
launchApiForm( launchApiForm(
@ -204,10 +181,13 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
onTap: () { onTap: () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => FullScreenWidget(part.fullname, part.image)) MaterialPageRoute(
); builder: (context) => PartImageWidget(part)
)
).then((value) {
refresh();
});
}), }),
onLongPress: _selectImage,
), ),
); );
} }

View File

@ -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<PartImageWidget> {
_PartImageState(this.part);
final InvenTreePart part;
@override
Future<void> 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<Widget> getAppBarActions(BuildContext context) {
List<Widget> 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);
}
}