⌨️Interactive TUI
Your apps are now interactive
Last updated
Your apps are now interactive
Last updated
The interactive TUI allows you to make your apps interactive if they provide one or two data sources, which consist of a list of strings, integers, and even class instances, to make getting information about them easier. The interactive TUI renders the screen in two panes, the top being a status bar, and the bottom being a list of key bindings. For clarification, the ifm
command uses the double pane interactive TUI and the taskman
command uses the single pane interactive TUI with info in the second pane:
You can exit out of any interactive TUI application by pressing the ESC
key on your keyboard.
These are some of the controls, alongside the custom defined controls for a specific TUI, that you can use:
Key | Action |
---|---|
| Moves up one element in the current pane |
| Moves down one element in the current pane |
| Moves to the first element |
| Moves to the last element |
| One page backward |
| One page forward |
| Gives you more information about a selected element if there is one |
| Shows you a list of available bindings |
| Switches the sides |
| Exits the interactive TUI app |
This feature is also available on Terminaux. Some of the features here might not get backported to Terminaux until the next version surfaces there.
Yes! You can make your own interactive TUI application. Depending on your requirements, you may want to make a plan as to how would your interactive TUI application be.
For each application, you must make a class that would implement both the BaseInteractiveTui
class and the IInteractiveTui
interface, just like below:
However, you cannot execute your interactive TUI based on your class unless you use this (assuming that you've already defined a command entry in your mod entry point class called mycommand
):
If everything goes well, you should see this:
And if you press your key binding, you'll get this:
When defining the interactive TUI binding, you can now set the required modifier keys by setting the bindingKeyModifiers
value. Here is a constructor that supports this property:
For multiple panes, you'll have to modify your class to take two data sources and adapt it to interact with the second pane, like below: (note the highlighted parts, they are added)
If everything goes well, you should be able to switch to the second pane, causing you to be able to select items from the second pane:
And if you try to execute your key binding on an item found in the second pane, you'll see this:
As of 0.1.0 Beta 3, you don't have to manually implement the switch function, since it's already implemented for double-pane interactive TUIs.
Additionally, you can make your TUI app refresh every set millisecond so that your app can update itself based on the selected data, like weather for the selected city. For this, you need an information source that is dynamic and self-updating (from the GetInfoFromItem()
function), like stopwatches, random data, or even self-updating data gathered from the Internet, based on the selected item in the first pane, assuming that you know how to process them correctly.
For example, to use the Namer library to make a single-paned TUI application that gathers random names to list 10 names in the info pane, you must add a NuGet package, Namer, to your mod's dependencies. To learn more about how to use this library, consult the below page:
The code that would do this would look like this:
If everything goes well, you should see your TUI app refresh every 15 seconds:
You can also specify the colors for your TUI application, too! Currently, your interactive TUI uses the regular colors defined under InteractiveTuiColors
, which gets its values from the kernel configuration that you can also customize.
However, you can override the TUI colors by using the new
keyword on all the *Color
properties to assign it a new Color
value. For example, the contacts manager gets its own colors from its own colors class, which is also configurable through the kernel settings, like below:
LastOnOverflow()
You usually don't need to override this function, as it works by checking both panes for out of bounds and, if overflown, fixing their values so that they don't overflow.
AcceptsEmptyData
You can specify if your interactive TUI accepts empty data. The interactive TUI, by default, checks for the data source in both panes and, if not found or are empty, exits.
However, if you override the value like below, it'll start up regardless of how many data is there.
HandleExit()
If you want to handle exiting your own TUI application in your way, you can override the HandleExit() function like this:
Instance
If you want to access instance-based fields