Commit 7fad08d

Richard Luby <richluby@gmail.com>
2016-11-17 08:45:15
user can scroll primary view
user can scroll back through the buffer history of the primary view pane to see previous outputs
1 parent a31dd51
Changed files (1)
clientVisualization.go
@@ -112,6 +112,7 @@ func initMainView(g *gocui.Gui, maxX int, maxY int) error {
 		}
 		v.Title = "Shadow Quiz"
 		v.Autoscroll = true
+		v.Wrap = true
 	}
 	return nil
 }
@@ -130,6 +131,7 @@ func initCommandView(g *gocui.Gui, maxX int, maxY int) error {
 		for _, command := range commandArray {
 			v.Write([]byte(command.Command + "\n"))
 		}
+		v.Write([]byte("↑/↓"))
 	}
 	return nil
 }
@@ -214,22 +216,52 @@ func initUserSession() {
 	if err = ApplicationView.MainGui.SetKeybinding("", gocui.KeyEnter, gocui.ModNone, handleEnterKeyPress); err != nil {
 		log.Printf("\nFailed to bind key: %+v", err)
 	}
+	if err = ApplicationView.MainGui.SetKeybinding("", gocui.KeyArrowUp, gocui.ModNone,
+		func(g *gocui.Gui, v *gocui.View) error {
+			view, _ := ApplicationView.MainGui.View(ApplicationView.MAIN_WINDOW_NAME)
+			scrollView(view, -1)
+			return nil
+		}); err != nil {
+		log.Printf("\nFailed to bind key: %+v", err)
+	}
+	if err = ApplicationView.MainGui.SetKeybinding("", gocui.KeyArrowDown, gocui.ModNone,
+		func(g *gocui.Gui, v *gocui.View) error {
+			view, _ := ApplicationView.MainGui.View(ApplicationView.MAIN_WINDOW_NAME)
+			scrollView(view, 1)
+			return nil
+		}); err != nil {
+		log.Printf("\nFailed to bind key: %+v", err)
+	}
 	if err = ApplicationView.MainGui.MainLoop(); err != nil && err != gocui.ErrQuit {
 		log.Printf("Error from CUI: %+v", err)
 		exitApplication(Command{})
 	}
 }
 
+// scrollView scrolls the view buffer for the specified view
+// see https://github.com/jroimartin/gocui/blob/master/_examples/stdin.go
+func scrollView(v *gocui.View, dy int) error {
+	if v != nil {
+		v.Autoscroll = false
+		ox, oy := v.Origin()
+		if err := v.SetOrigin(ox, oy+dy); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
 // handleEnterKeyPress parses the input supplied by the user after
 // pressing 'Enter'
 func handleEnterKeyPress(g *gocui.Gui, v *gocui.View) error {
+	view, err := ApplicationView.MainGui.View(ApplicationView.MAIN_WINDOW_NAME)
+	view.Autoscroll = true
 	if readUserInputSemaphore.Queued() > 0 {
 		readUserInputSemaphore.V() //taken whenever user input is required
 		return nil
 	}
 	var input string
 	var command Command
-	var err error
 	setStatusBar("")
 	input, err = readInputFromMainScreen()
 	if err != nil {