From 61edd75524543ed9662bfa6a60f82f0cc092ff5d Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Sun, 25 Nov 2018 11:06:05 +0000 Subject: [PATCH] colour hinting --- README.md | 3 ++- gui/explain.go | 2 +- gui/gui.go | 5 ++++- gui/mouse.go | 12 +++++------- gui/overlays.go | 2 +- gui/textbox.go | 10 ++++------ hint.colour.png | Bin 0 -> 12253 bytes hints/colours.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ hints/hint.go | 23 ++++++++++++++++++----- hints/perms.go | 7 +------ 10 files changed, 83 insertions(+), 28 deletions(-) create mode 100644 hint.colour.png create mode 100644 hints/colours.go diff --git a/README.md b/README.md index 4e15f5d..cf235a7 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ Ensure you have your latest graphics card drivers installed before use. ## Contextual Hints -![Example hint](hint.png) +![Permissions hint](hint.png) +![Colour hex hint](hint.colour.png) ## Built-in Powerline Fonts diff --git a/gui/explain.go b/gui/explain.go index a206b71..a8f7705 100644 --- a/gui/explain.go +++ b/gui/explain.go @@ -41,6 +41,6 @@ func (a *annotation) render(gui *GUI) { } } - gui.textbox(a.hint.StartX+1, a.hint.StartY+3, a.hint.Description) + gui.textbox(a.hint.StartX+1, a.hint.StartY+3, a.hint.Description, a.hint.ForegroundColour, a.hint.BackgroundColour) } diff --git a/gui/gui.go b/gui/gui.go index e9709c2..4a4e5aa 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -265,7 +265,10 @@ Buffer Size: %d lines gui.terminal.ActiveBuffer().ViewWidth(), gui.terminal.ActiveBuffer().ViewHeight(), gui.terminal.ActiveBuffer().Height(), - )) + ), + [3]float32{0, 1, 0}, + [3]float32{0, 0, 0}, + ) } gui.window.SwapBuffers() diff --git a/gui/mouse.go b/gui/mouse.go index 208bdfa..99aba12 100644 --- a/gui/mouse.go +++ b/gui/mouse.go @@ -27,13 +27,11 @@ func (gui *GUI) mouseMoveCallback(w *glfw.Window, xpos float64, ypos float64) { gui.terminal.ActiveBuffer().EndSelection(x, y, false) } else { - if gui.terminal.UsingMainBuffer() { - hint := gui.terminal.ActiveBuffer().GetHintAtPosition(x, y) - if hint != nil { - gui.setOverlay(newAnnotation(hint)) - } else { - gui.setOverlay(nil) - } + hint := gui.terminal.ActiveBuffer().GetHintAtPosition(x, y) + if hint != nil { + gui.setOverlay(newAnnotation(hint)) + } else { + gui.setOverlay(nil) } } diff --git a/gui/overlays.go b/gui/overlays.go index 0aa996f..e1d32dc 100644 --- a/gui/overlays.go +++ b/gui/overlays.go @@ -10,7 +10,7 @@ func (gui *GUI) setOverlay(m overlay) { } func (gui *GUI) renderOverlay() { - if gui.overlay == nil || !gui.terminal.UsingMainBuffer() { + if gui.overlay == nil { return } diff --git a/gui/textbox.go b/gui/textbox.go index 9fe6dd2..c56c526 100644 --- a/gui/textbox.go +++ b/gui/textbox.go @@ -6,7 +6,7 @@ import ( "github.com/liamg/aminal/buffer" ) -func (gui *GUI) textbox(col uint16, row uint16, text string) { +func (gui *GUI) textbox(col uint16, row uint16, text string, fg [3]float32, bg [3]float32) { lines := []string{} line := "" @@ -81,18 +81,16 @@ DONE: gui.renderer.Clean() - bg := [3]float32{0, 0, 0} - - for hx := col; hx < col+uint16(longestLine)+2; hx++ { + for hx := col; hx < col+uint16(longestLine)+1; hx++ { for hy := row - 1; hy < row+uint16(len(lines))+1; hy++ { - gui.renderer.DrawCellBg(buffer.NewBackgroundCell(bg), uint(hx), uint(hy), false, nil , true) + gui.renderer.DrawCellBg(buffer.NewBackgroundCell(bg), uint(hx), uint(hy), false, nil, true) } } x := float32(col) * gui.renderer.cellWidth f := gui.fontMap.GetFont('X') - f.SetColor(0.2, 1, 0.2, 1) + f.SetColor(fg[0], fg[1], fg[2], 1) for i, line := range lines { y := float32(row+1+uint16(i)) * gui.renderer.cellHeight diff --git a/hint.colour.png b/hint.colour.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ec1052008739c7735a8b282f017249619cf283 GIT binary patch literal 12253 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