90 lines
2.0 KiB
Dart
90 lines
2.0 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:flutter/rendering.dart';
|
||
|
|
|
||
|
|
import '../theme/app_theme.dart';
|
||
|
|
import 'top_drag_area.dart';
|
||
|
|
import 'window_chrome.dart';
|
||
|
|
import 'window_controls.dart';
|
||
|
|
|
||
|
|
|
||
|
|
class WindowChromeOverlay extends StatelessWidget {
|
||
|
|
|
||
|
|
|
||
|
|
final bool onDarkSurface;
|
||
|
|
|
||
|
|
const WindowChromeOverlay({super.key, this.onDarkSurface = false});
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
if (!WindowChrome.isDesktop) {
|
||
|
|
return const SizedBox.shrink();
|
||
|
|
}
|
||
|
|
final AppTokens tokens = context.appTokens;
|
||
|
|
return Positioned(
|
||
|
|
top: 0,
|
||
|
|
left: 0,
|
||
|
|
right: 0,
|
||
|
|
height: tokens.titleBarHeight,
|
||
|
|
child: _HitTestPassThrough(
|
||
|
|
child: Stack(
|
||
|
|
children: [
|
||
|
|
const Positioned.fill(
|
||
|
|
child: TopDragArea(child: SizedBox.expand()),
|
||
|
|
),
|
||
|
|
Positioned(
|
||
|
|
top: tokens.chromeInset,
|
||
|
|
right: tokens.chromeInset,
|
||
|
|
child: onDarkSurface
|
||
|
|
? const WindowControls.forDarkSurface()
|
||
|
|
: const WindowControls.forShellOverlay(),
|
||
|
|
),
|
||
|
|
],
|
||
|
|
),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
class WindowChromeHost extends StatelessWidget {
|
||
|
|
final Widget child;
|
||
|
|
final bool onDarkSurface;
|
||
|
|
|
||
|
|
const WindowChromeHost({
|
||
|
|
super.key,
|
||
|
|
required this.child,
|
||
|
|
this.onDarkSurface = false,
|
||
|
|
});
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
if (!WindowChrome.isDesktop) {
|
||
|
|
return child;
|
||
|
|
}
|
||
|
|
return Stack(
|
||
|
|
fit: StackFit.expand,
|
||
|
|
children: [
|
||
|
|
child,
|
||
|
|
WindowChromeOverlay(onDarkSurface: onDarkSurface),
|
||
|
|
],
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
class _HitTestPassThrough extends SingleChildRenderObjectWidget {
|
||
|
|
const _HitTestPassThrough({required super.child});
|
||
|
|
|
||
|
|
@override
|
||
|
|
RenderObject createRenderObject(BuildContext context) =>
|
||
|
|
_RenderHitTestPassThrough();
|
||
|
|
}
|
||
|
|
|
||
|
|
class _RenderHitTestPassThrough extends RenderProxyBox {
|
||
|
|
@override
|
||
|
|
bool hitTest(BoxHitTestResult result, {required Offset position}) {
|
||
|
|
hitTestChildren(result, position: position);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|