borders.go RawHistoryFolder
1package focus
2
3import (
4 "context"
5
6 "github.com/bnema/dumber/internal/logging"
7 "github.com/bnema/dumber/internal/ui/input"
8 "github.com/bnema/dumber/internal/ui/layout"
9)
10
11// CSS classes for mode borders.
12const (
13 paneModeClass = "pane-mode-active"
14 tabModeClass = "tab-mode-active"
15)
16
17// BorderManager manages mode indicator borders on the workspace container.
18// It creates a transparent overlay box that displays colored borders when
19// the user enters tab mode or pane mode.
20type BorderManager struct {
21 borderOverlay layout.BoxWidget
22 currentMode input.Mode
23}
24
25// NewBorderManager creates a border manager.
26// It creates a border overlay widget that should be added to the workspace container.
27func NewBorderManager(factory layout.WidgetFactory) *BorderManager {
28 // Create overlay box for mode borders
29 borderBox := factory.NewBox(layout.OrientationVertical, 0)
30 borderBox.SetCanFocus(false)
31 borderBox.SetCanTarget(false) // Don't intercept pointer events
32 borderBox.SetHexpand(true)
33 borderBox.SetVexpand(true)
34 borderBox.SetVisible(false) // Hidden in normal mode
35
36 return &BorderManager{
37 borderOverlay: borderBox,
38 currentMode: input.ModeNormal,
39 }
40}
41
42// Widget returns the border overlay widget for adding to workspace overlay.
43func (bm *BorderManager) Widget() layout.Widget {
44 return bm.borderOverlay
45}
46
47// OnModeChange updates border visibility based on mode.
48func (bm *BorderManager) OnModeChange(ctx context.Context, from, to input.Mode) {
49 log := logging.FromContext(ctx)
50 log.Debug().
51 Str("from", from.String()).
52 Str("to", to.String()).
53 Msg("border manager: mode changed")
54
55 // Remove old mode class
56 switch from {
57 case input.ModePane:
58 bm.borderOverlay.RemoveCssClass(paneModeClass)
59 case input.ModeTab:
60 bm.borderOverlay.RemoveCssClass(tabModeClass)
61 }
62
63 // Add new mode class and set visibility
64 switch to {
65 case input.ModePane:
66 bm.borderOverlay.AddCssClass(paneModeClass)
67 bm.borderOverlay.SetVisible(true)
68 case input.ModeTab:
69 bm.borderOverlay.AddCssClass(tabModeClass)
70 bm.borderOverlay.SetVisible(true)
71 case input.ModeNormal:
72 bm.borderOverlay.SetVisible(false)
73 }
74
75 bm.currentMode = to
76}
77
78// CurrentMode returns the current input mode.
79func (bm *BorderManager) CurrentMode() input.Mode {
80 return bm.currentMode
81}