diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index a6b54e6..66b2447 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + Vikunja CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart new file mode 100644 index 0000000..28ebaeb --- /dev/null +++ b/lib/fragments/namespace.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class NamespaceFragment extends StatelessWidget { + final String namespace; + + NamespaceFragment({this.namespace}); + + @override + Widget build(BuildContext context) { + return new Center( + child: new Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Container( + child: new Text( + 'Namespace: $namespace', + style: Theme.of(context).textTheme.title, + ), + ), + new Text('You\'ve selected a namespace!') + ], + )); + } +} diff --git a/lib/fragments/placeholder.dart b/lib/fragments/placeholder.dart new file mode 100644 index 0000000..d203541 --- /dev/null +++ b/lib/fragments/placeholder.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class PlaceholderFragment extends StatelessWidget { + @override + Widget build(BuildContext context) { + return new Container( + padding: EdgeInsets.only(left: 16.0), + child: new Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + new Container( + padding: EdgeInsets.only(top: 32.0), + child: new Text( + 'Welcome to Vikunja', + style: Theme.of(context).textTheme.headline, + ), + ), + new Text('Please select a namespace by clicking the ☰ icon.', + style: Theme.of(context).textTheme.subhead), + ], + )); + } +} diff --git a/lib/main.dart b/lib/main.dart index e7c0dcd..10d3914 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,137 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/pages/home_page.dart'; import 'package:fluttering_vikunja/style.dart'; -void main() => runApp(new MyApp()); +void main() => runApp(new VikunjaApp()); -class MyApp extends StatelessWidget { +class VikunjaApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Vikunja', theme: buildVikunjaTheme(), - home: new MyHomePage(title: 'Vikunja'), + home: new HomePage(), ); } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => new _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return new Scaffold( - appBar: new AppBar( - // 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: new Text(widget.title), - ), - drawer: Drawer( - child: ListView( - children: [ - new UserAccountsDrawerHeader( - decoration: BoxDecoration( - image: new DecorationImage( - image: AssetImage('assets/graphics/background.jpg'), - repeat: ImageRepeat.repeat - ), - ), - accountName: new Text( - 'Max Mustermann', - style: TextStyle(color: Colors.black), - ), - accountEmail: new Text( - 'max@try.vikunja.io', - style: TextStyle(color: Colors.black), - ), - otherAccountsPictures: [ - GestureDetector( - child: Semantics( - label: 'Switch to Fritz', - child: const CircleAvatar( - - ) - ), - ) - ], - ), - ListTile( - title: new Text('Namespace A'), - ) - ], - ) - ), - body: new Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: new Container( - padding: EdgeInsets.only(left: 16.0), - child: new Column( - // Column is also layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug paint" (press "p" in the console where you ran - // "flutter run", or select "Toggle Debug Paint" from the Flutter tool - // window in IntelliJ) to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.start, - children: [ - new Container( - padding: EdgeInsets.only(top: 32.0), - child: new Text( - 'Welcome to Vikunja', - style: Theme.of(context).textTheme.headline, - ), - ), - new Text( - 'Please select a namespace by clicking the ☰ icon.', - style: Theme.of(context).textTheme.subhead - ), - ], - ) - ) - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} +} \ No newline at end of file diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..064c837 --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/fragments/namespace.dart'; +import 'package:fluttering_vikunja/fragments/placeholder.dart'; + +class HomePage extends StatefulWidget { + @override + State createState() => new HomePageState(); + +} + +class HomePageState extends State { + List namespaces = [ + "Jonas's namespace", + 'Another namespace' + ]; + int _selectedDrawerIndex = -1; + + _getDrawerItemWidget(int pos) { + if(pos == -1) { + return new PlaceholderFragment(); + } + return new NamespaceFragment(namespace: namespaces[pos]); + } + + _onSelectItem(int index) { + setState(() => _selectedDrawerIndex = index); + Navigator.of(context).pop(); + } + + _addNamespace() { + + } + + @override + Widget build(BuildContext context) { + List drawerOptions = []; + namespaces.asMap().forEach((i, namespace) => + drawerOptions.add(new ListTile( + leading: const Icon(Icons.folder), + title: new Text(namespace), + selected: i == _selectedDrawerIndex, + onTap: () => _onSelectItem(i), + )) + ); + return new Scaffold( + appBar: AppBar( + title: new Text(_selectedDrawerIndex == -1 ? + 'Vakunja' : + namespaces[_selectedDrawerIndex]), + ), + drawer: new Drawer( + child: new Column( + children: [ + new UserAccountsDrawerHeader( + accountEmail: const Text('jonas@try.vikunja.io'), + accountName: const Text('Jonas Franz'), + ), + new Column( + children: ListTile.divideTiles(context: context, tiles: drawerOptions).toList() + ), + new Expanded( + child: new Align( + alignment: FractionalOffset.bottomCenter, + child: new ListTile( + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespace(), + ), + ), + ), + ] + ) + ), + body: _getDrawerItemWidget(_selectedDrawerIndex), + ); + } +} \ No newline at end of file diff --git a/test/widget_test.dart b/test/widget_test.dart index 6cf6986..1dac21a 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,12 +7,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:fluttering_vikunja/main.dart'; +import 'package:fluttering_vikunja/pages/home_page.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(new MyApp()); + await tester.pumpWidget(new HomePage()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);