From 245627d191cd4d7f67ddbaed2a73ee6b61c481f6 Mon Sep 17 00:00:00 2001
From: Joe <rbo@gmx.us>
Date: Tue, 26 Dec 2023 20:20:20 +0100
Subject: it builds at least

---
 c_exec.go     |  11 ++---
 c_hardflip.go |   5 +-
 c_init.go     |   4 +-
 i_events.go   |  39 +++++++--------
 i_ui.go       | 153 +++++++++++++++++++++++++++++++---------------------------
 5 files changed, 113 insertions(+), 99 deletions(-)

diff --git a/c_exec.go b/c_exec.go
index 494f485..cd7a11c 100644
--- a/c_exec.go
+++ b/c_exec.go
@@ -128,11 +128,10 @@ func c_format_rdp(host *HostNode) []string {
 	return cmd_fmt
 }
 
-func c_format_cmd(id uint64, lhost *HostList) {
-	host := lhost.head
+func c_format_cmd(dir_id, host_id uint64, ldirs *DirsList) {
 	var cmd_fmt []string
+	host := ldirs.sel(dir_id).lhost.sel(host_id)
 
-	host = lhost.sel(id)
 	if host == nil {
 		c_die("host id not found", nil)
 	}
@@ -146,9 +145,9 @@ func c_format_cmd(id uint64, lhost *HostList) {
 	c_exec_cmd(cmd_fmt)
 }
 
-func c_exec(id uint64, lhost *HostList) {
-	if lhost.head == nil {
+func c_exec(dir_id, host_id uint64, ldirs *DirsList) {
+	if ldirs.head == nil {
 		return
 	}
-	c_format_cmd(id, lhost)
+	c_format_cmd(dir_id, host_id, ldirs)
 }
diff --git a/c_hardflip.go b/c_hardflip.go
index f7585b4..f0c663f 100644
--- a/c_hardflip.go
+++ b/c_hardflip.go
@@ -57,11 +57,12 @@ type HardData struct {
 
 func main() {
 	data_dir := c_get_data_dir()
-	ldirs := c_load_data_dir(data_dir)
+	opts := HardOpts{true, true, false}
+	ldirs := c_load_data_dir(data_dir, opts)
 	data := HardData{
 		ldirs,
 		HardUI{},
-		HardOpts{true, true, false},
+		opts,
 		data_dir,
 	}
 	// dir := data.ldirs.head
diff --git a/c_init.go b/c_init.go
index 65e7144..d16999c 100644
--- a/c_init.go
+++ b/c_init.go
@@ -94,11 +94,11 @@ func c_recurse_data_dir(dir, root string, opts HardOpts, ldirs *DirsList,
 	}
 }
 
-func c_load_data_dir(dir string) *DirsList {
+func c_load_data_dir(dir string, opts HardOpts) *DirsList {
 	ldirs := DirsList{}
 	var id uint64
 
 	id = 0
-	c_recurse_data_dir("", data.opts, dir + "/", &ldirs, &id, "", nil, 1)
+	c_recurse_data_dir("", dir + "/", opts, &ldirs, &id, "", nil, 1)
 	return &ldirs
 }
diff --git a/i_events.go b/i_events.go
index 5c5a45c..6e3bdc5 100644
--- a/i_events.go
+++ b/i_events.go
@@ -53,25 +53,24 @@ import (
 )
 
 func i_reload_data(data *HardData) {
-	data.lhost, _ = c_load_data_dir(data.data_dir)
-	l := data.lhost
-	data.ui.sel_max = l.count()
+	data.ldirs = c_load_data_dir(data.data_dir, data.opts)
+	data.ui.sel_max, data.ui.count_dirs, data.ui.count_hosts = i_get_sel_max(data.ldirs)
 }
 
 func i_delete_host(data *HardData) {
-	ui := &data.ui
-	host := data.lhost.sel(data.ui.sel)
-	file_path := data.data_dir + "/" + host.Folder + host.Filename
-
-	if err := os.Remove(file_path); err != nil {
-		c_die("can't remove " + file_path, err)
-	}
-	data.lhost.del(data.ui.sel)
-	data.lhost.reset_id()
-	ui.sel_max = data.lhost.count()
-	if ui.sel >= ui.sel_max {
-		ui.sel = ui.sel_max - 1
-	}
+//     ui := &data.ui
+//     host := data.lhost.sel(data.ui.sel)
+//     file_path := data.data_dir + "/" + host.Folder + host.Filename
+//
+//     if err := os.Remove(file_path); err != nil {
+//         c_die("can't remove " + file_path, err)
+//     }
+//     data.lhost.del(data.ui.sel)
+//     data.lhost.reset_id()
+//     ui.sel_max = data.lhost.count()
+//     if ui.sel >= ui.sel_max {
+//         ui.sel = ui.sel_max - 1
+//     }
 }
 
 // screen events such as keypresses
@@ -103,12 +102,14 @@ func i_events(data *HardData) {
 			   ui.sel = 0
 			} else if event.Rune() == 'G' {
 			   ui.sel = ui.sel_max - 1
-			} else if event.Rune() == 'D' && data.lhost.head != nil {
+			} else if event.Rune() == 'D' &&
+					data.ldirs.head != nil &&
+					ui.sel_max != 0 {
 				ui.mode = DELETE_MODE
 			} else if event.Key() == tcell.KeyEnter {
 				ui.s.Fini()
-				c_exec(ui.sel, data.lhost)
-				if data.opts.loop == false {
+				c_exec(ui.sel, ui.sel, data.ldirs)
+				if data.opts.Loop == false {
 					os.Exit(0)
 				}
 				if ui.s, err = tcell.NewScreen(); err != nil {
diff --git a/i_ui.go b/i_ui.go
index ec38cf6..89bb123 100644
--- a/i_ui.go
+++ b/i_ui.go
@@ -60,6 +60,8 @@ type HardUI struct {
 	mode        uint8
 	sel         uint64
 	sel_max     uint64
+	count_dirs  uint64
+	count_hosts uint64
 	def_style   tcell.Style
 	title_style tcell.Style
 	dim         [2]int
@@ -151,80 +153,86 @@ func i_draw_zhosts_box(ui HardUI) {
 }
 
 func i_draw_delete_box(ui HardUI, host *HostNode) {
-	text := "Really delete this host?"
-	file := host.Folder + host.Filename
-	max_len := len(text)
-
-	if max_len < len(file) {
-		max_len = len(file)
-	}
-	left, right :=
-		(ui.dim[W] / 2) - (max_len / 2) - 5,
-		(ui.dim[W] / 2) + (max_len / 2) + 5
-	if left < ui.dim[W] / 8 { 
-		left = ui.dim[W] / 8
-	}
-	if right > ui.dim[W] - ui.dim[W] / 8 - 1 {
-		right = ui.dim[W] - ui.dim[W] / 8 - 1
-	}
-	top, bot :=
-		(ui.dim[H] / 2) - 4,
-		(ui.dim[H] / 2) + 3
-	i_draw_box(ui.s, left, top, right, bot, "", true)
-	left = (ui.dim[W] / 2) - (len(text) / 2)
-	if left < (ui.dim[W] / 8) + 1 { 
-		left = (ui.dim[W] / 8) + 1
-	}
-	top = ui.dim[H] / 2 - 2
-	i_draw_text(ui.s,
-		left, top, right, top,
-		ui.def_style, text)
-	left = (ui.dim[W] / 2) - (len(file) / 2)
-	if left < (ui.dim[W] / 8) + 1 { 
-		left = (ui.dim[W] / 8) + 1
-	}
-	top += 1
-	i_draw_text(ui.s,
-		left, top, right, top,
-		ui.def_style.Bold(true), file)
-	left = right - 11
-	if left < (ui.dim[W] / 8) + 1 { 
-		left = (ui.dim[W] / 8) + 1
-	}
-	top = ui.dim[H] / 2 + 1
-	i_draw_text(ui.s,
-		left, top, right, top,
-		ui.def_style.Bold(true).Underline(true), "y")
-	i_draw_text(ui.s,
-		left + 1, top, right, top,
-		ui.def_style, "es | ")
-	i_draw_text(ui.s,
-		left + 6, top, right, top,
-		ui.def_style.Bold(true).Underline(true), "n")
-	i_draw_text(ui.s,
-		left + 7, top, right, top,
-		ui.def_style, "o")
+	// text := "Really delete this host?"
+	// file := host.Folder + host.Filename
+	// max_len := len(text)
+    //
+	// if max_len < len(file) {
+	//     max_len = len(file)
+	// }
+	// left, right :=
+	//     (ui.dim[W] / 2) - (max_len / 2) - 5,
+	//     (ui.dim[W] / 2) + (max_len / 2) + 5
+	// if left < ui.dim[W] / 8 {
+	//     left = ui.dim[W] / 8
+	// }
+	// if right > ui.dim[W] - ui.dim[W] / 8 - 1 {
+	//     right = ui.dim[W] - ui.dim[W] / 8 - 1
+	// }
+	// top, bot :=
+	//     (ui.dim[H] / 2) - 4,
+	//     (ui.dim[H] / 2) + 3
+	// i_draw_box(ui.s, left, top, right, bot, "", true)
+	// left = (ui.dim[W] / 2) - (len(text) / 2)
+	// if left < (ui.dim[W] / 8) + 1 {
+	//     left = (ui.dim[W] / 8) + 1
+	// }
+	// top = ui.dim[H] / 2 - 2
+	// i_draw_text(ui.s,
+	//     left, top, right, top,
+	//     ui.def_style, text)
+	// left = (ui.dim[W] / 2) - (len(file) / 2)
+	// if left < (ui.dim[W] / 8) + 1 {
+	//     left = (ui.dim[W] / 8) + 1
+	// }
+	// top += 1
+	// i_draw_text(ui.s,
+	//     left, top, right, top,
+	//     ui.def_style.Bold(true), file)
+	// left = right - 11
+	// if left < (ui.dim[W] / 8) + 1 {
+	//     left = (ui.dim[W] / 8) + 1
+	// }
+	// top = ui.dim[H] / 2 + 1
+	// i_draw_text(ui.s,
+	//     left, top, right, top,
+	//     ui.def_style.Bold(true).Underline(true), "y")
+	// i_draw_text(ui.s,
+	//     left + 1, top, right, top,
+	//     ui.def_style, "es | ")
+	// i_draw_text(ui.s,
+	//     left + 6, top, right, top,
+	//     ui.def_style.Bold(true).Underline(true), "n")
+	// i_draw_text(ui.s,
+	//     left + 7, top, right, top,
+	//     ui.def_style, "o")
 }
 
 func i_host_panel(ui HardUI, opts HardOpts, ldirs *DirsList) {
 	i_draw_box(ui.s, 0, 0,
 		ui.dim[W] / 3, ui.dim[H] - 2,
 		" Hosts ", false)
-	host := lhost.head
-	icons := [2]string{"  ", "  "}
-	for i := 0; i < ui.list_start && host.next != nil; i++ {
-		host = host.next
+	// host := lhost.head
+	dirs := ldirs.head
+	// prot_icons := [2]string{"  ", "  "}
+	dirs_icons := [2]string{"  ", "  "}
+	for i := 0; i < ui.list_start && dirs.next != nil; i++ {
+		dirs = dirs.next
 	}
-	for line := 1; line < ui.dim[H] - 2 && host != nil; line++ {
+	for line := 1; line < ui.dim[H] - 2 && dirs != nil; line++ {
 		style := ui.def_style
-		if ui.sel == host.ID {
+		if ui.sel == dirs.ID {
 			style = ui.def_style.Reverse(true)
 		}
 		text := ""
-		if opts.icon == true {
-			text = icons[host.Type]
+		if opts.Icon == true {
+			var fold_var uint8
+			if dirs.Folded == true {
+				fold_var = 1
+			}
+			text = dirs_icons[fold_var]
 		}
-		text += host.Folder + host.Name
+		text += dirs.Name
 		spaces := ""
 		for i := 0; i < (ui.dim[W] / 3) - len(text) + 1; i++ {
 			spaces += " "
@@ -233,7 +241,7 @@ func i_host_panel(ui HardUI, opts HardOpts, ldirs *DirsList) {
 		i_draw_text(ui.s,
 			1, line, ui.dim[W] / 3, line,
 			style, text)
-		host = host.next
+		dirs = dirs.next
 	}
 	if ui.sel_max == 0 {
 		i_draw_text(ui.s,
@@ -300,7 +308,7 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 		ui.def_style, strconv.Itoa(int(host.Port)))
 	curr_line += 1
 	// RDP shit
-	if host.Type == 1 {
+	if host.Protocol == 1 {
 		if len(host.Domain) > 0 {
 			i_draw_text(ui.s,
 				(ui.dim[W] / 3) + 4, curr_line, ui.dim[W] - 2, curr_line,
@@ -329,7 +337,7 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 			ui.def_style, "***")
 		curr_line += 1
 	}
-	if host.Type == 0 && len(host.Priv) > 0 {
+	if host.Protocol == 0 && len(host.Priv) > 0 {
 		i_draw_text(ui.s,
 			(ui.dim[W] / 3) + 4, curr_line, ui.dim[W] - 2, curr_line,
 			ui.title_style, "Privkey: ")
@@ -340,7 +348,7 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 	}
 	curr_line += 1
 	// jump
-	if host.Type == 0 && len(host.Jump) > 0 {
+	if host.Protocol == 0 && len(host.Jump) > 0 {
 		i_draw_text(ui.s,
 			(ui.dim[W] / 3) + 4, curr_line, ui.dim[W] - 2, curr_line,
 			ui.title_style, "Jump settings: ")
@@ -375,7 +383,7 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 				ui.def_style, "***")
 			curr_line += 1
 		}
-		if host.Type == 0 && len(host.JumpPriv) > 0 {
+		if host.Protocol == 0 && len(host.JumpPriv) > 0 {
 			i_draw_text(ui.s,
 				(ui.dim[W] / 3) + 5, curr_line, ui.dim[W] - 2, curr_line,
 				ui.title_style, "Privkey: ")
@@ -387,7 +395,7 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 		curr_line += 1
 	}
 	// RDP shit
-	if host.Type == 1 {
+	if host.Protocol == 1 {
 		qual := [3]string{"Low", "Medium", "High"}
 		i_draw_text(ui.s,
 			(ui.dim[W] / 3) + 4, curr_line, ui.dim[W] - 2, curr_line,
@@ -426,12 +434,17 @@ func i_info_panel(ui HardUI, lhost *HostList) {
 	}
 }
 
+func i_get_sel_max(ldirs *DirsList) (uint64, uint64, uint64) {
+	count_dirs, count_hosts := ldirs.count()
+
+	return count_dirs + count_hosts, count_dirs, count_hosts
+}
+
 func i_ui(data *HardData) {
 	var err error
 	ui := &data.ui
 	ui.s, err = tcell.NewScreen()
-	count_dirs, count_hosts := data.ldirs.count()
-	ui.sel_max = count_dirs + count_hosts
+	ui.sel_max, ui.count_dirs, ui.count_hosts = i_get_sel_max(data.ldirs)
 
 	if err != nil {
 		c_die("view", err)
-- 
cgit v1.2.3