#ifndef ASH_ACCESSIBILITY_UI_ACCESSIBILITY_FOCUSABLE_WIDGET_DELEGATE_H_
#define ASH_ACCESSIBILITY_UI_ACCESSIBILITY_FOCUSABLE_WIDGET_DELEGATE_H_
#include <type_traits>
#include "ash/focus/focus_cycler.h"
#include "ash/shell.h"
#include "ui/views/widget/widget_delegate.h"
namespace ash {
template <typename T>
class AccessibilityFocusable : public T {
public:
explicit AccessibilityFocusable(bool register_with_focus_cycler = false)
: register_with_focus_cycler_(register_with_focus_cycler) {
static_assert(std::is_base_of<views::WidgetDelegate, T>::value,
"The typename must be derived from WidgetDelegate");
}
bool CanActivate() const override {
return Shell::Get()->focus_cycler()->widget_activating() == T::GetWidget();
}
void OnWidgetInitialized() override {
if (register_with_focus_cycler_) {
Shell::Get()->focus_cycler()->AddWidget(T::GetWidget());
}
}
void WindowClosing() override {
if (register_with_focus_cycler_) {
Shell::Get()->focus_cycler()->RemoveWidget(T::GetWidget());
}
}
private:
const bool register_with_focus_cycler_;
};
class AccessibilityFocusableWidgetDelegate
: public AccessibilityFocusable<views::WidgetDelegate> {
public:
explicit AccessibilityFocusableWidgetDelegate(
bool register_with_focus_cycler = false);
AccessibilityFocusableWidgetDelegate(
const AccessibilityFocusableWidgetDelegate&) = delete;
AccessibilityFocusableWidgetDelegate& operator=(
const AccessibilityFocusableWidgetDelegate&) = delete;
~AccessibilityFocusableWidgetDelegate() override = default;
};
}
#endif