Line data Source code
1 : // Copyright 2023 The terCAD team. All rights reserved. 2 : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file. 3 : 4 : import 'package:app_finance/_classes/herald/app_design.dart'; 5 : import 'package:app_finance/_configs/theme_helper.dart'; 6 : import 'package:app_finance/_ext/build_context_ext.dart'; 7 : import 'package:flutter/material.dart'; 8 : 9 : class SliverHeaderDelegate extends SliverPersistentHeaderDelegate { 10 : final key = GlobalKey(); 11 : double closedHeight; 12 : double openHeight; 13 : String title; 14 : Function? callback; 15 : 16 0 : SliverHeaderDelegate( 17 : this.title, { 18 : this.closedHeight = 29, 19 : this.openHeight = 30, 20 : this.callback, 21 : }); 22 : 23 0 : @override 24 0 : double get maxExtent => openHeight; 25 : 26 0 : @override 27 0 : double get minExtent => closedHeight; 28 : 29 0 : @override 30 : bool shouldRebuild(oldDelegate) => true; 31 : 32 0 : @override 33 : Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { 34 0 : final tmp = key.currentContext; 35 : try { 36 0 : if (tmp != null && tmp.mounted && tmp.findRenderObject() is RenderBox) { 37 0 : callback?.call(title); 38 : } 39 : } catch (e) { 40 : // .. ignore inactive state 41 : } 42 0 : final indent = ThemeHelper.getIndent(); 43 0 : final isPinned = shrinkOffset == maxExtent; 44 0 : return Container( 45 0 : padding: EdgeInsets.fromLTRB(indent, indent / 2, 0, 0), 46 0 : key: key, 47 0 : height: openHeight, 48 0 : decoration: BoxDecoration( 49 : color: isPinned 50 0 : ? Color.alphaBlend(context.colorScheme.inverseSurface.withOpacity(0.1), context.colorScheme.surface) 51 0 : : context.colorScheme.surface, 52 : border: isPinned 53 : ? null 54 0 : : Border( 55 0 : bottom: BorderSide( 56 0 : color: context.colorScheme.secondary.withOpacity(0.2), 57 : ), 58 : ), 59 : ), 60 0 : child: Align( 61 0 : alignment: AppDesign.isRightToLeft() ? Alignment.centerRight : Alignment.centerLeft, 62 0 : child: Text(title, style: context.textTheme.bodySmall), 63 : ), 64 : ); 65 : } 66 : }