| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/widgets.dart'; |
| |
| import 'colors.dart'; |
| |
| // The minimum padding from all edges of the selection toolbar to all edges of |
| // the screen. |
| const double _kToolbarScreenPadding = 8.0; |
| |
| // These values were measured from a screenshot of TextEdit on macOS 10.15.7 on |
| // a Macbook Pro. |
| const double _kToolbarWidth = 222.0; |
| const Radius _kToolbarBorderRadius = Radius.circular(4.0); |
| const EdgeInsets _kToolbarPadding = EdgeInsets.symmetric( |
| vertical: 3.0, |
| ); |
| |
| // These values were measured from a screenshot of TextEdit on macOS 10.16 on a |
| // Macbook Pro. |
| const CupertinoDynamicColor _kToolbarBorderColor = CupertinoDynamicColor.withBrightness( |
| color: Color(0xFFBBBBBB), |
| darkColor: Color(0xFF505152), |
| ); |
| const CupertinoDynamicColor _kToolbarBackgroundColor = CupertinoDynamicColor.withBrightness( |
| color: Color(0xffECE8E6), |
| darkColor: Color(0xff302928), |
| ); |
| |
| /// A macOS-style text selection toolbar. |
| /// |
| /// Typically displays buttons for text manipulation, e.g. copying and pasting |
| /// text. |
| /// |
| /// Tries to position itself as closely as possible to [anchor] while remaining |
| /// fully inside the viewport. |
| /// |
| /// See also: |
| /// |
| /// * [CupertinoAdaptiveTextSelectionToolbar], where this is used to build the |
| /// toolbar for desktop platforms. |
| /// * [AdaptiveTextSelectionToolbar], where this is used to build the toolbar on |
| /// macOS. |
| /// * [DesktopTextSelectionToolbar], which is similar but builds a |
| /// Material-style desktop toolbar. |
| class CupertinoDesktopTextSelectionToolbar extends StatelessWidget { |
| /// Creates a const instance of CupertinoTextSelectionToolbar. |
| const CupertinoDesktopTextSelectionToolbar({ |
| super.key, |
| required this.anchor, |
| required this.children, |
| }) : assert(children.length > 0); |
| |
| /// {@macro flutter.material.DesktopTextSelectionToolbar.anchor} |
| final Offset anchor; |
| |
| /// {@macro flutter.material.TextSelectionToolbar.children} |
| /// |
| /// See also: |
| /// * [CupertinoDesktopTextSelectionToolbarButton], which builds a default |
| /// macOS-style text selection toolbar text button. |
| final List<Widget> children; |
| |
| // Builds a toolbar just like the default Mac toolbar, with the right color |
| // background, padding, and rounded corners. |
| static Widget _defaultToolbarBuilder(BuildContext context, Widget child) { |
| return Container( |
| width: _kToolbarWidth, |
| decoration: BoxDecoration( |
| color: _kToolbarBackgroundColor.resolveFrom(context), |
| border: Border.all( |
| color: _kToolbarBorderColor.resolveFrom(context), |
| ), |
| borderRadius: const BorderRadius.all(_kToolbarBorderRadius), |
| ), |
| child: Padding( |
| padding: _kToolbarPadding, |
| child: child, |
| ), |
| ); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| assert(debugCheckHasMediaQuery(context)); |
| |
| final double paddingAbove = MediaQuery.paddingOf(context).top + _kToolbarScreenPadding; |
| final Offset localAdjustment = Offset(_kToolbarScreenPadding, paddingAbove); |
| |
| return Padding( |
| padding: EdgeInsets.fromLTRB( |
| _kToolbarScreenPadding, |
| paddingAbove, |
| _kToolbarScreenPadding, |
| _kToolbarScreenPadding, |
| ), |
| child: CustomSingleChildLayout( |
| delegate: DesktopTextSelectionToolbarLayoutDelegate( |
| anchor: anchor - localAdjustment, |
| ), |
| child: _defaultToolbarBuilder( |
| context, |
| Column( |
| mainAxisSize: MainAxisSize.min, |
| children: children, |
| ), |
| ), |
| ), |
| ); |
| } |
| } |