rustdesk/flutter/lib/widgets/gesture_help.dart

209 lines
7.6 KiB
Dart
Raw Normal View History

2022-02-23 21:16:30 +08:00
import 'package:flutter/material.dart';
2022-02-23 21:32:33 +08:00
import 'package:flutter_hbb/common.dart';
2022-02-23 21:16:30 +08:00
import 'package:toggle_switch/toggle_switch.dart';
2022-03-23 16:28:37 +08:00
import '../models/model.dart';
2022-02-23 21:16:30 +08:00
class GestureIcons {
static const String _family = 'gestureicons';
GestureIcons._();
static const IconData icon_mouse = IconData(0xe65c, fontFamily: _family);
static const IconData icon_Tablet_Touch =
IconData(0xe9ce, fontFamily: _family);
static const IconData icon_gesture_f_drag =
IconData(0xe686, fontFamily: _family);
static const IconData icon_Mobile_Touch =
IconData(0xe9cd, fontFamily: _family);
static const IconData icon_gesture_press =
IconData(0xe66c, fontFamily: _family);
static const IconData icon_gesture_tap =
IconData(0xe66f, fontFamily: _family);
static const IconData icon_gesture_pinch =
IconData(0xe66a, fontFamily: _family);
static const IconData icon_gesture_press_hold =
IconData(0xe66b, fontFamily: _family);
static const IconData icon_gesture_f_drag_up_down_ =
IconData(0xe685, fontFamily: _family);
static const IconData icon_gesture_f_tap_ =
IconData(0xe68e, fontFamily: _family);
static const IconData icon_gesture_f_swipe_right =
IconData(0xe68f, fontFamily: _family);
static const IconData icon_gesture_f_double_tap =
IconData(0xe691, fontFamily: _family);
}
2022-02-24 15:59:03 +08:00
typedef OnTouchModeChange = void Function(bool);
2022-02-23 21:16:30 +08:00
class GestureHelp extends StatefulWidget {
2022-03-23 16:28:37 +08:00
GestureHelp(
{Key? key, required this.touchMode, required this.onTouchModeChange})
: super(key: key);
2022-02-24 15:59:03 +08:00
final bool touchMode;
final OnTouchModeChange onTouchModeChange;
2022-03-23 16:28:37 +08:00
2022-02-23 21:16:30 +08:00
@override
State<StatefulWidget> createState() => _GestureHelpState();
}
class _GestureHelpState extends State<GestureHelp> {
2022-02-23 21:32:33 +08:00
var _selectedIndex;
var _touchMode;
@override
void initState() {
2022-02-24 15:59:03 +08:00
_touchMode = widget.touchMode;
2022-02-23 21:32:33 +08:00
_selectedIndex = _touchMode ? 1 : 0;
super.initState();
}
2022-02-23 21:16:30 +08:00
@override
Widget build(BuildContext context) {
2022-04-05 02:02:49 +08:00
final size = MediaQuery.of(context).size;
final space = 12.0;
var width = size.width - 2 * space;
final minWidth = 90;
if (size.width > minWidth + 2 * space) {
final n = (size.width / (minWidth + 2 * space)).floor();
width = size.width / n - 2 * space;
}
2022-02-23 21:16:30 +08:00
return Center(
child: Padding(
2022-04-05 02:02:49 +08:00
padding: const EdgeInsets.symmetric(vertical: 12.0),
2022-02-23 21:16:30 +08:00
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
2022-04-05 02:02:49 +08:00
crossAxisAlignment: CrossAxisAlignment.center,
2022-02-23 21:16:30 +08:00
children: <Widget>[
ToggleSwitch(
initialLabelIndex: _selectedIndex,
2022-02-24 15:59:03 +08:00
inactiveBgColor: MyTheme.darkGray,
2022-02-23 21:16:30 +08:00
totalSwitches: 2,
2022-03-23 16:28:37 +08:00
minWidth: 150,
2022-02-23 21:16:30 +08:00
fontSize: 15,
2022-03-23 16:28:37 +08:00
iconSize: 18,
2022-04-08 16:57:47 +08:00
labels: [translate("Mouse mode"), translate("Touch mode")],
2022-03-23 16:28:37 +08:00
icons: [Icons.mouse, Icons.touch_app],
2022-02-23 21:16:30 +08:00
onToggle: (index) {
setState(() {
2022-03-23 16:28:37 +08:00
if (_selectedIndex != index) {
2022-02-24 15:59:03 +08:00
_selectedIndex = index ?? 0;
_touchMode = index == 0 ? false : true;
widget.onTouchModeChange(_touchMode);
}
2022-02-23 21:16:30 +08:00
});
},
),
2022-04-05 02:02:49 +08:00
const SizedBox(height: 30),
2022-03-23 16:28:37 +08:00
Container(
2022-04-05 02:02:49 +08:00
child: Wrap(
spacing: space,
runSpacing: 2 * space,
2022-02-23 21:16:30 +08:00
children: _touchMode
2022-03-23 16:28:37 +08:00
? [
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_Mobile_Touch,
translate("One-Finger Tap"),
translate("Left Mouse")),
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_press_hold,
translate("One-Long Tap"),
translate("Right Mouse")),
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_swipe_right,
translate("One-Finger Move"),
translate("Mouse Drag")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_drag_up_down_,
translate("Two-Finger vertically"),
translate("Mouse Wheel")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_drag,
translate("Two-Finger Move"),
translate("Canvas Move")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_pinch,
translate("Pinch to Zoom"),
translate("Canvas Zoom")),
2022-02-23 21:16:30 +08:00
]
2022-03-23 16:28:37 +08:00
: [
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_Mobile_Touch,
translate("One-Finger Tap"),
translate("Left Mouse")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_tap_,
translate("Two-Finger Tap"),
translate("Right Mouse")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_swipe_right,
translate("Double Tap & Move"),
translate("Mouse Drag")),
2022-02-23 21:16:30 +08:00
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_drag_up_down_,
translate("Two-Finger vertically"),
translate("Mouse Wheel")),
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_f_drag,
translate("Two-Finger Move"),
translate("Canvas Move")),
GestureInfo(
2022-04-05 02:02:49 +08:00
width,
2022-03-23 16:28:37 +08:00
GestureIcons.icon_gesture_pinch,
translate("Pinch to Zoom"),
translate("Canvas Zoom")),
2022-02-23 21:16:30 +08:00
],
2022-03-23 16:28:37 +08:00
)),
2022-02-23 21:16:30 +08:00
],
)));
}
}
class GestureInfo extends StatelessWidget {
2022-04-05 02:02:49 +08:00
const GestureInfo(this.width, this.icon, this.fromText, this.toText,
{Key? key})
2022-02-23 21:16:30 +08:00
: super(key: key);
final String fromText;
final String toText;
final IconData icon;
2022-04-05 02:02:49 +08:00
final double width;
2022-02-23 21:16:30 +08:00
final iconSize = 35.0;
2022-04-05 02:02:49 +08:00
final iconColor = MyTheme.accent;
2022-02-23 21:16:30 +08:00
@override
Widget build(BuildContext context) {
2022-04-05 02:02:49 +08:00
return Container(
width: this.width,
child: Column(
2022-03-23 16:28:37 +08:00
children: [
2022-04-05 02:02:49 +08:00
Icon(
icon,
size: iconSize,
color: iconColor,
),
SizedBox(height: 6),
Text(fromText,
textAlign: TextAlign.center,
2022-04-08 16:57:47 +08:00
style: TextStyle(fontSize: 9, color: Colors.grey)),
2022-04-05 02:02:49 +08:00
SizedBox(height: 3),
Text(toText,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 12, color: Colors.black))
2022-03-23 16:28:37 +08:00
],
));
2022-02-23 21:16:30 +08:00
}
}