JJ_MKVMaker/lib/ui/setting_tile.dart

72 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'app_actions.dart' show isCompact;
/// 환경 설정의 한 줄 (ListTile 과 같은 쓰임새).
/// 좁은 화면 (접은 폴드 · 휴대폰 세로) 에서는 오른쪽의 넓은 조절 (고르기 상자 · 입력 칸 · 버튼) 을 설명 아래로 내려
/// 제목 · 설명이 한두 글자 폭으로 눌리지 않게 한다. 스위치 · 체크 상자 · 아이콘 버튼은 그대로 오른쪽에.
class SettingTile extends StatelessWidget {
final Widget? leading;
final Widget? title;
final Widget? subtitle;
final Widget? trailing;
final bool isThreeLine;
final bool enabled;
final bool? dense;
final VoidCallback? onTap;
final EdgeInsetsGeometry? contentPadding;
const SettingTile({
super.key,
this.leading,
this.title,
this.subtitle,
this.trailing,
this.isThreeLine = false,
this.enabled = true,
this.dense,
this.onTap,
this.contentPadding,
});
static bool _small(Widget w) => w is Switch || w is Checkbox || w is Icon || w is IconButton || w is Radio;
@override
Widget build(BuildContext context) {
final tile = _tile(context);
// 241: 오른쪽 스위치 · 고르기 상자가 제목을 이름으로 읽히게 (TalkBack 이 이름 없는 "켜짐" 만 읽었다).
// 줄 자체를 누르는 타일 ([onTap]) 은 누르는 곳이 둘이 되므로 합치지 않는다
return trailing != null && onTap == null ? MergeSemantics(child: tile) : tile;
}
Widget _tile(BuildContext context) {
final t = trailing;
if (t == null || _small(t) || !isCompact(context)) {
return ListTile(
leading: leading,
title: title,
subtitle: subtitle,
trailing: t,
isThreeLine: isThreeLine,
enabled: enabled,
dense: dense,
onTap: onTap,
contentPadding: contentPadding,
);
}
return ListTile(
leading: leading,
title: title,
subtitle: Column(crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [
?subtitle,
const SizedBox(height: 6),
Align(alignment: Alignment.centerLeft, child: t),
]),
enabled: enabled,
dense: dense,
onTap: onTap,
contentPadding: contentPadding,
);
}
}