150 lines
4.9 KiB
Dart
150 lines
4.9 KiB
Dart
|
import 'package:flutter/foundation.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:flutter/services.dart';
|
||
|
import 'package:flutter/widgets.dart';
|
||
|
|
||
|
class AppPlatformMenu extends StatefulWidget {
|
||
|
const AppPlatformMenu({super.key, required this.child});
|
||
|
|
||
|
final Widget child;
|
||
|
|
||
|
@override
|
||
|
State<AppPlatformMenu> createState() => _AppPlatformMenuState();
|
||
|
}
|
||
|
|
||
|
class _AppPlatformMenuState extends State<AppPlatformMenu> {
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
if (defaultTargetPlatform != TargetPlatform.macOS) {
|
||
|
return widget.child;
|
||
|
}
|
||
|
|
||
|
return PlatformMenuBar(
|
||
|
menus: <MenuItem>[
|
||
|
PlatformMenu(
|
||
|
label: 'TerminalStudio',
|
||
|
menus: [
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.about,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.about,
|
||
|
),
|
||
|
PlatformMenuItemGroup(
|
||
|
members: [
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.servicesSubmenu,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.servicesSubmenu,
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
PlatformMenuItemGroup(
|
||
|
members: [
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.hide,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.hide,
|
||
|
),
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.hideOtherApplications,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.hideOtherApplications,
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.quit,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.quit,
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
PlatformMenu(
|
||
|
label: 'Edit',
|
||
|
menus: [
|
||
|
PlatformMenuItemGroup(
|
||
|
members: [
|
||
|
PlatformMenuItem(
|
||
|
label: 'Copy',
|
||
|
shortcut: const SingleActivator(
|
||
|
LogicalKeyboardKey.keyC,
|
||
|
meta: true,
|
||
|
),
|
||
|
onSelected: () {
|
||
|
final primaryContext = primaryFocus?.context;
|
||
|
if (primaryContext == null) {
|
||
|
return;
|
||
|
}
|
||
|
Actions.invoke(
|
||
|
primaryContext,
|
||
|
CopySelectionTextIntent.copy,
|
||
|
);
|
||
|
},
|
||
|
),
|
||
|
PlatformMenuItem(
|
||
|
label: 'Paste',
|
||
|
shortcut: const SingleActivator(
|
||
|
LogicalKeyboardKey.keyV,
|
||
|
meta: true,
|
||
|
),
|
||
|
onSelected: () {
|
||
|
final primaryContext = primaryFocus?.context;
|
||
|
if (primaryContext == null) {
|
||
|
return;
|
||
|
}
|
||
|
Actions.invoke(
|
||
|
primaryContext,
|
||
|
const PasteTextIntent(SelectionChangedCause.keyboard),
|
||
|
);
|
||
|
},
|
||
|
),
|
||
|
PlatformMenuItem(
|
||
|
label: 'Select All',
|
||
|
shortcut: const SingleActivator(
|
||
|
LogicalKeyboardKey.keyA,
|
||
|
meta: true,
|
||
|
),
|
||
|
onSelected: () {
|
||
|
final primaryContext = primaryFocus?.context;
|
||
|
if (primaryContext == null) {
|
||
|
return;
|
||
|
}
|
||
|
print(primaryContext);
|
||
|
try {
|
||
|
final action = Actions.maybeFind<Intent>(
|
||
|
primaryContext,
|
||
|
intent: const SelectAllTextIntent(
|
||
|
SelectionChangedCause.keyboard,
|
||
|
),
|
||
|
);
|
||
|
print('action: $action');
|
||
|
} catch (e) {
|
||
|
print(e);
|
||
|
}
|
||
|
Actions.invoke<Intent>(
|
||
|
primaryContext,
|
||
|
const SelectAllTextIntent(SelectionChangedCause.keyboard),
|
||
|
);
|
||
|
},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
if (PlatformProvidedMenuItem.hasMenu(
|
||
|
PlatformProvidedMenuItemType.quit,
|
||
|
))
|
||
|
const PlatformProvidedMenuItem(
|
||
|
type: PlatformProvidedMenuItemType.quit,
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
child: widget.child,
|
||
|
);
|
||
|
}
|
||
|
}
|