Scurses, terminal drawing API for Scala, and Onions, a Scurses framework for easy terminal UI
Scurses and Onions are frameworks for drawing nice things in your terminal using simple, elegant Scala. Scurses provides a low-level drawing and event handling API while Onions provides a high-level UI API with useful widgets.
Contents:
High-level Scurses framework for easy terminal UI
Dependency:
libraryDependencies += "net.team2xh" %% "onions" % ""
To see an example application showcasing all the widgets, run:
$ sbt onions/run
Make sure that your terminal is sized big enough, scrolling is not supported yet.
Goal is to provide an API full of widgets to make it really easy for users to quickly set up a dashboard to monitor their services in the terminal (graphs, histograms, logs, etc.). It works great through SSH as well!
Scurses { implicit screen => val frame = Frame("Example UI") // Three columns val colA = frame.panel val colB = colA.splitRight val colC = colB.splitRight // Split second column in three rows val colB2 = colB.splitDown val colB3 = colB2.splitDown // Split third row of second column into two columns val colB3B = colB3.splitRight val colB3B2 = colB3B.splitDown // Split last column into two rows val colC2 = colC.splitDown// Add a label in the first column Label(colA, Lorem.Ipsum, TextWrap.JUSTIFY)
val r = Random val points = (1 to 50) map (i => { val x = r.nextInt(40) val y = 50 - x + (r.nextGaussian() * 5).toInt - 2 (x, y max 0) })
// Add a scatter plot in the first row of third column ScatterPlot(colC, points, "Time", "Sales")
// Show a heat map of the same values in the second row HeatMap(colC2, points, "Time", "Sales")
// Display and launch event loop frame.show() }
For examples regarding all widgets, see
ExampleUI.scala
Keys |
Action |
---|---|
↑ / ↓ | Focus next widget in direction / Focus next panel in direction |
← / → | Focus next panel in direction |
⇥ / ⇧+⇥ | Focus next / previous panel |
CTRL+SPACE | Switch to next tab (if panel has multiple tabs) |
SPACE / ↵ | Activate label action, check radio or checkbox |
< / > | Move slider left / right (also with SPACE / ↵) |
ESC / CTRL+C | Exit |
Low-level terminal drawing API for Scala
Dependency:
libraryDependencies += "net.team2xh" %% "scurses" % ""
$ sbt "scurses/runMain net.team2xh.scurses.examples.HelloWorld"
$ sbt scurses/run
$ sbt "scurses/runMain net.team2xh.scurses.examples.StressTest"
import net.team2xh.scurses.ScursesScurses { screen => // The screen will only be in Scurses mode inside this block // Scurses will reset the terminal buffer and everything when outside
// Get the current terminal size val (w, h) = screen.size
val greeting = "Hello, world!" val prompt = "Press a key to continue..." // Put some strings in the middle of the screen screen.put(w/2 - greeting.length/2, h/2, greeting) screen.put(w/2 - prompt.length/2, h/2 + 1, prompt, Colors.BRIGHT_BLACK) // Flush the buffer screen.refresh() // Wait for an input without storing it screen.keypress() }