Lines Matching refs:menu
32 #include <menu.h>
40 _menui_calc_neighbours(MENU *menu, int item_no);
41 static void _menui_redraw_menu(MENU *menu, int old_top_row, int old_cur_item);
44 * Link all the menu items together to speed up navigation. We need
51 _menui_stitch_items(MENU *menu)
55 row_major = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
57 if (menu->posted == 1)
59 if (menu->items == NULL)
62 menu->item_rows = menu->item_count / menu->cols;
63 menu->item_cols = menu->cols;
64 if (menu->item_count > (menu->item_rows * menu->item_cols))
65 menu->item_rows += 1;
67 _menui_max_item_size(menu);
69 for (i = 0; i < menu->item_count; i++) {
72 menu->items[i]->row = i / menu->item_cols;
73 menu->items[i]->col = i % menu->item_cols;
75 menu->items[i]->row = i % menu->item_rows;
76 menu->items[i]->col = i / menu->item_rows;
79 _menui_calc_neighbours(menu, i);
86 * Calculate the neighbours for an item in menu.
89 _menui_calc_neighbours(MENU *menu, int item_no)
94 row_major = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
95 cycle = ((menu->opts & O_NONCYCLIC) != O_NONCYCLIC);
96 item = menu->items[item_no];
98 if (menu->item_rows < 2) {
109 if (menu->item_cols < 2) {
113 menu->items[menu->item_count - 1];
117 item->up = menu->items[item_no - 1];
123 (menu->item_rows - 1) * menu->item_cols
125 if (neighbour >= menu->item_count)
126 neighbour -= menu->item_cols;
129 neighbour = item_no - menu->item_cols;
132 neighbour = menu->item_rows * item->col
133 + menu->item_rows - 1;
134 if (neighbour >= menu->item_count)
135 neighbour = menu->item_count - 1;
142 item->up = menu->items[neighbour];
148 if (menu->item_cols < 2) {
149 if (item_no == (menu->item_count - 1)) {
151 item->down = menu->items[0];
155 item->down = menu->items[item_no + 1];
159 if (item->row == menu->item_rows - 1) {
163 neighbour = item_no + menu->item_cols;
164 if (neighbour >= menu->item_count) {
170 if (item->row == menu->item_rows - 1) {
171 neighbour = item->col * menu->item_rows;
175 if (neighbour >= menu->item_count) {
177 * menu->item_rows;
183 item->down = menu->items[neighbour];
189 if (menu->item_cols < 2) {
199 if (menu->item_rows < 2) {
203 menu->items[menu->item_count - 1];
207 item->left = menu->items[item_no - 1];
212 neighbour = item_no + menu->cols - 1;
213 if (neighbour >= menu->item_count)
214 neighbour = menu->item_count - 1;
220 neighbour = menu->item_rows
221 * (menu->item_cols - 1) + item->row;
222 if (neighbour >= menu->item_count)
223 neighbour -= menu->item_rows;
226 neighbour = item_no - menu->item_rows;
229 item->left = menu->items[neighbour];
235 if (menu->item_rows < 2) {
236 if (item_no == menu->item_count - 1) {
238 item->right = menu->items[0];
242 item->right = menu->items[item_no + 1];
246 if (item->col == menu->item_cols - 1) {
247 neighbour = item_no - menu->item_cols
250 } else if (item_no == menu->item_count - 1) {
251 neighbour = item->row * menu->item_cols;
256 if (item->col == menu->item_cols - 1) {
260 neighbour = item_no + menu->item_rows;
261 if (neighbour >= menu->item_count) {
268 item->right = menu->items[neighbour];
276 * Goto the item pointed to by item and adjust the menu structure
280 _menui_goto_item(MENU *menu, ITEM *item, int new_top_row)
282 int old_top_row = menu->top_row, old_cur_item = menu->cur_item;
284 /* If we get a null then the menu is not cyclic so deny request */
288 menu->in_init = 1;
289 if (menu->top_row != new_top_row) {
290 if ((menu->posted == 1) && (menu->menu_term != NULL))
291 menu->menu_term(menu);
292 menu->top_row = new_top_row;
294 if ((menu->posted == 1) && (menu->menu_init != NULL))
295 menu->menu_init(menu);
299 if (menu->cur_item != item->index) {
301 if ((menu->posted == 1) && (menu->item_term != NULL))
302 menu->item_term(menu);
304 menu->cur_item = item->index;
305 menu->cur_row = item->row;
306 menu->cur_col = item->col;
308 if (menu->posted == 1)
309 _menui_redraw_menu(menu, old_top_row, old_cur_item);
311 if ((menu->posted == 1) && (menu->item_init != NULL))
312 menu->item_init(menu);
316 menu->in_init = 0;
322 * by iterating over the menu items. If a match is found return E_OK
326 _menui_match_items(MENU *menu, int direction, int *item_matched)
330 caseless = ((menu->opts & O_IGNORECASE) == O_IGNORECASE);
332 i = menu->cur_item;
334 if (++i >= menu->item_count) i = 0;
336 if (--i < 0) i = menu->item_count - 1;
341 if (menu->items[i]->name.length >= menu->plen) {
344 if (strncasecmp(menu->items[i]->name.string,
345 menu->pattern,
346 (size_t) menu->plen) == 0) {
348 menu->match_len = menu->plen;
352 if (strncmp(menu->items[i]->name.string,
353 menu->pattern,
354 (size_t) menu->plen) == 0) {
356 menu->match_len = menu->plen;
364 if (++i >= menu->item_count) i = 0;
366 if (--i <= 0) i = menu->item_count - 1;
368 } while (i != menu->cur_item);
370 menu->match_len = 0; /* match did not succeed - kill the match len. */
382 _menui_match_pattern(MENU *menu, int c, int direction, int *item_matched)
384 if (menu == NULL)
386 if (menu->items == NULL)
388 if (*menu->items == NULL)
393 if ((menu->pattern = (char *)
394 realloc(menu->pattern,
395 menu->plen + sizeof(char) +
396 ((menu->plen > 0)? 0 : 1)))
399 menu->pattern[menu->plen] = c;
400 menu->pattern[++menu->plen] = '\0';
404 if (menu->plen >= menu->max_item_width) {
405 menu->pattern[--menu->plen] = '\0';
409 if (_menui_match_items(menu, direction,
411 menu->pattern[--menu->plen] = '\0';
416 if (_menui_match_items(menu, direction,
429 _menui_draw_item(MENU *menu, int item)
433 mark_len = max(menu->mark.length, menu->unmark.length);
435 wmove(menu->scrwin,
436 menu->items[item]->row - menu->top_row,
437 menu->items[item]->col * (menu->col_width + 1));
439 if (menu->cur_item == item)
440 wattrset(menu->scrwin, menu->fore);
441 if ((menu->items[item]->opts & O_SELECTABLE) != O_SELECTABLE)
442 wattron(menu->scrwin, menu->grey);
444 /* deal with the menu mark, if one is set.
446 * all others unless the menu unmark string is set in which
449 if ((menu->items[item]->selected == 1) ||
450 (((menu->opts & O_ONEVALUE) == O_ONEVALUE) &&
451 (menu->cur_item == item))) {
452 if (menu->mark.string != NULL) {
453 for (j = 0; j < menu->mark.length; j++) {
454 waddch(menu->scrwin,
455 menu->mark.string[j]);
459 for (j = menu->mark.length; j < mark_len; j++)
460 waddch(menu->scrwin, ' ');
462 if (menu->unmark.string != NULL) {
463 for (j = 0; j < menu->unmark.length; j++) {
464 waddch(menu->scrwin,
465 menu->unmark.string[j]);
469 for (j = menu->unmark.length; j < mark_len; j++)
470 waddch(menu->scrwin, ' ');
473 /* add the menu name */
474 for (j=0; j < menu->items[item]->name.length; j++)
475 waddch(menu->scrwin,
476 menu->items[item]->name.string[j]);
478 pad_len = menu->col_width - menu->items[item]->name.length
480 if ((menu->opts & O_SHOWDESC) == O_SHOWDESC) {
481 pad_len -= menu->items[item]->description.length - 1;
483 waddch(menu->scrwin, menu->pad);
484 for (j = 0; j < menu->items[item]->description.length; j++) {
485 waddch(menu->scrwin,
486 menu->items[item]->description.string[j]);
490 waddch(menu->scrwin, ' ');
492 menu->items[item]->visible = 1;
495 wattrset(menu->scrwin, menu->back);
499 * odd if the menu items are inverse because the spacings do not
502 if ((menu->items[item]->col > 0) &&
503 (menu->items[item]->col < (menu->item_cols - 1))) {
504 wmove(menu->scrwin,
505 menu->items[item]->row - menu->top_row,
506 menu->items[item]->col * (menu->col_width + 1) - 1);
507 waddch(menu->scrwin, ' ');
511 pos_menu_cursor(menu);
515 * Draw the menu in the subwindow provided.
518 _menui_draw_menu(MENU *menu)
523 rowmajor = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
527 incr = menu->item_cols;
529 stride = menu->item_rows;
534 for (i = 0; i < menu->item_count; i += incr) {
535 if (menu->items[i]->row == menu->top_row)
538 for (j = 0; j < menu->item_cols; j++) {
540 if (offset >= menu->item_count)
542 menu->items[offset]->visible = 0;
546 wmove(menu->scrwin, 0, 0);
548 menu->col_width = getmaxx(menu->scrwin) / menu->cols;
550 for (cur_row = 0; cur_row < menu->rows; cur_row++) {
551 for (j = 0; j < menu->cols; j++) {
553 if (offset >= menu->item_count) {
555 wattrset(menu->scrwin, menu->back);
557 row = menu->items[menu->item_count - 1]->row;
560 wmove(menu->scrwin, cur_row,
561 j * (menu->col_width + 1));
562 for (k = 0; k < menu->col_width; k++)
563 waddch(menu->scrwin, ' ');
565 _menui_draw_item(menu, offset);
573 if (row_count < menu->item_rows) {
574 for (cur_row = row_count; cur_row < menu->item_rows; cur_row++) {
575 for (j = 0; j < menu->item_cols; j++) {
577 if (offset >= menu->item_count)
579 menu->items[offset]->visible = 0;
590 * Calculate the widest menu item and stash it in the menu struct.
594 _menui_max_item_size(MENU *menu)
598 with_desc = ((menu->opts & O_SHOWDESC) == O_SHOWDESC);
600 for (i = 0; i < menu->item_count; i++) {
601 width = menu->items[i]->name.length
602 + max(menu->mark.length, menu->unmark.length);
604 width += menu->items[i]->description.length + 1;
606 menu->max_item_width = max(menu->max_item_width, width);
612 * Redraw the menu on the screen. If the current item has changed then
616 _menui_redraw_menu(MENU *menu, int old_top_row, int old_cur_item)
619 if (menu->top_row != old_top_row) {
620 /* top row changed - redo the whole menu
626 wclear(menu->scrwin);
627 _menui_draw_menu(menu);
629 if (menu->cur_item != old_cur_item) {
631 _menui_draw_item(menu, old_cur_item);
634 _menui_draw_item(menu, menu