Files
Qlyra/lib/frontend/widgets/settings_card.dart
T

175 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'glossy_pill.dart';
class SettingsCard extends StatelessWidget {
final List<Widget> children;
const SettingsCard({super.key, required this.children});
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return GlossyPill(
color: cs.surfaceContainerHigh,
borderRadius: BorderRadius.circular(20),
depth: 6,
child: Column(
children: [
for (var i = 0; i < children.length; i++) ...[
children[i],
if (i != children.length - 1)
Padding(
padding: const EdgeInsets.only(left: 58),
child: Divider(
height: 1,
thickness: 1,
color: cs.outlineVariant.withValues(alpha: 0.35),
),
),
],
],
),
);
}
}
class SettingsToggleTile extends StatelessWidget {
final IconData icon;
final String label;
final String? subtitle;
final bool value;
final ValueChanged<bool> onChanged;
final bool enabled;
const SettingsToggleTile({
super.key,
required this.icon,
required this.label,
this.subtitle,
required this.value,
required this.onChanged,
this.enabled = true,
});
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return AnimatedOpacity(
duration: const Duration(milliseconds: 200),
opacity: enabled ? 1 : 0.4,
child: IgnorePointer(
ignoring: !enabled,
child: Material(
color: Colors.transparent,
child: InkWell(
onTap: () => onChanged(!value),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14),
child: Row(
children: [
Icon(icon, color: cs.onSurfaceVariant, size: 22, weight: 400),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: TextStyle(
color: cs.onSurface,
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
if (subtitle != null) ...[
const SizedBox(height: 2),
Text(
subtitle!,
style: TextStyle(
color: cs.onSurfaceVariant,
fontSize: 13,
height: 1.3,
),
),
],
],
),
),
const SizedBox(width: 12),
Switch(value: value, onChanged: onChanged),
],
),
),
),
),
),
);
}
}
class SettingsNavTile extends StatelessWidget {
final IconData? icon;
final Widget? leading;
final String label;
final Color? tintColor;
final VoidCallback? onTap;
final bool isLast;
const SettingsNavTile({
super.key,
this.icon,
this.leading,
required this.label,
this.tintColor,
this.onTap,
this.isLast = false,
});
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return Material(
color: Colors.transparent,
child: InkWell(
onTap: onTap ?? () {},
borderRadius: isLast
? const BorderRadius.vertical(bottom: Radius.circular(20))
: null,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 17),
child: Row(
children: [
leading ??
Icon(
icon,
color: tintColor ?? cs.onSurfaceVariant,
size: 22,
weight: 400,
),
const SizedBox(width: 16),
Expanded(
child: Text(
label,
style: TextStyle(
color: tintColor ?? cs.onSurface,
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
),
Icon(
Symbols.chevron_right,
color: cs.outline,
size: 20,
weight: 400,
),
],
),
),
),
);
}
}