chromium/ios/chrome/browser/bubble/ui_bundled/bubble_util.h

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_UTIL_H_
#define IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_UTIL_H_

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, BubbleAlignment);
typedef NS_ENUM(NSInteger, BubbleArrowDirection);

// TODO(crbug.com/40277360): Rename parameters.
namespace bubble_util {

// The default fixed distance from the leading edge of the bubble to the anchor
// point if leading aligned, and from the trailing edge of the bubble to the
// anchor point if trailing aligned.
CGFloat BubbleDefaultAlignmentOffset();

// Calculate the coordinates of the point of the bubble's arrow based on the
// `target_frame` of the target UI element and the bubble's `arrow_direction`.
// The returned point is in the same coordinate system as `target_frame`.
CGPoint AnchorPoint(CGRect target_frame, BubbleArrowDirection arrow_direction);

// Calculate the maximum size of the bubble such that it stays within its
// superview's bounding coordinate space and does not overlap the other side of
// the anchor point. `anchor_point` is the point on the targetĀ UI element the
// bubble is anchored at in the bubble's superview's coordinate system.
// `bubble_alignment_offset` is the distance from the leading edge of the bubble
// to the anchor point if leading aligned, and from the trailing edge of the
// bubble to the anchor point if trailing aligned. `direction` is the bubble's
// direction. `alignment` is the bubble's alignment. `bounding_size` is the size
// of the superview. Uses the ICU default locale of the device to determine
// whether the language is RTL.
CGSize BubbleMaxSize(CGPoint anchor_point,
                     CGFloat bubble_alignment_offset,
                     BubbleArrowDirection direction,
                     BubbleAlignment alignment,
                     CGSize bounding_size);

// Calculate the bubble's frame. `anchor_point` is the point on the UI element
// the bubble is pointing to. `bubble_alignment_offset` is the distance from the
// leading edge of the bubble to the anchor point if leading aligned, and from
// the trailing edge of the bubble to the anchor point if trailing aligned.
// `size` is the size of the bubble. `direction` is the direction the bubble's
// arrow is pointing. `alignment` is the alignment of the anchor (either
// leading, centered, or trailing). `bounding_width` is the width of the
// bubble's superview.
CGRect BubbleFrame(CGPoint anchor_point,
                   CGFloat bubble_alignment_offset,
                   CGSize size,
                   BubbleArrowDirection direction,
                   BubbleAlignment alignment,
                   CGFloat bounding_width);

// Returns alignment offset for a bubble with a floating arrow. `bounding_width`
// is the width of the bubble's superview. `anchor_point` is the point on the UI
// element the bubble is pointing to. `alignment` is the alignment of the anchor
// (either leading, centered, or trailing).
CGFloat FloatingArrowAlignmentOffset(CGFloat bounding_width,
                                     CGPoint anchor_point,
                                     BubbleAlignment alignment);
}  // namespace bubble_util

#endif  // IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_UTIL_H_