💄 Optimize title bar for windows and linux

This commit is contained in:
2025-09-27 18:45:58 +08:00
parent 4981a23e8e
commit eb5a849e1f

View File

@@ -31,6 +31,8 @@ class WindowScaffold extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final isMaximized = useState(false);
// Add window resize listener for desktop platforms // Add window resize listener for desktop platforms
useEffect(() { useEffect(() {
if (!kIsWeb && if (!kIsWeb &&
@@ -49,11 +51,16 @@ class WindowScaffold extends HookConsumerWidget {
_WindowSizeObserver(saveWindowSize), _WindowSizeObserver(saveWindowSize),
); );
final maximizeListener = _WindowMaximizeListener(isMaximized);
windowManager.addListener(maximizeListener);
windowManager.isMaximized().then((max) => isMaximized.value = max);
return () { return () {
// Cleanup observer when widget is disposed // Cleanup observer when widget is disposed
WidgetsBinding.instance.removeObserver( WidgetsBinding.instance.removeObserver(
_WindowSizeObserver(saveWindowSize), _WindowSizeObserver(saveWindowSize),
); );
windowManager.removeListener(maximizeListener);
}; };
} }
return null; return null;
@@ -87,15 +94,30 @@ class WindowScaffold extends HookConsumerWidget {
: MainAxisAlignment.start, : MainAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
child: Text( child: Platform.isMacOS
? Text(
'Solar Network', 'Solar Network',
textAlign: textAlign: TextAlign.center,
Platform.isMacOS ).padding(horizontal: 12, vertical: 5)
? TextAlign.center : Row(
: TextAlign.start, children: [
Image.asset(
Theme.of(context).brightness == Brightness.dark
? 'assets/icons/icon-dark.png'
: 'assets/icons/icon.png',
width: 20,
height: 20,
),
const SizedBox(width: 8),
Text(
'Solar Network',
textAlign: TextAlign.start,
),
],
).padding(horizontal: 12, vertical: 5), ).padding(horizontal: 12, vertical: 5),
), ),
if (!Platform.isMacOS) if (!Platform.isMacOS)
...([
IconButton( IconButton(
icon: Icon(Symbols.minimize), icon: Icon(Symbols.minimize),
onPressed: () => windowManager.minimize(), onPressed: () => windowManager.minimize(),
@@ -104,9 +126,8 @@ class WindowScaffold extends HookConsumerWidget {
constraints: BoxConstraints(), constraints: BoxConstraints(),
color: Theme.of(context).iconTheme.color, color: Theme.of(context).iconTheme.color,
), ),
if (!Platform.isMacOS)
IconButton( IconButton(
icon: Icon(Symbols.maximize), icon: Icon(isMaximized.value ? Symbols.fullscreen_exit : Symbols.fullscreen),
onPressed: () async { onPressed: () async {
if (await windowManager.isMaximized()) { if (await windowManager.isMaximized()) {
windowManager.restore(); windowManager.restore();
@@ -119,15 +140,15 @@ class WindowScaffold extends HookConsumerWidget {
constraints: BoxConstraints(), constraints: BoxConstraints(),
color: Theme.of(context).iconTheme.color, color: Theme.of(context).iconTheme.color,
), ),
if (!Platform.isMacOS)
IconButton( IconButton(
icon: Icon(Symbols.close), icon: Icon(Symbols.close),
onPressed: () => windowManager.close(), onPressed: () => windowManager.hide(),
iconSize: 16, iconSize: 16,
padding: EdgeInsets.all(8), padding: EdgeInsets.all(8),
constraints: BoxConstraints(), constraints: BoxConstraints(),
color: Theme.of(context).iconTheme.color, color: Theme.of(context).iconTheme.color,
), ),
]),
], ],
), ),
), ),
@@ -178,6 +199,21 @@ class _WindowSizeObserver extends WidgetsBindingObserver {
int get hashCode => onSaveWindowSize.hashCode; int get hashCode => onSaveWindowSize.hashCode;
} }
class _WindowMaximizeListener with WindowListener {
final ValueNotifier<bool> isMaximized;
_WindowMaximizeListener(this.isMaximized);
@override
void onWindowMaximize() {
isMaximized.value = true;
}
@override
void onWindowUnmaximize() {
isMaximized.value = false;
}
}
final rootScaffoldKey = GlobalKey<ScaffoldState>(); final rootScaffoldKey = GlobalKey<ScaffoldState>();
class AppScaffold extends HookConsumerWidget { class AppScaffold extends HookConsumerWidget {