flutter_desktop: scroll, mid commit

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2022-08-11 00:12:47 +08:00
parent 33f5d9a4f3
commit 4e4f837160
4 changed files with 262 additions and 189 deletions

View File

@ -4,3 +4,6 @@ const String kAppTypeDesktopRemote = "remote";
const String kAppTypeDesktopFileTransfer = "file transfer"; const String kAppTypeDesktopFileTransfer = "file transfer";
const String kTabLabelHomePage = "Home"; const String kTabLabelHomePage = "Home";
const String kTabLabelSettingPage = "Settings"; const String kTabLabelSettingPage = "Settings";
const int kDefaultDisplayWidth = 1280;
const int kDefaultDisplayHeight = 720;

View File

@ -14,6 +14,7 @@ import 'package:wakelock/wakelock.dart';
// import 'package:window_manager/window_manager.dart'; // import 'package:window_manager/window_manager.dart';
import '../../common.dart'; import '../../common.dart';
import '../../consts.dart';
import '../../mobile/widgets/dialog.dart'; import '../../mobile/widgets/dialog.dart';
import '../../mobile/widgets/overlay.dart'; import '../../mobile/widgets/overlay.dart';
import '../../models/model.dart'; import '../../models/model.dart';
@ -822,18 +823,58 @@ class _RemotePageState extends State<RemotePage>
class ImagePaint extends StatelessWidget { class ImagePaint extends StatelessWidget {
final String id; final String id;
final ScrollController _horizontal = ScrollController();
final ScrollController _vertical = ScrollController();
const ImagePaint({Key? key, required this.id}) : super(key: key); ImagePaint({Key? key, required this.id}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final m = Provider.of<ImageModel>(context); final m = Provider.of<ImageModel>(context);
final c = Provider.of<CanvasModel>(context); final c = Provider.of<CanvasModel>(context);
var s = c.scale; var s = c.scale;
return CustomPaint( final paintChild = SizedBox(
painter: width: (m.image?.width ?? kDefaultDisplayWidth) * s,
new ImagePainter(image: m.image, x: c.x / s, y: c.y / s, scale: s), height: (m.image?.height ?? kDefaultDisplayHeight) * s,
); child: CustomPaint(
painter: new ImagePainter(
// image: m.image, x: c.x / s, y: c.y / s, scale: s),
image: m.image,
x: 0,
y: 0,
scale: s),
));
if (c.scrollStyle == ScrollStyle.scrollbar) {
return Center(
child: Scrollbar(
controller: _vertical,
thumbVisibility: true,
trackVisibility: true,
child: Scrollbar(
controller: _horizontal,
thumbVisibility: true,
trackVisibility: true,
notificationPredicate: (notif) => notif.depth == 1,
child: SingleChildScrollView(
controller: _vertical,
child: SingleChildScrollView(
controller: _horizontal,
scrollDirection: Axis.horizontal,
child: paintChild),
),
),
));
} else {
return Center(
child: InteractiveViewer(
// boundaryMargin: const EdgeInsets.all(20.0),
// minScale: 0.1,
// maxScale: 1.6,
scaleEnabled: false,
child: paintChild,
));
}
} }
} }
@ -896,6 +937,8 @@ void showOptions(String id, OverlayDialogManager dialogManager) async {
if (quality == '') quality = 'balanced'; if (quality == '') quality = 'balanced';
String viewStyle = String viewStyle =
await bind.getSessionOption(id: id, arg: 'view-style') ?? ''; await bind.getSessionOption(id: id, arg: 'view-style') ?? '';
String scrollStyle =
await bind.getSessionOption(id: id, arg: 'scroll-style') ?? '';
var displays = <Widget>[]; var displays = <Widget>[];
final pi = ffi(id).ffiModel.pi; final pi = ffi(id).ffiModel.pi;
final image = ffi(id).ffiModel.getConnectionImage(); final image = ffi(id).ffiModel.getConnectionImage();
@ -968,6 +1011,14 @@ void showOptions(String id, OverlayDialogManager dialogManager) async {
ffi(id).canvasModel.updateViewStyle(); ffi(id).canvasModel.updateViewStyle();
}); });
}; };
var setScrollStyle = (String? value) {
if (value == null) return;
setState(() {
scrollStyle = value;
bind.sessionPeerOption(id: id, name: "scroll-style", value: value);
ffi(id).canvasModel.updateScrollStyle();
});
};
return CustomAlertDialog( return CustomAlertDialog(
title: SizedBox.shrink(), title: SizedBox.shrink(),
content: Column( content: Column(
@ -978,6 +1029,10 @@ void showOptions(String id, OverlayDialogManager dialogManager) async {
getRadio('Shrink', 'shrink', viewStyle, setViewStyle), getRadio('Shrink', 'shrink', viewStyle, setViewStyle),
getRadio('Stretch', 'stretch', viewStyle, setViewStyle), getRadio('Stretch', 'stretch', viewStyle, setViewStyle),
Divider(color: MyTheme.border), Divider(color: MyTheme.border),
getRadio('Scrollbar', 'scrollbar', scrollStyle, setScrollStyle),
getRadio(
'ScrollMouse', 'scrollmouse', scrollStyle, setScrollStyle),
Divider(color: MyTheme.border),
getRadio('Good image quality', 'best', quality, setQuality), getRadio('Good image quality', 'best', quality, setQuality),
getRadio('Balanced', 'balanced', quality, setQuality), getRadio('Balanced', 'balanced', quality, setQuality),
getRadio('Optimize reaction time', 'low', quality, setQuality), getRadio('Optimize reaction time', 'low', quality, setQuality),

View File

@ -432,22 +432,27 @@ class ImageModel with ChangeNotifier {
} }
} }
enum ScrollStyle {
scrollbar,
scrollmouse,
}
class CanvasModel with ChangeNotifier { class CanvasModel with ChangeNotifier {
double _x = 0; double _x = 0;
double _y = 0; double _y = 0;
double _scale = 1.0; double _scale = 1.0;
double _tabBarHeight = 0.0; double _tabBarHeight = 0.0;
String id = ""; // TODO multi canvas model String id = ""; // TODO multi canvas model
ScrollStyle _scrollStyle = ScrollStyle.scrollbar;
WeakReference<FFI> parent; WeakReference<FFI> parent;
CanvasModel(this.parent); CanvasModel(this.parent);
double get x => _x; double get x => _x;
double get y => _y; double get y => _y;
double get scale => _scale; double get scale => _scale;
ScrollStyle get scrollStyle => _scrollStyle;
set tabBarHeight(double h) => _tabBarHeight = h; set tabBarHeight(double h) => _tabBarHeight = h;
double get tabBarHeight => _tabBarHeight; double get tabBarHeight => _tabBarHeight;
@ -497,6 +502,16 @@ class CanvasModel with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void updateScrollStyle() async {
final s = await bind.getSessionOption(id: id, arg: 'scroll-style');
if (s == 'scrollmouse') {
_scrollStyle = ScrollStyle.scrollmouse;
} else {
_scrollStyle = ScrollStyle.scrollbar;
}
notifyListeners();
}
void update(double x, double y, double scale) { void update(double x, double y, double scale) {
_x = x; _x = x;
_y = y; _y = y;

File diff suppressed because it is too large Load Diff