feat: style tweaks

This commit is contained in:
Rongjian Zhang 2019-09-14 17:19:33 +08:00
parent 2c6a3d097c
commit 9fe6639f66
11 changed files with 120 additions and 129 deletions

View File

@ -48,20 +48,10 @@ class _HomeState extends State<Home> {
children: <Widget>[
Icon(Icons.notifications_none),
Positioned(
right: 0,
child: Container(
width: 8,
height: 8,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(4)),
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [PrimerColors.red400, PrimerColors.red600],
),
),
),
)
right: 0,
top: 0,
child: Icon(Octicons.primitive_dot,
color: PrimerColors.red500, size: 12))
],
);
}

View File

@ -1,6 +1,7 @@
import 'package:flutter_highlight/themes/github.dart';
import 'package:git_touch/screens/image_view.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/markdown_view.dart';
import 'package:path/path.dart' as path;
import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
@ -132,15 +133,24 @@ class ObjectScreen extends StatelessWidget {
}
Widget _buildBlob(payload) {
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: HighlightView(
payload['text'],
language: extname.isEmpty ? 'plaintext' : extname,
theme: githubTheme,
padding: EdgeInsets.all(10),
),
);
switch (extname) {
case 'md':
case 'markdown':
return Padding(
padding: const EdgeInsets.all(12),
child: MarkdownView(payload['text']),
);
default:
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: HighlightView(
payload['text'],
language: extname.isEmpty ? 'plaintext' : extname,
theme: githubTheme,
padding: EdgeInsets.all(10),
),
);
}
}
@override

View File

@ -222,14 +222,8 @@ class RepoScreen extends StatelessWidget {
),
TableView(items: [
TableViewItem(
leftWidget: Icon(Octicons.code,
size: 20,
color: convertColor(payload['primaryLanguage'] == null
? null
: payload['primaryLanguage']['color'])),
text: Text(payload['primaryLanguage'] == null
? 'Unknown'
: payload['primaryLanguage']['name']),
leftWidget: Icon(Octicons.code, size: 20),
text: Text('Code'),
rightWidget: Row(
children: <Widget>[
Text(filesize(payload['languages']['totalSize'] as int)),
@ -281,14 +275,6 @@ class RepoScreen extends StatelessWidget {
]),
BorderView(height: 10),
TableView(items: [
TableViewItem(
leftWidget: Icon(Octicons.law, size: 20),
text: Text('License'),
rightWidget: Text(payload['licenseInfo'] == null
? 'Unknown'
: (payload['licenseInfo']['spdxId'] ??
payload['licenseInfo']['name'])),
),
TableViewItem(
leftWidget: Icon(Octicons.history, size: 20),
text: Text('Commits'),
@ -305,6 +291,14 @@ class RepoScreen extends StatelessWidget {
),
screenBuilder: (_) => CommitsScreen(owner, name),
),
TableViewItem(
leftWidget: Icon(Octicons.law, size: 20),
text: Text('License'),
rightWidget: Text(payload['licenseInfo'] == null
? 'Unknown'
: (payload['licenseInfo']['spdxId'] ??
payload['licenseInfo']['name'])),
),
]),
BorderView(height: 10),
if (payload['object'] != null)

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:primer/primer.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:share/share.dart';
@ -92,20 +93,16 @@ class UserScreen extends StatelessWidget {
}
TableViewItem _buildTableViewItem({
String placeholder,
IconData iconData,
String text,
Function onTap,
}) {
if (text == null || text.isEmpty) return null;
var leftWidget = Icon(iconData, size: 20, color: PrimerColors.blue500);
var usePlaceholder = text == null || text.isEmpty;
var itemText = usePlaceholder
? Text(placeholder, style: TextStyle(color: PrimerColors.gray300))
: Text(text);
return TableViewItem(
leftWidget: leftWidget,
text: itemText,
text: Text(text),
rightWidget: onTap == null
? null
: Icon(CupertinoIcons.right_chevron,
@ -216,49 +213,11 @@ class UserScreen extends StatelessWidget {
children: <Widget>[
Container(
padding: EdgeInsets.all(12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Avatar(url: payload['avatarUrl'], size: 30),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text(
payload['name'] ?? login,
style: TextStyle(
color: PrimerColors.blue500,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
SizedBox(width: 8),
Text(
login,
style: TextStyle(
color: PrimerColors.gray700, fontSize: 16),
),
],
),
SizedBox(height: 6),
Text(
payload['bio'] == null ||
(payload['bio'] as String).isEmpty
? 'No bio'
: payload['bio'],
style: TextStyle(
color: PrimerColors.gray700,
fontSize: 14,
),
),
],
),
)
],
child: UserItem(
login,
name: payload['name'],
avatarUrl: payload['avatarUrl'],
bio: payload['bio'],
),
),
BorderView(),
@ -293,12 +252,10 @@ class UserScreen extends StatelessWidget {
TableView(items: [
_buildTableViewItem(
iconData: Octicons.organization,
placeholder: 'Company',
text: payload['company'],
),
_buildTableViewItem(
iconData: Octicons.location,
placeholder: 'Location',
text: payload['location'],
onTap: payload['location'] == null
? null
@ -309,7 +266,6 @@ class UserScreen extends StatelessWidget {
}),
_buildTableViewItem(
iconData: Octicons.mail,
placeholder: 'Email',
text: payload['email'],
onTap: (payload['email'] as String).isEmpty
? null
@ -319,7 +275,6 @@ class UserScreen extends StatelessWidget {
),
_buildTableViewItem(
iconData: Octicons.link,
placeholder: 'Website',
text: payload['websiteUrl'],
onTap: payload['websiteUrl'] == null
? null

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:primer/primer.dart';
import 'package:tuple/tuple.dart';
import '../scaffolds/list.dart';
@ -65,7 +66,7 @@ class UsersScreen extends StatelessWidget {
name
login
avatarUrl
url
bio
}
}
}
@ -85,30 +86,11 @@ class UsersScreen extends StatelessWidget {
screenBuilder: (_) => UserScreen(payload['login']),
child: Container(
padding: EdgeInsets.all(10),
child: Row(
children: <Widget>[
Avatar(url: payload['avatarUrl'], size: 24),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: join(SizedBox(height: 6), [
Text(
payload['name'] ?? payload['login'],
style: TextStyle(
fontSize: 16,
color: PrimerColors.blue500,
fontWeight: FontWeight.w500,
),
),
Text(
payload['login'],
style: TextStyle(fontSize: 14, color: PrimerColors.gray700),
)
]),
),
)
],
child: UserItem(
payload['login'],
name: payload['name'],
avatarUrl: payload['avatarUrl'],
bio: payload['bio'],
),
),
);

View File

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
@ -7,6 +9,8 @@ import 'package:primer/primer.dart';
import '../screens/repo.dart';
export 'package:flutter_vector_icons/flutter_vector_icons.dart';
final monospaceFont = Platform.isIOS ? 'Menlo' : 'monospace'; // FIXME:
class StorageKeys {
static const account = 'account';
static const github = 'github';

View File

@ -299,7 +299,7 @@ class EventItem extends StatelessWidget {
color: PrimerColors.blue500,
fontSize: 14,
backgroundColor: Color(0xffeaf5ff),
fontFamily: 'Menlo', // FIXME:
fontFamily: monospaceFont,
),
),
TextSpan(text: ' at '),
@ -315,8 +315,7 @@ class EventItem extends StatelessWidget {
style: TextStyle(
color: PrimerColors.blue500,
fontSize: 13,
fontFamily: 'Menlo',
fontFamilyFallback: ['Menlo', 'Roboto Mono'],
fontFamily: monospaceFont,
),
),
SizedBox(width: 6),

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:git_touch/utils/utils.dart';
import 'package:primer/primer.dart';
class MarkdownView extends StatelessWidget {
@ -23,7 +24,7 @@ class MarkdownView extends StatelessWidget {
code: _basicStyle.copyWith(
fontSize: 16 * 0.85,
height: 1.45,
fontFamily: 'monospace', // FIXME:
fontFamily: monospaceFont,
),
h1: _hStyle.copyWith(fontSize: 32),
h2: _hStyle.copyWith(fontSize: 24),

View File

@ -106,14 +106,14 @@ class RepoItem extends StatelessWidget {
),
],
),
payload['description'] == null ||
(payload['description'] as String).isEmpty
? null
: Text(
payload['description'],
style: TextStyle(
color: PrimerColors.gray700, fontSize: 14),
),
if (payload['description'] != null &&
(payload['description'] as String).isNotEmpty)
Text(
payload['description'],
style: TextStyle(
color: PrimerColors.gray700,
fontSize: inRepoScreen ? 15 : 14),
),
if (!inRepoScreen) _buildStatus(),
]),
),

View File

@ -40,6 +40,8 @@ class TableView extends StatelessWidget {
static final _seperator = BorderView();
Widget _buildItem(TableViewItem item) {
if (item == null) return null;
var widget = Container(
height: 44,
child: Row(children: [

View File

@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:git_touch/widgets/avatar.dart';
import 'package:primer/primer.dart';
class UserItem extends StatelessWidget {
final String login;
final String name;
final String avatarUrl;
final String bio;
UserItem(this.login, {this.name, this.avatarUrl, this.bio});
@override
Widget build(BuildContext context) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Avatar(url: avatarUrl, size: 24),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text(
name ?? login,
style: TextStyle(
color: PrimerColors.blue500,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
SizedBox(width: 8),
Text(
login,
style: TextStyle(color: PrimerColors.gray700, fontSize: 16),
),
],
),
SizedBox(height: 6),
if (bio != null && bio.isNotEmpty)
Text(
bio,
style: TextStyle(color: PrimerColors.gray700, fontSize: 15),
),
],
),
)
],
);
}
}