import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../app/tema.dart'; import 'muzik_form_state.dart'; const _yapiBloklari = [ ('intro', 'Intro'), ('verse', 'Verse'), ('verse 1', 'Verse 1'), ('verse 2', 'Verse 2'), ('pre-chorus', 'Pre-Chorus'), ('chorus', 'Nakarat'), ('post-chorus', 'Post-Chorus'), ('double chorus', 'Çift Nakarat'), ('bridge', 'Bridge'), ('interlude', 'Interlude'), ('drop', 'Drop'), ('build-up', 'Build-up'), ('breakdown', 'Breakdown'), ('instrumental break', 'Enstrümantal Ara'), ('guitar solo', 'Gitar Solo'), ('drum solo', 'Davul Solo'), ('sax solo', 'Sax Solo'), ('piano solo', 'Piyano Solo'), ('key change', 'Ton Değişimi'), ('chant', 'Chant'), ('call and response', 'Çağrı-Yanıt'), ('false ending', 'Sahte Bitiş'), ('big finale', 'Büyük Final'), ('coda', 'Coda'), ('reprise', 'Reprise'), ('outro', 'Outro'), ]; /// [Verse]/[Chorus] yapı bloklu şarkı sözü editörü. class SozEditoru extends ConsumerStatefulWidget { const SozEditoru({super.key}); @override ConsumerState createState() => _SozEditoruState(); } class _SozEditoruState extends ConsumerState { late final TextEditingController _ctrl; @override void initState() { super.initState(); _ctrl = TextEditingController( text: ref.read(muzikFormProvider).parametreler.lyrics); } @override void dispose() { _ctrl.dispose(); super.dispose(); } void _blokEkle(String blok) { final secim = _ctrl.selection; final metin = _ctrl.text; final eklenecek = '${metin.isEmpty ? '' : '\n'}[$blok]\n'; final konum = secim.isValid ? secim.end : metin.length; _ctrl.text = metin.substring(0, konum) + eklenecek + metin.substring(konum); _ctrl.selection = TextSelection.collapsed(offset: konum + eklenecek.length); _degisti(); } void _degisti() { final form = ref.read(muzikFormProvider); ref.read(muzikFormProvider.notifier).parametreGuncelle( form.parametreler.kopyala(lyrics: _ctrl.text)); } @override Widget build(BuildContext context) { ref.listen( muzikFormProvider.select((s) => s.parametreler.lyrics), (_, yeni) { if (yeni != _ctrl.text) _ctrl.text = yeni; }); final enstrumantal = ref.watch( muzikFormProvider.select((s) => s.sihirbaz.enstrumantalMi)); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ const Icon(Icons.lyrics, size: 18, color: FikoRenkler.neonCyan), const SizedBox(width: 8), const Text('Şarkı Sözleri', style: TextStyle(fontSize: 13.5, fontWeight: FontWeight.w700)), const Spacer(), if (_ctrl.text.isNotEmpty) IconButton( tooltip: 'Temizle', icon: const Icon(Icons.clear, size: 17), onPressed: () { _ctrl.clear(); _degisti(); setState(() {}); }, ), ], ), if (enstrumantal) Padding( padding: const EdgeInsets.symmetric(vertical: 20), child: Center( child: Text('Enstrümantal mod — söz kullanılmaz', style: TextStyle( color: Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.5))), ), ) else ...[ const SizedBox(height: 6), Wrap( spacing: 6, runSpacing: 6, children: [ for (final (id, etiket) in _yapiBloklari) ActionChip( avatar: const Icon(Icons.add, size: 14), label: Text(etiket, style: const TextStyle(fontSize: 11.5)), onPressed: () => _blokEkle(id), ), ], ), const SizedBox(height: 10), Expanded( child: TextField( controller: _ctrl, maxLines: null, expands: true, textAlignVertical: TextAlignVertical.top, style: const TextStyle(fontSize: 13, height: 1.55), decoration: const InputDecoration( hintText: '[verse]\nSözlerinizi buraya yazın...\n\n[chorus]\nNakarat...', ), onChanged: (_) => _degisti(), ), ), ], ], ); } }