Skip to content

Commit c823f97

Browse files
paulwkckoutcher
authored andcommitted
Add toggle options to help (#1381)
[tk: fixed grep and alignment of bindings descriptions]
1 parent b0f77a7 commit c823f97

File tree

10 files changed

+96
-47
lines changed

10 files changed

+96
-47
lines changed

include/tig/line.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ struct ref;
8484
_(STAT_UNTRACKED, ""), \
8585
_(HELP_GROUP, ""), \
8686
_(HELP_ACTION, ""), \
87+
_(HELP_TOGGLE, ""), \
8788
_(DIFF_STAT, ""), \
8889
_(PALETTE_0, ""), \
8990
_(PALETTE_1, ""), \

src/help.c

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
#include "tig/argv.h"
1515
#include "tig/view.h"
1616
#include "tig/search.h"
17+
#include "tig/prompt.h"
1718
#include "tig/draw.h"
1819

20+
extern const struct menu_item toggle_menu_items[];
21+
22+
static struct keymap toggle_menu_keymap = {
23+
"toggle", NULL, 0, false
24+
};
25+
1926
/*
2027
* Help backend
2128
*/
@@ -26,8 +33,11 @@ struct help_state {
2633
};
2734

2835
struct help {
29-
struct keymap *keymap;
3036
enum request request;
37+
union {
38+
struct keymap *keymap;
39+
struct menu_item *menu;
40+
} item;
3141
union {
3242
const char *text;
3343
const struct request_info *req_info;
@@ -38,7 +48,7 @@ static bool
3848
help_draw(struct view *view, struct line *line, unsigned int lineno)
3949
{
4050
struct help *help = line->data;
41-
const struct keymap *keymap = help->keymap;
51+
const struct keymap *keymap = help->item.keymap;
4252
struct help_state *state = view->private;
4353

4454
if (line->type == LINE_SECTION) {
@@ -48,6 +58,20 @@ help_draw(struct view *view, struct line *line, unsigned int lineno)
4858
} else if (line->type == LINE_HELP_GROUP || !keymap) {
4959
draw_text(view, line->type, help->data.text);
5060

61+
} else if (line->type == LINE_HELP_TOGGLE) {
62+
struct menu_item *item = help->item.menu;
63+
char key[2];
64+
65+
if (!string_nformat(key, sizeof(key), NULL, "%c", item->hotkey))
66+
return true;
67+
if (draw_field(view, LINE_DEFAULT, key, state->keys_width + 2, ALIGN_RIGHT, false))
68+
return true;
69+
70+
if (draw_field(view, LINE_HELP_ACTION, item->data, state->name_width, ALIGN_LEFT, false))
71+
return true;
72+
73+
draw_formatted(view, LINE_DEFAULT, "Toggle %s", item->text);
74+
5175
} else if (help->request > REQ_RUN_REQUESTS) {
5276
struct run_request *req = get_run_request(help->request);
5377
const char *key = get_keys(keymap, help->request, true);
@@ -83,7 +107,7 @@ static bool
83107
help_grep(struct view *view, struct line *line)
84108
{
85109
struct help *help = line->data;
86-
const struct keymap *keymap = help->keymap;
110+
const struct keymap *keymap = help->item.keymap;
87111

88112
if (line->type == LINE_SECTION) {
89113
const char *text[] = { keymap->name, NULL };
@@ -95,6 +119,15 @@ help_grep(struct view *view, struct line *line)
95119

96120
return grep_text(view, text);
97121

122+
} else if (line->type == LINE_HELP_TOGGLE) {
123+
char key[2];
124+
const char *text[] = { key, help->item.menu->data, "Toggle", help->item.menu->text, NULL };
125+
126+
if (!string_nformat(key, sizeof(key), NULL, "%c", help->item.menu->hotkey))
127+
return false;
128+
129+
return grep_text(view, text);
130+
98131
} else if (help->request > REQ_RUN_REQUESTS) {
99132
struct run_request *req = get_run_request(help->request);
100133
const char *key = get_keys(keymap, help->request, true);
@@ -127,7 +160,7 @@ add_help_line(struct view *view, struct help **help_ptr, struct keymap *keymap,
127160

128161
if (!add_line_alloc(view, &help, type, 0, false))
129162
return false;
130-
help->keymap = keymap;
163+
help->item.keymap = keymap;
131164
if (help_ptr)
132165
*help_ptr = help;
133166
return true;
@@ -145,15 +178,15 @@ help_keys_visitor(void *data, const char *group, struct keymap *keymap,
145178

146179
if (iterator->keymap != keymap) {
147180
iterator->keymap = keymap;
148-
if (!add_help_line(iterator->view, &help, keymap, LINE_SECTION))
181+
if (!add_help_line(view, &help, keymap, LINE_SECTION))
149182
return false;
150183
}
151184

152185
if (keymap->hidden)
153186
return true;
154187

155188
if (group) {
156-
if (!add_help_line(iterator->view, &help, keymap, LINE_HELP_GROUP))
189+
if (!add_help_line(view, &help, keymap, LINE_HELP_GROUP))
157190
return false;
158191
help->data.text = group;
159192
}
@@ -176,6 +209,7 @@ static enum status_code
176209
help_open(struct view *view, enum open_flags flags)
177210
{
178211
struct help_request_iterator iterator = { view };
212+
struct help_state *state = view->private;
179213
struct help *help;
180214

181215
reset_view(view);
@@ -188,8 +222,26 @@ help_open(struct view *view, enum open_flags flags)
188222
return ERROR_OUT_OF_MEMORY;
189223
help->data.text = "";
190224

191-
return foreach_key(help_keys_visitor, &iterator, true)
192-
? SUCCESS : error("Failed to render key bindings");
225+
if (!foreach_key(help_keys_visitor, &iterator, true))
226+
return error("Failed to render key bindings");
227+
228+
if (!add_help_line(view, &help, &toggle_menu_keymap, LINE_SECTION))
229+
return ERROR_OUT_OF_MEMORY;
230+
if (!toggle_menu_keymap.hidden) {
231+
int i;
232+
233+
if (!add_help_line(view, &help, NULL, LINE_HELP_GROUP))
234+
return ERROR_OUT_OF_MEMORY;
235+
help->data.text = "Toggle keys (enter: o <key>):";
236+
237+
for (i = 0; toggle_menu_items[i].data; i++) {
238+
state->name_width = MAX(state->name_width, strlen(toggle_menu_items[i].data));
239+
if (!add_help_line(view, &help, (struct keymap *)&toggle_menu_items[i], LINE_HELP_TOGGLE))
240+
return ERROR_OUT_OF_MEMORY;
241+
}
242+
}
243+
244+
return SUCCESS;
193245
}
194246

195247
static enum request
@@ -200,7 +252,7 @@ help_request(struct view *view, enum request request, struct line *line)
200252
switch (request) {
201253
case REQ_ENTER:
202254
if (line->type == LINE_SECTION) {
203-
struct keymap *keymap = help->keymap;
255+
struct keymap *keymap = help->item.keymap;
204256

205257
keymap->hidden = !keymap->hidden;
206258
refresh_view(view);

src/tig.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,23 @@
8383
_('d', "untracked directory info", "status-show-untracked-dirs"), \
8484
_('|', "view split", "vertical-split"), \
8585

86+
87+
const struct menu_item toggle_menu_items[] = {
88+
#define DEFINE_TOGGLE_MENU(key, help, name) { key, help, name }
89+
TOGGLE_MENU_INFO(DEFINE_TOGGLE_MENU)
90+
{ 0 }
91+
};
92+
8693
static void
8794
toggle_option(struct view *view)
8895
{
89-
const struct menu_item menu[] = {
90-
#define DEFINE_TOGGLE_MENU(key, help, name) { key, help, name }
91-
TOGGLE_MENU_INFO(DEFINE_TOGGLE_MENU)
92-
{ 0 }
93-
};
9496
const char *toggle_argv[] = { "toggle", NULL, NULL };
9597
int i = 0;
9698

97-
if (!prompt_menu("Toggle option", menu, &i))
99+
if (!prompt_menu("Toggle option", toggle_menu_items, &i))
98100
return;
99101

100-
toggle_argv[1] = menu[i].data;
102+
toggle_argv[1] = toggle_menu_items[i].data;
101103
run_prompt_command(view, toggle_argv);
102104
}
103105

test/help/all-keybindings-test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
. libtest.sh
44

5-
export COLUMNS=90
5+
export COLUMNS=100
66
export LINES=130
77

88
steps '

test/help/all-keybindings-test.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,4 @@ External commands:
126126
[-] pager bindings
127127
Internal commands:
128128
@ :/^@@
129-
[help] - line 1 of 128 100%
129+
[help] - line 1 of 147 87%

test/help/default-test

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
. libtest.sh
44

5+
export COLUMNS=100
6+
57
steps '
68
:view-help
79
:save-display help-default.screen
@@ -43,15 +45,15 @@ View switching
4345
h view-help Show help view
4446
View manipulation
4547
<Enter> enter Enter and open selected line
46-
< back Go back to the previous view st
48+
< back Go back to the previous view state
4749
<Down>, <Ctrl-N>, J next Move to next
4850
<Up>, <Ctrl-P>, K previous Move to previous
4951
',' parent Move to parent
5052
<Tab> view-next Move focus to the next view
5153
R, <F5> refresh Reload and refresh view
5254
O maximize Maximize the current view
5355
q view-close Close the current view
54-
[help] - line 1 of 128 21%
56+
[help] - line 1 of 147 19%
5557
EOF
5658

5759
assert_equals 'help-search.screen' <<EOF
@@ -75,15 +77,15 @@ View switching
7577
h view-help Show help view
7678
View manipulation
7779
<Enter> enter Enter and open selected line
78-
< back Go back to the previous view st
80+
< back Go back to the previous view state
7981
<Down>, <Ctrl-N>, J next Move to next
8082
<Up>, <Ctrl-P>, K previous Move to previous
8183
',' parent Move to parent
8284
<Tab> view-next Move focus to the next view
8385
R, <F5> refresh Reload and refresh view
8486
O maximize Maximize the current view
8587
q view-close Close the current view
86-
[help] - line 19 of 128 21%
88+
[help] - line 19 of 147 19%
8789
EOF
8890

8991
assert_equals 'help-collapsed.screen' <<EOF
@@ -115,5 +117,5 @@ External commands:
115117
External commands:
116118
C ?git checkout %(branch)
117119
! ?git branch -D %(branch)
118-
[help] - line 4 of 55 50%
120+
[help] - line 4 of 74 37%
119121
EOF

test/help/user-command-test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,5 @@ Searching
5555
[-] main bindings
5656
Cursor navigation
5757
G move-last-line Move cursor to last line
58-
[help] - line 81 of 148 72%
58+
[help] - line 81 of 167 64%
5959
EOF

test/tigrc/env-vars-test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,5 @@ Quick reference for tig keybindings:
3535
[-] generic bindings
3636
Misc
3737
: prompt Open the prompt
38-
[help] - line 1 of 5 100%
38+
[help] - line 1 of 24 20%
3939
EOF

test/tigrc/parse-test

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
. libtest.sh
66

7+
export LINES=20
8+
79
tigrc <<EOF
810
s # Unknown command
911
set # Missing name, equals and value
@@ -123,16 +125,6 @@ External commands:
123125
4 <quitting command
124126
5 +echoed command
125127
0 @?<+all modifiers
126-
127-
128-
129-
130-
131-
132-
133-
134-
135-
136-
137-
[help] - line 1 of 17 100%
128+
[-] toggle bindings
129+
[help] - line 1 of 36 50%
138130
EOF

test/tigrc/source-test

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
. libtest.sh
44

5-
LINES=9
5+
export LINES=9
66

77
# Disable built-in configuration
88
export TIGRC_SYSTEM=does-not-exist
@@ -28,7 +28,7 @@ View manipulation
2828
q quit Close all views and quit
2929
Misc
3030
: prompt Open the prompt
31-
[help] - line 1 of 7 100%
31+
[help] - line 1 of 26 26%
3232
EOF
3333

3434
test_case source-file-quietly \
@@ -48,7 +48,7 @@ View manipulation
4848
q quit Close all views and quit
4949
Misc
5050
: prompt Open the prompt
51-
[help] - line 1 of 7 100%
51+
[help] - line 1 of 26 26%
5252
EOF
5353

5454
test_case source-nonexistent-file \
@@ -68,9 +68,9 @@ Quick reference for tig keybindings:
6868
[-] generic bindings
6969
Misc
7070
: prompt Open the prompt
71-
72-
73-
[help] - line 1 of 5 100%
71+
[-] toggle bindings
72+
Toggle keys (enter: o <key>):
73+
[help] - line 1 of 24 29%
7474
EOF
7575

7676
test_case source-nonexistent-file-quietly \
@@ -88,9 +88,9 @@ Quick reference for tig keybindings:
8888
[-] generic bindings
8989
Misc
9090
: prompt Open the prompt
91-
92-
93-
[help] - line 1 of 5 100%
91+
[-] toggle bindings
92+
Toggle keys (enter: o <key>):
93+
[help] - line 1 of 24 29%
9494
EOF
9595

9696
test_case source-tilde-path \
@@ -110,7 +110,7 @@ View manipulation
110110
q quit Close all views and quit
111111
Misc
112112
: prompt Open the prompt
113-
[help] - line 1 of 7 100%
113+
[help] - line 1 of 26 26%
114114
EOF
115115

116116
run_test_cases

0 commit comments

Comments
 (0)