diff --git a/lib/ui/tools/tools_ui_model.dart b/lib/ui/tools/tools_ui_model.dart index 4c6cac3..3e9e0d5 100644 --- a/lib/ui/tools/tools_ui_model.dart +++ b/lib/ui/tools/tools_ui_model.dart @@ -11,6 +11,7 @@ import 'package:starcitizen_doctor/common/helper/log_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/ui/tools/downloader/downloader_dialog_ui_model.dart'; import 'package:url_launcher/url_launcher_string.dart'; +import 'package:xml/xml.dart'; import 'downloader/downloader_dialog_ui.dart'; @@ -79,7 +80,10 @@ class ToolsUIModel extends BaseUIModel { notifyListeners(); items.addAll(await _addNvmePatchCard()); notifyListeners(); + items.add(await _addPhotographyCard()); + notifyListeners(); items.add(await _addShaderCard()); + // close loading isItemLoading = false; notifyListeners(); } catch (e) { @@ -169,6 +173,19 @@ class ToolsUIModel extends BaseUIModel { ); } + Future<_ToolsItemData> _addPhotographyCard() async { + // 获取配置文件状态 + final isEnable = await _checkPhotographyStatus(); + + return _ToolsItemData( + "photography_mode", + isEnable ? "关闭摄影模式" : "开启摄影模式", + "一键修改镜游戏内镜头参数以便于摄影操作。\n\n @拉邦那 Lapernum 提供参数信息。", + const Icon(FontAwesomeIcons.camera, size: 28), + onTap: () => _onChangePhotographyMode(isEnable), + ); + } + /// ---------------------------- func ------------------------------------------------------- /// ----------------------------------------------------------------------------------------- /// ----------------------------------------------------------------------------------------- @@ -374,6 +391,60 @@ class ToolsUIModel extends BaseUIModel { } } } + + Future _checkPhotographyStatus({bool? setMode}) async { + const keys = ["AudioShakeStrength", "CameraSpringMovement", "ShakeScale"]; + final attributesFile = File( + "$scInstalledPath\\USER\\Client\\0\\Profiles\\default\\attributes.xml"); + if (setMode == null) { + bool isEnable = false; + if (scInstalledPath.isNotEmpty) { + if (await attributesFile.exists()) { + final xmlFile = + XmlDocument.parse(await attributesFile.readAsString()); + isEnable = true; + for (var k in keys) { + if (!isEnable) break; + final e = xmlFile.rootElement.children + .where((element) => element.getAttribute("name") == k) + .firstOrNull; + if (e != null && e.getAttribute("value") == "0") { + } else { + isEnable = false; + } + } + } + } + return isEnable; + } else { + if (!await attributesFile.exists()) { + showToast(context!, "配置文件不存在,请尝试运行一次游戏"); + return false; + } + final xmlFile = XmlDocument.parse(await attributesFile.readAsString()); + // clear all + xmlFile.rootElement.children.removeWhere( + (element) => keys.contains(element.getAttribute("name"))); + if (setMode) { + for (var element in keys) { + XmlElement newNode = XmlElement(XmlName('Attr'), [ + XmlAttribute(XmlName('name'), element), + XmlAttribute(XmlName('value'), '0'), + ]); + xmlFile.rootElement.children.add(newNode); + } + } + dPrint(xmlFile); + await attributesFile.delete(); + await attributesFile.writeAsString(xmlFile.toXmlString(pretty: true)); + } + return true; + } + + _onChangePhotographyMode(bool isEnable) async { + await handleError(() => _checkPhotographyStatus(setMode: !isEnable)); + reloadData(); + } } class _ToolsItemData { diff --git a/pubspec.yaml b/pubspec.yaml index ce0be69..992bb57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,6 +65,7 @@ dependencies: hexcolor: ^3.0.1 dart_rss: ^3.0.1 html: ^0.15.4 + xml: ^6.5.0 dependency_overrides: http: ^1.1.2