feat: scheme download feature.
This commit is contained in:
@@ -123,7 +123,7 @@
|
|||||||
# RoadMap
|
# RoadMap
|
||||||
|
|
||||||
|
|
||||||
- [ ] 方案下载功能实现
|
- [x] 方案下载功能实现
|
||||||
- [ ] 方案应用功能实现
|
- [ ] 方案应用功能实现
|
||||||
- [ ] BugFix
|
- [ ] BugFix
|
||||||
- [ ] MD 编辑器中的UI文本国际化
|
- [ ] MD 编辑器中的UI文本国际化
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class _ContentState extends State<Content> {
|
|||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
LocalManager(),
|
LocalManager(key: H.localManagerKey),
|
||||||
GestureEditor(),
|
GestureEditor(),
|
||||||
MarketOrMe(),
|
MarketOrMe(),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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/scheme.provider.dart';
|
||||||
import 'package:dde_gesture_manager/models/settings.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/widgets/dde_button.dart';
|
||||||
|
import 'package:dde_gesture_manager_api/models.dart' show SchemeForDownload;
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
@@ -19,10 +20,10 @@ class LocalManager extends StatefulWidget {
|
|||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<LocalManager> createState() => _LocalManagerState();
|
State<LocalManager> createState() => LocalManagerState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _LocalManagerState extends State<LocalManager> {
|
class LocalManagerState extends State<LocalManager> {
|
||||||
late ScrollController _scrollController;
|
late ScrollController _scrollController;
|
||||||
String? _hoveringItemPath;
|
String? _hoveringItemPath;
|
||||||
late String _selectedItemPath;
|
late String _selectedItemPath;
|
||||||
@@ -69,6 +70,27 @@ class _LocalManagerState extends State<LocalManager> {
|
|||||||
context.read<GesturePropProvider>().copyFrom(GestureProp.empty());
|
context.read<GesturePropProvider>().copyFrom(GestureProp.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future addLocalScheme(BuildContext context, [SchemeForDownload? downloadedScheme = null]) async {
|
||||||
|
var localSchemesProvider = context.read<LocalSchemesProvider>();
|
||||||
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var isOpen = context.watch<ContentLayoutProvider>().localManagerOpened == true;
|
var isOpen = context.watch<ContentLayoutProvider>().localManagerOpened == true;
|
||||||
@@ -192,15 +214,7 @@ class _LocalManagerState extends State<LocalManager> {
|
|||||||
DButton.add(
|
DButton.add(
|
||||||
enabled: true,
|
enabled: true,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
var localSchemesProvider = context.read<LocalSchemesProvider>();
|
await addLocalScheme(context);
|
||||||
var newSchemes = [...?localSchemesProvider.schemes];
|
|
||||||
var newEntry = await localSchemesProvider.create();
|
|
||||||
newSchemes.add(newEntry);
|
|
||||||
localSchemesProvider.setProps(schemes: newSchemes..sort());
|
|
||||||
setState(() {
|
|
||||||
_selectedItemPath = newEntry.path;
|
|
||||||
});
|
|
||||||
_handleItemClick(context, newEntry);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
DButton.delete(
|
DButton.delete(
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import 'package:dde_gesture_manager/constants/constants.dart';
|
|||||||
import 'package:dde_gesture_manager/extensions.dart';
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||||
import 'package:dde_gesture_manager/models/scheme.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:flutter/cupertino.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
@@ -37,6 +39,8 @@ class H {
|
|||||||
|
|
||||||
DateTime? lastCheckAuthStatusTime;
|
DateTime? lastCheckAuthStatusTime;
|
||||||
|
|
||||||
|
static final localManagerKey = GlobalKey<LocalManagerState>();
|
||||||
|
|
||||||
initTopContext(BuildContext context) {
|
initTopContext(BuildContext context) {
|
||||||
_topContext = context;
|
_topContext = context;
|
||||||
}
|
}
|
||||||
@@ -123,6 +127,9 @@ class H {
|
|||||||
throw 'Could not launch $url';
|
throw 'Could not launch $url';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handleDownloadScheme(BuildContext context, SchemeForDownload value) =>
|
||||||
|
localManagerKey.currentState?.addLocalScheme(context, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
class PreferredPanelsStatus {
|
class PreferredPanelsStatus {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.add({
|
factory DButton.add({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -41,7 +41,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.delete({
|
factory DButton.delete({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -58,7 +58,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.apply({
|
factory DButton.apply({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -75,7 +75,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.duplicate({
|
factory DButton.duplicate({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -92,7 +92,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.paste({
|
factory DButton.paste({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -109,7 +109,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.logout({
|
factory DButton.logout({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight,
|
height = defaultButtonHeight,
|
||||||
width = defaultButtonHeight,
|
width = defaultButtonHeight,
|
||||||
@@ -126,7 +126,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.upload({
|
factory DButton.upload({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight,
|
height = defaultButtonHeight,
|
||||||
width = defaultButtonHeight,
|
width = defaultButtonHeight,
|
||||||
@@ -143,7 +143,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.download({
|
factory DButton.download({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -160,7 +160,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.share({
|
factory DButton.share({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
@@ -177,7 +177,7 @@ class DButton extends StatefulWidget {
|
|||||||
|
|
||||||
factory DButton.like({
|
factory DButton.like({
|
||||||
Key? key,
|
Key? key,
|
||||||
required enabled,
|
required bool enabled,
|
||||||
GestureTapCallback? onTap,
|
GestureTapCallback? onTap,
|
||||||
height = defaultButtonHeight * .7,
|
height = defaultButtonHeight * .7,
|
||||||
width = defaultButtonHeight * .7,
|
width = defaultButtonHeight * .7,
|
||||||
|
|||||||
@@ -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/constants/constants.dart';
|
||||||
import 'package:dde_gesture_manager/http/api.dart';
|
import 'package:dde_gesture_manager/http/api.dart';
|
||||||
import 'package:dde_gesture_manager/models/configs.provider.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/models/settings.provider.dart';
|
||||||
import 'package:dde_gesture_manager/utils/helper.dart';
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
import 'package:dde_gesture_manager/widgets/dde_button.dart';
|
import 'package:dde_gesture_manager/widgets/dde_button.dart';
|
||||||
@@ -281,14 +282,15 @@ class _MarketWidgetState extends State<MarketWidget> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
DButton.download(
|
DButton.download(
|
||||||
enabled: true,
|
enabled: (context.watch<LocalSchemesProvider>().schemes ?? []).every((e) => e.scheme.id != _selected),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) {
|
Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) {
|
||||||
/// todo: 下载逻辑
|
if (value != null) {
|
||||||
value.sout();
|
H.handleDownloadScheme(context, value);
|
||||||
setState(() {
|
setState(() {
|
||||||
currentSelectedScheme.downloads = currentSelectedScheme.downloads! + 1;
|
currentSelectedScheme.downloads = currentSelectedScheme.downloads! + 1;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:dde_gesture_manager/constants/constants.dart';
|
|||||||
import 'package:dde_gesture_manager/extensions.dart';
|
import 'package:dde_gesture_manager/extensions.dart';
|
||||||
import 'package:dde_gesture_manager/http/api.dart';
|
import 'package:dde_gesture_manager/http/api.dart';
|
||||||
import 'package:dde_gesture_manager/models/configs.provider.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/scheme_list_refresh_key.provider.dart';
|
||||||
import 'package:dde_gesture_manager/models/settings.provider.dart';
|
import 'package:dde_gesture_manager/models/settings.provider.dart';
|
||||||
import 'package:dde_gesture_manager/utils/helper.dart';
|
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||||
@@ -294,14 +295,15 @@ class _MeWidgetState extends State<MeWidget> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
DButton.download(
|
DButton.download(
|
||||||
enabled: true,
|
enabled: (context.watch<LocalSchemesProvider>().schemes ?? []).every((e) => e.scheme.id != _selected),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) {
|
Api.downloadScheme(schemeId: currentSelectedScheme!.uuid!).then((value) {
|
||||||
/// todo: 下载逻辑
|
if (value != null) {
|
||||||
value.sout();
|
H.handleDownloadScheme(context, value);
|
||||||
context
|
context
|
||||||
.read<SchemeListRefreshKeyProvider>()
|
.read<SchemeListRefreshKeyProvider>()
|
||||||
.setProps(refreshKey: DateTime.now().millisecondsSinceEpoch);
|
.setProps(refreshKey: DateTime.now().millisecondsSinceEpoch);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user