feat!: remove superseded ThermionWindows widget
This commit is contained in:
@@ -6,7 +6,6 @@ import 'package:thermion_flutter/src/widgets/src/thermion_widget_web.dart';
|
|||||||
import 'package:thermion_flutter/thermion_flutter.dart';
|
import 'package:thermion_flutter/thermion_flutter.dart';
|
||||||
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
|
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
|
||||||
import 'package:thermion_dart/src/viewer/src/shared_types/view.dart' as t;
|
import 'package:thermion_dart/src/viewer/src/shared_types/view.dart' as t;
|
||||||
import 'thermion_widget_windows.dart';
|
|
||||||
|
|
||||||
Future kDefaultResizeCallback(Size size, t.View view, double pixelRatio) async {
|
Future kDefaultResizeCallback(Size size, t.View view, double pixelRatio) async {
|
||||||
var camera = await view.getCamera();
|
var camera = await view.getCamera();
|
||||||
@@ -87,7 +86,7 @@ class _ThermionWidgetState extends State<ThermionWidget> {
|
|||||||
return widget.initial ?? Container(color: Colors.red);
|
return widget.initial ?? Container(color: Colors.red);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Windows & Web don't support imported textures yet
|
// Web doesn't support imported textures yet
|
||||||
if (kIsWeb) {
|
if (kIsWeb) {
|
||||||
return ThermionWidgetWeb(
|
return ThermionWidgetWeb(
|
||||||
viewer: widget.viewer,
|
viewer: widget.viewer,
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:thermion_flutter/src/widgets/src/resize_observer.dart';
|
|
||||||
import 'package:thermion_flutter/src/widgets/src/transparent_filament_widget.dart';
|
|
||||||
import 'package:thermion_flutter/thermion_flutter.dart' as t;
|
|
||||||
import 'package:thermion_flutter_platform_interface/thermion_flutter_window.dart';
|
|
||||||
|
|
||||||
class ThermionWidgetWindows extends StatefulWidget {
|
|
||||||
|
|
||||||
final t.ThermionViewer viewer;
|
|
||||||
|
|
||||||
final t.View view;
|
|
||||||
|
|
||||||
///
|
|
||||||
///
|
|
||||||
///
|
|
||||||
final Widget? initial;
|
|
||||||
|
|
||||||
///
|
|
||||||
/// A callback that will be invoked whenever this widget (and the underlying texture is resized).
|
|
||||||
///
|
|
||||||
final Future Function(Size size, t.View view, double pixelRatio)? onResize;
|
|
||||||
|
|
||||||
const ThermionWidgetWindows({super.key, required this.viewer, this.initial, this.onResize, required this.view});
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<StatefulWidget> createState() => _ThermionWidgetWindowsState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ThermionWidgetWindowsState extends State<ThermionWidgetWindows> {
|
|
||||||
|
|
||||||
ThermionFlutterWindow? _window;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
|
||||||
await widget.viewer.initialized;
|
|
||||||
|
|
||||||
var dpr = MediaQuery.of(context).devicePixelRatio;
|
|
||||||
|
|
||||||
final renderBox = ((context.findRenderObject()) as RenderBox);
|
|
||||||
var size = renderBox.size;
|
|
||||||
var width = (size.width * dpr).ceil();
|
|
||||||
var height = (size.height * dpr).ceil();
|
|
||||||
|
|
||||||
final offset = renderBox.localToGlobal(Offset.zero);
|
|
||||||
final offsetLeft = (offset.dx * dpr).toInt();
|
|
||||||
final offsetTop = (offset.dy * dpr).toInt();
|
|
||||||
|
|
||||||
_window = await t.ThermionFlutterPlatform.instance.createWindow(width, height, offsetLeft, offsetTop);
|
|
||||||
|
|
||||||
await widget.view.updateViewport(_window!.width, _window!.height);
|
|
||||||
|
|
||||||
try {
|
|
||||||
await widget.onResize?.call(
|
|
||||||
Size(_window!.width.toDouble(), _window!.height.toDouble()),
|
|
||||||
widget.view,
|
|
||||||
dpr);
|
|
||||||
} catch (err, st) {
|
|
||||||
print(err);
|
|
||||||
print(st);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mounted) {
|
|
||||||
setState(() {});
|
|
||||||
}
|
|
||||||
|
|
||||||
_requestFrame();
|
|
||||||
|
|
||||||
widget.viewer.onDispose(() async {
|
|
||||||
var window = _window;
|
|
||||||
if (mounted) {
|
|
||||||
setState(() {});
|
|
||||||
}
|
|
||||||
await window?.destroy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _rendering = false;
|
|
||||||
|
|
||||||
void _requestFrame() {
|
|
||||||
WidgetsBinding.instance.scheduleFrameCallback((d) async {
|
|
||||||
if (widget.viewer.rendering && !_rendering) {
|
|
||||||
_rendering = true;
|
|
||||||
await widget.viewer.requestFrame();
|
|
||||||
_rendering = false;
|
|
||||||
}
|
|
||||||
_requestFrame();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
final _resizing = <Future>[];
|
|
||||||
|
|
||||||
Timer? _resizeTimer;
|
|
||||||
|
|
||||||
Future _resize(Size oldSize, Size newSize) async {
|
|
||||||
await Future.wait(_resizing);
|
|
||||||
|
|
||||||
_resizeTimer?.cancel();
|
|
||||||
|
|
||||||
_resizeTimer = Timer(const Duration(milliseconds: 100), () async {
|
|
||||||
await Future.wait(_resizing);
|
|
||||||
if (!mounted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newSize.width == _window?.width &&
|
|
||||||
newSize.height == _window?.height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final completer = Completer();
|
|
||||||
|
|
||||||
_resizing.add(completer.future);
|
|
||||||
|
|
||||||
final dpr = MediaQuery.of(context).devicePixelRatio;
|
|
||||||
|
|
||||||
newSize *= dpr;
|
|
||||||
|
|
||||||
var newWidth = newSize.width.ceil();
|
|
||||||
var newHeight = newSize.height.ceil();
|
|
||||||
|
|
||||||
final renderBox = context.findRenderObject() as RenderBox;
|
|
||||||
final offset = renderBox.localToGlobal(Offset.zero);
|
|
||||||
final offsetLeft = (offset.dx * dpr).toInt();
|
|
||||||
final offsetTop = (offset.dy * dpr).toInt();
|
|
||||||
|
|
||||||
await _window?.resize(
|
|
||||||
newWidth,
|
|
||||||
newHeight,
|
|
||||||
offsetLeft,
|
|
||||||
offsetTop,
|
|
||||||
);
|
|
||||||
|
|
||||||
await widget.view.updateViewport(_window!.width, _window!.height);
|
|
||||||
|
|
||||||
await widget.onResize?.call(
|
|
||||||
Size(_window!.width.toDouble(), _window!.height.toDouble()),
|
|
||||||
widget.view,
|
|
||||||
dpr);
|
|
||||||
|
|
||||||
if (!mounted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setState(() {});
|
|
||||||
completer.complete();
|
|
||||||
_resizing.remove(completer.future);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
if (_window == null) {
|
|
||||||
return widget.initial ?? Container(color: Colors.red);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResizeObserver(
|
|
||||||
onResized: _resize,
|
|
||||||
child: CustomPaint(painter:TransparencyPainter()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user