| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_MENU_BUBBLE_CONTROLLER_H_ |
| #define ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_MENU_BUBBLE_CONTROLLER_H_ |
| |
| #include "ash/ash_export.h" |
| #include "ash/public/cpp/ash_constants.h" |
| #include "ash/system/accessibility/autoclick_menu_view.h" |
| #include "ash/system/locale/locale_update_controller_impl.h" |
| #include "ash/system/tray/tray_bubble_view.h" |
| |
| namespace ash { |
| |
| class AutoclickScrollBubbleController; |
| |
| // Manages the bubble which contains an AutoclickMenuView. |
| class ASH_EXPORT AutoclickMenuBubbleController |
| : public TrayBubbleView::Delegate, |
| public LocaleChangeObserver { |
| public: |
| // The duration of the position change animation for the menu and scroll |
| // bubbles in milliseconds. |
| static const int kAnimationDurationMs = 150; |
| |
| AutoclickMenuBubbleController(); |
| ~AutoclickMenuBubbleController() override; |
| |
| // Sets the currently selected event type. |
| void SetEventType(AutoclickEventType type); |
| |
| // Sets the menu's position on the screen. |
| void SetPosition(AutoclickMenuPosition position); |
| |
| // Set the scroll menu's position on the screen. The rect is the bounds of |
| // the scrollable area, and the point is the user-selected scroll point. |
| void SetScrollPosition(gfx::Rect scroll_bounds_in_dips, |
| const gfx::Point& scroll_point_in_dips); |
| |
| void ShowBubble(AutoclickEventType event_type, |
| AutoclickMenuPosition position); |
| |
| void CloseBubble(); |
| |
| // Shows or hides the bubble. |
| void SetBubbleVisibility(bool is_visible); |
| |
| // Performs a mouse event on the bubble at the given location in DIPs. |
| void ClickOnBubble(gfx::Point location_in_dips, int mouse_event_flags); |
| |
| // Performs a mouse event on the scroll bubble at the given location in DIPs. |
| void ClickOnScrollBubble(gfx::Point location_in_dips, int mouse_event_flags); |
| |
| // Whether the the bubble, if the bubble exists, contains the given screen |
| // point. |
| bool ContainsPointInScreen(const gfx::Point& point); |
| |
| // Whether the scroll bubble exists and contains the given screen point. |
| bool ScrollBubbleContainsPointInScreen(const gfx::Point& point); |
| |
| // TrayBubbleView::Delegate: |
| void BubbleViewDestroyed() override; |
| |
| // LocaleChangeObserver: |
| void OnLocaleChanged() override; |
| |
| private: |
| friend class AutoclickMenuBubbleControllerTest; |
| friend class AutoclickTest; |
| |
| // Owned by views hierarchy. |
| AutoclickMenuBubbleView* bubble_view_ = nullptr; |
| AutoclickMenuView* menu_view_ = nullptr; |
| AutoclickMenuPosition position_ = kDefaultAutoclickMenuPosition; |
| |
| views::Widget* bubble_widget_ = nullptr; |
| |
| // The controller for the scroll bubble. Only exists during a scroll. Owned |
| // by this class so that positioning calculations can take place using both |
| // classes at once. |
| std::unique_ptr<AutoclickScrollBubbleController> scroll_bubble_controller_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AutoclickMenuBubbleController); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_MENU_BUBBLE_CONTROLLER_H_ |