From f0e5e8c173ceab193fecf14b6309fbfd59c1c81d Mon Sep 17 00:00:00 2001
From: Malte Bauch <malte.bauch@stud.h-da.de>
Date: Fri, 16 Oct 2020 15:30:33 +0200
Subject: [PATCH] added footerView

this view contains grpcStatus and databaseStatus
---
 cmd/gosdn-tview/views/datbaseStatusView.go | 43 ++++++++++++++++++++++
 cmd/gosdn-tview/views/footerView.go        | 35 ++++++++++++++++++
 cmd/gosdn-tview/views/gRPCStatusView.go    | 17 ++++++---
 cmd/gosdn-tview/views/mainView.go          | 14 ++-----
 4 files changed, 94 insertions(+), 15 deletions(-)
 create mode 100644 cmd/gosdn-tview/views/datbaseStatusView.go
 create mode 100644 cmd/gosdn-tview/views/footerView.go

diff --git a/cmd/gosdn-tview/views/datbaseStatusView.go b/cmd/gosdn-tview/views/datbaseStatusView.go
new file mode 100644
index 000000000..2e9a26866
--- /dev/null
+++ b/cmd/gosdn-tview/views/datbaseStatusView.go
@@ -0,0 +1,43 @@
+package views
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cmd/gosdn-tview/app"
+	"github.com/rivo/tview"
+	"time"
+)
+
+type DatabaseStatusView struct {
+	databaseStatusView *tview.TextView
+}
+
+func NewDatabaseStatusView(app *app.App) *DatabaseStatusView {
+	dv := &DatabaseStatusView{
+		databaseStatusView: tview.NewTextView(),
+	}
+	dv.databaseStatusView.
+		SetDynamicColors(true).
+		SetTextAlign(tview.AlignCenter).
+		SetRegions(true).
+		SetBorder(true).
+		SetTitle("Database")
+
+	go databaseTicker(dv)
+
+	return dv
+}
+
+func (dv *DatabaseStatusView) GetContent() tview.Primitive {
+	return dv.databaseStatusView
+}
+
+func (dv *DatabaseStatusView) SetContent(s string) {
+	dv.databaseStatusView.Clear()
+	dv.databaseStatusView.SetText(s)
+}
+
+func databaseTicker(dv *DatabaseStatusView) {
+	ticker := time.NewTicker(5 * time.Second)
+	for t := range ticker.C {
+		dv.SetContent(t.String())
+	}
+}
diff --git a/cmd/gosdn-tview/views/footerView.go b/cmd/gosdn-tview/views/footerView.go
new file mode 100644
index 000000000..f998d7ba5
--- /dev/null
+++ b/cmd/gosdn-tview/views/footerView.go
@@ -0,0 +1,35 @@
+package views
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cmd/gosdn-tview/app"
+	"github.com/rivo/tview"
+	"google.golang.org/grpc"
+)
+
+type FooterView struct {
+	footerView         *tview.Flex
+	databaseStatusView *DatabaseStatusView
+	gRPCStatusView     *GRPCStatusView
+}
+
+func NewFooterView(app *app.App, conn *grpc.ClientConn) *FooterView {
+
+	fw := &FooterView{
+		footerView:         tview.NewFlex(),
+		databaseStatusView: NewDatabaseStatusView(app),
+		gRPCStatusView:     NewGRPCStatusView(app, conn),
+	}
+	fw.footerView.
+		SetBorder(true).
+		SetTitle("Status")
+
+	fw.footerView.
+		AddItem(fw.gRPCStatusView.GetContent(), 0, 1, false).
+		AddItem(fw.databaseStatusView.GetContent(), 0, 1, false)
+
+	return fw
+}
+
+func (fw *FooterView) GetContent() tview.Primitive {
+	return fw.footerView
+}
diff --git a/cmd/gosdn-tview/views/gRPCStatusView.go b/cmd/gosdn-tview/views/gRPCStatusView.go
index 1c6020b67..3e522db7f 100644
--- a/cmd/gosdn-tview/views/gRPCStatusView.go
+++ b/cmd/gosdn-tview/views/gRPCStatusView.go
@@ -11,23 +11,25 @@ type GRPCStatusView struct {
 	gRPCStatusView *tview.TextView
 }
 
-//TODO: change to grpcStatusView
 func NewGRPCStatusView(app *app.App, conn *grpc.ClientConn) *GRPCStatusView {
-	//TODO: change to uses FlexBox if there is more to display in the header
 	sv := &GRPCStatusView{
 		gRPCStatusView: tview.NewTextView(),
 	}
 
 	sv.gRPCStatusView.
+		SetDynamicColors(true).
+		SetTextAlign(tview.AlignCenter).
 		SetRegions(true).
 		SetBorder(true).
 		SetTitle("gRPC")
 
+	//TODO: maybe there is another way to do this.
+	//		pretty ugly atm, since it re-draws every 5 seconds...
 	sv.gRPCStatusView.SetChangedFunc(func() {
 		app.Draw()
 	})
 
-	go goSDNTicker(sv, conn)
+	go gRPCTicker(sv, conn)
 
 	return sv
 }
@@ -41,9 +43,14 @@ func (sv *GRPCStatusView) SetContent(s string) {
 	sv.gRPCStatusView.SetText(s)
 }
 
-func goSDNTicker(sv *GRPCStatusView, conn *grpc.ClientConn) {
+func gRPCTicker(sv *GRPCStatusView, conn *grpc.ClientConn) {
+	//TODO: refactor -> get rid of hardcoded values
 	ticker := time.NewTicker(5 * time.Second)
 	for range ticker.C {
-		sv.SetContent(conn.GetState().String())
+		if str := conn.GetState().String(); str == "READY" || str == "IDLE" {
+			sv.SetContent("[green]" + "connected")
+		} else {
+			sv.SetContent("[red]" + "disconnected")
+		}
 	}
 }
diff --git a/cmd/gosdn-tview/views/mainView.go b/cmd/gosdn-tview/views/mainView.go
index b5123b89e..e69d74dc6 100644
--- a/cmd/gosdn-tview/views/mainView.go
+++ b/cmd/gosdn-tview/views/mainView.go
@@ -12,7 +12,7 @@ type MainView struct {
 	commandsListView   *CommandListView
 	resultAndInputView *ResultAndInputView
 	headerView         *HeaderView
-	goSDNStatusView    *GRPCStatusView
+	footerView         *FooterView
 }
 
 func NewMainView(app *app.App, conn *grpc.ClientConn) *MainView {
@@ -22,15 +22,15 @@ func NewMainView(app *app.App, conn *grpc.ClientConn) *MainView {
 		commandsListView:   NewCommandListView(),
 		resultAndInputView: NewResultAndInputView(),
 		headerView:         NewHeaderView(),
-		goSDNStatusView:    NewGRPCStatusView(app, conn),
+		footerView:         NewFooterView(app, conn),
 	}
 	mv.commandsListView.GetCommands(app, mv.resultAndInputView, conn)
 
 	mv.mainGrid.
-		SetRows(8, 0, 3).
+		SetRows(8, 0, 5).
 		SetColumns(40, 0).
 		AddItem(mv.headerView.GetContent(), 0, 0, 1, 2, 0, 0, false).
-		AddItem(mv.goSDNStatusView.GetContent(), 2, 0, 1, 2, 0, 0, false)
+		AddItem(mv.footerView.GetContent(), 2, 0, 1, 2, 0, 0, false)
 
 	mv.mainGrid.AddItem(mv.commandsListView.GetContent(), 1, 0, 1, 1, 0, 0, true).
 		AddItem(mv.resultAndInputView.GetContent(), 1, 1, 1, 1, 0, 0, false)
@@ -43,9 +43,3 @@ func NewMainView(app *app.App, conn *grpc.ClientConn) *MainView {
 func (mv *MainView) GetContent() tview.Primitive {
 	return mv.pages
 }
-
-func newPrimitive(text string) tview.Primitive {
-	return tview.NewTextView().
-		SetTextAlign(tview.AlignCenter).
-		SetText(text)
-}
-- 
GitLab