From 5e17a995e6343e3094d5f79f082ade86c4e0b1a3 Mon Sep 17 00:00:00 2001 From: open-trade Date: Mon, 21 Dec 2020 18:28:28 +0800 Subject: [PATCH] remember cursor, canvas offset and scale --- flutter_hbb/lib/model.dart | 65 ++++++++++++++++++++++++++- flutter_hbb/pubspec.lock | 92 +++++++++++++++++++++++++++----------- flutter_hbb/pubspec.yaml | 1 + 3 files changed, 132 insertions(+), 26 deletions(-) diff --git a/flutter_hbb/lib/model.dart b/flutter_hbb/lib/model.dart index 9133283ce..e76084b2f 100644 --- a/flutter_hbb/lib/model.dart +++ b/flutter_hbb/lib/model.dart @@ -2,6 +2,7 @@ import 'package:ffi/ffi.dart'; import 'package:flutter/services.dart'; import 'package:flutter/gestures.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:device_info/device_info.dart'; import 'dart:io'; import 'dart:math'; @@ -38,6 +39,7 @@ class FfiModel with ChangeNotifier { get permissions => _permissions; get initialized => _initialized; + get display => _display; get secure => _secure; get direct => _direct; get pi => _pi; @@ -187,7 +189,7 @@ class FfiModel with ChangeNotifier { } if (_pi.currentDisplay < _pi.displays.length) { _display = _pi.displays[_pi.currentDisplay]; - FFI.cursorModel.updateDisplayOrigin(_display.x, _display.y); + initializeCursorAndCanvas(); } if (displays.length > 0) { showLoading('Waiting for image...', context); @@ -243,6 +245,13 @@ class CanvasModel with ChangeNotifier { double get y => _y; double get scale => _scale; + void update(double x, double y, double scale) { + _x = x; + _y = y; + _scale = scale; + notifyListeners(); + } + set scale(v) { _scale = v; notifyListeners(); @@ -443,6 +452,16 @@ class CursorModel with ChangeNotifier { notifyListeners(); } + void updateDisplayOriginWithCursor( + double x, double y, double xCursor, double yCursor) { + _displayOriginX = x; + _displayOriginY = y; + _x = xCursor; + _y = yCursor; + FFI.moveMouse(x, y); + notifyListeners(); + } + void clear() { _x = -10000; _x = -10000; @@ -573,6 +592,8 @@ class FFI { } static void close() { + savePreference(id, cursorModel.x, cursorModel.y, canvasModel.x, + canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay); id = ""; setByName('close', ''); imageModel.update(null); @@ -647,3 +668,45 @@ class PeerInfo { int currentDisplay; List displays; } + +void savePreference(String id, double xCursor, double yCursor, double xCanvas, + double yCanvas, double scale, int currentDisplay) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final p = Map(); + p['xCursor'] = xCursor; + p['yCursor'] = yCursor; + p['xCanvas'] = xCanvas; + p['yCanvas'] = yCanvas; + p['scale'] = scale; + p['currentDisplay'] = currentDisplay; + prefs.setString('peer' + id, json.encode(p)); +} + +Future> getPreference(String id) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + var p = prefs.getString('peer' + id); + if (p == null) return null; + Map m = json.decode(p); + return m; +} + +void initializeCursorAndCanvas() async { + var p = await getPreference(FFI.id); + int currentDisplay = 0; + if (p != null) { + currentDisplay = p['currentDisplay']; + } + if (p == null || currentDisplay != FFI.ffiModel.pi.currentDisplay) { + FFI.cursorModel + .updateDisplayOrigin(FFI.ffiModel.display.x, FFI.ffiModel.display.y); + return; + } + double xCursor = p['xCursor']; + double yCursor = p['yCursor']; + double xCanvas = p['xCanvas']; + double yCanvas = p['yCanvas']; + double scale = p['scale']; + FFI.cursorModel.updateDisplayOriginWithCursor( + FFI.ffiModel.display.x, FFI.ffiModel.display.y, xCursor, yCursor); + FFI.canvasModel.update(xCanvas, yCanvas, scale); +} diff --git a/flutter_hbb/pubspec.lock b/flutter_hbb/pubspec.lock index dd24d84ca..f343c67e1 100644 --- a/flutter_hbb/pubspec.lock +++ b/flutter_hbb/pubspec.lock @@ -21,42 +21,42 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.1" + version: "2.5.0-nullsafety.3" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0-nullsafety.3" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0-nullsafety.5" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0-nullsafety.3" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0-nullsafety.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.3" + version: "1.15.0-nullsafety.5" convert: dependency: transitive description: @@ -84,7 +84,7 @@ packages: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" device_info: dependency: "direct main" description: @@ -105,7 +105,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0-nullsafety.3" ffi: dependency: "direct main" description: @@ -126,14 +126,14 @@ packages: name: firebase url: "https://pub.dartlang.org" source: hosted - version: "7.3.2" + version: "7.3.3" firebase_analytics: dependency: "direct main" description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "6.2.0" + version: "6.3.0" firebase_analytics_platform_interface: dependency: transitive description: @@ -154,7 +154,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "0.5.2+1" + version: "0.5.3" firebase_core_platform_interface: dependency: transitive description: @@ -255,21 +255,21 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.2" + version: "0.6.3-nullsafety.3" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.1" + version: "0.12.10-nullsafety.3" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0-nullsafety.6" nested: dependency: transitive description: @@ -290,7 +290,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.1" + version: "1.8.0-nullsafety.3" path_provider: dependency: "direct main" description: @@ -367,7 +367,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "4.3.2+2" + version: "4.3.2+3" quiver: dependency: transitive description: @@ -375,6 +375,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.12+4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2+4" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+11" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+7" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+3" sky_engine: dependency: transitive description: flutter @@ -386,42 +428,42 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.2" + version: "1.8.0-nullsafety.4" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.1" + version: "1.10.0-nullsafety.6" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0-nullsafety.3" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0-nullsafety.3" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0-nullsafety.3" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.2" + version: "0.2.19-nullsafety.6" tuple: dependency: "direct main" description: @@ -435,7 +477,7 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0-nullsafety.5" url_launcher: dependency: "direct main" description: @@ -484,7 +526,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0-nullsafety.5" wakelock: dependency: "direct main" description: @@ -535,5 +577,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0-110 <2.11.0" + dart: ">=2.12.0-0.0 <3.0.0" flutter: ">=1.22.0 <2.0.0" diff --git a/flutter_hbb/pubspec.yaml b/flutter_hbb/pubspec.yaml index 25cfb59ec..77824d3b1 100644 --- a/flutter_hbb/pubspec.yaml +++ b/flutter_hbb/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: firebase_analytics: ^6.2.0 package_info: ^0.4.3+2 url_launcher: ^5.7.10 + shared_preferences: ^0.5.12+4 dev_dependencies: flutter_launcher_icons: "^0.8.0"