Skip to content

Instantly share code, notes, and snippets.

@nafg
Last active August 5, 2016 03:53
Show Gist options
  • Save nafg/801baa21c7e770d7d7edce9167ce411d to your computer and use it in GitHub Desktop.
Save nafg/801baa21c7e770d7d7edce9167ce411d to your computer and use it in GitHub Desktop.
Ammonite interactive menu script
import $ivy.`com.googlecode.lanterna:lanterna:3.0.0-beta3`
import scala.collection.JavaConverters._
import com.googlecode.lanterna.gui2.Interactable.Result
import com.googlecode.lanterna.gui2.TextGUI.Listener
import com.googlecode.lanterna.gui2._
import com.googlecode.lanterna.gui2.table.{Table, TableModel}
import com.googlecode.lanterna.input.{KeyStroke, KeyType}
import com.googlecode.lanterna.screen.TerminalScreen
import com.googlecode.lanterna.terminal.DefaultTerminalFactory
def getChoice(choices: Seq[(String, String)]) = {
var res = Option.empty[String]
val screen = new TerminalScreen(new DefaultTerminalFactory().createTerminal())
screen.startScreen()
val bw = new BasicWindow()
val panel = new Panel(new BorderLayout)
lazy val input: TextBox =
new TextBox {
override def handleKeyStroke(keyStroke: KeyStroke) =
if (keyStroke.getKeyType == KeyType.Enter) {
res = Some(getText)
bw.close()
Result.HANDLED
}
else {
val ret = super.handleKeyStroke(keyStroke)
val text = getText
val model = new TableModel[String]("Value", "Description")
for ((v, d) <- choices if v.indexOf(text) >= 0)
model.addRow(v, d)
table.setTableModel(model)
ret
}
}
def tableModel = table.getTableModel
lazy val table: Table[String] =
new Table[String]("Value", "Description") {
private def getSel = tableModel.getRow(table.getSelectedRow).get(0)
override def handleKeyStroke(keyStroke: KeyStroke) =
if (keyStroke.getKeyType == KeyType.Enter) {
res = Some(getSel)
bw.close()
Result.HANDLED
}
else {
val ret = super.handleKeyStroke(keyStroke)
input.setText(getSel)
ret
}
}
for ((v, d) <- choices)
tableModel.addRow(v, d)
panel
.addComponent(input, BorderLayout.Location.TOP)
.addComponent(table)
bw.setComponent(panel)
bw.setHints(List(Window.Hint.FULL_SCREEN, Window.Hint.NO_DECORATIONS).asJava)
val gui = new MultiWindowTextGUI(screen)
gui.addListener(new Listener {
override def onUnhandledKeyStroke(textGUI: TextGUI, keyStroke: KeyStroke) = {
if (keyStroke.getKeyType == KeyType.Escape) bw.close()
false
}
})
gui.addWindowAndWait(bw)
screen.stopScreen()
res
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment