app/lib/ui/tools/tools_ui.dart
2023-10-09 01:32:07 +00:00

236 lines
8.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:starcitizen_doctor/base/ui.dart';
import 'tools_ui_model.dart';
class ToolsUI extends BaseUI<ToolsUIModel> {
@override
Widget? buildBody(BuildContext context, ToolsUIModel model) {
return Stack(
children: [
Column(
children: [
const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.only(left: 22, right: 22),
child: Row(
children: [
Expanded(
child: Column(
children: [
makeGameLauncherPathSelect(context, model),
const SizedBox(height: 12),
makeGamePathSelect(context, model),
],
),
),
const SizedBox(width: 12),
Button(
onPressed: model.working ? null : model.loadData,
child: const Padding(
padding: EdgeInsets.only(
top: 32, bottom: 32, left: 12, right: 12),
child: Icon(FluentIcons.refresh),
),
),
],
),
),
const SizedBox(height: 12),
if (model.items.isEmpty)
const Expanded(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ProgressRing(),
SizedBox(height: 12),
Text("正在扫描..."),
],
),
),
)
else
Expanded(
child: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: AlignedGridView.count(
crossAxisCount: 3,
mainAxisSpacing: 12,
crossAxisSpacing: 12,
itemCount: model.items.length,
shrinkWrap: true,
itemBuilder: (context, index) {
final item = model.items[index];
return Container(
width: 300,
height: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: FluentTheme.of(context).cardColor,
),
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(.2),
borderRadius:
BorderRadius.circular(1000)),
child: Padding(
padding: const EdgeInsets.all(8),
child: item.icon,
),
),
const SizedBox(width: 12),
Expanded(
child: Text(
item.name,
style: const TextStyle(fontSize: 16),
)),
const SizedBox(width: 12),
],
),
const SizedBox(height: 12),
Expanded(
child: Text(
item.infoString,
style: TextStyle(
fontSize: 14,
color: Colors.white.withOpacity(.6)),
)),
Row(
children: [
const Spacer(),
Button(
onPressed: model.working
? null
: item.onTap == null
? null
: () {
try {
item.onTap?.call();
} catch (e) {
showToast(
context, "处理失败!:$e");
}
},
child: const Padding(
padding: EdgeInsets.all(6),
child: Icon(FluentIcons.play),
),
),
],
)
],
),
),
);
},
),
),
)
],
),
if (model.working)
Container(
decoration: BoxDecoration(
color: Colors.black.withAlpha(150),
),
child: const Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ProgressRing(),
SizedBox(height: 12),
Text("正在处理..."),
],
),
),
)
],
);
}
Widget makeGamePathSelect(BuildContext context, ToolsUIModel model) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text("游戏安装位置: "),
const SizedBox(width: 6),
Expanded(
child: SizedBox(
height: 36,
child: ComboBox<String>(
value: model.scInstalledPath,
items: [
for (final path in model.scInstallPaths)
ComboBoxItem(
value: path,
child: Text(path),
)
],
onChanged: (v) {
model.loadData(skipPathScan: true);
model.scInstalledPath = v!;
model.notifyListeners();
},
),
),
),
const SizedBox(width: 8),
Button(
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Icon(FluentIcons.folder_open),
),
onPressed: () => model.openDir(model.scInstalledPath))
],
);
}
Widget makeGameLauncherPathSelect(BuildContext context, ToolsUIModel model) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text("RSI启动器位置"),
const SizedBox(width: 6),
Expanded(
child: SizedBox(
height: 36,
child: ComboBox<String>(
value: model.rsiLauncherInstalledPath,
items: [
for (final path in model.rsiLauncherInstallPaths)
ComboBoxItem(
value: path,
child: Text(path),
)
],
onChanged: (v) {
model.loadData(skipPathScan: true);
model.rsiLauncherInstalledPath = v!;
model.notifyListeners();
},
),
),
),
const SizedBox(width: 8),
Button(
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Icon(FluentIcons.folder_open),
),
onPressed: () => model.openDir(model.rsiLauncherInstalledPath))
],
);
}
@override
String getUITitle(BuildContext context, ToolsUIModel model) => "ToolsUI";
}