summaryrefslogtreecommitdiffstats
path: root/cmd/grv/grv_variable_view.go
blob: cf0d2b053aaba967ffc517521a6236a147b4857c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main

import (
	"fmt"
	"sync"

	log "github.com/Sirupsen/logrus"
)

// GRVVariableView represents the variable view
type GRVVariableView struct {
	*AbstractWindowView
	variables         GRVVariableSetter
	activeViewPos     ViewPos
	lastViewDimension ViewDimension
	lock              sync.Mutex
}

// NewGRVVariableView creates a new instance
func NewGRVVariableView(channels Channels, config Config, variables GRVVariableSetter) *GRVVariableView {
	grvVariableView := &GRVVariableView{
		variables:     variables,
		activeViewPos: NewViewPosition(),
	}

	grvVariableView.AbstractWindowView = NewAbstractWindowView(grvVariableView, channels, config, variables, &grvVariableView.lock, "variable")

	return grvVariableView
}

// Render generates and writes variable view to the provided window
func (grvVariableView *GRVVariableView) Render(win RenderWindow) (err error) {
	grvVariableView.lock.Lock()
	defer grvVariableView.lock.Unlock()

	log.Debug("Rendering GRVVariableView")

	grvVariableView.lastViewDimension = win.ViewDimensions()

	variables := grvVariableView.variables.VariableValues()
	viewRows := grvVariableView.rows()
	rows := win.Rows() - 2

	viewPos := grvVariableView.viewPos()
	viewPos.DetermineViewStartRow(rows, viewRows)
	viewRowIndex := viewPos.ViewStartRowIndex()
	startColumn := viewPos.ViewStartColumn()

	var lineBuilder *LineBuilder
	for rowIndex := uint(0); rowIndex < rows && viewRowIndex < viewRows; rowIndex++ {
		variable := GRVVariable(viewRowIndex)
		variableName := GRVVariableName(variable)
		variableValue := variables[variable]

		if lineBuilder, err = win.LineBuilder(rowIndex+1, startColumn); err != nil {
			return
		}

		lineBuilder.Append(" ").
			AppendWithStyle(CmpGRVVariableViewVariable, "%v: ", variableName).
			AppendWithStyle(CmpGRVVariableViewValue, "%v", variableValue)

		viewRowIndex++
	}

	if err = win.SetSelectedRow(viewPos.SelectedRowIndex()+1, grvVariableView.active); err != nil {
		return
	}

	win.DrawBorder()

	if err = win.SetTitle(CmpGRVVariableViewTitle, "Variables"); err != nil {
		return
	}

	if err = win.SetFooter(CmpGRVVariableViewFooter, "Variable %v of %v", viewPos.ActiveRowIndex()+1, grvVariableView.rows()); err != nil {
		return
	}

	if searchActive, searchPattern, lastSearchFoundMatch := grvVariableView.viewSearch.SearchActive(); searchActive && lastSearchFoundMatch {
		if err = win.Highlight(searchPattern, CmpAllviewSearchMatch); err != nil {
			return
		}
	}

	return
}

// ViewID returns the ViewID for the grv variable view
func (grvVariableView *GRVVariableView) ViewID() ViewID {
	return ViewGRVVariable
}

func (grvVariableView *GRVVariableView) line(lineIndex uint) (line string) {
	if lineIndex < grvVariableView.rows() {
		variables := grvVariableView.variables.VariableValues()

		variable := GRVVariable(lineIndex)
		variableName := GRVVariableName(variable)
		variableValue := variables[variable]

		line = fmt.Sprintf("%v: %v", variableName, variableValue)
	}

	return
}

func (grvVariableView *GRVVariableView) viewPos() ViewPos {
	return grvVariableView.activeViewPos
}

func (grvVariableView *GRVVariableView) rows() uint {
	return uint(VarCount)
}

func (grvVariableView *GRVVariableView) viewDimension() ViewDimension {
	return grvVariableView.lastViewDimension
}

func (grvVariableView *GRVVariableView) onRowSelected(rowIndex uint) (err error) {
	grvVariableView.channels.UpdateDisplay()
	return
}

// HandleAction checks if the grv variable view supports this action and if it does executes it
func (grvVariableView *GRVVariableView) HandleAction(action Action) (err error) {
	grvVariableView.lock.Lock()
	defer grvVariableView.lock.Unlock()

	var handled bool
	if handled, err = grvVariableView.AbstractWindowView.HandleAction(action); handled {
		log.Debugf("Action handled by AbstractWindowView")
	} else {
		log.Debugf("Action not handled")
	}

	return
}