From 6d3db243c3be17cb8412d9d6ce626816ede012ac Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 4 Apr 2020 10:48:48 +1100 Subject: [PATCH] Move Drawer to separate file - Now consistent drawer is accessible across all views --- lib/main.dart | 70 +++---------------- lib/widget/category_display.dart | 4 ++ lib/widget/drawer.dart | 111 +++++++++++++++++++++++++++++++ lib/widget/location_display.dart | 2 + lib/widget/part_display.dart | 3 + lib/widget/stock_display.dart | 3 + 6 files changed, 132 insertions(+), 61 deletions(-) create mode 100644 lib/widget/drawer.dart diff --git a/lib/main.dart b/lib/main.dart index daccd3dd..1261ca6c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:InvenTree/inventree/stock.dart'; import 'package:InvenTree/widget/category_display.dart'; import 'package:InvenTree/widget/location_display.dart'; +import 'package:InvenTree/widget/drawer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -103,28 +104,6 @@ class _MyHomePageState extends State { _MyHomePageState() : super(); - void _login() { - Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeSettingsWidget())); - } - - void _goHome() { - // Reset the stack, go to "home" - Navigator.pushNamedAndRemoveUntil(context, "/", (r) => false); - } - - void _showParts() { - // Construct a top-level category display (initialize with a null category) - Navigator.push(context, MaterialPageRoute(builder: (context) => CategoryDisplayWidget(null))); - } - - void _scanCode() async { - scanQrCode(context); - } - - void _showStock() { - Navigator.push(context, MaterialPageRoute(builder: (context) => LocationDisplayWidget(null))); - } - @override Widget build(BuildContext context) { // This method is rerun every time setState is called, for instance as done @@ -138,46 +117,15 @@ class _MyHomePageState extends State { // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(widget.title), - /* - leading: IconButton( - icon: Icon(Icons.menu), - tooltip: "Menu", - onPressed: null, - ) - */ - ), - drawer: new Drawer( - child: new ListView( - children: [ - new ListTile( - leading: new Image.asset("assets/image/icon.png", - fit: BoxFit.scaleDown, - ), - title: new Text("InvenTree"), - onTap: _goHome, - ), - new Divider(), - new ListTile( - title: new Text("Scan"), - onTap: _scanCode, - ), - new ListTile( - title: new Text("Parts"), - onTap: _showParts, - ), - new ListTile( - title: new Text("Stock"), - onTap: _showStock, - ), - new Divider(), - new ListTile( - title: new Text("Settings"), - leading: new Icon(Icons.settings), - onTap: _login, - ), - ], - ) + actions: [ + IconButton( + icon: Icon(Icons.search), + tooltip: 'Search', + onPressed: null, + ), + ], ), + drawer: new InvenTreeDrawer(context), body: Center( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart index dcf01ac2..cb70178a 100644 --- a/lib/widget/category_display.dart +++ b/lib/widget/category_display.dart @@ -1,6 +1,9 @@ import 'package:InvenTree/inventree/part.dart'; + import 'package:InvenTree/widget/part_display.dart'; +import 'package:InvenTree/widget/drawer.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -82,6 +85,7 @@ class _CategoryDisplayState extends State { appBar: AppBar( title: Text(_titleString), ), + drawer: new InvenTreeDrawer(context), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/widget/drawer.dart b/lib/widget/drawer.dart new file mode 100644 index 00000000..5bd10b15 --- /dev/null +++ b/lib/widget/drawer.dart @@ -0,0 +1,111 @@ +import 'package:InvenTree/barcode.dart'; +import 'package:flutter/material.dart'; + +import 'package:InvenTree/widget/category_display.dart'; +import 'package:InvenTree/widget/location_display.dart'; + +import 'package:InvenTree/settings.dart'; + +class InvenTreeDrawer extends StatelessWidget { + + final BuildContext context; + + InvenTreeDrawer(this.context); + + void _closeDrawer() { + // Close the drawer + Navigator.of(context).pop(); + } + + /* + * Return to the 'home' screen. + * This will empty the navigation stack. + */ + void _home() { + _closeDrawer(); + + Navigator.pushNamedAndRemoveUntil(context, "/", (r) => false); + } + + /* + * Launch the camera to scan a QR code. + * Upon successful scan, data are passed off to be decoded. + */ + void _scan() async { + + _closeDrawer(); + scanQrCode(context); + } + + /* + * Display the top-level PartCategory list + */ + void _showParts() { + + _closeDrawer(); + Navigator.push(context, MaterialPageRoute(builder: (context) => CategoryDisplayWidget(null))); + } + + /* + * Display the top-level StockLocation list + */ + void _showStock() { + _closeDrawer(); + Navigator.push(context, MaterialPageRoute(builder: (context) => LocationDisplayWidget(null))); + } + + /* + * Load settings widget + */ + void _settings() { + _closeDrawer(); + Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeSettingsWidget())); + } + + @override + Widget build(BuildContext context) { + return Drawer( + child: new ListView( + children: [ + new ListTile( + leading: new Image.asset( + "assets/image/icon.png", + fit: BoxFit.scaleDown, + ), + title: new Text("InvenTree"), + onTap: _home, + ), + new Divider(), + new ListTile( + title: new Text("Search"), + leading: new Icon(Icons.search), + onTap: null, + ), + new ListTile( + title: new Text("Scan"), + onTap: _scan, + ), + new Divider(), + new ListTile( + title: new Text("Parts"), + onTap: _showParts, + ), + new ListTile( + title: new Text("Stock"), + onTap: _showStock, + ), + new ListTile( + title: new Text("Suppliers"), + onTap: null, + ), + new Divider(), + new ListTile( + title: new Text("Settings"), + leading: new Icon(Icons.settings), + onTap: _settings, + ), + ] + ) + ); + } +} \ No newline at end of file diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart index 5143973c..2b589ae3 100644 --- a/lib/widget/location_display.dart +++ b/lib/widget/location_display.dart @@ -1,5 +1,6 @@ import 'package:InvenTree/inventree/stock.dart'; +import 'package:InvenTree/widget/drawer.dart'; import 'package:InvenTree/widget/stock_display.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -88,6 +89,7 @@ class _LocationDisplayState extends State { appBar: AppBar( title: Text(_title), ), + drawer: new InvenTreeDrawer(context), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/widget/part_display.dart b/lib/widget/part_display.dart index 9cf1d51d..725caf17 100644 --- a/lib/widget/part_display.dart +++ b/lib/widget/part_display.dart @@ -4,6 +4,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:InvenTree/widget/drawer.dart'; + class PartDisplayWidget extends StatefulWidget { PartDisplayWidget(this.part, {Key key}) : super(key: key); @@ -38,6 +40,7 @@ class _PartDisplayState extends State { appBar: AppBar( title: Text(_title), ), + drawer: new InvenTreeDrawer(context), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/widget/stock_display.dart b/lib/widget/stock_display.dart index 55d16a5b..45c9e041 100644 --- a/lib/widget/stock_display.dart +++ b/lib/widget/stock_display.dart @@ -4,6 +4,8 @@ import 'package:InvenTree/inventree/stock.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:InvenTree/widget/drawer.dart'; + class StockItemDisplayWidget extends StatefulWidget { StockItemDisplayWidget(this.item, {Key key}) : super(key: key); @@ -37,6 +39,7 @@ class _StockItemDisplayState extends State { appBar: AppBar( title: Text(_title), ), + drawer: new InvenTreeDrawer(context), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center,