From b8f69bfaaff2fb71c54bb18e7c066b4d4c0bebf6 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sun, 11 Apr 2021 01:48:43 +0200 Subject: [PATCH] Add level badges to search results --- .../search_result_page/parts/badge.dart | 27 ++++++++++++++++ .../parts/common_badge.dart | 21 +++++++++++++ .../search_result_page/parts/jlpt_badge.dart | 25 +++++++++++++++ .../parts/wanikani_badge.dart | 26 ++++++++++++++++ .../search_result_page/search_card.dart | 31 +++++++++++++++++-- 5 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 lib/view/components/search/search_result_page/parts/badge.dart create mode 100644 lib/view/components/search/search_result_page/parts/common_badge.dart create mode 100644 lib/view/components/search/search_result_page/parts/jlpt_badge.dart create mode 100644 lib/view/components/search/search_result_page/parts/wanikani_badge.dart diff --git a/lib/view/components/search/search_result_page/parts/badge.dart b/lib/view/components/search/search_result_page/parts/badge.dart new file mode 100644 index 0000000..3ddf3aa --- /dev/null +++ b/lib/view/components/search/search_result_page/parts/badge.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class Badge extends StatelessWidget { + final Widget child; + final Color color; + + const Badge(this.child, this.color); + + @override + Widget build(BuildContext context) { + return Container( + child: FittedBox( + child: Center( + child: this.child + ), + ), + padding: EdgeInsets.all(5), + width: 30, + height: 30, + margin: EdgeInsets.symmetric(horizontal: 2), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color + ), + ); } + +} \ No newline at end of file diff --git a/lib/view/components/search/search_result_page/parts/common_badge.dart b/lib/view/components/search/search_result_page/parts/common_badge.dart new file mode 100644 index 0000000..77998f8 --- /dev/null +++ b/lib/view/components/search/search_result_page/parts/common_badge.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/badge.dart'; + +class CommonBadge extends StatelessWidget { + bool isCommon; + + CommonBadge(this.isCommon) { + this.isCommon ??= false; + } + + @override + Widget build(BuildContext context) { + return Badge( + Text( + "C", + style: TextStyle(color: this.isCommon ? Colors.white : Colors.transparent) + ), + this.isCommon ? Colors.green : Colors.transparent + ); + } +} \ No newline at end of file diff --git a/lib/view/components/search/search_result_page/parts/jlpt_badge.dart b/lib/view/components/search/search_result_page/parts/jlpt_badge.dart new file mode 100644 index 0000000..d0566d6 --- /dev/null +++ b/lib/view/components/search/search_result_page/parts/jlpt_badge.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/badge.dart'; + +class JLPTBadge extends StatelessWidget { + final String jlptLevel; + + const JLPTBadge(this.jlptLevel); + + String _extractJlptLevel(String jlptRaw) { + return jlptRaw.isNotEmpty ? jlptRaw.substring(5).toUpperCase() : ''; + } + + @override + Widget build(BuildContext context) { + return Badge( + Text( + _extractJlptLevel(this.jlptLevel), + style: TextStyle( + color: Colors.white + ), + ), + this.jlptLevel.isNotEmpty ? Colors.blue : Colors.transparent + ); + } +} \ No newline at end of file diff --git a/lib/view/components/search/search_result_page/parts/wanikani_badge.dart b/lib/view/components/search/search_result_page/parts/wanikani_badge.dart new file mode 100644 index 0000000..a24f9f8 --- /dev/null +++ b/lib/view/components/search/search_result_page/parts/wanikani_badge.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/badge.dart'; + +class WKBadge extends StatelessWidget { + final String wkLevel; + + const WKBadge(this.wkLevel); + + String _extractWkLevel(String wkRaw) { + // return jlptRaw.isNotEmpty ? jlptRaw.substring(5).toUpperCase() : ''; + return wkRaw.isNotEmpty ? 'W' + wkRaw.substring(8) : ''; + } + + @override + Widget build(BuildContext context) { + return Badge( + Text( + _extractWkLevel(this.wkLevel), + style: TextStyle( + color: Colors.white, + ), + ), + this.wkLevel.isNotEmpty ? Colors.red : Colors.transparent + ); + } +} \ No newline at end of file diff --git a/lib/view/components/search/search_result_page/search_card.dart b/lib/view/components/search/search_result_page/search_card.dart index 88f2b6e..1b2e53c 100644 --- a/lib/view/components/search/search_result_page/search_card.dart +++ b/lib/view/components/search/search_result_page/search_card.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/common_badge.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/jlpt_badge.dart'; +import 'package:jisho_study_tool/view/components/search/search_result_page/parts/wanikani_badge.dart'; import 'package:unofficial_jisho_api/api.dart'; @@ -19,10 +22,32 @@ class SearchResultCard extends StatelessWidget { @override Widget build(BuildContext context) { return ExpansionTile( - title: JapaneseHeader(mainWord), + title: + IntrinsicWidth( + child: Row( + children: [ + JapaneseHeader(mainWord), + Row( + children: [ + WKBadge(result.tags.firstWhere((tag) => tag.contains("wanikani"), orElse: () => '')), + JLPTBadge(result.jlpt.isNotEmpty ? result.jlpt[0] : ''), + CommonBadge(result.is_common) + ], + ) + ], + mainAxisAlignment: MainAxisAlignment.spaceBetween, + ), + ), children: [ - Senses(result.senses), - OtherForms(otherForms), + Container( + child: Column( + children: [ + Senses(result.senses), + OtherForms(otherForms), + ], + ), + padding: EdgeInsets.symmetric(horizontal: 30), + ) ], ); }