Add some more information to palettes
This commit is contained in:
parent
ca131d2135
commit
a7bcd6dd9e
1 changed files with 85 additions and 5 deletions
|
|
@ -4,21 +4,101 @@
|
||||||
.author = "Igor Támara",
|
.author = "Igor Támara",
|
||||||
.layout = "tutorial.shtml",
|
.layout = "tutorial.shtml",
|
||||||
.draft = false,
|
.draft = false,
|
||||||
.custom = { .githubedit = "https://github.com/neurocyte/flow-website/tree/master/content/docs/architecture/palette.md"},
|
.custom = {
|
||||||
|
.githubedit = "/docs/architecture/palette.md"
|
||||||
|
},
|
||||||
---
|
---
|
||||||
|
|
||||||
Palettes are overlay menus that allow to select an item from the
|
Palettes are overlay menus that allow to select an item from the
|
||||||
presented list, applying a command with the selected element,
|
presented list, applying a command with the selected element,
|
||||||
optionally deleting the selected item; it's possible to close
|
optionally deleting the selected item; it's possible to close
|
||||||
the palette without selecting(cancel), filter the elements, and
|
the palette without selecting anything(a.k.a. cancel), filter
|
||||||
having special elements that trigger different actions.
|
the elements, and having special elements that trigger different
|
||||||
|
actions.
|
||||||
|
|
||||||
|
Examples of palettes are command_palette, clipboard_palette,
|
||||||
|
they all are based on palette.zig that does all the heavy lifting
|
||||||
|
and sets the framework to create new palettes as simple as
|
||||||
|
possible.
|
||||||
|
|
||||||
|
Palettes are an special case of minimode and for instance a
|
||||||
|
mode, they receive inputs from keyboards and execute the
|
||||||
|
beforehand mentioned actions in response.
|
||||||
|
|
||||||
To get the most of this section, it's recommended to have
|
To get the most of this section, it's recommended to have
|
||||||
read about [commands](/docs/architecture/command), and optionally
|
read about [commands](/docs/architecture/command), and optionally
|
||||||
[minimodes](/docs/architecture/minimode).
|
[minimodes](/docs/architecture/minimode).
|
||||||
|
|
||||||
See
|
## Defining the palette
|
||||||
[clipboard history palette](https://github.com/neurocyte/flow/commit/634a18cb5685a3c3fcfc08301306e628d33c3256)
|
|
||||||
|
|
||||||
|
Palettes are under `tui/overlay` and use the facilities offered by
|
||||||
|
`palette.zig` to perform all the operations.
|
||||||
|
|
||||||
|
1. Defining the list of elements
|
||||||
|
2. Filtering the elements
|
||||||
|
3. Perform an action with the selected element
|
||||||
|
|
||||||
|
Note: Palettes are meant to show options and allowing to select
|
||||||
|
the options to execute an action on the given selection. To
|
||||||
|
maintain as readable as possible the code and thus extensible,
|
||||||
|
the data to be used should be prepared previously.
|
||||||
|
|
||||||
|
### Fields
|
||||||
|
|
||||||
|
Basic fields that give hints to the user and need to be set are:
|
||||||
|
|
||||||
|
```zig
|
||||||
|
pub const label = "Clipboard history";
|
||||||
|
pub const name = " clipboard";
|
||||||
|
pub const description = "clipboard";
|
||||||
|
pub const icon = " ";
|
||||||
|
```
|
||||||
|
|
||||||
|
### Defining the list of elements in the palette
|
||||||
|
|
||||||
|
`load_entries` is in charge of populating the visible entries,
|
||||||
|
each one with an index.
|
||||||
|
|
||||||
|
```zig
|
||||||
|
pub fn load_entries(palette: *Type) !usize
|
||||||
|
```
|
||||||
|
|
||||||
|
The index will identify the action to be taken.
|
||||||
|
|
||||||
|
When populating with each entry, there must be a relation that
|
||||||
|
links the option chosen with the required action, and this happens
|
||||||
|
in `add_menu_entry` used when the user writes in the input to filter
|
||||||
|
out options.
|
||||||
|
|
||||||
|
```zig
|
||||||
|
pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !void {
|
||||||
|
```
|
||||||
|
|
||||||
|
The common line that will be used when registering the event to a
|
||||||
|
selected item is
|
||||||
|
|
||||||
|
```zig
|
||||||
|
try palette.menu.add_item_with_handler(value.written(), select);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Acting on selection
|
||||||
|
|
||||||
|
When the selection happens, it is time to invoke the command with the
|
||||||
|
selection and the palette needs to be closed.
|
||||||
|
Those actions will be handled inside `select`, whose signature is:
|
||||||
|
|
||||||
|
```zig
|
||||||
|
fn select(menu: **Type.MenuType, button: *Type.ButtonType, pos: Type.Pos) void {
|
||||||
|
```
|
||||||
|
|
||||||
|
Other common operations in the palettes can be inspected looking at the source
|
||||||
|
code of the palettes, all of them import `palette.zig`. Once the functions are
|
||||||
|
ready, it's time to make the palette available as a command.
|
||||||
|
|
||||||
|
## Registering the palette
|
||||||
|
|
||||||
|
Commands that open the palette are defined in `tui.zig` in a similar way as it
|
||||||
|
is done with [minimodes](/docs/architecture/minimode).
|
||||||
|
|
||||||
|
To view a complete implementation of a palette, take a look at
|
||||||
|
[clipboard history palette commit](https://github.com/neurocyte/flow/commit/634a18cb5685a3c3fcfc08301306e628d33c3256)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue