Skip to content
This repository was archived by the owner on Jul 13, 2023. It is now read-only.

Commit

Permalink
Merge branch 'master' of https://github.com/JonasWanke/l42n
Browse files Browse the repository at this point in the history
  • Loading branch information
JonasWanke committed Mar 6, 2020
2 parents 612ee52 + 396d006 commit 3a2b239
Showing 3 changed files with 134 additions and 101 deletions.
2 changes: 1 addition & 1 deletion lib/id_with_highlighted_parts.dart
Original file line number Diff line number Diff line change
@@ -15,7 +15,7 @@ class IdWithHighlightedParts extends StatelessWidget {
final highlights = [for (var i = 0; i < id.length; i++) false];

for (final part in partsToHighlight) {
for (final match in part.allMatches(id)) {
for (final match in part.allMatches(id.toLowerCase())) {
for (var i = match.start; i < match.end; i++) {
highlights[i] = true;
}
107 changes: 7 additions & 100 deletions lib/translation_grid.dart
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ import 'package:provider/provider.dart';

import 'data/data.dart';
import 'translation_field.dart';
import 'translation_row.dart';

class TranslationGrid extends StatelessWidget {
TranslationGrid({String filter = ''})
@@ -61,10 +62,10 @@ class TranslationGrid extends StatelessWidget {
return SizedBox(height: 8);
}
if (index.isEven) {
return Divider();
return Divider(height: 8);
}

return _TranslationRow(
return TranslationRow(
id: ids[index ~/ 2],
proportions: proportions,
partsToHighlight: _filterParts,
@@ -117,7 +118,7 @@ class _HeaderRow extends StatelessWidget {
];
return SizedBox(
height: 56,
child: _Row(
child: GridRow(
proportions: proportions,
cells: [
for (final title in titles)
@@ -140,103 +141,8 @@ class _HeaderRow extends StatelessWidget {
}
}

class _TranslationRow extends StatelessWidget {
const _TranslationRow({
Key key,
@required this.id,
@required this.proportions,
this.partsToHighlight = const [],
}) : assert(id != null),
assert(proportions != null),
super(key: key);

final String id;
final List<int> proportions;
final List<String> partsToHighlight;

@override
Widget build(BuildContext context) {
final project = Provider.of<Project>(context);

return StreamBuilder<List<Locale>>(
stream: project.localeBloc.all,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: snapshot.hasError
? Text(snapshot.error.toString())
: CircularProgressIndicator(),
);
}

final locales = snapshot.data;
return Padding(
padding: EdgeInsets.symmetric(vertical: 4),
child: _Row(
proportions: proportions,
leading: StreamBuilder<List<L42nStringError>>(
stream: project.errorBloc.allForResource(id),
builder: (context, snapshot) {
final errors = snapshot.data;
if (errors?.isEmpty != false) {
return SizedBox();
}

final sorted = errors.toList()
..sort((e1, e2) {
return (e1.locale?.toString() ?? '')
.compareTo(e2.locale?.toString() ?? '');
});
return Tooltip(
message: sorted
.map((e) =>
'• ${e.locale != null ? '${e.locale}: ' : ''}${e.runtimeType}')
.join('\n'),
child: Center(
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
color:
errors.any((e) => e.severity == ErrorSeverity.error)
? Theme.of(context).errorColor
: Colors.yellow,
),
width: 12,
height: 12,
),
),
);
},
),
trailing: Center(
child: IconButton(
icon: Icon(Icons.delete_outline),
tooltip: 'Delete resource',
onPressed: () {
// project.
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Resource $id deleted.'),
));
},
),
),
cells: [
IdWithHighlightedParts(
id: id,
partsToHighlight:
partsToHighlight.isNotEmpty ? partsToHighlight : null,
),
for (final locale in locales) TranslationField(id, locale),
],
),
);
},
);
}
}

class _Row extends StatelessWidget {
const _Row({
class GridRow extends StatelessWidget {
const GridRow({
Key key,
this.leading,
this.trailing = const SizedBox(),
@@ -255,6 +161,7 @@ class _Row extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(
// crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
SizedBox(
width: 32,
126 changes: 126 additions & 0 deletions lib/translation_row.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'data/data.dart';
import 'id_with_highlighted_parts.dart';
import 'translation_field.dart';
import 'translation_grid.dart';

const _animationDuration = Duration(seconds: 1);

class TranslationRow extends StatefulWidget {
const TranslationRow({
Key key,
@required this.id,
@required this.proportions,
this.partsToHighlight = const [],
}) : assert(id != null),
assert(proportions != null),
super(key: key);

final String id;
final List<int> proportions;
final List<String> partsToHighlight;

@override
_TranslationRowState createState() => _TranslationRowState();
}

class _TranslationRowState extends State<TranslationRow> {
bool _isSelected = false;

@override
Widget build(BuildContext context) {
final project = Provider.of<Project>(context);

return StreamBuilder<List<Locale>>(
stream: project.localeBloc.all,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: snapshot.hasError
? Text(snapshot.error.toString())
: CircularProgressIndicator(),
);
}

final locales = snapshot.data;
return AnimatedPadding(
duration: _animationDuration,
padding: EdgeInsets.symmetric(vertical: _isSelected ? 16 : 0),
child: FocusAttachment(
child: Material(
animationDuration: _animationDuration,
color: Theme.of(context).scaffoldBackgroundColor,
elevation: _isSelected ? 4 : 0,
child: GridRow(
proportions: widget.proportions,
leading: _buildIssueDot(),
cells: [
IdWithHighlightedParts(
id: widget.id,
partsToHighlight: widget.partsToHighlight.isNotEmpty
? widget.partsToHighlight
: null,
),
for (final locale in locales)
TranslationField(widget.id, locale),
],
trailing: Center(
child: IconButton(
icon: Icon(Icons.delete_outline),
tooltip: 'Delete resource',
onPressed: () {
// project.
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Resource ${widget.id} deleted.'),
));
},
),
),
),
),
),
);
},
);
}

Widget _buildIssueDot() {
final project = Provider.of<Project>(context);

return StreamBuilder<List<L42nStringError>>(
stream: project.errorBloc.allForResource(widget.id),
builder: (context, snapshot) {
final errors = snapshot.data;
if (errors?.isEmpty != false) {
return SizedBox();
}

final sorted = errors.toList()
..sort((e1, e2) {
return (e1.locale?.toString() ?? '')
.compareTo(e2.locale?.toString() ?? '');
});
return Tooltip(
message: sorted
.map((e) =>
'• ${e.locale != null ? '${e.locale}: ' : ''}${e.runtimeType}')
.join('\n'),
child: Center(
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
color: errors.any((e) => e.severity == ErrorSeverity.error)
? Theme.of(context).errorColor
: Colors.yellow,
),
width: 12,
height: 12,
),
),
);
},
);
}
}

0 comments on commit 3a2b239

Please sign in to comment.