mirror of
https://github.com/krille-chan/fluffychat
synced 2024-10-10 15:03:38 +00:00
99 lines
3.4 KiB
Dart
99 lines
3.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:badges/badges.dart';
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
import 'package:fluffychat/config/app_config.dart';
|
|
import 'package:fluffychat/widgets/hover_builder.dart';
|
|
import 'package:fluffychat/widgets/unread_rooms_badge.dart';
|
|
import '../../config/themes.dart';
|
|
|
|
class NaviRailItem extends StatelessWidget {
|
|
final String toolTip;
|
|
final bool isSelected;
|
|
final void Function() onTap;
|
|
final Widget icon;
|
|
final Widget? selectedIcon;
|
|
final bool Function(Room)? unreadBadgeFilter;
|
|
|
|
const NaviRailItem({
|
|
required this.toolTip,
|
|
required this.isSelected,
|
|
required this.onTap,
|
|
required this.icon,
|
|
this.selectedIcon,
|
|
this.unreadBadgeFilter,
|
|
super.key,
|
|
});
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final borderRadius = BorderRadius.circular(AppConfig.borderRadius);
|
|
final icon = isSelected ? selectedIcon ?? this.icon : this.icon;
|
|
final unreadBadgeFilter = this.unreadBadgeFilter;
|
|
return HoverBuilder(
|
|
builder: (context, hovered) {
|
|
return SizedBox(
|
|
height: FluffyThemes.navRailWidth,
|
|
width: FluffyThemes.navRailWidth,
|
|
child: Stack(
|
|
children: [
|
|
Positioned(
|
|
top: 16,
|
|
bottom: 16,
|
|
left: 0,
|
|
child: AnimatedContainer(
|
|
width: isSelected ? 4 : 0,
|
|
duration: FluffyThemes.animationDuration,
|
|
curve: FluffyThemes.animationCurve,
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).colorScheme.primary,
|
|
borderRadius: const BorderRadius.only(
|
|
topRight: Radius.circular(90),
|
|
bottomRight: Radius.circular(90),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Center(
|
|
child: AnimatedScale(
|
|
scale: hovered ? 1.2 : 1.0,
|
|
duration: FluffyThemes.animationDuration,
|
|
curve: FluffyThemes.animationCurve,
|
|
child: Material(
|
|
borderRadius: borderRadius,
|
|
color: isSelected
|
|
? Theme.of(context).colorScheme.primaryContainer
|
|
: Theme.of(context).colorScheme.surface,
|
|
child: Tooltip(
|
|
message: toolTip,
|
|
child: InkWell(
|
|
borderRadius: borderRadius,
|
|
onTap: onTap,
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8.0,
|
|
vertical: 8.0,
|
|
),
|
|
child: unreadBadgeFilter == null
|
|
? icon
|
|
: UnreadRoomsBadge(
|
|
filter: unreadBadgeFilter,
|
|
badgePosition: BadgePosition.topEnd(
|
|
top: -12,
|
|
end: -8,
|
|
),
|
|
child: icon,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|