From e6401d65d52c7e430973f6421007ee887f631253 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Thu, 30 Jan 2020 12:55:55 +0800 Subject: [PATCH] refactor: object tree widget --- lib/screens/gitlab_tree.dart | 34 ++++----------------- lib/screens/object.dart | 40 ++++--------------------- lib/widgets/object_tree.dart | 57 ++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 64 deletions(-) create mode 100644 lib/widgets/object_tree.dart diff --git a/lib/screens/gitlab_tree.dart b/lib/screens/gitlab_tree.dart index 060c023..89c8d51 100644 --- a/lib/screens/gitlab_tree.dart +++ b/lib/screens/gitlab_tree.dart @@ -2,13 +2,11 @@ import 'package:flutter/cupertino.dart'; import 'package:git_touch/models/gitlab.dart'; import 'package:git_touch/scaffolds/refresh_stateful.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; -import 'package:git_touch/widgets/table_view.dart'; +import 'package:git_touch/widgets/object_tree.dart'; import 'package:flutter/material.dart'; import 'package:git_touch/models/auth.dart'; import 'package:provider/provider.dart'; import 'package:git_touch/utils/utils.dart'; -import 'package:primer/primer.dart'; -import 'package:seti/seti.dart'; final gitlabTreeRouter = RouterScreen( '/gitlab/projects/:id/tree', @@ -18,29 +16,8 @@ final gitlabTreeRouter = RouterScreen( class GitlabTreeScreen extends StatelessWidget { final int id; final String path; - GitlabTreeScreen(this.id, {this.path}); - static const _iconDefaultColor = PrimerColors.blue300; - - Widget _buildIcon(GitlabTreeItem item) { - switch (item.type) { - case 'blob': - return SetiIcon(item.path, size: 36); - case 'tree': - case 'commit': - return Icon( - item.type == 'tree' - ? Octicons.file_directory - : Octicons.file_submodule, - color: _iconDefaultColor, - size: 24, - ); - default: - return null; - } - } - @override Widget build(BuildContext context) { return RefreshStatefulScaffold>( @@ -54,12 +31,11 @@ class GitlabTreeScreen extends StatelessWidget { return (res as List).map((v) => GitlabTreeItem.fromJson(v)); }, bodyBuilder: (data, _) { - return TableView( - hasIcon: true, + return ObjectTree( items: data.map((item) { - return TableViewItem( - leftWidget: _buildIcon(item), - text: Text(item.name), + return ObjectTreeItem( + type: item.type, + name: item.name, url: (() { switch (item.type) { case 'tree': diff --git a/lib/screens/object.dart b/lib/screens/object.dart index a74d8f1..d8e4d34 100644 --- a/lib/screens/object.dart +++ b/lib/screens/object.dart @@ -8,7 +8,7 @@ import 'package:git_touch/scaffolds/refresh_stateful.dart'; import 'package:git_touch/widgets/action_entry.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/markdown_view.dart'; -import 'package:git_touch/widgets/table_view.dart'; +import 'package:git_touch/widgets/object_tree.dart'; import 'package:path/path.dart' as p; import 'package:flutter/material.dart'; import 'package:flutter_highlight/flutter_highlight.dart'; @@ -16,8 +16,6 @@ import 'package:git_touch/models/auth.dart'; import 'package:photo_view/photo_view.dart'; import 'package:provider/provider.dart'; import 'package:git_touch/utils/utils.dart'; -import 'package:primer/primer.dart'; -import 'package:seti/seti.dart'; final objectRouter = RouterScreen( '/:owner/:name/blob/:ref', @@ -52,26 +50,6 @@ class ObjectScreen extends StatelessWidget { String get rawUrl => 'https://raw.githubusercontent.com/$owner/$name/$branch/$_path'; // TODO: - static const _iconDefaultColor = PrimerColors.blue300; - - Widget _buildIcon(GhObjectTreeEntry item) { - switch (item.type) { - case 'blob': - return SetiIcon(item.name, size: 36); - case 'tree': - case 'commit': - return Icon( - item.type == 'tree' - ? Octicons.file_directory - : Octicons.file_submodule, - color: _iconDefaultColor, - size: 24, - ); - default: - return null; - } - } - @override Widget build(BuildContext context) { return RefreshStatefulScaffold( @@ -121,20 +99,12 @@ class ObjectScreen extends StatelessWidget { bodyBuilder: (data, _) { switch (data.resolveType) { case 'Tree': - final tree = data as GhObjectTree; - - return TableView( - hasIcon: true, - items: tree.entries.map((item) { + return ObjectTree( + items: (data as GhObjectTree).entries.map((v) { // if (item.type == 'commit') return null; - final p = [...paths, item.name].join('/').urlencode; + final p = [...paths, v.name].join('/').urlencode; final url = '/$owner/$name/blob/$branch?path=$p'; - - return TableViewItem( - leftWidget: _buildIcon(item), - text: Text(item.name), - url: url, - ); + return ObjectTreeItem(name: v.name, type: v.type, url: url); }), ); case 'Blob': diff --git a/lib/widgets/object_tree.dart b/lib/widgets/object_tree.dart new file mode 100644 index 0000000..6da6ee6 --- /dev/null +++ b/lib/widgets/object_tree.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/utils/utils.dart'; +import 'package:git_touch/widgets/table_view.dart'; +import 'package:primer/primer.dart'; +import 'package:seti/seti.dart'; + +class ObjectTreeItem { + final String url; + final String name; + final String type; + ObjectTreeItem({ + @required this.name, + @required this.url, + @required this.type, + }); +} + +class ObjectTree extends StatelessWidget { + final Iterable items; + ObjectTree({@required this.items}); + + Widget _buildIcon(ObjectTreeItem item) { + switch (item.type) { + case 'blob': + return SetiIcon(item.name, size: 36); + case 'tree': + return Icon( + Octicons.file_directory, + color: PrimerColors.blue300, + size: 24, + ); + case 'commit': + return Icon( + Octicons.file_submodule, + color: PrimerColors.blue300, + size: 24, + ); + default: + throw 'object type error'; + } + } + + @override + Widget build(BuildContext context) { + return TableView( + hasIcon: true, + items: [ + for (var item in items) + TableViewItem( + leftWidget: _buildIcon(item), + text: Text(item.name), + url: item.url, + ) + ], + ); + } +}