Skip to content

Commit

Permalink
feat(menu): better key equivalent API (#1079)
Browse files Browse the repository at this point in the history
* Menu: add CTRL modifier

* NativeMenuExample: update to use new API

* Menu: add key conversions (i.e. "Space" -> " ")

* NativeMenuExample: try special keys
  • Loading branch information
zbaylin authored May 28, 2021
1 parent 49d816b commit d737fcd
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 15 deletions.
38 changes: 33 additions & 5 deletions examples/NativeMenuExample.re
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 48,37 @@ module View = {
~title="Item 1.2",
~onClick=menuCallback("Item 1.2"),
~keyEquivalent=
Menu.KeyEquivalent.ofString("b") |> Menu.KeyEquivalent.enableShift,
Menu.KeyEquivalent.ofString("b")
|> (ke => Menu.KeyEquivalent.enableShift(ke, true)),
(),
);
let item13 =
Menu.Item.create(
~title="Item 1.3",
~onClick=menuCallback("Item 1.3"),
~keyEquivalent=
Menu.KeyEquivalent.ofString("Space")
|> (ke => Menu.KeyEquivalent.enableCtrl(ke, true)),
(),
);
let item14 =
Menu.Item.create(
~title="Item 1.4",
~onClick=menuCallback("Item 1.4"),
~keyEquivalent=Menu.KeyEquivalent.ofString("ESC"),
(),
);
let item15 =
Menu.Item.create(
~title="Item 1.5",
~onClick=menuCallback("Item 1.5"),
~keyEquivalent=Menu.KeyEquivalent.ofString("Tab"),
(),
);
Menu.addItem(menu2, item12);
Menu.addItem(menu2, item13);
Menu.addItem(menu2, item14);
Menu.addItem(menu2, item15);

let menu3 = Menu.create("Test 3");
Menu.addSubmenu(~parent=menuBar, ~child=menu3);
Expand All @@ -62,9 89,10 @@ module View = {
let item311 =
Menu.Item.create(
~title="Item 3.1.1",
~onClick=menuCallback("Item 1.3"),
~onClick=menuCallback("Item 3.1.1"),
~keyEquivalent=
Menu.KeyEquivalent.ofString("c") |> Menu.KeyEquivalent.enableAlt,
Menu.KeyEquivalent.ofString("c")
|> (ke => Menu.KeyEquivalent.enableAlt(ke, true)),
(),
);

Expand All @@ -73,7 101,7 @@ module View = {
let item312 =
Menu.Item.create(
~title="Item 3.1.2",
~onClick=menuCallback("Item 1.4"),
~onClick=menuCallback("Item 3.1.2"),
(),
);

Expand All @@ -82,7 110,7 @@ module View = {
let item313 =
Menu.Item.create(
~title="Item 3.1.3",
~onClick=menuCallback("Item 1.5"),
~onClick=menuCallback("Item 3.1.3"),
(),
);

Expand Down
28 changes: 23 additions & 5 deletions src/Native/Menu.re
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 8,33 @@ module KeyEquivalent = {
str: string,
alt: bool,
shift: bool,
ctrl: bool,
};

let ofString = str => {str, alt: false, shift: false};
let strToKey = str =>
switch (str) {
| "Space"
| "space" => " "
| "ESC"
| "esc"
| "Escape"
| "escape" => 0x1b |> Char.chr |> String.make(1)
| "TAB"
| "Tab"
| "tab" => "\t"
| key => key
};

let enableAlt = t => {...t, alt: true};
let disableAlt = t => {...t, alt: false};
let ofString = str => {
str: strToKey(str),
alt: false,
shift: false,
ctrl: false,
};

let enableShift = t => {...t, shift: true};
let disableShift = t => {...t, shift: false};
let enableAlt = (t, truth) => {...t, alt: truth};
let enableShift = (t, truth) => {...t, shift: truth};
let enableCtrl = (t, truth) => {...t, ctrl: truth};
};

module Item = {
Expand Down
8 changes: 3 additions & 5 deletions src/Native/Menu.rei
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 5,9 @@ module KeyEquivalent: {

let ofString: string => t;

let enableAlt: t => t;
let disableAlt: t => t;

let enableShift: t => t;
let disableShift: t => t;
let enableAlt: (t, bool) => t;
let enableShift: (t, bool) => t;
let enableCtrl: (t, bool) => t;
};

module Item: {
Expand Down
1 change: 1 addition & 0 deletions src/Native/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 56,7 @@ void convertCamlKeyEquivalent(value vKeyEquivalent, struct KeyEquivalent *keyEqu
keyEquivalent->str = String_val(Field(vKeyEquivalent, 0));
keyEquivalent->alt = Bool_val(Field(vKeyEquivalent, 1));
keyEquivalent->shift = Bool_val(Field(vKeyEquivalent, 2));
keyEquivalent->ctrl = Bool_val(Field(vKeyEquivalent, 3));
}

CAMLprim value revery_menuItemCreate(value vTitle, value vKeyEquivalent) {
Expand Down
1 change: 1 addition & 0 deletions src/Native/menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 4,5 @@ struct KeyEquivalent {
const char *str;
int alt;
int shift;
int ctrl;
};
3 changes: 3 additions & 0 deletions src/Native/menu_cocoa.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 39,9 @@ NSMenuItem *revery_menuItemCreate_cocoa(const char *title, struct KeyEquivalent
if (keyEquivalent->shift) {
modifierFlags |= NSEventModifierFlagShift;
}
if (keyEquivalent->ctrl) {
modifierFlags |= NSEventModifierFlagControl;
}
[nsMenuItem setKeyEquivalentModifierMask:modifierFlags];
}

Expand Down

0 comments on commit d737fcd

Please sign in to comment.