Add commands and key bindings

This commit is contained in:
2025-06-09 18:31:07 +03:00
parent c6c7bddb2a
commit 2b0f190f15
5 changed files with 428 additions and 133 deletions
+7 -98
View File
@@ -3,7 +3,6 @@ package main
import (
"fmt"
"github.com/gdamore/tcell/v2"
"maps"
"slices"
"strconv"
"strings"
@@ -11,7 +10,6 @@ import (
type TopMenuButton struct {
Name string
Key rune
Action func(w *Window)
}
@@ -21,89 +19,20 @@ func initTopMenu() {
// Buttons
fileButton := TopMenuButton{
Name: "File",
Key: 'f',
Action: func(window *Window) {
ClearDropdowns()
d := CreateDropdownMenu([]string{"New", "Save", "Open", "Close", "Quit"}, 0, 1, 0, func(i int) {
switch i {
case 0:
number := 1
for _, buffer := range Buffers {
if strings.HasPrefix(buffer.Name, "New File ") {
number++
}
}
buffer := CreateBuffer(fmt.Sprintf("New File %d", number))
window.CurrentBuffer = buffer
window.CursorMode = CursorModeBuffer
RunCommand(window, "new-buffer")
case 1:
if !window.CurrentBuffer.canSave {
PrintMessage(window, "Cannot save this buffer!")
return
}
inputChannel := RequestInput(window, "Save file [y\\N]:", "")
go func() {
input := <-inputChannel
if strings.ToLower(input) != "y" && strings.ToLower(input) != "yes" {
return
}
inputChannel = RequestInput(window, "Save buffer to:", window.CurrentBuffer.filename)
input = <-inputChannel
if strings.TrimSpace(input) == "" {
PrintMessage(window, "No save location was given!")
return
}
window.CurrentBuffer.filename = strings.TrimSpace(input)
err := window.CurrentBuffer.Save()
if err != nil {
PrintMessage(window, fmt.Sprintf("Could not save file: %s", err))
window.CurrentBuffer.filename = ""
return
}
PrintMessage(window, "File saved.")
}()
RunCommand(window, "save")
case 2:
inputChannel := RequestInput(window, "File to open:", "")
go func() {
input := <-inputChannel
if input == "" {
return
}
if openBuffer := GetOpenFileBuffer(input); openBuffer != nil {
PrintMessage(window, fmt.Sprintf("File already open! Switching to buffer: %s", openBuffer.Name))
window.CurrentBuffer = openBuffer
} else {
newBuffer, err := CreateFileBuffer(input, false)
if err != nil {
PrintMessage(window, fmt.Sprintf("Could not open file: %s", err.Error()))
return
}
PrintMessage(window, fmt.Sprintf("Opening file at: %s", newBuffer.filename))
window.CurrentBuffer = newBuffer
}
}()
RunCommand(window, "open")
case 3:
delete(Buffers, window.CurrentBuffer.Id)
buffersSlice := slices.Collect(maps.Values(Buffers))
if len(buffersSlice) == 0 {
window.Close()
return
}
window.CurrentBuffer = buffersSlice[0]
window.CursorMode = CursorModeBuffer
RunCommand(window, "close-buffer")
case 4:
window.Close()
window.CursorMode = CursorModeBuffer
RunCommand(window, "quit")
}
ClearDropdowns()
})
@@ -113,33 +42,14 @@ func initTopMenu() {
}
EditButton := TopMenuButton{
Name: "Edit",
Key: 'e',
Action: func(window *Window) {
ClearDropdowns()
d := CreateDropdownMenu([]string{"Copy", "Paste"}, 0, 1, 0, func(i int) {
switch i {
case 0:
if window.CurrentBuffer.Selection == nil {
// Copy line
_, line := window.GetCursorPos2D()
window.Clipboard = strings.SplitAfter(window.CurrentBuffer.Contents, "\n")[line]
PrintMessage(window, "Copied line to clipboard.")
} else {
// Copy selection
window.Clipboard = window.CurrentBuffer.GetSelectedText()
PrintMessage(window, "Copied selection to clipboard.")
}
RunCommand(window, "copy")
case 1:
str := window.CurrentBuffer.Contents
index := window.CurrentBuffer.CursorPos
if index == len(str) {
str += window.Clipboard
} else {
str = str[:index] + window.Clipboard + str[index:]
}
window.CurrentBuffer.CursorPos += len(window.Clipboard)
window.CurrentBuffer.Contents = str
RunCommand(window, "paste")
}
ClearDropdowns()
window.CursorMode = CursorModeBuffer
@@ -150,7 +60,6 @@ func initTopMenu() {
}
Buffers := TopMenuButton{
Name: "Buffers",
Key: 'b',
Action: func(window *Window) {
ClearDropdowns()
buffersSlice := make([]string, 0)