import 'package:flutter/material.dart'; class _Kisayol { final String tus; final String aciklama; const _Kisayol(this.tus, this.aciklama); } class KlavyeYardimDialog extends StatelessWidget { const KlavyeYardimDialog({super.key}); static Future goster(BuildContext context) => showDialog( context: context, builder: (_) => const KlavyeYardimDialog(), ); static const List<_Kisayol> _kisayollar = [ _Kisayol('Ctrl + Z', 'Geri al'), _Kisayol('Ctrl + Y', 'İleri al'), _Kisayol('Ctrl + E', 'Seçili segmenti üret'), _Kisayol('Ctrl + D', 'Segmenti çoğalt (klonla)'), _Kisayol('Delete', 'Seçili segmenti sil'), _Kisayol('Space', 'Oynat / Duraklat'), _Kisayol('↑ / ↓ veya P / N', 'Önceki / Sonraki segment'), _Kisayol('J / K / L', 'Frame geri / Oynat-Dur / Frame ileri (yakında)'), _Kisayol('F', 'Snapshot al'), _Kisayol('L', 'Loop önizleme aç/kapat'), _Kisayol('Alt + 1..6', 'Studio / Timeline / Storyboard / Müzik / Görsel / LoRA'), _Kisayol('?', 'Bu pencereyi aç'), ]; @override Widget build(BuildContext context) { final theme = Theme.of(context); final cs = theme.colorScheme; return AlertDialog( icon: Icon(Icons.keyboard_alt_outlined, color: cs.primary), title: const Text('Klavye Kısayolları'), contentPadding: const EdgeInsets.fromLTRB(24, 12, 24, 0), content: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 520, maxHeight: 480), child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ for (var i = 0; i < _kisayollar.length; i++) _SatirKart( kisayol: _kisayollar[i], ciftSira: i.isOdd, ), ], ), ), ), actionsPadding: const EdgeInsets.fromLTRB(16, 8, 16, 12), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Tamam'), ), ], ); } } class _SatirKart extends StatelessWidget { final _Kisayol kisayol; final bool ciftSira; const _SatirKart({required this.kisayol, required this.ciftSira}); @override Widget build(BuildContext context) { final theme = Theme.of(context); final cs = theme.colorScheme; return Container( margin: const EdgeInsets.symmetric(vertical: 2), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), decoration: BoxDecoration( color: ciftSira ? cs.surfaceContainerHigh : cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(10), ), child: Row( children: [ SizedBox( width: 170, child: _TusEtiketi(metin: kisayol.tus), ), const SizedBox(width: 12), Expanded( child: Text( kisayol.aciklama, style: theme.textTheme.bodyMedium?.copyWith( color: cs.onSurface, ), ), ), ], ), ); } } class _TusEtiketi extends StatelessWidget { final String metin; const _TusEtiketi({required this.metin}); @override Widget build(BuildContext context) { final theme = Theme.of(context); final cs = theme.colorScheme; final parcalar = metin.split(RegExp(r'\s+')); return Wrap( spacing: 4, runSpacing: 4, crossAxisAlignment: WrapCrossAlignment.center, children: [ for (final p in parcalar) if (p == '+' || p == '/' || p == 'veya') Padding( padding: const EdgeInsets.symmetric(horizontal: 2), child: Text( p, style: theme.textTheme.labelMedium?.copyWith( color: cs.onSurfaceVariant, ), ), ) else Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), decoration: BoxDecoration( color: cs.surface, borderRadius: BorderRadius.circular(6), border: Border.all(color: cs.outlineVariant), boxShadow: [ BoxShadow( color: cs.shadow.withValues(alpha: 0.08), offset: const Offset(0, 1), blurRadius: 2, ), ], ), child: Text( p, style: theme.textTheme.labelMedium?.copyWith( fontFamily: 'monospace', fontWeight: FontWeight.w600, color: cs.onSurface, ), ), ), ], ); } }