Fixes order of opperations issue when drawing messages

This commit is contained in:
sloumdrone 2019-09-15 21:24:45 -07:00
parent cb3bcc9465
commit e7a1b4e348
3 changed files with 98 additions and 39 deletions

106
client.go
View File

@ -29,6 +29,7 @@ type client struct {
Width int
Options map[string]string
Message string
MessageIsErr bool
PageState Pages
BookMarks Bookmarks
TopBar Headbar
@ -116,7 +117,8 @@ func (c *client) Draw() {
}
}
screen.WriteString("\033[0m")
screen.WriteString(c.Message)
// TODO using message here breaks on resize, must regenerate
screen.WriteString(c.RenderMessage())
screen.WriteString("\n") // for the input line
screen.WriteString(c.FootBar.Render(c.Width, c.PageState.Position, c.Options["theme"]))
cui.Clear("screen")
@ -237,7 +239,7 @@ func (c *client) routeCommandInput(com *cmdparse.Command) error {
case cmdparse.DOAS:
c.doCommandAs(com.Action, com.Value)
case cmdparse.DOLINKAS:
// err = doLinkCommandAs(com.Action, com.Target, com.Value)
c.doLinkCommandAs(com.Action, com.Target, com.Value)
default:
return fmt.Errorf("Unknown command entry!")
}
@ -361,6 +363,52 @@ func (c *client) doCommandAs(action string, values []string) {
c.SetMessage(fmt.Sprintf("Unknown command structure"), true)
}
func (c *client) doLinkCommandAs(action, target string, values []string) {
num, err := strconv.Atoi(target)
if err != nil {
c.SetMessage(fmt.Sprintf("Expected link number, got %q", target), true)
c.DrawMessage()
return
}
switch action {
case "ADD", "A":
links := c.PageState.History[c.PageState.Position].Links
if num >= len(links) {
c.SetMessage(fmt.Sprintf("Invalid link id: %s", target), true)
c.DrawMessage()
return
}
bm := make([]string, 0, 5)
bm = append(bm, links[num-1])
bm = append(bm, values...)
msg, err := c.BookMarks.Add(bm)
if err != nil {
c.SetMessage(err.Error(), true)
c.DrawMessage()
return
} else {
c.SetMessage(msg, false)
c.DrawMessage()
}
err = saveConfig()
if err != nil {
c.SetMessage("Error saving bookmark to file", true)
c.DrawMessage()
}
if c.BookMarks.IsOpen {
c.Draw()
}
case "WRITE", "W":
// TODO get file writing working in some semblance of universal way
// return saveFile(links[num-1], strings.Join(values, " "))
default:
c.SetMessage(fmt.Sprintf("Unknown command structure"), true)
}
}
func (c *client) getCurrentPageUrl() (string, error) {
if c.PageState.Length < 1 {
return "", fmt.Errorf("There are no pages in history")
@ -429,6 +477,9 @@ func (c *client) doLinkCommand(action, target string) {
func (c *client) search() {
c.ClearMessage()
c.ClearMessageLine()
// TODO handle keeping the full command bar here
// like was done for regular command entry
// maybe split into separate function
fmt.Print("?")
entry, err := cui.GetLine()
c.ClearMessageLine()
@ -439,9 +490,9 @@ func (c *client) search() {
} else if strings.TrimSpace(entry) == "" {
return
}
u, err := MakeUrl(c.Options["searchurl"])
u, err := MakeUrl(c.Options["searchengine"])
if err != nil {
c.SetMessage("'searchurl' is not set to a valid url", true)
c.SetMessage("'searchengine' is not set to a valid url", true)
c.DrawMessage()
return
}
@ -507,28 +558,47 @@ func (c *client) displayConfigValue(setting string) {
}
func (c *client) SetMessage(msg string, isError bool) {
c.MessageIsErr = isError
c.Message = msg
}
func (c *client) DrawMessage() {
leadIn, leadOut := "", ""
if isError {
leadIn = "\033[91m"
leadOut = "\033[0m"
if c.Options["theme"] == "normal" {
leadIn = "\033[101;7m"
}
}
if c.Options["theme"] == "normal" {
leadIn = "\033[7m"
leadOut = "\033[0m"
}
c.Message = fmt.Sprintf("%s%-*.*s%s", leadIn, c.Width, c.Width, msg, leadOut)
if c.MessageIsErr {
leadIn = "\033[31;1m"
leadOut = "\033[0m"
if c.Options["theme"] == "normal" {
leadIn = "\033[41;1;7m"
}
}
func (c *client) DrawMessage() {
// c.ClearMessageLine()
cui.MoveCursorTo(c.Height-1, 0)
fmt.Printf("%s", c.Message)
fmt.Printf("%s%-*.*s%s", leadIn, c.Width, c.Width, c.Message, leadOut)
}
func (c *client) RenderMessage() string {
leadIn, leadOut := "", ""
if c.Options["theme"] == "normal" {
leadIn = "\033[7m"
leadOut = "\033[0m"
}
if c.MessageIsErr {
leadIn = "\033[31;1m"
leadOut = "\033[0m"
if c.Options["theme"] == "normal" {
leadIn = "\033[41;1;7m"
}
}
return fmt.Sprintf("%s%-*.*s%s", leadIn, c.Width, c.Width, c.Message, leadOut)
}
func (c *client) ClearMessage() {
@ -656,7 +726,7 @@ func MakeClient(name string) *client {
// "httpbrowser": "lynx",
// "configlocation": userinfo.HomeDir,
// }
c := client{0, 0, defaultOptions, "", MakePages(), MakeBookmarks(), MakeHeadbar(name), MakeFootbar()}
c := client{0, 0, defaultOptions, "", false, MakePages(), MakeBookmarks(), MakeHeadbar(name), MakeFootbar()}
return &c
}

View File

@ -18,16 +18,6 @@ type Headbar struct {
// + + + R E C E I V E R S + + + \\
//--------------------------------------------------\\
func (h *Headbar) Build(width string) string {
// TODO Build out header to specified width
return ""
}
func (h *Headbar) Draw() {
// TODO this will actually draw the bar
// without having to redraw everything else
}
func (h *Headbar) Render(width int, theme string) string {
maxMsgWidth := width - len([]rune(h.title)) - 2
if theme == "inverse" {

19
main.go
View File

@ -37,17 +37,19 @@ var settings config.Config
func saveConfig() error {
var opts strings.Builder
bkmrks := bombadillo.BookMarks.IniDump()
// TODO opts becomes a string builder rather than concat
opts := "\n[SETTINGS]\n"
opts.WriteString(bkmrks)
opts.WriteString("\n[SETTINGS]\n")
for k, v := range bombadillo.Options {
opts += k
opts += "="
opts += v
opts += "\n"
opts.WriteString(k)
opts.WriteRune('=')
opts.WriteString(v)
opts.WriteRune('\n')
}
return ioutil.WriteFile(bombadillo.Options["configlocation"] + "/.bombadillo.ini", []byte(bkmrks+opts), 0644)
return ioutil.WriteFile(bombadillo.Options["configlocation"] + "/.bombadillo.ini", []byte(opts.String()), 0644)
}
func loadConfig() error {
@ -100,9 +102,6 @@ func main() {
panic(err)
}
// TODO find out why the loading message
// has disappeared on initial load...
// Start polling for terminal size changes
go bombadillo.GetSize()