blob: 302c508688510a6eebf268c53a8b743cf1dd02d5 [file] [log] [blame]
// 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_