Files
FlClash/lib/views/proxies/setting.dart
T

342 lines
11 KiB
Dart
Raw Normal View History

2024-07-15 22:06:09 +08:00
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/enum/enum.dart';
import 'package:fl_clash/icons/icons.dart';
2025-02-09 18:39:38 +08:00
import 'package:fl_clash/providers/config.dart';
2024-07-15 22:06:09 +08:00
import 'package:fl_clash/widgets/widgets.dart';
import 'package:material_ui/material_ui.dart';
2025-02-09 18:39:38 +08:00
import 'package:flutter_riverpod/flutter_riverpod.dart';
2024-07-15 22:06:09 +08:00
class ProxiesSetting extends StatelessWidget {
2024-09-26 14:29:04 +08:00
const ProxiesSetting({super.key});
2024-07-15 22:06:09 +08:00
Glyph _getIconWithProxiesType(ProxiesType type) {
2024-07-15 22:06:09 +08:00
return switch (type) {
ProxiesType.tab => AppGlyphs.layoutTabs,
ProxiesType.list => AppGlyphs.layoutList,
2024-07-15 22:06:09 +08:00
};
}
Glyph _getIconWithProxiesSortType(ProxiesSortType type) {
2024-07-15 22:06:09 +08:00
return switch (type) {
ProxiesSortType.none => AppGlyphs.sort,
ProxiesSortType.delay => AppGlyphs.bolt,
ProxiesSortType.name => AppGlyphs.sortAlpha,
2024-07-15 22:06:09 +08:00
};
}
2026-02-02 10:14:13 +08:00
String _getStringProxiesSortType(BuildContext context, ProxiesSortType type) {
final appLocalizations = context.appLocalizations;
2024-07-15 22:06:09 +08:00
return switch (type) {
ProxiesSortType.none => appLocalizations.defaultText,
ProxiesSortType.delay => appLocalizations.delay,
ProxiesSortType.name => appLocalizations.name,
};
}
2026-02-02 10:14:13 +08:00
String getTextForProxiesLayout(
BuildContext context,
ProxiesLayout proxiesLayout,
) {
final appLocalizations = context.appLocalizations;
2024-08-13 21:42:23 +08:00
return switch (proxiesLayout) {
ProxiesLayout.tight => appLocalizations.tight,
ProxiesLayout.standard => appLocalizations.standard,
ProxiesLayout.loose => appLocalizations.loose,
};
}
2026-02-02 10:14:13 +08:00
String _getTextWithProxiesIconStyle(
BuildContext context,
ProxiesIconStyle style,
) {
final appLocalizations = context.appLocalizations;
2024-09-26 14:29:04 +08:00
return switch (style) {
ProxiesIconStyle.filled => appLocalizations.iconStyleFilled,
ProxiesIconStyle.plain => appLocalizations.iconStylePlain,
ProxiesIconStyle.hidden => appLocalizations.iconStyleHidden,
};
}
Glyph _getIconWithProxiesLayout(ProxiesLayout proxiesLayout) {
return switch (proxiesLayout) {
ProxiesLayout.tight => AppGlyphs.columnsThree,
ProxiesLayout.standard => AppGlyphs.columnsTwo,
ProxiesLayout.loose => AppGlyphs.columnsOne,
};
}
Glyph _getIconWithProxyCardType(ProxyCardType type) {
return switch (type) {
ProxyCardType.expand => AppGlyphs.cardLarge,
ProxyCardType.shrink => AppGlyphs.cardMedium,
ProxyCardType.min => AppGlyphs.cardSmall,
};
}
Glyph _getIconWithProxiesIconStyle(ProxiesIconStyle style) {
return switch (style) {
ProxiesIconStyle.filled => AppGlyphs.iconTile,
ProxiesIconStyle.plain => AppGlyphs.iconPlain,
ProxiesIconStyle.hidden => AppGlyphs.eyeOff,
2024-09-26 14:29:04 +08:00
};
}
2026-02-02 10:14:13 +08:00
List<Widget> _buildStyleSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
2024-07-15 22:06:09 +08:00
return generateSection(
2025-10-14 15:13:52 +08:00
isFirst: true,
2024-07-15 22:06:09 +08:00
title: appLocalizations.style,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
2025-02-09 18:39:38 +08:00
child: Consumer(
2025-07-31 17:09:18 +08:00
builder: (_, ref, _) {
final proxiesType = ref.watch(
proxiesStyleSettingProvider.select((state) => state.type),
);
2024-07-15 22:06:09 +08:00
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesType.values)
SettingInfoCard(
Info(
label: item.label,
glyph: _getIconWithProxiesType(item),
2024-07-15 22:06:09 +08:00
),
isSelected: proxiesType == item,
onPressed: () {
2025-12-16 11:23:09 +08:00
ref.read(proxiesStyleSettingProvider.notifier).update((
state,
) {
return state.copyWith(type: item);
});
2024-07-15 22:06:09 +08:00
},
2025-07-31 17:09:18 +08:00
),
2024-07-15 22:06:09 +08:00
],
);
},
),
2025-07-31 17:09:18 +08:00
),
2024-07-15 22:06:09 +08:00
],
);
}
2026-02-02 10:14:13 +08:00
List<Widget> _buildSortSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
2024-07-15 22:06:09 +08:00
return generateSection(
title: appLocalizations.sort,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
2025-02-09 18:39:38 +08:00
child: Consumer(
2025-07-31 17:09:18 +08:00
builder: (_, ref, _) {
final sortType = ref.watch(
proxiesStyleSettingProvider.select((state) => state.sortType),
);
2024-07-15 22:06:09 +08:00
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesSortType.values)
SettingInfoCard(
Info(
2026-02-02 10:14:13 +08:00
label: _getStringProxiesSortType(context, item),
glyph: _getIconWithProxiesSortType(item),
2024-07-15 22:06:09 +08:00
),
2025-02-09 18:39:38 +08:00
isSelected: sortType == item,
2024-07-15 22:06:09 +08:00
onPressed: () {
2025-12-16 11:23:09 +08:00
ref.read(proxiesStyleSettingProvider.notifier).update((
state,
) {
return state.copyWith(sortType: item);
});
2024-07-15 22:06:09 +08:00
},
),
],
);
},
),
),
],
);
}
2026-02-02 10:14:13 +08:00
List<Widget> _buildSizeSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
2024-07-15 22:06:09 +08:00
return generateSection(
title: appLocalizations.size,
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
2025-02-09 18:39:38 +08:00
child: Consumer(
2025-07-31 17:09:18 +08:00
builder: (_, ref, _) {
final cardType = ref.watch(
proxiesStyleSettingProvider.select((state) => state.cardType),
);
2024-07-15 22:06:09 +08:00
return Wrap(
spacing: 16,
children: [
for (final item in ProxyCardType.values)
SettingInfoCard(
Info(
label: item.label,
glyph: _getIconWithProxyCardType(item),
),
2025-02-09 18:39:38 +08:00
isSelected: item == cardType,
2024-07-15 22:06:09 +08:00
onPressed: () {
2025-12-16 11:23:09 +08:00
ref.read(proxiesStyleSettingProvider.notifier).update((
state,
) {
return state.copyWith(cardType: item);
});
2024-07-15 22:06:09 +08:00
},
2025-07-31 17:09:18 +08:00
),
2024-07-15 22:06:09 +08:00
],
);
},
),
2025-07-31 17:09:18 +08:00
),
2024-07-15 22:06:09 +08:00
],
);
}
2026-02-02 10:14:13 +08:00
List<Widget> _buildLayoutSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
2024-07-15 22:06:09 +08:00
return generateSection(
2024-08-13 21:42:23 +08:00
title: appLocalizations.layout,
2024-07-15 22:06:09 +08:00
items: [
SingleChildScrollView(
2025-07-31 17:09:18 +08:00
padding: const EdgeInsets.symmetric(horizontal: 16),
2024-07-15 22:06:09 +08:00
scrollDirection: Axis.horizontal,
2025-02-09 18:39:38 +08:00
child: Consumer(
2025-07-31 17:09:18 +08:00
builder: (_, ref, _) {
final layout = ref.watch(
proxiesStyleSettingProvider.select((state) => state.layout),
);
2024-07-15 22:06:09 +08:00
return Wrap(
spacing: 16,
children: [
2024-08-13 21:42:23 +08:00
for (final item in ProxiesLayout.values)
SettingInfoCard(
Info(
label: getTextForProxiesLayout(context, item),
glyph: _getIconWithProxiesLayout(item),
),
2025-02-09 18:39:38 +08:00
isSelected: item == layout,
2024-07-15 22:06:09 +08:00
onPressed: () {
2025-12-16 11:23:09 +08:00
ref.watch(proxiesStyleSettingProvider.notifier).update((
state,
) {
return state.copyWith(layout: item);
});
2024-07-15 22:06:09 +08:00
},
2025-07-31 17:09:18 +08:00
),
2024-07-15 22:06:09 +08:00
],
);
},
),
),
],
);
}
2026-02-02 10:14:13 +08:00
List<Widget> _buildGroupStyleSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
2024-09-26 14:29:04 +08:00
return generateSection(
2024-10-27 16:59:23 +08:00
title: appLocalizations.iconStyle,
2024-09-26 14:29:04 +08:00
items: [
SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
2025-02-09 18:39:38 +08:00
child: Consumer(
2025-07-31 17:09:18 +08:00
builder: (_, ref, _) {
final iconStyle = ref.watch(
proxiesStyleSettingProvider.select((state) => state.iconStyle),
);
2024-09-26 14:29:04 +08:00
return Wrap(
spacing: 16,
children: [
for (final item in ProxiesIconStyle.values)
SettingInfoCard(
Info(
label: _getTextWithProxiesIconStyle(context, item),
glyph: _getIconWithProxiesIconStyle(item),
),
2024-09-26 14:29:04 +08:00
isSelected: iconStyle == item,
onPressed: () {
2025-12-16 11:23:09 +08:00
ref.read(proxiesStyleSettingProvider.notifier).update((
state,
) {
return state.copyWith(iconStyle: item);
});
2024-09-26 14:29:04 +08:00
},
),
],
);
},
),
),
],
);
}
List<Widget> _buildFilterSetting(BuildContext context) {
final appLocalizations = context.appLocalizations;
return generateSection(
title: appLocalizations.filter,
items: [
ConfigToggleItem(
title: (l) => l.hideTimeoutProxies,
subtitle: (l) => l.hideTimeoutProxiesDesc,
selector: proxiesStyleSettingProvider.select(
(state) => state.hideTimeoutProxies,
),
onChanged: (ref, value) {
ref
.read(proxiesStyleSettingProvider.notifier)
.update((state) => state.copyWith(hideTimeoutProxies: value));
},
),
],
);
}
2024-07-15 22:06:09 +08:00
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: EdgeInsets.only(top: context.contentTopPadding, bottom: 32),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
..._buildStyleSetting(context),
..._buildSortSetting(context),
..._buildLayoutSetting(context),
..._buildSizeSetting(context),
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(context)],
2024-09-26 14:29:04 +08:00
),
),
..._buildFilterSetting(context),
],
2024-07-15 22:06:09 +08:00
),
);
}
2024-08-13 21:42:23 +08:00
}