2024-03-10 19:44:53 +08:00
|
|
|
import 'package:fluent_ui/fluent_ui.dart';
|
|
|
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
|
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
2024-03-17 16:54:09 +08:00
|
|
|
import 'package:starcitizen_doctor/app.dart';
|
2024-03-15 00:01:06 +08:00
|
|
|
import 'package:starcitizen_doctor/generated/l10n.dart';
|
2024-03-10 19:44:53 +08:00
|
|
|
import 'package:starcitizen_doctor/ui/settings/settings_ui_model.dart';
|
|
|
|
|
|
|
|
class SettingsUI extends HookConsumerWidget {
|
|
|
|
const SettingsUI({super.key});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
|
|
final sate = ref.watch(settingsUIModelProvider);
|
|
|
|
final model = ref.read(settingsUIModelProvider.notifier);
|
2024-03-17 16:54:09 +08:00
|
|
|
final appGlobalState = ref.watch(appGlobalModelProvider);
|
|
|
|
final appGlobalModel = ref.read(appGlobalModelProvider.notifier);
|
|
|
|
return ListView(padding: const EdgeInsets.all(16), children: [
|
2024-11-03 16:55:44 +08:00
|
|
|
makeTitle(S.current.settings_title_general),
|
2024-03-17 16:54:09 +08:00
|
|
|
makeSettingsItem(
|
|
|
|
const Icon(FontAwesomeIcons.language, size: 20),
|
|
|
|
S.current.settings_app_language,
|
|
|
|
subTitle: S.current.settings_app_language_switch_info,
|
|
|
|
onTap: () {},
|
|
|
|
onComboChanged: appGlobalModel.changeLocale,
|
|
|
|
comboMenus: AppGlobalModel.appLocaleSupport,
|
|
|
|
selectedComboValue: appGlobalState.appLocale ?? const Locale("auto"),
|
|
|
|
showGoIcon: false,
|
2024-03-10 19:44:53 +08:00
|
|
|
),
|
2024-03-17 16:54:09 +08:00
|
|
|
const SizedBox(height: 12),
|
2024-11-03 18:32:12 +08:00
|
|
|
makeSettingsItem(const Icon(FluentIcons.link, size: 20),
|
|
|
|
S.current.setting_action_create_settings_shortcut,
|
|
|
|
subTitle: S.current.setting_action_create_desktop_shortcut,
|
|
|
|
onTap: () => model.addShortCut(context)),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
makeSettingsItem(const Icon(FontAwesomeIcons.networkWired, size: 20),
|
|
|
|
S.current.settings_item_dns,
|
2024-11-03 16:55:44 +08:00
|
|
|
subTitle: S.current.settings_item_dns_info,
|
2024-11-03 16:42:39 +08:00
|
|
|
switchStatus: sate.isUseInternalDNS,
|
|
|
|
onSwitch: model.onChangeUseInternalDNS,
|
|
|
|
onTap: () => model.onChangeUseInternalDNS(!sate.isUseInternalDNS)),
|
2024-03-17 16:54:09 +08:00
|
|
|
const SizedBox(height: 12),
|
2024-11-03 16:42:39 +08:00
|
|
|
makeSettingsItem(const Icon(FluentIcons.delete, size: 20),
|
|
|
|
S.current.setting_action_clear_translation_file_cache,
|
|
|
|
subTitle: S.current.setting_action_info_cache_clearing_info(
|
|
|
|
(sate.locationCacheSize / 1024 / 1024).toStringAsFixed(2)),
|
|
|
|
onTap: () => model.cleanLocationCache(context)),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
makeSettingsItem(const Icon(FluentIcons.speed_high, size: 20),
|
|
|
|
S.current.setting_action_tool_site_access_acceleration,
|
|
|
|
onTap: () =>
|
|
|
|
model.onChangeToolSiteMirror(!sate.isEnableToolSiteMirrors),
|
|
|
|
subTitle: S.current.setting_action_info_mirror_server_info,
|
|
|
|
onSwitch: model.onChangeToolSiteMirror,
|
|
|
|
switchStatus: sate.isEnableToolSiteMirrors),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
makeSettingsItem(const Icon(FluentIcons.document_set, size: 20),
|
|
|
|
S.current.setting_action_view_log,
|
|
|
|
onTap: () => model.showLogs(),
|
|
|
|
subTitle: S.current.setting_action_info_view_log_file),
|
2024-11-03 16:55:44 +08:00
|
|
|
makeTitle(S.current.settings_title_game),
|
2024-03-17 16:54:09 +08:00
|
|
|
makeSettingsItem(const Icon(FontAwesomeIcons.microchip, size: 20),
|
|
|
|
S.current.setting_action_ignore_efficiency_cores_on_launch,
|
|
|
|
subTitle: S.current
|
|
|
|
.setting_action_set_core_count(sate.inputGameLaunchECore),
|
|
|
|
onTap: () => model.setGameLaunchECore(context)),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
makeSettingsItem(const Icon(FluentIcons.folder_open, size: 20),
|
|
|
|
S.current.setting_action_set_launcher_file,
|
|
|
|
subTitle: sate.customLauncherPath != null
|
|
|
|
? "${sate.customLauncherPath}"
|
|
|
|
: S.current.setting_action_info_manual_launcher_location_setting,
|
|
|
|
onTap: () => model.setLauncherPath(context),
|
|
|
|
onDel: () {
|
|
|
|
model.delName("custom_launcher_path");
|
|
|
|
}),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
makeSettingsItem(const Icon(FluentIcons.game, size: 20),
|
|
|
|
S.current.setting_action_set_game_file,
|
|
|
|
subTitle: sate.customGamePath != null
|
|
|
|
? "${sate.customGamePath}"
|
|
|
|
: S.current.setting_action_info_manual_game_location_setting,
|
|
|
|
onTap: () => model.setGamePath(context),
|
|
|
|
onDel: () {
|
|
|
|
model.delName("custom_game_path");
|
|
|
|
}),
|
|
|
|
const SizedBox(height: 12),
|
|
|
|
]);
|
2024-03-10 19:44:53 +08:00
|
|
|
}
|
|
|
|
|
2024-11-03 16:42:39 +08:00
|
|
|
Widget makeTitle(String title) {
|
|
|
|
return Padding(
|
|
|
|
padding: const EdgeInsets.only(top: 12, bottom: 12),
|
|
|
|
child: Text(
|
|
|
|
title,
|
|
|
|
style: TextStyle(fontSize: 24),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-03-17 16:54:09 +08:00
|
|
|
Widget makeSettingsItem(
|
|
|
|
Widget icon,
|
|
|
|
String title, {
|
|
|
|
String? subTitle,
|
|
|
|
VoidCallback? onTap,
|
|
|
|
VoidCallback? onDel,
|
|
|
|
void Function(bool? b)? onSwitch,
|
|
|
|
bool switchStatus = false,
|
|
|
|
bool showGoIcon = true,
|
|
|
|
Map<dynamic, String> comboMenus = const {},
|
|
|
|
ValueChanged? onComboChanged,
|
|
|
|
dynamic selectedComboValue,
|
|
|
|
}) {
|
2024-03-10 19:44:53 +08:00
|
|
|
return Button(
|
|
|
|
onPressed: onTap,
|
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.only(top: 12, bottom: 12),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
icon,
|
2024-03-17 16:54:09 +08:00
|
|
|
const SizedBox(width: 18),
|
2024-03-10 19:44:53 +08:00
|
|
|
Expanded(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Text(title),
|
|
|
|
const Spacer(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
if (subTitle != null) ...[
|
|
|
|
const SizedBox(height: 3),
|
2024-03-17 16:54:09 +08:00
|
|
|
Padding(
|
|
|
|
padding: const EdgeInsets.only(right: 12),
|
|
|
|
child: Text(
|
|
|
|
subTitle,
|
|
|
|
textAlign: TextAlign.start,
|
|
|
|
style: TextStyle(
|
2024-12-14 13:48:24 +08:00
|
|
|
fontSize: 12,
|
|
|
|
color: Colors.white.withValues(alpha: .6)),
|
2024-03-17 16:54:09 +08:00
|
|
|
),
|
|
|
|
),
|
2024-03-10 19:44:53 +08:00
|
|
|
]
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
if (onDel != null) ...[
|
|
|
|
Button(
|
|
|
|
onPressed: onDel,
|
|
|
|
child: const Padding(
|
|
|
|
padding: EdgeInsets.all(6),
|
|
|
|
child: Icon(FluentIcons.delete),
|
|
|
|
)),
|
|
|
|
],
|
|
|
|
if (onSwitch != null) ...[
|
|
|
|
ToggleSwitch(checked: switchStatus, onChanged: onSwitch),
|
|
|
|
],
|
2024-03-17 16:54:09 +08:00
|
|
|
if (comboMenus.isNotEmpty) ...[
|
|
|
|
SizedBox(
|
|
|
|
height: 36,
|
|
|
|
child: ComboBox(
|
|
|
|
value: selectedComboValue,
|
|
|
|
items: [
|
|
|
|
for (final mkv in comboMenus.entries)
|
|
|
|
ComboBoxItem(
|
|
|
|
value: mkv.key,
|
|
|
|
child: Text(mkv.value),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
onChanged: onComboChanged,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
2024-03-10 19:44:53 +08:00
|
|
|
const SizedBox(width: 12),
|
2024-03-17 16:54:09 +08:00
|
|
|
if (showGoIcon) const Icon(FluentIcons.chevron_right),
|
2024-03-10 19:44:53 +08:00
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
2024-11-03 18:32:12 +08:00
|
|
|
}
|