172 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:auto_size_text/auto_size_text.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:get/get.dart';
 | 
						|
 | 
						|
import '../../common.dart';
 | 
						|
 | 
						|
class Button extends StatefulWidget {
 | 
						|
  final GestureTapCallback onTap;
 | 
						|
  final String text;
 | 
						|
  final double? textSize;
 | 
						|
  final double? minWidth;
 | 
						|
  final bool isOutline;
 | 
						|
  final double? padding;
 | 
						|
  final Color? textColor;
 | 
						|
  final double? radius;
 | 
						|
  final Color? borderColor;
 | 
						|
 | 
						|
  Button({
 | 
						|
    Key? key,
 | 
						|
    this.minWidth,
 | 
						|
    this.isOutline = false,
 | 
						|
    this.textSize,
 | 
						|
    this.padding,
 | 
						|
    this.textColor,
 | 
						|
    this.radius,
 | 
						|
    this.borderColor,
 | 
						|
    required this.onTap,
 | 
						|
    required this.text,
 | 
						|
  }) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  State<Button> createState() => _ButtonState();
 | 
						|
}
 | 
						|
 | 
						|
class _ButtonState extends State<Button> {
 | 
						|
  RxBool hover = false.obs;
 | 
						|
  RxBool pressed = false.obs;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return Obx(() => InkWell(
 | 
						|
          onTapDown: (_) => pressed.value = true,
 | 
						|
          onTapUp: (_) => pressed.value = false,
 | 
						|
          onTapCancel: () => pressed.value = false,
 | 
						|
          onHover: (value) => hover.value = value,
 | 
						|
          onTap: widget.onTap,
 | 
						|
          child: ConstrainedBox(
 | 
						|
              constraints: BoxConstraints(
 | 
						|
                minWidth: widget.minWidth ?? 70.0,
 | 
						|
              ),
 | 
						|
              child: Container(
 | 
						|
                padding: EdgeInsets.all(widget.padding ?? 4.5),
 | 
						|
                alignment: Alignment.center,
 | 
						|
                decoration: BoxDecoration(
 | 
						|
                  color: pressed.value
 | 
						|
                      ? MyTheme.accent
 | 
						|
                      : (widget.isOutline
 | 
						|
                          ? Colors.transparent
 | 
						|
                          : MyTheme.button),
 | 
						|
                  border: Border.all(
 | 
						|
                    color: pressed.value
 | 
						|
                        ? MyTheme.accent
 | 
						|
                        : hover.value
 | 
						|
                            ? MyTheme.hoverBorder
 | 
						|
                            : (widget.isOutline
 | 
						|
                                ? widget.borderColor ?? MyTheme.border
 | 
						|
                                : MyTheme.button),
 | 
						|
                  ),
 | 
						|
                  borderRadius: BorderRadius.circular(widget.radius ?? 5),
 | 
						|
                ),
 | 
						|
                child: Text(
 | 
						|
                  translate(
 | 
						|
                    widget.text,
 | 
						|
                  ),
 | 
						|
                  style: TextStyle(
 | 
						|
                      fontSize: widget.textSize ?? 12.0,
 | 
						|
                      color: widget.isOutline
 | 
						|
                          ? widget.textColor ??
 | 
						|
                              Theme.of(context).textTheme.titleLarge?.color
 | 
						|
                          : Colors.white),
 | 
						|
                ).marginSymmetric(horizontal: 12),
 | 
						|
              )),
 | 
						|
        ));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class FixedWidthButton extends StatefulWidget {
 | 
						|
  final GestureTapCallback onTap;
 | 
						|
  final String text;
 | 
						|
  final double? textSize;
 | 
						|
  final double width;
 | 
						|
  final bool isOutline;
 | 
						|
  final double? padding;
 | 
						|
  final Color? textColor;
 | 
						|
  final double? radius;
 | 
						|
  final Color? borderColor;
 | 
						|
  final int? maxLines;
 | 
						|
 | 
						|
  FixedWidthButton({
 | 
						|
    Key? key,
 | 
						|
    required this.width,
 | 
						|
    this.maxLines,
 | 
						|
    this.isOutline = false,
 | 
						|
    this.textSize,
 | 
						|
    this.padding,
 | 
						|
    this.textColor,
 | 
						|
    this.radius,
 | 
						|
    this.borderColor,
 | 
						|
    required this.onTap,
 | 
						|
    required this.text,
 | 
						|
  }) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  State<FixedWidthButton> createState() => _FixedWidthButtonState();
 | 
						|
}
 | 
						|
 | 
						|
class _FixedWidthButtonState extends State<FixedWidthButton> {
 | 
						|
  RxBool hover = false.obs;
 | 
						|
  RxBool pressed = false.obs;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return Obx(() => InkWell(
 | 
						|
          onTapDown: (_) => pressed.value = true,
 | 
						|
          onTapUp: (_) => pressed.value = false,
 | 
						|
          onTapCancel: () => pressed.value = false,
 | 
						|
          onHover: (value) => hover.value = value,
 | 
						|
          onTap: widget.onTap,
 | 
						|
          child: Container(
 | 
						|
            width: widget.width,
 | 
						|
            padding: EdgeInsets.all(widget.padding ?? 4.5),
 | 
						|
            alignment: Alignment.center,
 | 
						|
            decoration: BoxDecoration(
 | 
						|
              color: pressed.value
 | 
						|
                  ? MyTheme.accent
 | 
						|
                  : (widget.isOutline ? Colors.transparent : MyTheme.button),
 | 
						|
              border: Border.all(
 | 
						|
                color: pressed.value
 | 
						|
                    ? MyTheme.accent
 | 
						|
                    : hover.value
 | 
						|
                        ? MyTheme.hoverBorder
 | 
						|
                        : (widget.isOutline
 | 
						|
                            ? widget.borderColor ?? MyTheme.border
 | 
						|
                            : MyTheme.button),
 | 
						|
              ),
 | 
						|
              borderRadius: BorderRadius.circular(widget.radius ?? 5),
 | 
						|
            ),
 | 
						|
            child: Row(
 | 
						|
              mainAxisAlignment: MainAxisAlignment.center,
 | 
						|
              children: [
 | 
						|
                Flexible(
 | 
						|
                  child: AutoSizeText(
 | 
						|
                    translate(
 | 
						|
                      widget.text,
 | 
						|
                    ),
 | 
						|
                    maxLines: widget.maxLines ?? 1,
 | 
						|
                    textAlign: TextAlign.center,
 | 
						|
                    style: TextStyle(
 | 
						|
                        fontSize: widget.textSize ?? 12.0,
 | 
						|
                        color: widget.isOutline
 | 
						|
                            ? widget.textColor ??
 | 
						|
                                Theme.of(context).textTheme.titleLarge?.color
 | 
						|
                            : Colors.white),
 | 
						|
                  ).marginSymmetric(horizontal: 12),
 | 
						|
                ),
 | 
						|
              ],
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        ));
 | 
						|
  }
 | 
						|
}
 |