import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../comfy/comfy_durum.dart'; import '../muzik/muzik_ekrani.dart'; import '../muzik/muzik_form_state.dart'; import '../resim/resim_ekrani.dart'; import '../resim/resim_form_state.dart'; import '../veri/isar_servisi.dart'; import '../video/video_ekrani.dart'; import '../video/video_form_state.dart'; import 'kabuk.dart'; import 'tema.dart'; /// TEK MERKEZİ KOMUT KAYDI — palet (Ctrl+K), global kısayollar ve kısayol /// yardımı (?) hepsi BU kaynaktan beslenir. Çoğu pro araçta menü/kısayol/palet /// ayrı tanımlanır; tek kaynak = tutarlılık + keşfedilebilirlik. class FikoKomut { const FikoKomut({ required this.id, required this.baslik, required this.ikon, required this.calistir, this.kategori = 'Genel', this.kisayol = const [], this.anahtarlar = const [], this.renk, }); final String id; final String baslik; final IconData ikon; /// Komutu çalıştırır (context gerekiyorsa kapatma ile sağlanır). final VoidCallback calistir; final String kategori; /// Gösterilecek kısayol parçaları, ör. ['Ctrl', 'K']. final List kisayol; /// Arama için ek anahtar kelimeler. final List anahtarlar; final Color? renk; /// Fuzzy arama skoru (0 = eşleşme yok). Yüksek = daha iyi. int eslesmeSkoru(String sorgu) { if (sorgu.isEmpty) return 1; final q = sorgu.toLowerCase(); final hedef = '$baslik ${anahtarlar.join(' ')} $kategori'.toLowerCase(); final b = baslik.toLowerCase(); if (b.startsWith(q)) return 100; if (b.contains(q)) return 70; if (hedef.contains(q)) return 40; // Subsequence (harf sırası): "mzk" → "müzik". var i = 0; for (final c in hedef.codeUnits) { if (i < q.length && c == q.codeUnitAt(i)) i++; } return i == q.length ? 15 : 0; } } /// Aktif ekranın palete/kısayola kattığı bağlamsal komutlar. /// Her ekran açıldığında kendi eylemlerini buraya yazar (Üret, Sihirbaz vb.). final aktifEylemlerProvider = StateProvider>((ref) => const []); /// Uygulama genel komutları (ekran geçişleri + tema + ComfyUI). List genelKomutlar(WidgetRef ref) { final komutlar = []; final ekranlar = kabukEkranlari; for (var i = 0; i < ekranlar.length; i++) { final e = ekranlar[i]; komutlar.add(FikoKomut( id: 'git_$i', baslik: '${e.etiket} ekranına git', ikon: e.ikon, kategori: 'Ekranlar', renk: e.renk, anahtarlar: [e.etiket, e.kategori, 'ekran', 'git'], kisayol: i < 9 ? ['Ctrl', '${i + 1}'] : (i == 9 ? const ['Ctrl', '0'] : const []), calistir: () => ref.read(seciliEkranProvider.notifier).state = i, )); } komutlar.addAll([ FikoKomut( id: 'tema', baslik: 'Temayı değiştir (Koyu/Açık)', ikon: Icons.brightness_6_rounded, kategori: 'Genel', kisayol: const ['Ctrl', 'L'], anahtarlar: const ['dark', 'light', 'tema', 'koyu', 'açık'], calistir: () => ref .read(ayarlarProvider.notifier) .guncelle((a) => a.koyuTema = !a.koyuTema), ), FikoKomut( id: 'comfy_baslat', baslik: 'ComfyUI\'yi Başlat', ikon: Icons.play_arrow_rounded, kategori: 'ComfyUI', anahtarlar: const ['comfy', 'sunucu', 'başlat'], calistir: ComfyBaslatici.baslat, ), FikoKomut( id: 'comfy_yeniden', baslik: 'ComfyUI\'yi Yeniden Başlat', ikon: Icons.restart_alt_rounded, kategori: 'ComfyUI', anahtarlar: const ['comfy', 'restart', 'yeniden'], calistir: () => ComfyBaslatici.yenidenBaslat(), ), FikoKomut( id: 'comfy_durdur', baslik: 'ComfyUI\'yi Durdur', ikon: Icons.stop_circle_outlined, kategori: 'ComfyUI', anahtarlar: const ['comfy', 'stop', 'durdur', 'kapat'], calistir: () => ComfyBaslatici.durdur(), ), ]); return komutlar; } /// Aktif ekranın bağlamsal komutları (merkezi — staleness yok, palet her /// açıldığında seçili ekrandan taze hesaplanır). "Bu Ekran" kategorisi. List _ekranKomutlari(WidgetRef ref) { switch (ref.read(seciliEkranProvider)) { case 0: return [ FikoKomut( id: 'm_uret', baslik: 'Müzik Üret', ikon: Icons.play_arrow_rounded, kategori: 'Bu Ekran', renk: FikoRenkler.neonCyan, anahtarlar: const ['üret', 'generate', 'müzik'], calistir: () => ref.read(muzikFormProvider.notifier).uret()), FikoKomut( id: 'm_sihirbaz', baslik: 'Müzik Sihirbazını Aç/Kapat', ikon: Icons.auto_fix_high_rounded, kategori: 'Bu Ekran', calistir: () => ref.read(muzikFormProvider.notifier).sihirbazAcKapat()), FikoKomut( id: 'm_gecmis', baslik: 'Müzik Üretim Geçmişi', ikon: Icons.history_rounded, kategori: 'Bu Ekran', calistir: () => ref .read(muzikGecmisAcikProvider.notifier) .update((v) => !v)), ]; case 1: return [ FikoKomut( id: 'r_uret', baslik: 'Resim Üret', ikon: Icons.play_arrow_rounded, kategori: 'Bu Ekran', renk: FikoRenkler.neonPembe, anahtarlar: const ['üret', 'generate', 'resim'], calistir: () => ref.read(resimFormProvider.notifier).uret()), FikoKomut( id: 'r_sihirbaz', baslik: 'Resim Sihirbazını Aç/Kapat', ikon: Icons.auto_fix_high_rounded, kategori: 'Bu Ekran', calistir: () => ref.read(resimFormProvider.notifier).sihirbazAcKapat()), FikoKomut( id: 'r_gecmis', baslik: 'Resim Üretim Geçmişi', ikon: Icons.history_rounded, kategori: 'Bu Ekran', calistir: () => ref .read(resimGecmisAcikProvider.notifier) .update((v) => !v)), ]; case 2: return [ FikoKomut( id: 'v_uret', baslik: 'Video Üret', ikon: Icons.play_arrow_rounded, kategori: 'Bu Ekran', renk: FikoRenkler.neonMor, anahtarlar: const ['üret', 'generate', 'video'], calistir: () => ref.read(videoFormProvider.notifier).uret()), FikoKomut( id: 'v_sihirbaz', baslik: 'Video Sihirbazını Aç/Kapat', ikon: Icons.auto_fix_high_rounded, kategori: 'Bu Ekran', calistir: () => ref.read(videoFormProvider.notifier).sihirbazAcKapat()), FikoKomut( id: 'v_gecmis', baslik: 'Video Üretim Geçmişi', ikon: Icons.history_rounded, kategori: 'Bu Ekran', calistir: () => ref .read(videoGecmisAcikProvider.notifier) .update((v) => !v)), ]; default: return const []; } } /// Genel + aktif ekran komutları (palet/yardım bunu kullanır). /// Ekran komutları en başta (en alakalı). List tumKomutlar(WidgetRef ref) => [ ..._ekranKomutlari(ref), ...ref.read(aktifEylemlerProvider), ...genelKomutlar(ref), ];