From a124f765ccdc0dc0f539659ea2081845c5cf9ec2 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Wed, 19 Jan 2022 18:54:42 +0800 Subject: [PATCH] feat: scheme download feature. --- README.md | 2 +- app/lib/pages/content.dart | 2 +- app/lib/pages/local_manager.dart | 36 +++++++++++++++++++++++++----------- app/lib/utils/helper.dart | 7 +++++++ app/lib/widgets/dde_button.dart | 20 ++++++++++---------- app/lib/widgets/market.dart | 14 ++++++++------ app/lib/widgets/me.dart | 14 ++++++++------ 7 files changed, 60 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 1b5d491..991f9b0 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ # RoadMap -- [ ] 方案下载功能实现 +- [x] 方案下载功能实现 - [ ] 方案应用功能实现 - [ ] BugFix - [ ] MD 编辑器中的UI文本国际化 diff --git a/app/lib/pages/content.dart b/app/lib/pages/content.dart index abe0d5c..1fe7191 100644 --- a/app/lib/pages/content.dart +++ b/app/lib/pages/content.dart @@ -54,7 +54,7 @@ class _ContentState extends State { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - LocalManager(), + LocalManager(key: H.localManagerKey), GestureEditor(), MarketOrMe(), ], diff --git a/app/lib/pages/local_manager.dart b/app/lib/pages/local_manager.dart index 514a168..3e29d3a 100644 --- a/app/lib/pages/local_manager.dart +++ b/app/lib/pages/local_manager.dart @@ -9,6 +9,7 @@ import 'package:dde_gesture_manager/models/scheme.dart'; import 'package:dde_gesture_manager/models/scheme.provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; import 'package:dde_gesture_manager/widgets/dde_button.dart'; +import 'package:dde_gesture_manager_api/models.dart' show SchemeForDownload; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:uuid/uuid.dart'; @@ -19,10 +20,10 @@ class LocalManager extends StatefulWidget { }) : super(key: key); @override - State createState() => _LocalManagerState(); + State createState() => LocalManagerState(); } -class _LocalManagerState extends State { +class LocalManagerState extends State { late ScrollController _scrollController; String? _hoveringItemPath; late String _selectedItemPath; @@ -69,6 +70,27 @@ class _LocalManagerState extends State { context.read().copyFrom(GestureProp.empty()); } + Future addLocalScheme(BuildContext context, [SchemeForDownload? downloadedScheme = null]) async { + var localSchemesProvider = context.read(); + var newSchemes = [...?localSchemesProvider.schemes]; + var newEntry = await localSchemesProvider.create(); + if (downloadedScheme != null) { + newEntry.scheme + ..id = downloadedScheme.uuid + ..name = downloadedScheme.name + ..description = downloadedScheme.description + ..uploaded = true + ..fromMarket = true + ..gestures = (downloadedScheme.gestures ?? []).map(GestureProp.parse).toList(); + } + newSchemes.add(newEntry); + localSchemesProvider.setProps(schemes: newSchemes..sort()); + setState(() { + _selectedItemPath = newEntry.path; + }); + _handleItemClick(context, newEntry); + } + @override Widget build(BuildContext context) { var isOpen = context.watch().localManagerOpened == true; @@ -192,15 +214,7 @@ class _LocalManagerState extends State { DButton.add( enabled: true, onTap: () async { - var localSchemesProvider = context.read(); - var newSchemes = [...?localSchemesProvider.schemes]; - var newEntry = await localSchemesProvider.create(); - newSchemes.add(newEntry); - localSchemesProvider.setProps(schemes: newSchemes..sort()); - setState(() { - _selectedItemPath = newEntry.path; - }); - _handleItemClick(context, newEntry); + await addLocalScheme(context); }, ), DButton.delete( diff --git a/app/lib/utils/helper.dart b/app/lib/utils/helper.dart index 787af6b..f217894 100644 --- a/app/lib/utils/helper.dart +++ b/app/lib/utils/helper.dart @@ -2,6 +2,8 @@ import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/models/content_layout.provider.dart'; import 'package:dde_gesture_manager/models/scheme.dart'; +import 'package:dde_gesture_manager/pages/local_manager.dart'; +import 'package:dde_gesture_manager_api/src/models/scheme.dart'; import 'package:flutter/cupertino.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -37,6 +39,8 @@ class H { DateTime? lastCheckAuthStatusTime; + static final localManagerKey = GlobalKey(); + initTopContext(BuildContext context) { _topContext = context; } @@ -123,6 +127,9 @@ class H { throw 'Could not launch $url'; } } + + static void handleDownloadScheme(BuildContext context, SchemeForDownload value) => + localManagerKey.currentState?.addLocalScheme(context, value); } class PreferredPanelsStatus { diff --git a/app/lib/widgets/dde_button.dart b/app/lib/widgets/dde_button.dart index f0bac0a..1c9dbca 100644 --- a/app/lib/widgets/dde_button.dart +++ b/app/lib/widgets/dde_button.dart @@ -24,7 +24,7 @@ class DButton extends StatefulWidget { factory DButton.add({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -41,7 +41,7 @@ class DButton extends StatefulWidget { factory DButton.delete({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -58,7 +58,7 @@ class DButton extends StatefulWidget { factory DButton.apply({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -75,7 +75,7 @@ class DButton extends StatefulWidget { factory DButton.duplicate({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -92,7 +92,7 @@ class DButton extends StatefulWidget { factory DButton.paste({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -109,7 +109,7 @@ class DButton extends StatefulWidget { factory DButton.logout({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight, width = defaultButtonHeight, @@ -126,7 +126,7 @@ class DButton extends StatefulWidget { factory DButton.upload({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight, width = defaultButtonHeight, @@ -143,7 +143,7 @@ class DButton extends StatefulWidget { factory DButton.download({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -160,7 +160,7 @@ class DButton extends StatefulWidget { factory DButton.share({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, @@ -177,7 +177,7 @@ class DButton extends StatefulWidget { factory DButton.like({ Key? key, - required enabled, + required bool enabled, GestureTapCallback? onTap, height = defaultButtonHeight * .7, width = defaultButtonHeight * .7, diff --git a/app/lib/widgets/market.dart b/app/lib/widgets/market.dart index 2d89144..5778dc3 100644 --- a/app/lib/widgets/market.dart +++ b/app/lib/widgets/market.dart @@ -3,6 +3,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/http/api.dart'; import 'package:dde_gesture_manager/models/configs.provider.dart'; +import 'package:dde_gesture_manager/models/local_schemes_provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; import 'package:dde_gesture_manager/utils/helper.dart'; import 'package:dde_gesture_manager/widgets/dde_button.dart'; @@ -281,14 +282,15 @@ class _MarketWidgetState extends State { }, ), DButton.download( - enabled: true, + enabled: (context.watch().schemes ?? []).every((e) => e.scheme.id != _selected), onTap: () { Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) { - /// todo: 下载逻辑 - value.sout(); - setState(() { - currentSelectedScheme.downloads = currentSelectedScheme.downloads! + 1; - }); + if (value != null) { + H.handleDownloadScheme(context, value); + setState(() { + currentSelectedScheme.downloads = currentSelectedScheme.downloads! + 1; + }); + } }); }, ), diff --git a/app/lib/widgets/me.dart b/app/lib/widgets/me.dart index 6a33aa0..cdd9321 100644 --- a/app/lib/widgets/me.dart +++ b/app/lib/widgets/me.dart @@ -5,6 +5,7 @@ import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/http/api.dart'; import 'package:dde_gesture_manager/models/configs.provider.dart'; +import 'package:dde_gesture_manager/models/local_schemes_provider.dart'; import 'package:dde_gesture_manager/models/scheme_list_refresh_key.provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; import 'package:dde_gesture_manager/utils/helper.dart'; @@ -294,14 +295,15 @@ class _MeWidgetState extends State { }, ), DButton.download( - enabled: true, + enabled: (context.watch().schemes ?? []).every((e) => e.scheme.id != _selected), onTap: () { Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) { - /// todo: 下载逻辑 - value.sout(); - context - .read() - .setProps(refreshKey: DateTime.now().millisecondsSinceEpoch); + if (value != null) { + H.handleDownloadScheme(context, value); + context + .read() + .setProps(refreshKey: DateTime.now().millisecondsSinceEpoch); + } }); }, ),