Files
esdi/tui/internal/controllers/cdashdisplay_layout_moveTool.go
T
esilva a6ab64117c this is a doozy - device auto discovery and handling
The main goal was to decouple more things
We got devices being looked for in the background and the stream view
is like a device now too
2026-09-17 23:01:50 +01:00

128 lines
2.6 KiB
Go

package controllers
import (
"esdi/devices/cdashdisplay"
helper "esdi/helpers"
"github.com/gdamore/tcell/v2"
)
type ManipMode int
const (
moveMode ManipMode = iota
resizeMode
)
type modeHandler func(*tcell.EventKey) *tcell.EventKey
type windowManipState struct {
Mode ManipMode
}
func keyToVector(r rune) (helper.Vector, bool) {
var mult uint16 = 1
// Is uppercase? For fast movement
if r >= 'A' && r <= 'Z' {
mult = 10
r += 'a' - 'A'
}
switch r {
case 'h':
return helper.Vector{DX: -mult, DY: 0}, true
case 'j':
return helper.Vector{DX: 0, DY: mult}, true
case 'k':
return helper.Vector{DX: 0, DY: -mult}, true
case 'l':
return helper.Vector{DX: mult, DY: 0}, true
}
return helper.Vector{}, false
}
func (lc *LayoutController) handleMovementCapture(idx int16,
ev *tcell.EventKey,
) *tcell.EventKey {
vec, ok := keyToVector(ev.Rune())
if !ok {
return nil
}
// Acquire the cdashdisplay
displayIF, err := lc.DevService.GetDevice(cdashdisplay.NAME)
if err != nil {
lc.Messages <- "failed to get " + cdashdisplay.NAME
return nil
}
display, ok := displayIF.(*cdashdisplay.CDashDisplay)
if !ok {
lc.Messages <- "failed to acquire " + cdashdisplay.NAME
return nil
}
// ---
err = display.MoveWindow(idx, &vec)
if err != nil {
lc.Messages <- "failed to move window: " + err.Error() + "\n"
return nil
}
// Success - update the form
window := display.State.Layout.Windows[idx]
lc.LayoutToolView.UpdateFormView(idx, window)
return nil
}
func (lc *LayoutController) handleResizeCapture(idx int16,
ev *tcell.EventKey,
) *tcell.EventKey {
vec, ok := keyToVector(ev.Rune())
if !ok {
return nil
}
// Acquire the cdashdisplay
displayIF, err := lc.DevService.GetDevice(cdashdisplay.NAME)
if err != nil {
lc.Messages <- "failed to get " + cdashdisplay.NAME
return nil
}
display, ok := displayIF.(*cdashdisplay.CDashDisplay)
if !ok {
lc.Messages <- "failed to acquire " + cdashdisplay.NAME
return nil
}
// ---
err = display.ResizeWindow(idx, &vec)
if err != nil {
lc.Messages <- "failed to resize window: " + err.Error() + "\n"
return nil
}
// Success - update the form
window := display.State.Layout.Windows[idx]
lc.LayoutToolView.UpdateFormView(idx, window)
return nil
}
func (s *windowManipState) CurrentHandler(lc *LayoutController, idx int16) modeHandler {
switch s.Mode {
case moveMode:
return func(ev *tcell.EventKey) *tcell.EventKey {
return lc.handleMovementCapture(idx, ev)
}
case resizeMode:
return func(ev *tcell.EventKey) *tcell.EventKey {
return lc.handleResizeCapture(idx, ev)
}
}
return nil
}