Cybersecurity-Projects/PROJECTS/beginner/steganography-multi-tool/internal/tui/steps.go

97 lines
2.7 KiB
Go

/*
©AngelaMos | 2026
steps.go
Per-operation wizard step labels, current-step mapping, and contextual footer hints
*/
package tui
func (m Model) stepLabels() []string {
switch m.op {
case opReveal:
return []string{"operation", "carrier", "stego", "reveal"}
case opCapacity:
return []string{"operation", "cover", "report"}
default:
labels := []string{"operation", "carrier"}
if hasTechniques(m.format) {
labels = append(labels, "technique")
}
return append(labels, "cover", "payload", "secure", "save", "embed")
}
}
func (m Model) stepStages() []stage {
switch m.op {
case opReveal:
return []stage{stageOperation, stageFormat, stageCover, stageRunning}
case opCapacity:
return []stage{stageOperation, stageCover, stageReview}
default:
stages := []stage{stageOperation, stageFormat}
if hasTechniques(m.format) {
stages = append(stages, stageTechnique)
}
return append(stages, stageCover, stagePayload, stageSecure, stageSave, stageReview)
}
}
func (m Model) stepIndex() int {
target := m.stage
switch m.stage {
case stagePassphrase:
target = stageRunning
case stageRunning, stageResult:
if m.op == opReveal {
target = stageRunning
} else {
target = stageReview
}
}
for i, s := range m.stepStages() {
if s == target {
return i
}
}
return 0
}
func (m Model) footerHints() []keyHint {
switch m.stage {
case stageOperation:
return []keyHint{{"up/down", "move"}, {"enter", "select"}, {"q", "quit"}}
case stageFormat, stageTechnique:
return []keyHint{{"up/down", "move"}, {"enter", "select"}, {"esc", "back"}, {"q", "quit"}}
case stageCover:
return []keyHint{{"up/down", "browse"}, {"enter", "open or select"}, {"esc", "back"}}
case stagePayload:
if m.payloadMode == payloadFile {
return []keyHint{{"up/down", "browse"}, {"enter", "choose"}, {"tab", "message"}, {"esc", "back"}}
}
return []keyHint{{"type", "message"}, {"enter", "continue"}, {"tab", "file"}, {"esc", "back"}}
case stageSecure:
return []keyHint{{"up/down", "field"}, {"space", "change"}, {"enter", "continue"}, {"esc", "back"}}
case stageSave:
return []keyHint{{"type", "path"}, {"enter", "continue"}, {"esc", "back"}}
case stageReview:
if m.op == opCapacity {
return []keyHint{{"esc", "back"}, {"n", "new run"}, {"q", "quit"}}
}
return []keyHint{{"enter", "embed"}, {"esc", "back"}, {"q", "quit"}}
case stagePassphrase:
return []keyHint{{"enter", "unlock"}, {"esc", "cancel"}}
case stageResult:
if m.saving {
return []keyHint{{"enter", "write"}, {"esc", "cancel"}}
}
if m.canSaveReveal() {
return []keyHint{{"s", "save"}, {"n", "new run"}, {"q", "quit"}}
}
return []keyHint{{"n", "new run"}, {"q", "quit"}}
case stageRunning:
return []keyHint{{"working", "..."}}
}
return nil
}