rustdesk/flutter/lib/desktop/widgets/button.dart

172 lines
5.3 KiB
Dart
Raw Normal View History

import 'package:auto_size_text/auto_size_text.dart';
2022-09-23 17:28:22 +08:00
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;
2022-09-23 17:28:22 +08:00
Button({
Key? key,
this.minWidth,
this.isOutline = false,
2022-09-23 20:18:11 +08:00
this.textSize,
this.padding,
this.textColor,
this.radius,
this.borderColor,
2022-09-23 17:28:22 +08:00
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(
2022-09-23 20:18:11 +08:00
minWidth: widget.minWidth ?? 70.0,
2022-09-23 17:28:22 +08:00
),
child: Container(
2022-09-23 20:18:11 +08:00
padding: EdgeInsets.all(widget.padding ?? 4.5),
2022-09-23 17:28:22 +08:00
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
2022-09-23 20:18:11 +08:00
? widget.borderColor ?? MyTheme.border
2022-09-23 17:28:22 +08:00
: MyTheme.button),
),
2022-09-23 20:18:11 +08:00
borderRadius: BorderRadius.circular(widget.radius ?? 5),
2022-09-23 17:28:22 +08:00
),
child: Text(
translate(
widget.text,
),
style: TextStyle(
2022-09-23 20:18:11 +08:00
fontSize: widget.textSize ?? 12.0,
color: widget.isOutline
? widget.textColor ??
Theme.of(context).textTheme.titleLarge?.color
: Colors.white),
2022-09-23 17:28:22 +08:00
).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),
),
],
),
),
));
}
}