import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; const String _kutuAdi = 'ui_durumu'; Future _kutuAl() async { if (Hive.isBoxOpen(_kutuAdi)) return Hive.box(_kutuAdi); return await Hive.openBox(_kutuAdi); } /// Sürüklenebilir bölücü çubuk. İki panel arasına dikey/yatay bölücü koyar. class YatayBolucu extends StatefulWidget { final Widget sol; final Widget sag; final double baslangicSolGenislik; final double minSol; final double minSag; final String? hafizaAnahtari; const YatayBolucu({ super.key, required this.sol, required this.sag, required this.baslangicSolGenislik, this.minSol = 120, this.minSag = 200, this.hafizaAnahtari, }); @override State createState() => _YatayBolucuState(); } class _YatayBolucuState extends State { late double _solGenislik; @override void initState() { super.initState(); _solGenislik = widget.baslangicSolGenislik; _hafizaYukle(); } Future _hafizaYukle() async { if (widget.hafizaAnahtari == null) return; try { final box = await _kutuAl(); final kaydedilen = box.get(widget.hafizaAnahtari); if (kaydedilen is num && mounted) { setState(() => _solGenislik = kaydedilen.toDouble()); } } catch (_) {} } Future _hafizaKaydet() async { if (widget.hafizaAnahtari == null) return; try { final box = await _kutuAl(); await box.put(widget.hafizaAnahtari!, _solGenislik); } catch (_) {} } @override Widget build(BuildContext context) { return LayoutBuilder( builder: (ctx, c) { if (_solGenislik > c.maxWidth - widget.minSag) { _solGenislik = c.maxWidth - widget.minSag; } if (_solGenislik < widget.minSol) _solGenislik = widget.minSol; return Row( children: [ SizedBox(width: _solGenislik, child: widget.sol), _Tutamac( eksen: Axis.vertical, onSurukle: (delta) { setState(() { _solGenislik = (_solGenislik + delta) .clamp(widget.minSol, c.maxWidth - widget.minSag); }); }, onSurukleBitti: _hafizaKaydet, ), Expanded(child: widget.sag), ], ); }, ); } } class DikeyBolucu extends StatefulWidget { final Widget ust; final Widget alt; final double baslangicUstYukseklik; final double minUst; final double minAlt; final String? hafizaAnahtari; const DikeyBolucu({ super.key, required this.ust, required this.alt, required this.baslangicUstYukseklik, this.minUst = 120, this.minAlt = 80, this.hafizaAnahtari, }); @override State createState() => _DikeyBolucuState(); } class _DikeyBolucuState extends State { late double _ustYukseklik; @override void initState() { super.initState(); _ustYukseklik = widget.baslangicUstYukseklik; _hafizaYukle(); } Future _hafizaYukle() async { if (widget.hafizaAnahtari == null) return; try { final box = await _kutuAl(); final kaydedilen = box.get(widget.hafizaAnahtari); if (kaydedilen is num && mounted) { setState(() => _ustYukseklik = kaydedilen.toDouble()); } } catch (_) {} } Future _hafizaKaydet() async { if (widget.hafizaAnahtari == null) return; try { final box = await _kutuAl(); await box.put(widget.hafizaAnahtari!, _ustYukseklik); } catch (_) {} } @override Widget build(BuildContext context) { return LayoutBuilder( builder: (ctx, c) { if (_ustYukseklik > c.maxHeight - widget.minAlt) { _ustYukseklik = c.maxHeight - widget.minAlt; } if (_ustYukseklik < widget.minUst) _ustYukseklik = widget.minUst; return Column( children: [ SizedBox(height: _ustYukseklik, width: double.infinity, child: widget.ust), _Tutamac( eksen: Axis.horizontal, onSurukle: (delta) { setState(() { _ustYukseklik = (_ustYukseklik + delta) .clamp(widget.minUst, c.maxHeight - widget.minAlt); }); }, onSurukleBitti: _hafizaKaydet, ), Expanded(child: widget.alt), ], ); }, ); } } class _Tutamac extends StatefulWidget { final Axis eksen; final ValueChanged onSurukle; final VoidCallback? onSurukleBitti; const _Tutamac({ required this.eksen, required this.onSurukle, this.onSurukleBitti, }); @override State<_Tutamac> createState() => _TutamacState(); } class _TutamacState extends State<_Tutamac> { bool _hover = false; bool _surukleniyor = false; @override Widget build(BuildContext context) { final theme = Theme.of(context); final aktif = _hover || _surukleniyor; final dikey = widget.eksen == Axis.vertical; return MouseRegion( cursor: dikey ? SystemMouseCursors.resizeColumn : SystemMouseCursors.resizeRow, onEnter: (_) => setState(() => _hover = true), onExit: (_) => setState(() => _hover = false), child: GestureDetector( behavior: HitTestBehavior.opaque, onPanStart: (_) => setState(() => _surukleniyor = true), onPanEnd: (_) { setState(() => _surukleniyor = false); widget.onSurukleBitti?.call(); }, onPanUpdate: (d) => widget.onSurukle(dikey ? d.delta.dx : d.delta.dy), child: AnimatedContainer( duration: const Duration(milliseconds: 120), width: dikey ? 6 : double.infinity, height: dikey ? double.infinity : 6, color: aktif ? theme.colorScheme.primary.withValues(alpha: 0.5) : theme.dividerColor.withValues(alpha: 0.5), ), ), ); } }