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
2835struct 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
3848help_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
83107help_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
176209help_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
195247static 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 );
0 commit comments