#ifndef ASH_PUBLIC_CPP_ACCELERATOR_CONFIGURATION_H_
#define ASH_PUBLIC_CPP_ACCELERATOR_CONFIGURATION_H_
#include <map>
#include <vector>
#include "ash/public/cpp/ash_public_export.h"
#include "ash/public/mojom/accelerator_configuration.mojom.h"
#include "ash/public/mojom/accelerator_info.mojom.h"
#include "base/functional/callback.h"
#include "base/types/optional_ref.h"
#include "ui/base/accelerators/accelerator.h"
namespace ash {
using AcceleratorActionId = uint32_t;
using ActionIdToAcceleratorsMap =
std::map<AcceleratorActionId, std::vector<ui::Accelerator>>;
class ASH_PUBLIC_EXPORT AcceleratorConfiguration {
public:
using AcceleratorsUpdatedCallback =
base::RepeatingCallback<void(ash::mojom::AcceleratorSource,
const ActionIdToAcceleratorsMap&)>;
explicit AcceleratorConfiguration(ash::mojom::AcceleratorSource source);
virtual ~AcceleratorConfiguration();
void AddAcceleratorsUpdatedCallback(AcceleratorsUpdatedCallback callback);
void RemoveAcceleratorsUpdatedCallback(AcceleratorsUpdatedCallback callback);
virtual base::optional_ref<const std::vector<ui::Accelerator>>
GetAcceleratorsForAction(AcceleratorActionId action_id) = 0;
virtual bool IsMutable() const = 0;
virtual bool IsDeprecated(const ui::Accelerator& accelerator) const = 0;
virtual bool IsAcceleratorLocked(
const ui::Accelerator& accelerator) const = 0;
virtual mojom::AcceleratorConfigResult AddUserAccelerator(
AcceleratorActionId action_id,
const ui::Accelerator& accelerator) = 0;
virtual mojom::AcceleratorConfigResult RemoveAccelerator(
AcceleratorActionId action_id,
const ui::Accelerator& accelerator) = 0;
virtual mojom::AcceleratorConfigResult ReplaceAccelerator(
AcceleratorActionId action_id,
const ui::Accelerator& old_acc,
const ui::Accelerator& new_acc) = 0;
virtual mojom::AcceleratorConfigResult RestoreDefault(
AcceleratorActionId action_id) = 0;
virtual mojom::AcceleratorConfigResult RestoreAllDefaults() = 0;
protected:
void UpdateAccelerators(const ActionIdToAcceleratorsMap& accelerators);
private:
void NotifyAcceleratorsUpdated();
const ash::mojom::AcceleratorSource source_;
std::vector<AcceleratorsUpdatedCallback> callbacks_;
ActionIdToAcceleratorsMap accelerator_mapping_cache_;
};
}
#endif