From d2e07cd89d3af1f433e53e2093a870942a89b361 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Thu, 20 Jan 2022 17:42:52 +0800 Subject: [PATCH] feat: scheme apply feature. --- app/lib/constants/constants.dart | 12 +++++++++- app/lib/pages/local_manager.dart | 9 +++---- app/lib/utils/apply_scheme_interface.dart | 7 ++++++ app/lib/utils/apply_scheme_linux.dart | 40 +++++++++++++++++++++++++++++++ app/lib/utils/apply_scheme_web.dart | 39 ++++++++++++++++++++++++++++++ app/lib/utils/helper.dart | 19 +++++++++++++++ app/resources/langs/en.json | 7 ++++++ app/resources/langs/zh-CN.json | 7 ++++++ 8 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 app/lib/utils/apply_scheme_interface.dart create mode 100644 app/lib/utils/apply_scheme_linux.dart create mode 100644 app/lib/utils/apply_scheme_web.dart diff --git a/app/lib/constants/constants.dart b/app/lib/constants/constants.dart index 52cdae0..3065250 100644 --- a/app/lib/constants/constants.dart +++ b/app/lib/constants/constants.dart @@ -19,6 +19,16 @@ const double defaultBorderRadius = 8; const double defaultButtonHeight = 36; +const userGestureConfigFilePath = 'deepin/dde-daemon/gesture.json'; + +const deepinLogoutCommands = [ + 'dbus-send', + '--type=method_call', + '--dest=com.deepin.SessionManager', + '/com/deepin/SessionManager', + 'com.deepin.SessionManager.RequestLogout' +]; + const List builtInCommands = [ 'ShowWorkspace', 'Handle4Or5FingersSwipeUp', @@ -45,4 +55,4 @@ enum UploadRespStatus { done, name_occupied, error, -} \ No newline at end of file +} diff --git a/app/lib/pages/local_manager.dart b/app/lib/pages/local_manager.dart index 4d35a58..35bb184 100644 --- a/app/lib/pages/local_manager.dart +++ b/app/lib/pages/local_manager.dart @@ -8,6 +8,7 @@ import 'package:dde_gesture_manager/models/local_schemes_provider.dart'; 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/utils/apply_scheme_interface.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'; @@ -257,10 +258,10 @@ class LocalManagerState extends State { DButton.apply( enabled: true, onTap: () { - var appliedId = - localSchemes.firstWhere((ele) => ele.path == _selectedItemPath).scheme.id!; - appliedId.sout(); - context.read().setProps(appliedSchemeId: appliedId); + var appliedScheme = + localSchemes.firstWhere((ele) => ele.path == _selectedItemPath).scheme; + context.read().setProps(appliedSchemeId: appliedScheme.id); + SchemeApplyUtil().apply(context, appliedScheme); }, ), ] diff --git a/app/lib/utils/apply_scheme_interface.dart b/app/lib/utils/apply_scheme_interface.dart new file mode 100644 index 0000000..fe52623 --- /dev/null +++ b/app/lib/utils/apply_scheme_interface.dart @@ -0,0 +1,7 @@ +import 'package:dde_gesture_manager/models/scheme.dart'; +import 'package:flutter/material.dart'; +export 'apply_scheme_web.dart' if (dart.library.io) 'apply_scheme_linux.dart'; + +abstract class SchemeApplyUtilStub { + void apply(BuildContext context, Scheme scheme); +} diff --git a/app/lib/utils/apply_scheme_linux.dart b/app/lib/utils/apply_scheme_linux.dart new file mode 100644 index 0000000..a55b169 --- /dev/null +++ b/app/lib/utils/apply_scheme_linux.dart @@ -0,0 +1,40 @@ +import 'dart:io'; + +import 'package:dde_gesture_manager/constants/constants.dart'; +import 'package:dde_gesture_manager/extensions.dart'; +import 'package:dde_gesture_manager/models/scheme.dart'; +import 'package:dde_gesture_manager/utils/helper.dart'; +import 'package:dde_gesture_manager/utils/notificator.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_platform_alert/flutter_platform_alert.dart'; +import 'package:uuid/uuid.dart'; +import 'apply_scheme_interface.dart'; +import 'package:xdg_directories/xdg_directories.dart' as xdg; +import 'package:path/path.dart' show join; + +class SchemeApplyUtil implements SchemeApplyUtilStub { + void apply(BuildContext context, Scheme scheme) { + var configFilePath = join(xdg.configHome.path, userGestureConfigFilePath); + configFilePath.sout(); + var file = File(configFilePath); + if (scheme.id == Uuid.NAMESPACE_NIL) { + if (file.existsSync()) file.deleteSync(); + } else { + if (!file.existsSync()) file.createSync(recursive: true); + file.writeAsStringSync( + H.transGesturePropsToConfig(scheme.gestures ?? []), + flush: true, + ); + Notificator.showConfirm( + title: LocaleKeys.info_apply_scheme_success.tr(), + description: LocaleKeys.info_apply_scheme_description.tr(), + positiveButtonTitle: LocaleKeys.info_apply_scheme_logout_immediately.tr(), + negativeButtonTitle: LocaleKeys.str_cancel.tr(), + ).then((value) { + if (value == CustomButton.positiveButton) { + Process.run(deepinLogoutCommands.first, deepinLogoutCommands.skip(1).toList()); + } + }); + } + } +} diff --git a/app/lib/utils/apply_scheme_web.dart b/app/lib/utils/apply_scheme_web.dart new file mode 100644 index 0000000..4e959ec --- /dev/null +++ b/app/lib/utils/apply_scheme_web.dart @@ -0,0 +1,39 @@ +import 'package:dde_gesture_manager/constants/constants.dart'; +import 'package:dde_gesture_manager/extensions.dart'; +import 'package:dde_gesture_manager/models/scheme.dart'; +import 'package:dde_gesture_manager/utils/helper.dart'; +import 'package:dde_gesture_manager/utils/notificator.dart'; +import 'package:flutter/material.dart'; +import 'package:uuid/uuid.dart'; +import 'apply_scheme_interface.dart'; +import 'package:flutter/services.dart'; + +class SchemeApplyUtil implements SchemeApplyUtilStub { + void apply(BuildContext context, Scheme scheme) { + var cmd = scheme.id == Uuid.NAMESPACE_NIL + ? [ + 'rm \$XDG_CONFIG_HOME/${userGestureConfigFilePath}', + ] + : [ + 'cat > \$XDG_CONFIG_HOME/${userGestureConfigFilePath} << EOF', + '${H.transGesturePropsToConfig(scheme.gestures ?? [])}', + 'EOF', + ]; + cmd.add('zenity' + ' --title=${LocaleKeys.info_apply_scheme_success.tr()}' + ' --question' + ' --no-wrap' + ' --text=${LocaleKeys.info_apply_scheme_description.tr()}' + ' --ok-label=${LocaleKeys.info_apply_scheme_logout_immediately.tr()}' + ' --cancel-label=${LocaleKeys.str_cancel.tr()}' + ' && ${deepinLogoutCommands.join(' ')}'); + Clipboard.setData(ClipboardData( + text: cmd.join('\n'), + )); + Notificator.success( + context, + title: LocaleKeys.info_apply_scheme_commands_copied_title.tr(), + description: LocaleKeys.info_apply_scheme_commands_copied_description.tr(), + ); + } +} diff --git a/app/lib/utils/helper.dart b/app/lib/utils/helper.dart index f217894..6741aee 100644 --- a/app/lib/utils/helper.dart +++ b/app/lib/utils/helper.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + 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'; @@ -130,6 +132,23 @@ class H { static void handleDownloadScheme(BuildContext context, SchemeForDownload value) => localManagerKey.currentState?.addLocalScheme(context, value); + + static String transGesturePropsToConfig(List gestures) => + JsonEncoder.withIndent(' ' * 4).convert(gestures + .map( + (gesture) => { + "Event": { + "Name": gesture.gesture!.name, + "Direction": H.getGestureDirectionName(gesture.direction), + "Fingers": gesture.fingers, + }, + "Action": { + "Type": gesture.type!.name, + "Action": gesture.command, + }, + }, + ) + .toList()); } class PreferredPanelsStatus { diff --git a/app/resources/langs/en.json b/app/resources/langs/en.json index b88dfea..e5e237f 100644 --- a/app/resources/langs/en.json +++ b/app/resources/langs/en.json @@ -163,6 +163,13 @@ "title": "Are you sure to sharing?", "description": "Other users can see this scheme and download it after share", "success": "Share success" + }, + "apply_scheme": { + "success": "Apply success", + "description": "The gesture scheme will take effect after logout, pay attention to the save work data", + "logout_immediately": "Logout", + "commands_copied_title": "Commands copied!", + "commands_copied_description": "Please open the terminal and paste the command to execute" } }, "me": { diff --git a/app/resources/langs/zh-CN.json b/app/resources/langs/zh-CN.json index 03227f9..b72af6f 100644 --- a/app/resources/langs/zh-CN.json +++ b/app/resources/langs/zh-CN.json @@ -163,6 +163,13 @@ "title": "确定分享?", "description": "分享后其他用户可以看到本方案并下载使用", "success": "分享成功" + }, + "apply_scheme": { + "success": "设置成功", + "description": "手势方案需注销后才能生效,注销前注意保存工作进度", + "logout_immediately": "立即注销", + "commands_copied_title": "命令复制成功!", + "commands_copied_description": "请打开终端后粘贴命令并执行" } }, "me": {