menu.h (2939B)
1 /* 2 * Copyright (c) 2022-2024 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef LTK_MENU_H 18 #define LTK_MENU_H 19 20 #include <stddef.h> 21 22 #include "text.h" 23 #include "widget.h" 24 #include "window.h" 25 26 #define LTK_MENU_SIGNAL_INVALID -1 27 28 #define LTK_MENUENTRY_SIGNAL_PRESSED -1 29 #define LTK_MENUENTRY_SIGNAL_INVALID -2 30 31 struct ltk_menuentry; 32 typedef struct ltk_menuentry ltk_menuentry; 33 34 typedef struct { 35 ltk_widget widget; 36 ltk_menuentry **entries; 37 size_t num_entries; 38 size_t num_alloc; 39 double x_scroll_offset; 40 double y_scroll_offset; 41 int scroll_timer_id; 42 char is_submenu; 43 char was_opened_left; 44 char was_opened_above; 45 /* FIXME: better names */ 46 char popup_submenus; 47 char unpopup_submenus_on_hide; 48 char scroll_top_hover; 49 char scroll_bottom_hover; 50 char scroll_left_hover; 51 char scroll_right_hover; 52 } ltk_menu; 53 54 /* FIXME: maybe need to set entire widget hierarchy to hover state so menu entry 55 is also hover when nested widget is hover? */ 56 57 struct ltk_menuentry { 58 ltk_widget widget; 59 /* FIXME: I guess if the regular label got the ability to 60 change its color, a label could just be used instead of this */ 61 ltk_text_line *text_line; 62 ltk_menu *submenu; 63 }; 64 65 /* FIXME: ltk_orientation for hor/vert! 66 should submenus also allow setting orientation? 67 -> would maybe look weird in some cases */ 68 69 /* FIXME: allow orientation */ 70 ltk_menu *ltk_menu_create(ltk_window *window); 71 ltk_menu *ltk_submenu_create(ltk_window *window); 72 ltk_menuentry *ltk_menuentry_create(ltk_window *window, const char *text); 73 int ltk_menuentry_attach_submenu(ltk_menuentry *e, ltk_menu *submenu); 74 int ltk_menuentry_detach_submenu(ltk_menuentry *e); 75 const char *ltk_menuentry_get_text(ltk_menuentry *entry); 76 int ltk_menu_insert_entry(ltk_menu *menu, ltk_menuentry *entry, size_t idx); 77 int ltk_menu_add_entry(ltk_menu *menu, ltk_menuentry *entry); 78 ltk_menuentry *ltk_menu_remove_entry_index(ltk_menu *menu, size_t idx); 79 int ltk_menu_remove_entry(ltk_menu *menu, ltk_menuentry *entry); 80 void ltk_menu_remove_all_entries(ltk_menu *menu); 81 size_t ltk_menu_get_num_entries(ltk_menu *menu); 82 ltk_menuentry *ltk_menu_get_entry(ltk_menu *menu, size_t idx); 83 size_t ltk_menu_get_entry_index(ltk_menu *menu, ltk_menuentry *entry); 84 85 #endif /* LTK_MENU_H */