import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../ayarlar/ayarlar_ekrani.dart'; import '../cekirdek/sabitler.dart'; import '../comfy/comfy_durum.dart'; import '../film/film_ekrani.dart'; import '../msr/msr_ekrani.dart'; import '../galeri/galeri_ekrani.dart'; import '../direktor/direktor_ekrani.dart'; import '../editor/editor_ekrani.dart'; import '../karakter/karakter_ekrani.dart'; import '../lora/lora_ekrani.dart'; import '../model/model_ekrani.dart'; import '../muzik/muzik_ekrani.dart'; import '../resim/resim_ekrani.dart'; import '../video/video_ekrani.dart'; import 'kisayollar.dart'; import 'tasarim.dart'; import 'tema.dart'; final seciliEkranProvider = StateProvider((ref) => 0); class _EkranTanimi { const _EkranTanimi(this.ikon, this.etiket, this.renk, this.olustur, {this.kategori = ''}); final IconData ikon; final String etiket; final Color renk; final Widget Function() olustur; /// Sidebar gruplaması (Miller/Hick — 12 düz öğe yerine mantıksal bloklar). final String kategori; } /// Sidebar kategori sırası (gösterim sırası; öğe index'leri korunur). const _kategoriler = ['ÜRETİM', 'KURGU', 'VARLIKLAR', 'SİSTEM']; /// Ekran bilgisi (komut sistemi/palet için dışa açık erişim). typedef EkranBilgi = ({IconData ikon, String etiket, Color renk, String kategori}); /// Tüm ekranların dışa açık listesi (index = seciliEkranProvider değeri). List get kabukEkranlari => [ for (final e in _ekranlar) (ikon: e.ikon, etiket: e.etiket, renk: e.renk, kategori: e.kategori), ]; // Index-bağımsız: her ekran kendi builder'ını taşır. Müzik/Resim/Video 0/1/2'de // kalmalı (galeri_ekrani oraya yönleniyor). final _ekranlar = <_EkranTanimi>[ _EkranTanimi(Icons.music_note_rounded, 'Müzik', FikoRenkler.neonCyan, () => const MuzikEkrani(), kategori: 'ÜRETİM'), _EkranTanimi(Icons.image_rounded, 'Resim', FikoRenkler.neonPembe, () => const ResimEkrani(), kategori: 'ÜRETİM'), _EkranTanimi(Icons.movie_rounded, 'Video', FikoRenkler.neonMor, () => const VideoEkrani(), kategori: 'ÜRETİM'), _EkranTanimi(Icons.theaters_rounded, 'Film/Dizi', FikoRenkler.neonMor, () => const FilmEkrani(), kategori: 'KURGU'), _EkranTanimi(Icons.auto_awesome_motion_rounded, 'Sahne Stüdyo', FikoRenkler.neonAmber, () => const MsrEkrani(), kategori: 'KURGU'), _EkranTanimi(Icons.theater_comedy_rounded, 'Direktör', FikoRenkler.neonYesil, () => const DirektorEkrani(), kategori: 'KURGU'), _EkranTanimi(Icons.face_rounded, 'Karakterler', FikoRenkler.neonYesil, () => const KarakterEkrani(), kategori: 'VARLIKLAR'), _EkranTanimi(Icons.layers_rounded, 'LoRA', FikoRenkler.neonYesil, () => const LoraEkrani(), kategori: 'VARLIKLAR'), _EkranTanimi(Icons.download_for_offline_rounded, 'Modeller', FikoRenkler.neonCyan, () => const ModelEkrani(), kategori: 'VARLIKLAR'), _EkranTanimi(Icons.cut_rounded, 'Editör', FikoRenkler.neonPembe, () => const EditorEkrani(), kategori: 'KURGU'), _EkranTanimi(Icons.collections_rounded, 'Galeri', FikoRenkler.neonCyan, () => const GaleriEkrani(), kategori: 'SİSTEM'), _EkranTanimi(Icons.settings_rounded, 'Ayarlar', FikoRenkler.neonMor, () => const AyarlarEkrani(), kategori: 'SİSTEM'), ]; class Kabuk extends ConsumerWidget { const Kabuk({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final secili = ref.watch(seciliEkranProvider); return KisayolKabugu( child: Scaffold( body: Row( children: [ const _Sidebar(), Expanded( child: AnimatedSwitcher( duration: Sabitler.animOrta, switchInCurve: Curves.easeOutCubic, transitionBuilder: (cocuk, anim) => FadeTransition( opacity: anim, child: SlideTransition( position: Tween( begin: const Offset(0, 0.015), end: Offset.zero) .animate(anim), child: cocuk, ), ), child: KeyedSubtree( key: ValueKey(secili), child: _ekranOlustur(secili), ), ), ), ], ), ), ); } Widget _ekranOlustur(int indeks) => (indeks >= 0 && indeks < _ekranlar.length) ? _ekranlar[indeks].olustur() : const SizedBox.shrink(); } class _Sidebar extends ConsumerWidget { const _Sidebar(); @override Widget build(BuildContext context, WidgetRef ref) { final secili = ref.watch(seciliEkranProvider); final tema = Theme.of(context); return Container( width: 174, decoration: BoxDecoration( color: tema.canvasColor, border: Border(right: BorderSide(color: tema.dividerColor)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 14), Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( children: [ ShaderMask( shaderCallback: (r) => const LinearGradient(colors: [ FikoRenkler.neonMor, FikoRenkler.neonCyan, ]).createShader(r), child: const Icon(Icons.auto_awesome, size: 21, color: Colors.white), ), const SizedBox(width: 8), const Expanded( child: Text('FikoYT Stüdyo', style: TextStyle( fontSize: 13.5, fontWeight: FontWeight.w800, letterSpacing: 0.2)), ), ], ), ), const SizedBox(height: 12), const Padding( padding: EdgeInsets.fromLTRB(10, 0, 10, 4), child: PaletButonu(), ), const SizedBox(height: 4), Expanded( child: ListView( padding: const EdgeInsets.symmetric(horizontal: 10), children: [ for (final kategori in _kategoriler) ...[ _KategoriBasligi(kategori), for (var i = 0; i < _ekranlar.length; i++) if (_ekranlar[i].kategori == kategori) _SidebarOge( tanim: _ekranlar[i], secili: secili == i, onTap: () => ref.read(seciliEkranProvider.notifier).state = i, ), ], ], ), ), const Padding( padding: EdgeInsets.all(12), child: ComfyDurumRozeti(), ), ], ), ); } } /// Sidebar kategori başlığı (Miller chunk'lama görsel sinyali). class _KategoriBasligi extends StatelessWidget { const _KategoriBasligi(this.metin); final String metin; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.fromLTRB(10, 12, 10, 5), child: Text( metin, style: TextStyle( fontSize: 9.5, fontWeight: FontWeight.w800, letterSpacing: 1.1, color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.38), ), ), ); } } class _SidebarOge extends StatefulWidget { const _SidebarOge( {required this.tanim, required this.secili, required this.onTap}); final _EkranTanimi tanim; final bool secili; final VoidCallback onTap; @override State<_SidebarOge> createState() => _SidebarOgeState(); } class _SidebarOgeState extends State<_SidebarOge> { bool _hover = false; @override Widget build(BuildContext context) { final t = widget.tanim; // Tek marka neonu (vurgu enflasyonu çözümü): seçim/hover kromu daima mor; // ekranın kimlik rengi (t.renk) yalnız ikon + sol şeritte yaşar. const marka = FikoRenkler.neonMor; final kimlik = t.renk; final pasifRenk = Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.65); final secili = widget.secili; return MouseRegion( onEnter: (_) => setState(() => _hover = true), onExit: (_) => setState(() => _hover = false), child: GestureDetector( onTap: widget.onTap, child: AnimatedContainer( duration: FikoHareket.kisa, curve: FikoHareket.standart, margin: const EdgeInsets.symmetric(vertical: 2), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), decoration: BoxDecoration( color: secili ? marka.withValues(alpha: FikoDurum.secili) : _hover ? marka.withValues(alpha: FikoDurum.hover) : Colors.transparent, borderRadius: FikoYaricap.rMd, border: Border.all( color: secili ? marka.withValues(alpha: 0.5) : Colors.transparent, ), boxShadow: secili ? FikoGolge.glow(marka, guc: 0.18, yaricap: 14) : null, ), child: Row( children: [ // Kimlik şeridi — ekranın kendi neonu sadece burada. AnimatedContainer( duration: FikoHareket.kisa, width: 3, height: secili ? 18 : 0, decoration: BoxDecoration( color: kimlik, borderRadius: FikoYaricap.rXs, ), ), SizedBox(width: secili ? 7 : 0), Icon(t.ikon, size: 17, color: secili ? kimlik : pasifRenk), const SizedBox(width: 9), Expanded( child: Text( t.etiket, style: TextStyle( fontSize: 12.5, fontWeight: secili ? FontWeight.w700 : FontWeight.w500, color: secili ? Theme.of(context).colorScheme.onSurface : pasifRenk, ), ), ), ], ), ), ), ); } }