vim_mode_policy.go RawHistoryFolder
1package usecase
2
3// VimModePolicyTransition describes what the UI should do after a Vim mode
4// policy evaluation.
5type VimModePolicyTransition string
6
7const (
8 VimModePolicyTransitionStay VimModePolicyTransition = "stay"
9 VimModePolicyTransitionExit VimModePolicyTransition = "exit"
10)
11
12// VimModePolicyTrigger identifies the focus or activation event being
13// evaluated.
14type VimModePolicyTrigger string
15
16const (
17 VimModePolicyTriggerActivationAttempt VimModePolicyTrigger = "activation_attempt"
18 VimModePolicyTriggerOmniboxFocus VimModePolicyTrigger = "omnibox_focus"
19 VimModePolicyTriggerFindBarFocus VimModePolicyTrigger = "find_bar_focus"
20 VimModePolicyTriggerOverlayFocus VimModePolicyTrigger = "overlay_focus"
21 VimModePolicyTriggerPageEditableFocusChanged VimModePolicyTrigger = "page_editable_focus_changed"
22 VimModePolicyTriggerContextChanged VimModePolicyTrigger = "context_changed"
23)
24
25// VimModePolicyInput captures the current Vim mode state and the event being
26// evaluated.
27type VimModePolicyInput struct {
28 Trigger VimModePolicyTrigger
29 VimModeActive bool
30 PageEditableFocused bool
31 EventInActiveContext bool
32 PreserveOnContextChange bool
33}
34
35// VimModePolicyUseCase evaluates whether Vim mode should stay active, exit,
36// or be blocked from activating.
37type VimModePolicyUseCase struct{}
38
39// NewVimModePolicyUseCase creates a VimModePolicyUseCase.
40func NewVimModePolicyUseCase() *VimModePolicyUseCase {
41 return &VimModePolicyUseCase{}
42}
43
44// Evaluate decides the Vim mode transition for the provided event.
45func (*VimModePolicyUseCase) Evaluate(input VimModePolicyInput) VimModePolicyTransition {
46 switch input.Trigger {
47 case VimModePolicyTriggerActivationAttempt:
48 // Ctrl+Y is the explicit Vim Mode activation command. It must remain
49 // available while a page input is focused so users can leave typing mode
50 // without first moving focus elsewhere.
51 return VimModePolicyTransitionStay
52 case VimModePolicyTriggerOmniboxFocus,
53 VimModePolicyTriggerFindBarFocus,
54 VimModePolicyTriggerOverlayFocus:
55 if input.VimModeActive {
56 return VimModePolicyTransitionExit
57 }
58 return VimModePolicyTransitionStay
59 case VimModePolicyTriggerPageEditableFocusChanged:
60 if input.VimModeActive && input.PageEditableFocused && input.EventInActiveContext {
61 return VimModePolicyTransitionExit
62 }
63 return VimModePolicyTransitionStay
64 case VimModePolicyTriggerContextChanged:
65 if input.VimModeActive && !input.PreserveOnContextChange {
66 return VimModePolicyTransitionExit
67 }
68 return VimModePolicyTransitionStay
69 default:
70 return VimModePolicyTransitionStay
71 }
72}