import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../app/tema.dart'; import 'resim_form_state.dart'; /// LoRA stack paneli — ekle/sil + güç slider'ı, ComfyUI'den canlı liste. class LoraPanel extends ConsumerWidget { const LoraPanel({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final loralar = ref.watch(resimFormProvider.select((s) => s.parametreler.loralar)); final notifier = ref.read(resimFormProvider.notifier); final tumLoralar = ref.watch(loraListesiProvider).valueOrNull ?? []; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ const Icon(Icons.layers, size: 16, color: FikoRenkler.neonYesil), const SizedBox(width: 6), Text(loralar.isEmpty ? 'LoRA' : 'LoRA (${loralar.length})', style: const TextStyle( fontSize: 12.5, fontWeight: FontWeight.w700)), const Spacer(), MenuAnchor( builder: (context, ctrl, _) => IconButton( visualDensity: VisualDensity.compact, tooltip: 'LoRA ekle', icon: const Icon(Icons.add_circle_outline, size: 18), onPressed: () => ctrl.isOpen ? ctrl.close() : ctrl.open(), ), menuChildren: [ if (tumLoralar.isEmpty) const MenuItemButton( onPressed: null, child: Text('LoRA bulunamadı')), for (final l in tumLoralar) MenuItemButton( onPressed: () => notifier.loraEkle(l), child: Text(l.replaceAll('.safetensors', ''), style: const TextStyle(fontSize: 12)), ), ], ), ], ), for (var i = 0; i < loralar.length; i++) Padding( padding: const EdgeInsets.symmetric(vertical: 2), child: Row( children: [ Expanded( flex: 3, child: Text( loralar[i].dosya.replaceAll('.safetensors', ''), maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: 11.5), ), ), Expanded( flex: 4, child: Slider( value: loralar[i].guc.clamp(-2, 2), min: -2, max: 2, divisions: 80, onChanged: (v) => notifier.loraGuc(i, v), ), ), SizedBox( width: 32, child: Text(loralar[i].guc.toStringAsFixed(2), style: const TextStyle(fontSize: 10.5)), ), IconButton( visualDensity: VisualDensity.compact, icon: const Icon(Icons.close, size: 15), onPressed: () => notifier.loraSil(i), ), ], ), ), if (loralar.isEmpty) Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: Text('Kendi eğittiğin karakter LoRA\'larını + ile ekle', style: TextStyle( fontSize: 10.5, color: Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.5))), ), ], ); } }