85 lines
2.3 KiB
Dart
85 lines
2.3 KiB
Dart
import 'package:aves/model/collection_filters.dart';
|
|
import 'package:aves/model/collection_lens.dart';
|
|
import 'package:aves/model/image_entry.dart';
|
|
import 'package:aves/utils/color_utils.dart';
|
|
import 'package:aves/widgets/album/filtered_collection_page.dart';
|
|
import 'package:aves/widgets/fullscreen/info/info_page.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class XmpTagSectionSliver extends AnimatedWidget {
|
|
final CollectionLens collection;
|
|
final ImageEntry entry;
|
|
|
|
XmpTagSectionSliver({
|
|
Key key,
|
|
@required this.collection,
|
|
@required this.entry,
|
|
}) : super(key: key, listenable: entry.metadataChangeNotifier);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final tags = entry.xmpSubjects;
|
|
return SliverList(
|
|
delegate: SliverChildListDelegate.fixed(
|
|
tags.isEmpty
|
|
? []
|
|
: [
|
|
const SectionRow('Tags'),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: TagButton.buttonBorderWidth / 2),
|
|
child: Wrap(
|
|
spacing: 8,
|
|
children: tags
|
|
.map((tag) => TagButton(
|
|
tag: tag,
|
|
onPressed: () => _goToTag(context, tag),
|
|
))
|
|
.toList(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
void _goToTag(BuildContext context, String tag) {
|
|
if (collection == null) return;
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => FilteredCollectionPage(
|
|
collection: collection,
|
|
filter: TagFilter(tag),
|
|
title: tag,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class TagButton extends StatelessWidget {
|
|
final String tag;
|
|
final VoidCallback onPressed;
|
|
|
|
const TagButton({
|
|
@required this.tag,
|
|
@required this.onPressed,
|
|
});
|
|
|
|
static const double buttonBorderWidth = 2;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return OutlineButton(
|
|
onPressed: onPressed,
|
|
borderSide: BorderSide(
|
|
color: stringToColor(tag),
|
|
width: buttonBorderWidth,
|
|
),
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(42),
|
|
),
|
|
child: Text(tag),
|
|
);
|
|
}
|
|
}
|