mirror of
https://github.com/felixangell/phi.git
synced 2024-08-16 19:20:21 +03:00
command palette now works for simple actions
This commit is contained in:
parent
8c27c35353
commit
8376e1d4eb
@ -131,6 +131,13 @@ func (b *Buffer) OnDispose() {
|
||||
|
||||
func (b *Buffer) OnInit() {}
|
||||
|
||||
func (b *Buffer) setLine(idx int, val string) {
|
||||
b.contents[idx] = rope.New(val)
|
||||
if b.curs.y == idx {
|
||||
b.moveToEndOfLine()
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Buffer) appendLine(val string) {
|
||||
b.contents = append(b.contents, rope.New(val))
|
||||
// because we've added a new line
|
||||
|
@ -20,18 +20,32 @@ func init() {
|
||||
|
||||
type CommandPalette struct {
|
||||
BaseComponent
|
||||
buff *Buffer
|
||||
parentBuff *Buffer
|
||||
buff *Buffer
|
||||
parentBuff *Buffer
|
||||
|
||||
suggestionIndex int
|
||||
recentSuggestions *[]suggestion
|
||||
}
|
||||
|
||||
const suggestionBoxHeight = 128
|
||||
var suggestionBoxHeight, suggestionBoxWidth = 48, 0
|
||||
|
||||
type suggestion struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (s *suggestion) renderHighlighted(x, y int, ctx *strife.Renderer) {
|
||||
ctx.SetColor(strife.Blue)
|
||||
ctx.Rect(x, y, suggestionBoxWidth, suggestionBoxHeight, strife.Fill)
|
||||
|
||||
ctx.SetColor(strife.White)
|
||||
ctx.String(s.name, x, y)
|
||||
}
|
||||
|
||||
func (s *suggestion) render(x, y int, ctx *strife.Renderer) {
|
||||
ctx.SetColor(strife.Red)
|
||||
ctx.Rect(x, y, suggestionBoxWidth, suggestionBoxHeight, strife.Fill)
|
||||
|
||||
ctx.SetColor(strife.White)
|
||||
ctx.String(s.name, x, y)
|
||||
}
|
||||
|
||||
@ -50,6 +64,8 @@ func NewCommandPalette(conf cfg.TomlConfig, view *View) *CommandPalette {
|
||||
palette.buff.Resize(palette.w, palette.h)
|
||||
palette.buff.Translate((view.w/2)-(palette.w/2), 10)
|
||||
|
||||
suggestionBoxWidth = palette.w
|
||||
|
||||
return palette
|
||||
}
|
||||
|
||||
@ -62,6 +78,8 @@ func (b *CommandPalette) processCommand() {
|
||||
tokenizedLine := strings.Split(b.buff.contents[0].String(), " ")
|
||||
command := tokenizedLine[0]
|
||||
|
||||
log.Println(tokenizedLine)
|
||||
|
||||
action, exists := actions[command]
|
||||
if !exists {
|
||||
return
|
||||
@ -74,30 +92,89 @@ func (b *CommandPalette) calculateSuggestions() {
|
||||
tokenizedLine := strings.Split(b.buff.contents[0].String(), " ")
|
||||
command := tokenizedLine[0]
|
||||
|
||||
if command == "" {
|
||||
b.recentSuggestions = nil
|
||||
return
|
||||
}
|
||||
|
||||
ranks := fuzzy.RankFind(command, commandSet)
|
||||
suggestions := make([]suggestion, len(ranks))
|
||||
suggestions := []suggestion{}
|
||||
|
||||
for _, r := range ranks {
|
||||
cmdName := commandSet[r.Index]
|
||||
if cmdName == "" {
|
||||
continue
|
||||
}
|
||||
suggestions = append(suggestions, suggestion{cmdName})
|
||||
}
|
||||
|
||||
b.recentSuggestions = &suggestions
|
||||
}
|
||||
|
||||
func (b *CommandPalette) scrollSuggestion(dir int) {
|
||||
if b.recentSuggestions != nil {
|
||||
b.suggestionIndex += dir
|
||||
|
||||
if b.suggestionIndex < 0 {
|
||||
b.suggestionIndex = len(*b.recentSuggestions) - 1
|
||||
} else if b.suggestionIndex >= len(*b.recentSuggestions) {
|
||||
b.suggestionIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *CommandPalette) clearInput() {
|
||||
actions["delete_line"].proc(b.buff)
|
||||
}
|
||||
|
||||
func (b *CommandPalette) setToSuggested() {
|
||||
if b.recentSuggestions == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// set the buffer
|
||||
suggestions := *b.recentSuggestions
|
||||
sugg := suggestions[b.suggestionIndex]
|
||||
b.buff.setLine(0, sugg.name)
|
||||
|
||||
// remove all suggestions
|
||||
b.recentSuggestions = nil
|
||||
b.suggestionIndex = -1
|
||||
}
|
||||
|
||||
func (b *CommandPalette) OnUpdate() bool {
|
||||
if !b.HasFocus() {
|
||||
return false
|
||||
}
|
||||
|
||||
override := func(k int) bool {
|
||||
if k != sdl.K_RETURN && k != sdl.K_ESCAPE {
|
||||
override := func(key int) bool {
|
||||
switch key {
|
||||
|
||||
case sdl.K_UP:
|
||||
b.scrollSuggestion(-1)
|
||||
return false
|
||||
case sdl.K_DOWN:
|
||||
b.scrollSuggestion(1)
|
||||
return false
|
||||
|
||||
// any other key we calculate
|
||||
// the suggested commands
|
||||
default:
|
||||
b.suggestionIndex = -1
|
||||
b.calculateSuggestions()
|
||||
return false
|
||||
|
||||
case sdl.K_RETURN:
|
||||
// we have a suggestion so let's
|
||||
// fill the buffer with that instead!
|
||||
if b.suggestionIndex != -1 {
|
||||
b.setToSuggested()
|
||||
return true
|
||||
}
|
||||
|
||||
fallthrough
|
||||
case sdl.K_ESCAPE:
|
||||
break
|
||||
}
|
||||
|
||||
b.processCommand()
|
||||
@ -121,7 +198,11 @@ func (b *CommandPalette) OnRender(ctx *strife.Renderer) {
|
||||
|
||||
if b.recentSuggestions != nil {
|
||||
for i, sugg := range *b.recentSuggestions {
|
||||
sugg.render(b.x, b.y+(i*suggestionBoxHeight), ctx)
|
||||
if b.suggestionIndex != i {
|
||||
sugg.render(b.x, b.y+((i+1)*suggestionBoxHeight), ctx)
|
||||
} else {
|
||||
sugg.renderHighlighted(b.x, b.y+((i+1)*suggestionBoxHeight), ctx)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user