diff options
author | Joe <rbo@gmx.us> | 2023-12-18 20:20:20 +0100 |
---|---|---|
committer | Joe <rbo@gmx.us> | 2023-12-18 20:20:20 +0100 |
commit | d73397da87e0d33ca9509e9120e6289d41e95499 (patch) | |
tree | 4a0b9f8e34fefaf9cab50e6f624699aaf2c27e60 | |
parent | cool ui (diff) | |
download | hardflip-d73397da87e0d33ca9509e9120e6289d41e95499.tar.gz hardflip-d73397da87e0d33ca9509e9120e6289d41e95499.tar.bz2 hardflip-d73397da87e0d33ca9509e9120e6289d41e95499.tar.xz hardflip-d73397da87e0d33ca9509e9120e6289d41e95499.tar.zst hardflip-d73397da87e0d33ca9509e9120e6289d41e95499.zip |
added LICENSE
-rw-r--r-- | LICENSE | 24 | ||||
-rw-r--r-- | c_exec.go | 6 | ||||
-rw-r--r-- | c_hardflip.go | 10 | ||||
-rw-r--r-- | go.mod | 2 | ||||
-rw-r--r-- | i_ui.go | 70 |
5 files changed, 97 insertions, 15 deletions
@@ -0,0 +1,24 @@ +Copyright (c) 2023 Joe +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the organization nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @@ -106,16 +106,16 @@ func c_format_rdp() { func c_format_cmd(id uint64, lhost *HostList) { host := lhost.head - // var cmd_fmt []string + var cmd_fmt []string host = lhost.sel(id) if host == nil { c_die("host id not found", nil) } if host.Type == 0 { - // cmd_fmt = format_ssh(host) + cmd_fmt = c_format_ssh(host) } - // exec_cmd(cmd_fmt) + c_exec_cmd(cmd_fmt) } func c_display_servers(lhost *HostList) { diff --git a/c_hardflip.go b/c_hardflip.go index ed4581a..07e6112 100644 --- a/c_hardflip.go +++ b/c_hardflip.go @@ -48,10 +48,10 @@ package main func main() { - // var data_dir string + var data_dir string - // data_dir = c_get_data_dir() - // lhost := c_load_data_dir(data_dir) - // display_servers(lhost) - i_ui() + data_dir = c_get_data_dir() + lhost := c_load_data_dir(data_dir) + // c_display_servers(lhost) + i_ui(lhost) } @@ -4,6 +4,7 @@ go 1.18 require ( github.com/gdamore/tcell/v2 v2.7.0 + golang.org/x/term v0.15.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -13,6 +14,5 @@ require ( github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.4.3 // indirect golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect ) @@ -39,7 +39,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * hardflip: src/c_hardflip.go - * Mon, 18 Dec 2023 16:50:31 +0100 + * Mon, 18 Dec 2023 17:59:45 +0100 * Joe * * interfacing with the user @@ -50,9 +50,12 @@ package main import ( "os" "github.com/gdamore/tcell/v2" + "golang.org/x/term" ) -func i_draw_text(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text string) { +func i_draw_text(s tcell.Screen, + x1, y1, x2, y2 int, + style tcell.Style, text string) { row := y1 col := x1 for _, r := range []rune(text) { @@ -68,7 +71,56 @@ func i_draw_text(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text str } } -func i_ui() { +func i_draw_box(s tcell.Screen, + x1, y1, x2, y2 int, + title string, content string) { + style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) + + if y2 < y1 { + y1, y2 = y2, y1 + } + if x2 < x1 { + x1, x2 = x2, x1 + } + // Draw borders + for col := x1; col <= x2; col++ { + s.SetContent(col, y1, tcell.RuneHLine, nil, style) + s.SetContent(col, y2, tcell.RuneHLine, nil, style) + } + for row := y1 + 1; row < y2; row++ { + s.SetContent(x1, row, tcell.RuneVLine, nil, style) + s.SetContent(x2, row, tcell.RuneVLine, nil, style) + } + + // Only draw corners if necessary + if y1 != y2 && x1 != x2 { + s.SetContent(x1, y1, tcell.RuneULCorner, nil, style) + s.SetContent(x2, y1, tcell.RuneURCorner, nil, style) + s.SetContent(x1, y2, tcell.RuneLLCorner, nil, style) + s.SetContent(x2, y2, tcell.RuneLRCorner, nil, style) + } + + i_draw_text(s, x1 + 1, y1, x2 - 1, y2 - 1, style, title) + i_draw_text(s, x1 + 1, y1 + 1, x2 - 1, y2 - 1, style, content) +} + +func i_bottom_text(s tcell.Screen, term_w, term_h int, style tcell.Style) { + i_draw_text(s, 0, term_h - 1, term_w - 1, term_h, style, "(q) Quit") +} + +func i_hosts_panel(s tcell.Screen, term_w, term_h int, lhost *HostList) { + i_draw_box(s, 0, 0, + term_w / 3, term_h - 2, + " hosts ", "") +} + +func i_info_panel(s tcell.Screen, term_w, term_h int) { + i_draw_box(s, (term_w / 3) + 1, 0, + term_w - 1, term_h - 2, + " infos ", "") +} + +func i_ui(lhost *HostList) { screen, err := tcell.NewScreen() if err != nil { c_die("view", err) @@ -76,21 +128,27 @@ func i_ui() { if err := screen.Init(); err != nil { c_die("view", err) } - def_style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) + def_style := tcell.StyleDefault. + Background(tcell.ColorReset). + Foreground(tcell.ColorReset) screen.SetStyle(def_style) quit := func() { screen.Fini() os.Exit(0) } for { - i_draw_text(screen, 0, 0, 30, 0, def_style, "hey fuck you") + term_w, term_h, _ := term.GetSize(0) + screen.Clear() + i_bottom_text(screen, term_w, term_h, def_style) + i_hosts_panel(screen, term_w, term_h, lhost) + i_info_panel(screen, term_w, term_h) screen.Show() ev := screen.PollEvent() switch ev := ev.(type) { case *tcell.EventResize: screen.Sync() case *tcell.EventKey: - if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC { + if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC || ev.Rune() == 'q' || ev.Rune() == 'Q' { quit() } } |