Skip to content

Commit 97ca052

Browse files
authored
Merge pull request os-autoinst#160 from grisu48/rc
Improve pagination for openqa-mon
2 parents a54697f + bb125d7 commit 97ca052

File tree

4 files changed

+123
-81
lines changed

4 files changed

+123
-81
lines changed

cmd/openqa-mon/openqa-mon.go

+67-44
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,7 @@ func SetStatus() {
509509
} else {
510510
tui.SetStatus("")
511511
}
512+
tui.UpdateHeader()
512513
}
513514

514515
func parseProgramArguments(cliargs []string) error {
@@ -735,7 +736,7 @@ func main() {
735736
if len(remotes) == 1 {
736737
remotesString = remotes[0].URI
737738
}
738-
tui.remotes=remotesString
739+
tui.remotes = remotesString
739740
tui.SetHeader(fmt.Sprintf("openqa-mon v%s - Monitoring %s", internal.VERSION, remotesString))
740741
tui.Model.HideStates = config.HideStates
741742
tui.Update()
@@ -862,7 +863,6 @@ func singleCall(remotes []Remote) {
862863
}
863864
}
864865

865-
866866
func continuousMonitoring(remotes []Remote) {
867867
var err error
868868
// Ensure cursor is visible after termination
@@ -881,51 +881,74 @@ func continuousMonitoring(remotes []Remote) {
881881
refreshSignal := make(chan int, 1)
882882

883883
// Keybress callback
884+
p := make([]byte, 3) // History, needed for special keys
884885
tui.Keypress = func(b byte) {
885-
switch b {
886-
case 'q':
887-
tui.LeaveAltScreen()
888-
os.Exit(0)
889-
case 'r':
890-
// Refresh
891-
refreshSignal <- 1
892-
return
893-
case '?':
894-
tui.SetShowHelp(!tui.DoShowHelp())
895-
case 'h':
896-
tui.SetHideStates(!tui.DoHideStates())
897-
case 'p':
898-
config.Paused = !config.Paused
899-
if config.Paused {
900-
SetStatus()
901-
} else {
902-
refreshSignal <- 1
886+
p[2], p[1], p[0] = p[1], p[0], b
887+
888+
// Handle special keys
889+
if p[2] == 27 && p[1] == 91 {
890+
switch p[0] {
891+
case 72: // home
892+
tui.FirstPage()
893+
case 70: // end
894+
tui.LastPage()
895+
case 53: // page up
896+
tui.PrevPage()
897+
case 54: // page down
898+
tui.NextPage()
899+
case 68: // arrow left
900+
tui.PrevPage()
901+
case 67: // arrow right
902+
tui.NextPage()
903903
}
904-
return
905-
case 'd','n':
906-
config.Notify = !config.Notify
907-
SetStatus()
908-
case 'b':
909-
config.Bell = !config.Bell
910-
SetStatus()
911-
case 'm':
912-
config.Notify = false
913-
config.Bell = false
914-
SetStatus()
915-
case 'l':
916-
config.Notify = true
917-
config.Bell = true
918-
SetStatus()
919-
case '+':
920-
config.Continuous++
921-
SetStatus()
922-
case '-':
923-
if config.Continuous > 1 {
924-
config.Continuous--
904+
} else {
905+
switch b {
906+
case 'q':
907+
tui.LeaveAltScreen()
908+
os.Exit(0)
909+
case 'r':
910+
// Refresh
911+
refreshSignal <- 1
912+
return
913+
case '?':
914+
tui.SetShowHelp(!tui.DoShowHelp())
915+
case 'h':
916+
tui.SetHideStates(!tui.DoHideStates())
917+
case 'p':
918+
config.Paused = !config.Paused
919+
if config.Paused {
920+
SetStatus()
921+
} else {
922+
refreshSignal <- 1
923+
}
924+
return
925+
case 'd', 'n':
926+
config.Notify = !config.Notify
927+
SetStatus()
928+
case 'b':
929+
config.Bell = !config.Bell
930+
SetStatus()
931+
case 'm':
932+
config.Notify = false
933+
config.Bell = false
934+
SetStatus()
935+
case 'l':
936+
config.Notify = true
937+
config.Bell = true
938+
SetStatus()
939+
case '+':
940+
config.Continuous++
941+
SetStatus()
942+
case '-':
943+
if config.Continuous > 1 {
944+
config.Continuous--
945+
}
946+
SetStatus()
947+
case '>':
948+
tui.NextPage()
949+
case '<':
950+
tui.PrevPage()
925951
}
926-
SetStatus()
927-
case '>': tui.NextPage()
928-
case '<': tui.PrevPage()
929952
}
930953
tui.Update()
931954
}

cmd/openqa-mon/tui.go

+22-8
Original file line numberDiff line numberDiff line change
@@ -269,22 +269,36 @@ func (tui *TUI) SetHideStates(enabled bool) {
269269
tui.Update()
270270
}
271271

272+
func (tui *TUI) UpdateHeader() {
273+
tui.header = fmt.Sprintf("openqa-mon v%s - Monitoring %s - Page %d/%d", internal.VERSION, tui.remotes, 1+tui.currentPage, tui.totalPages)
274+
}
275+
276+
func (tui *TUI) FirstPage() {
277+
tui.Model.mutex.Lock()
278+
defer tui.Model.mutex.Unlock()
279+
tui.currentPage = 0
280+
tui.UpdateHeader()
281+
}
282+
283+
func (tui *TUI) LastPage() {
284+
tui.Model.mutex.Lock()
285+
defer tui.Model.mutex.Unlock()
286+
tui.currentPage = max(0, tui.totalPages-1)
287+
tui.UpdateHeader()
288+
}
289+
272290
func (tui *TUI) NextPage() {
273291
tui.Model.mutex.Lock()
274292
defer tui.Model.mutex.Unlock()
275-
if tui.currentPage < tui.totalPages-1 {
276-
tui.currentPage++
277-
tui.header = fmt.Sprintf("openqa-mon v%s - Monitoring %s - Page %d/%d", internal.VERSION, tui.remotes, 1+tui.currentPage, tui.totalPages)
278-
}
293+
tui.currentPage = min(tui.totalPages-1, tui.currentPage+1)
294+
tui.UpdateHeader()
279295
}
280296

281297
func (tui *TUI) PrevPage() {
282298
tui.Model.mutex.Lock()
283299
defer tui.Model.mutex.Unlock()
284-
if tui.currentPage > 0 {
285-
tui.currentPage--
286-
tui.header = fmt.Sprintf("openqa-mon v%s - Monitoring %s - Page %d/%d", internal.VERSION, tui.remotes, 1+tui.currentPage, tui.totalPages)
287-
}
300+
tui.currentPage = max(0, tui.currentPage-1)
301+
tui.UpdateHeader()
288302
}
289303

290304
func (tui *TUI) DoHideStates() bool {

cmd/openqa-revtui/openqa-revtui.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ func tui_main(tui *TUI, instance *gopenqa.Instance) error {
291291
refreshing := false
292292
tui.Keypress = func(key byte) {
293293
// Input handling
294-
if key == 'r' {
294+
switch key {
295+
case 'r':
295296
if !refreshing {
296297
refreshing = true
297298
go func() {
@@ -302,22 +303,22 @@ func tui_main(tui *TUI, instance *gopenqa.Instance) error {
302303
}()
303304
tui.Update()
304305
}
305-
} else if key == 'u' {
306+
case 'u':
306307
tui.Update()
307-
} else if key == 'q' {
308+
case 'q':
308309
tui.done <- true
309-
} else if key == 'h' {
310+
case 'h':
310311
tui.SetHide(!tui.Hide())
311312
tui.Model.MoveHome()
312313
tui.Update()
313-
} else if key == 'm' {
314+
case 'm':
314315
tui.SetShowTracker(!tui.showTracker)
315316
tui.Update()
316-
} else if key == 's' {
317+
case 's':
317318
// Shift through the sorting mechanism
318319
tui.SetSorting((tui.Sorting() + 1) % 2)
319320
tui.Update()
320-
} else if key == 'o' || key == 'O' {
321+
case 'o', 'O':
321322
// Note: 'o' has a failsafe to not open more than 10 links. 'O' overrides this failsafe
322323
jobs := tui.GetVisibleJobs()
323324
if len(jobs) == 0 {
@@ -333,7 +334,7 @@ func tui_main(tui *TUI, instance *gopenqa.Instance) error {
333334
}
334335
}
335336
tui.Update()
336-
} else {
337+
default:
337338
tui.Update()
338339
}
339340
}

cmd/openqa-revtui/tui.go

+25-21
Original file line numberDiff line numberDiff line change
@@ -204,28 +204,32 @@ func (tui *TUI) readInput() {
204204
p[2], p[1], p[0] = p[1], p[0], k
205205

206206
// Catch special keys
207-
if p[1] == 91 && k == 65 { // Arrow up
208-
if tui.Model.offset > 0 {
209-
tui.Model.offset--
210-
tui.Update()
207+
if p[2] == 27 && p[1] == 91 {
208+
switch k {
209+
case 65: // arrow up
210+
if tui.Model.offset > 0 {
211+
tui.Model.offset--
212+
tui.Update()
213+
}
214+
215+
case 66: // arrow down
216+
max := max(0, (tui.Model.printLines - tui.screensize))
217+
if tui.Model.offset < max {
218+
tui.Model.offset++
219+
tui.Update()
220+
}
221+
case 72: // home
222+
tui.Model.offset = 0
223+
case 70: // end
224+
tui.Model.offset = max(0, (tui.Model.printLines - tui.screensize))
225+
case 53: // page up
226+
// Always leave one line overlap for better orientation
227+
tui.Model.offset = max(0, tui.Model.offset-tui.screensize+1)
228+
case 54: // page down
229+
max := max(0, (tui.Model.printLines - tui.screensize))
230+
// Always leave one line overlap for better orientation
231+
tui.Model.offset = min(max, tui.Model.offset+tui.screensize-1)
211232
}
212-
} else if p[1] == 91 && k == 66 { // Arrow down
213-
max := max(0, (tui.Model.printLines - tui.screensize))
214-
if tui.Model.offset < max {
215-
tui.Model.offset++
216-
tui.Update()
217-
}
218-
} else if p[2] == 27 && p[1] == 91 && p[0] == 72 { // home
219-
tui.Model.offset = 0
220-
} else if p[2] == 27 && p[1] == 91 && p[0] == 70 { // end
221-
tui.Model.offset = max(0, (tui.Model.printLines - tui.screensize))
222-
} else if p[2] == 27 && p[1] == 91 && p[0] == 53 { // page up
223-
// Always leave one line overlap for better orientation
224-
tui.Model.offset = max(0, tui.Model.offset-tui.screensize+1)
225-
} else if p[2] == 27 && p[1] == 91 && p[0] == 54 { // page down
226-
max := max(0, (tui.Model.printLines - tui.screensize))
227-
// Always leave one line overlap for better orientation
228-
tui.Model.offset = min(max, tui.Model.offset+tui.screensize-1)
229233
}
230234

231235
// Forward keypress to listener

0 commit comments

Comments
 (0)