diff --git a/lib/i10n/localization_intl.dart b/lib/i10n/localization_intl.dart index 295871e..1bf4781 100644 --- a/lib/i10n/localization_intl.dart +++ b/lib/i10n/localization_intl.dart @@ -72,6 +72,16 @@ class DemoLocalizations { String get work => Intl.message('Work', name: 'work', desc: '工作',); + String get setIconName => Intl.message('icon name', name: 'setIconName', desc: '给图标设置一个名字吧',); + String get defaultIconName => Intl.message('default', name: 'defaultIconName', desc: '默认',); + String get customIcon => Intl.message('Custom Icon', name: 'customIcon', desc: '自定义图标',); + String get cancel => Intl.message('cancel', name: 'cancel', desc: '取消',); + String get ok => Intl.message('ok', name: 'ok', desc: '确定',); + String get pickAColor => Intl.message('Pick a color!', name: 'pickAColor', desc: '选择一个颜色吧!',); + String get canNotAddMoreIcon => Intl.message('You can only customize up to 10 icons.', name: 'canNotAddMoreIcon', desc: '最多只能自定义10个图标',); + + + String get checkUpdate { return Intl.message( diff --git a/lib/i10n/messages_en_US.dart b/lib/i10n/messages_en_US.dart index 6cd4b07..90623ee 100644 --- a/lib/i10n/messages_en_US.dart +++ b/lib/i10n/messages_en_US.dart @@ -32,13 +32,17 @@ class MessageLookup extends MessageLookupByLibrary { "appSetting" : MessageLookupByLibrary.simpleMessage("Setting"), "backgroundGradient" : MessageLookupByLibrary.simpleMessage("Background Gradient"), "blueGray" : MessageLookupByLibrary.simpleMessage("blue-gray"), + "canNotAddMoreIcon" : MessageLookupByLibrary.simpleMessage("You can only customize up to 10 icons."), + "cancel" : MessageLookupByLibrary.simpleMessage("cancel"), "changeTheme" : MessageLookupByLibrary.simpleMessage("Change Theme"), "checkUpdate" : MessageLookupByLibrary.simpleMessage("Check Update"), "coffee" : MessageLookupByLibrary.simpleMessage("coffee"), "currentIcons" : MessageLookupByLibrary.simpleMessage("Current Icons"), + "customIcon" : MessageLookupByLibrary.simpleMessage("Custom Icon"), "cyan" : MessageLookupByLibrary.simpleMessage("cyan"), "dark" : MessageLookupByLibrary.simpleMessage("dark"), "deadline" : MessageLookupByLibrary.simpleMessage("deadline"), + "defaultIconName" : MessageLookupByLibrary.simpleMessage("default"), "deleteTask" : MessageLookupByLibrary.simpleMessage("Delete"), "editTask" : MessageLookupByLibrary.simpleMessage("Edit"), "game" : MessageLookupByLibrary.simpleMessage("Game"), @@ -47,11 +51,14 @@ class MessageLookup extends MessageLookupByLibrary { "itemNumber" : m0, "languageTitle" : MessageLookupByLibrary.simpleMessage("Change Language"), "music" : MessageLookupByLibrary.simpleMessage("Music"), + "ok" : MessageLookupByLibrary.simpleMessage("ok"), + "pickAColor" : MessageLookupByLibrary.simpleMessage("Pick a color!"), "pink" : MessageLookupByLibrary.simpleMessage("pink"), "purple" : MessageLookupByLibrary.simpleMessage("purple"), "read" : MessageLookupByLibrary.simpleMessage("Read"), "remindMe" : MessageLookupByLibrary.simpleMessage("remind me"), "repeat" : MessageLookupByLibrary.simpleMessage("repeat"), + "setIconName" : MessageLookupByLibrary.simpleMessage("icon name"), "sports" : MessageLookupByLibrary.simpleMessage("Sports"), "submit" : MessageLookupByLibrary.simpleMessage("Submit"), "taskItems" : m1, diff --git a/lib/i10n/messages_zh_CN.dart b/lib/i10n/messages_zh_CN.dart index d6da1eb..912745a 100644 --- a/lib/i10n/messages_zh_CN.dart +++ b/lib/i10n/messages_zh_CN.dart @@ -32,13 +32,17 @@ class MessageLookup extends MessageLookupByLibrary { "appSetting" : MessageLookupByLibrary.simpleMessage("设置"), "backgroundGradient" : MessageLookupByLibrary.simpleMessage("背景渐变"), "blueGray" : MessageLookupByLibrary.simpleMessage("炊烟袅袅"), + "canNotAddMoreIcon" : MessageLookupByLibrary.simpleMessage("最多只能自定义10个图标"), + "cancel" : MessageLookupByLibrary.simpleMessage("取消"), "changeTheme" : MessageLookupByLibrary.simpleMessage("切换主题"), "checkUpdate" : MessageLookupByLibrary.simpleMessage("检查更新"), "coffee" : MessageLookupByLibrary.simpleMessage("想入啡啡"), "currentIcons" : MessageLookupByLibrary.simpleMessage("当前图标"), + "customIcon" : MessageLookupByLibrary.simpleMessage("自定义图标"), "cyan" : MessageLookupByLibrary.simpleMessage("蓝天白云"), "dark" : MessageLookupByLibrary.simpleMessage("不见五指"), "deadline" : MessageLookupByLibrary.simpleMessage("截止日期"), + "defaultIconName" : MessageLookupByLibrary.simpleMessage("默认"), "deleteTask" : MessageLookupByLibrary.simpleMessage("删除"), "editTask" : MessageLookupByLibrary.simpleMessage("编辑"), "game" : MessageLookupByLibrary.simpleMessage("打游戏"), @@ -47,11 +51,14 @@ class MessageLookup extends MessageLookupByLibrary { "itemNumber" : m0, "languageTitle" : MessageLookupByLibrary.simpleMessage("切换语言"), "music" : MessageLookupByLibrary.simpleMessage("听歌"), + "ok" : MessageLookupByLibrary.simpleMessage("确定"), + "pickAColor" : MessageLookupByLibrary.simpleMessage("选择一个颜色吧!"), "pink" : MessageLookupByLibrary.simpleMessage("略施粉黛"), "purple" : MessageLookupByLibrary.simpleMessage("紫气东来"), "read" : MessageLookupByLibrary.simpleMessage("读书"), "remindMe" : MessageLookupByLibrary.simpleMessage("提醒我"), "repeat" : MessageLookupByLibrary.simpleMessage("重复"), + "setIconName" : MessageLookupByLibrary.simpleMessage("图标名"), "sports" : MessageLookupByLibrary.simpleMessage("运动"), "submit" : MessageLookupByLibrary.simpleMessage("提交"), "taskItems" : m1, diff --git a/lib/logic/icon_setting_page_logic.dart b/lib/logic/icon_setting_page_logic.dart index fe4209a..a409fe6 100644 --- a/lib/logic/icon_setting_page_logic.dart +++ b/lib/logic/icon_setting_page_logic.dart @@ -2,10 +2,13 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_colorpicker/flutter_colorpicker.dart'; +import 'package:todo_list/i10n/localization_intl.dart'; import 'package:todo_list/json/task_icon_bean.dart'; import 'package:todo_list/model/all_model.dart'; import 'package:todo_list/utils/icon_list_util.dart'; import 'package:todo_list/utils/shared_util.dart'; +import 'package:todo_list/utils/theme_util.dart'; +import 'package:todo_list/widgets/custom_icon_widget.dart'; class IconSettingPageLogic { final IconSettingPageModel _model; @@ -14,49 +17,60 @@ class IconSettingPageLogic { void onIconPress(IconBean iconBean) { showDialog( + barrierDismissible: false, context: _model.context, builder: (ctx) { return AlertDialog( elevation: 0.0, - title: const Text('Pick a color!'), - content: SingleChildScrollView( - child: ColorPicker( - pickerColor: _model.currentPickerColor, - onColorChanged: (color) { - _model.currentPickerColor = color; - }, - enableLabel: true, - pickerAreaHeightPercent: 0.8, - ), - ), - actions: [ - FlatButton( - child: const Text('Got it'), - onPressed: () async { - ColorBean colorBean = - ColorBean.fromColor(_model.currentPickerColor); - TaskIconBean taskIconBean = TaskIconBean( - taskName: _model.currentIconName.isEmpty - ? "default" - : _model.currentIconName, - colorBean: colorBean, - iconBean: iconBean); - final data = jsonEncode(taskIconBean.toMap()); - debugPrint("data:${data}"); - SharedUtil.instance.readAndSaveList(Keys.taskIconBeans, data); - getTaskList(); - Navigator.of(_model.context).pop(); - }, - ), - ], + contentPadding: EdgeInsets.fromLTRB(20, 0, 20, 0), + title: Text(DemoLocalizations.of(_model.context).customIcon), + content: CustomIconWidget( + iconData: IconBean.fromBean(iconBean), + onApplyTap: (color) async{ + _model.currentPickerColor = color; + ColorBean colorBean = + ColorBean.fromColor(_model.currentPickerColor); + TaskIconBean taskIconBean = TaskIconBean( + taskName: _model.currentIconName.isEmpty + ? DemoLocalizations.of(_model.context).defaultIconName + : _model.currentIconName, + colorBean: colorBean, + iconBean: iconBean); + final data = jsonEncode(taskIconBean.toMap()); + final canAddMore = await SharedUtil.instance.readAndSaveList(Keys.taskIconBeans, data); + if(!canAddMore){ + showCanNotAddIcon(); + } + getTaskList(); + }, + pickerColor: _model.currentPickerColor, + onTextChange: (text){ + final name = text.isEmpty ? DemoLocalizations.of(_model.context).defaultIconName : text; + _model.currentIconName = name; + }, + ) ); }); } + void getTaskList() async { - final list = await IconListUtil.getInstance().getIconWithCache(_model.context); + final list = + await IconListUtil.getInstance().getIconWithCache(_model.context); _model.taskIcons.clear(); _model.taskIcons.addAll(list); _model.refresh(); } + + void showCanNotAddIcon(){ + showDialog(context: _model.context,builder: (ctx){ + return AlertDialog( + content: Text(DemoLocalizations.of(_model.context).canNotAddMoreIcon), + ); + }); + } + + void removeIcon(){ + + } } diff --git a/lib/model/icon_setting_page_model.dart b/lib/model/icon_setting_page_model.dart index b586398..0a78670 100644 --- a/lib/model/icon_setting_page_model.dart +++ b/lib/model/icon_setting_page_model.dart @@ -10,8 +10,9 @@ class IconSettingPageModel extends ChangeNotifier { BuildContext context; List taskIcons = []; - Color currentPickerColor; + Color currentPickerColor = Colors.black; String currentIconName = ""; + bool isDeleting = false; IconSettingPageModel() { logic = IconSettingPageLogic(this); @@ -20,7 +21,6 @@ class IconSettingPageModel extends ChangeNotifier { void setContext(BuildContext context) { if (this.context == null) { this.context = context; - currentPickerColor = Theme.of(context).primaryColor; logic.getTaskList(); } } diff --git a/lib/pages/icon_setting_page.dart b/lib/pages/icon_setting_page.dart index 271cbe8..1c634b4 100644 --- a/lib/pages/icon_setting_page.dart +++ b/lib/pages/icon_setting_page.dart @@ -17,10 +17,31 @@ class IconSettingPage extends StatelessWidget { body: Container( child: Column( children: [ - Container( - child: Text(DemoLocalizations.of(context).currentIcons), - margin: EdgeInsets.only(top: 20, left: 25), - alignment: Alignment.topLeft, + Row( + children: [ + Expanded( + child: Container( + child: Text(DemoLocalizations.of(context).currentIcons), + margin: EdgeInsets.only(top: 20, left: 25), + alignment: Alignment.centerLeft, + ), + ), + Expanded( + child: Container( + child: GestureDetector( + child: model.isDeleting + ? Icon(Icons.check, color: Colors.green,size: 20,) + : Icon(Icons.border_color,size: 20,), + onTap: () { + model.isDeleting = !model.isDeleting; + model.refresh(); + }, + ), + margin: EdgeInsets.only(top: 20, right: 25), + alignment: Alignment.centerRight, + ), + ), + ], ), Container( height: 150, diff --git a/lib/utils/shared_util.dart b/lib/utils/shared_util.dart index 6bde78a..6e72d7b 100644 --- a/lib/utils/shared_util.dart +++ b/lib/utils/shared_util.dart @@ -48,12 +48,14 @@ class SharedUtil{ } - void readAndSaveList(String key, String data) async{ + Future readAndSaveList(String key, String data) async{ SharedPreferences prefs = await SharedPreferences.getInstance(); String account = prefs.getString(Keys.account) ?? "default"; List strings = prefs.getStringList(key + account) ?? []; + if(strings.length >= 10) return false; strings.add(data); await prefs.setStringList(key + account, strings); + return true; } diff --git a/lib/widgets/custom_icon_widget.dart b/lib/widgets/custom_icon_widget.dart new file mode 100644 index 0000000..8139365 --- /dev/null +++ b/lib/widgets/custom_icon_widget.dart @@ -0,0 +1,200 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_colorpicker/flutter_colorpicker.dart'; +import 'package:todo_list/i10n/localization_intl.dart'; +import 'package:todo_list/utils/theme_util.dart'; + +class CustomIconWidget extends StatefulWidget { + final IconData iconData; + final Function onApplyTap; + final Color pickerColor; + final ValueChanged onTextChange; + + CustomIconWidget( + {this.iconData, + this.onApplyTap, + this.pickerColor, this.onTextChange,}) + : assert(iconData != null), + assert(onApplyTap != null), + assert(onTextChange != null), + assert(pickerColor != null); + + @override + _CustomIconWidgetState createState() => _CustomIconWidgetState(); +} + +class _CustomIconWidgetState extends State { + final List defaultColors = [ + MyThemeColor.blueGrayColor, + MyThemeColor.darkColor, + MyThemeColor.greenColor, + MyThemeColor.purpleColor, + MyThemeColor.cyanColor, + MyThemeColor.coffeeColor, + MyThemeColor.defaultColor, + ]; + + Color currentIconColor; + int currentSelectIndex; + + @override + void initState() { + super.initState(); + currentIconColor = widget.pickerColor; + currentSelectIndex = -1; + } + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: Column( + children: [ + Container( + margin: EdgeInsets.all(10), + width: 260, + child: TextField( + onChanged: (text) => widget.onTextChange(text), + decoration: InputDecoration( + hintText: DemoLocalizations.of(context).setIconName, + prefixIcon: Icon( + widget.iconData, + color: currentIconColor, + ), + ), + maxLength: 20, + maxLines: 1, + ), + ), + Row( + children: List.generate(defaultColors.length, (index) { + return InkWell( + onTap: (){ + setState(() { + currentSelectIndex = index; + currentIconColor = defaultColors[index]; + }); + }, + child: Container( + width: 20, + height: 20, + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: defaultColors[index], + border:currentSelectIndex == index ? Border.all(width: 2,color: Colors.black) : null, + ), + ), + ); + }), + ), + Container( + child: Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: (){ + _showColorPicker(context); + }, + child: Container( + alignment: Alignment.centerLeft, + height: 35, + width: 35, + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.redAccent, + Colors.greenAccent, + Colors.blueAccent, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + border: currentSelectIndex == 7 + ? Border.all(color: currentIconColor, width: 4) + : null, + ), + ), + ), + ), + Expanded( + flex: 2, + child: Container( + alignment: Alignment.centerRight, + child: FlatButton( + child: Text( + DemoLocalizations.of(context).cancel, + style: TextStyle(color: Colors.redAccent), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + )), + Expanded( + flex: 2, + child: Container( + alignment: Alignment.centerRight, + child: FlatButton( + child: Text( + DemoLocalizations.of(context).ok, + style: TextStyle(color: Colors.black), + ), + onPressed: (){ + widget.onApplyTap(currentIconColor); + Navigator.of(context).pop(); + }, + ), + ), + ), + ], + ), + ) + ], + ), + ); + } + + + void _showColorPicker(BuildContext context) { + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + elevation: 0.0, + title: Text(DemoLocalizations.of(context).pickAColor), + content: SingleChildScrollView( + child: ColorPicker( + pickerColor: currentIconColor, + onColorChanged: (color) { + currentIconColor = color; + currentSelectIndex = 7; + }, + enableLabel: true, + pickerAreaHeightPercent: 0.8, + ), + ), + actions: [ + FlatButton( + child: Text(DemoLocalizations.of(context).cancel,style: TextStyle(color: Colors.redAccent),), + onPressed: () { + currentIconColor = widget.pickerColor; + currentSelectIndex = -1; + Navigator.of(context).pop(); + }, + ), + FlatButton( + child: Text(DemoLocalizations.of(context).ok), + onPressed: () { + setState(() { + + }); + Navigator.of(context).pop(); + }, + ), + ], + ); + }); + } +} diff --git a/res/intl_en_US.arb b/res/intl_en_US.arb index e2ce8fa..148b6da 100644 --- a/res/intl_en_US.arb +++ b/res/intl_en_US.arb @@ -84,6 +84,48 @@ "type": "text", "placeholders": {} }, + "setIconName": "icon name", + "@setIconName": { + "description": "给图标设置一个名字吧", + "type": "text", + "placeholders": {} + }, + "defaultIconName": "default", + "@defaultIconName": { + "description": "默认", + "type": "text", + "placeholders": {} + }, + "customIcon": "Custom Icon", + "@customIcon": { + "description": "自定义图标", + "type": "text", + "placeholders": {} + }, + "cancel": "cancel", + "@cancel": { + "description": "取消", + "type": "text", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "description": "确定", + "type": "text", + "placeholders": {} + }, + "pickAColor": "Pick a color!", + "@pickAColor": { + "description": "选择一个颜色吧!", + "type": "text", + "placeholders": {} + }, + "canNotAddMoreIcon": "You can only customize up to 10 icons.", + "@canNotAddMoreIcon": { + "description": "最多只能自定义10个图标", + "type": "text", + "placeholders": {} + }, "checkUpdate": "Check Update", "@checkUpdate": { "description": "检查更新", diff --git a/res/intl_messages.arb b/res/intl_messages.arb index 9aefc98..8f419f5 100644 --- a/res/intl_messages.arb +++ b/res/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2019-07-12T22:31:54.781781", + "@@last_modified": "2019-07-13T13:17:04.899970", "appName": "One Day", "@appName": { "description": "app的名字", @@ -84,6 +84,48 @@ "type": "text", "placeholders": {} }, + "setIconName": "icon name", + "@setIconName": { + "description": "给图标设置一个名字吧", + "type": "text", + "placeholders": {} + }, + "defaultIconName": "default", + "@defaultIconName": { + "description": "默认", + "type": "text", + "placeholders": {} + }, + "customIcon": "Custom Icon", + "@customIcon": { + "description": "自定义图标", + "type": "text", + "placeholders": {} + }, + "cancel": "cancel", + "@cancel": { + "description": "取消", + "type": "text", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "description": "确定", + "type": "text", + "placeholders": {} + }, + "pickAColor": "Pick a color!", + "@pickAColor": { + "description": "选择一个颜色吧!", + "type": "text", + "placeholders": {} + }, + "canNotAddMoreIcon": "You can only customize up to 10 icons.", + "@canNotAddMoreIcon": { + "description": "最多只能自定义10个图标", + "type": "text", + "placeholders": {} + }, "checkUpdate": "Check Update", "@checkUpdate": { "description": "检查更新", diff --git a/res/intl_zh_CN.arb b/res/intl_zh_CN.arb index cf98ef7..2d71d95 100644 --- a/res/intl_zh_CN.arb +++ b/res/intl_zh_CN.arb @@ -78,7 +78,48 @@ "type": "text", "placeholders": {} }, - + "defaultIconName": "默认", + "@defaultIconName": { + "description": "默认", + "type": "text", + "placeholders": {} + }, + "setIconName": "图标名", + "@setIconName": { + "description": "给图标设置一个名字吧", + "type": "text", + "placeholders": {} + }, + "customIcon": "自定义图标", + "@customIcon": { + "description": "自定义图标", + "type": "text", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "description": "取消", + "type": "text", + "placeholders": {} + }, + "ok": "确定", + "@ok": { + "description": "确定", + "type": "text", + "placeholders": {} + }, + "pickAColor": "选择一个颜色吧!", + "@pickAColor": { + "description": "选择一个颜色吧!", + "type": "text", + "placeholders": {} + }, + "canNotAddMoreIcon": "最多只能自定义10个图标", + "@canNotAddMoreIcon": { + "description": "最多只能自定义10个图标", + "type": "text", + "placeholders": {} + }, "checkUpdate": "检查更新", "@checkUpdate": { "description": "检查更新",