Files
MWClash/lib/fragments/proxies/setting.dart
chen08209 a8c0519ffe Add rule override
Optimize more details
2025-04-06 20:13:53 +08:00

283 lines
8.8 KiB
Dart

import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/enum/enum.dart';
import 'package:fl_clash/providers/config.dart';
import 'package:fl_clash/widgets/widgets.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:intl/intl.dart';
class ProxiesSetting extends StatelessWidget {
const ProxiesSetting({super.key});
IconData _getIconWithProxiesType(ProxiesType type) {
return switch (type) {
ProxiesType.tab => Icons.view_carousel,
ProxiesType.list => Icons.view_list,
};
}
IconData _getIconWithProxiesSortType(ProxiesSortType type) {
return switch (type) {
ProxiesSortType.none => Icons.sort,
ProxiesSortType.delay => Icons.network_ping,
ProxiesSortType.name => Icons.sort_by_alpha,
};
}
String _getStringProxiesSortType(ProxiesSortType type) {
return switch (type) {
ProxiesSortType.none => appLocalizations.defaultText,
ProxiesSortType.delay => appLocalizations.delay,
ProxiesSortType.name => appLocalizations.name,
};
}
String getTextForProxiesLayout(ProxiesLayout proxiesLayout) {
return switch (proxiesLayout) {
ProxiesLayout.tight => appLocalizations.tight,
ProxiesLayout.standard => appLocalizations.standard,
ProxiesLayout.loose => appLocalizations.loose,
};
}
String _getTextWithProxiesIconStyle(ProxiesIconStyle style) {
return switch (style) {
ProxiesIconStyle.standard => appLocalizations.standard,
ProxiesIconStyle.none => appLocalizations.noIcon,
ProxiesIconStyle.icon => appLocalizations.onlyIcon,
};
}
List<Widget> _buildStyleSetting() {
return generateSection(
title: appLocalizations.style,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
child: Consumer(
builder: (_, ref, __) {
final proxiesType = ref.watch(proxiesStyleSettingProvider.select(
(state) => state.type,
));
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesType.values)
SettingInfoCard(
Info(
label: Intl.message(item.name),
iconData: _getIconWithProxiesType(item),
),
isSelected: proxiesType == item,
onPressed: () {
ref
.read(proxiesStyleSettingProvider.notifier)
.updateState((state) {
return state.copyWith(
type: item,
);
});
},
)
],
);
},
),
)
],
);
}
List<Widget> _buildSortSetting() {
return generateSection(
title: appLocalizations.sort,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
child: Consumer(
builder: (_, ref, __) {
final sortType = ref.watch(proxiesStyleSettingProvider.select(
(state) => state.sortType,
));
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesSortType.values)
SettingInfoCard(
Info(
label: _getStringProxiesSortType(item),
iconData: _getIconWithProxiesSortType(item),
),
isSelected: sortType == item,
onPressed: () {
ref
.read(proxiesStyleSettingProvider.notifier)
.updateState((state) {
return state.copyWith(
sortType: item,
);
});
},
),
],
);
},
),
),
],
);
}
List<Widget> _buildSizeSetting() {
return generateSection(
title: appLocalizations.size,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
child: Consumer(
builder: (_, ref, __) {
final cardType = ref.watch(proxiesStyleSettingProvider.select(
(state) => state.cardType,
));
return Wrap(
spacing: 16,
children: [
for (final item in ProxyCardType.values)
SettingTextCard(
Intl.message(item.name),
isSelected: item == cardType,
onPressed: () {
ref
.read(proxiesStyleSettingProvider.notifier)
.updateState((state) {
return state.copyWith(
cardType: item,
);
});
},
)
],
);
},
),
)
],
);
}
List<Widget> _buildLayoutSetting() {
return generateSection(
title: appLocalizations.layout,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(
horizontal: 16,
),
scrollDirection: Axis.horizontal,
child: Consumer(
builder: (_, ref, __) {
final layout = ref.watch(proxiesStyleSettingProvider.select(
(state) => state.layout,
));
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesLayout.values)
SettingTextCard(
getTextForProxiesLayout(item),
isSelected: item == layout,
onPressed: () {
ref
.watch(proxiesStyleSettingProvider.notifier)
.updateState((state) {
return state.copyWith(
layout: item,
);
});
},
)
],
);
},
),
),
],
);
}
_buildGroupStyleSetting() {
return generateSection(
title: appLocalizations.iconStyle,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
child: Consumer(
builder: (_, ref, __) {
final iconStyle = ref.watch(proxiesStyleSettingProvider.select(
(state) => state.iconStyle,
));
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesIconStyle.values)
SettingTextCard(
_getTextWithProxiesIconStyle(item),
isSelected: iconStyle == item,
onPressed: () {
ref
.read(proxiesStyleSettingProvider.notifier)
.updateState((state) {
return state.copyWith(
iconStyle: item,
);
});
},
),
],
);
},
),
),
],
);
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: EdgeInsets.only(bottom: 32),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
..._buildStyleSetting(),
..._buildSortSetting(),
..._buildLayoutSetting(),
..._buildSizeSetting(),
Consumer(
builder: (_, ref, child) {
final isList = ref.watch(proxiesStyleSettingProvider
.select((state) => state.type == ProxiesType.list));
if (isList) {
return child!;
}
return Container();
},
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
..._buildGroupStyleSetting(),
],
),
),
],
),
);
}
}