static rt_bool_t rtgui_combobox_onmouse_button(struct rtgui_combobox* box, struct rtgui_event_mouse* event) { struct rtgui_rect rect; /* get widget rect */ rect = RTGUI_WIDGET(box)->extent; /* move to the pull down button */ rect.x1 = rect.x2 - RTGUI_COMBOBOX_BUTTON_WIDTH; if (rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK) { /* handle mouse button on pull down button */ if (event->button & RTGUI_MOUSE_BUTTON_LEFT && event->button & RTGUI_MOUSE_BUTTON_DOWN) { box->pd_pressed = RT_TRUE; rtgui_widget_update(RTGUI_WIDGET(box)); } else if (event->button & RTGUI_MOUSE_BUTTON_LEFT && event->button & RTGUI_MOUSE_BUTTON_UP) { box->pd_pressed = RT_FALSE; rtgui_widget_update(RTGUI_WIDGET(box)); /* pop pull down window */ if (box->pd_win == RT_NULL) { rtgui_listbox_t *list; /* create pull down window */ rect = RTGUI_WIDGET(box)->extent; rect.y1 = rect.y2; rect.y2 = rect.y1 + 5 * (2 + rtgui_theme_get_selected_height()); box->pd_win = rtgui_win_create(RT_NULL, "combo", &rect, RTGUI_WIN_STYLE_NO_TITLE); rtgui_win_set_ondeactivate(RTGUI_WIN(box->pd_win), rtgui_combobox_pulldown_hide); /* set user data to parent combobox */ box->pd_win->user_data = (rt_uint32_t)box; /* create list box */ rtgui_rect_inflate(&rect, -1); list = rtgui_listbox_create(box->items, box->items_count, &rect); rtgui_container_add_child(RTGUI_CONTAINER(box->pd_win), RTGUI_WIDGET(list)); rtgui_widget_focus(RTGUI_WIDGET(list)); rtgui_listbox_set_onitem(list, rtgui_combobox_pdwin_onitem); rtgui_win_set_ondeactivate(box->pd_win, rtgui_combobox_pdwin_ondeactive); } /* show combo box pull down window */ rtgui_win_show(RTGUI_WIN(box->pd_win), RT_FALSE); } return RT_TRUE; } return RT_FALSE; }
static void rtgui_filelist_view_menu_pop(rtgui_widget_t *parent) { struct rtgui_win *menu; rtgui_rect_t screen, rect = {0, 0, 140, 85}; rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), &screen); rtgui_rect_moveto_align(&screen, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); menu = rtgui_win_create(RTGUI_WIN(rtgui_widget_get_toplevel(parent)), "Folder Menu", &rect, RTGUI_WIN_STYLE_DESTROY_ON_CLOSE); if (menu != RT_NULL) { rtgui_listbox_t *listbox; /* Pass the pointer to filelist_view via user_data. */ menu->user_data = (rt_uint32_t)parent; rtgui_win_set_ondeactivate(menu, rtgui_filelist_view_on_menu_deactivate); listbox = rtgui_listbox_create(_folder_actions, sizeof(_folder_actions) / sizeof(_folder_actions[0]), &rect); /* Set the item index *before* setup the callback. `set_current_item` * will invoke the "onitem". So just keep it clean when setting the * current item. */ rtgui_listbox_set_current_item(listbox, 0); rtgui_listbox_set_onitem(listbox, rtgui_filelist_view_on_folder_item); rtgui_container_add_child(RTGUI_CONTAINER(menu), RTGUI_WIDGET(listbox)); rtgui_win_show(menu, RT_TRUE); } }
static void rtgui_filelist_view_menu_pop(rtgui_widget_t *parent) { rtgui_win_t *menu; rtgui_listbox_t *listbox; rtgui_rect_t screen, rect = {0, 0, 140, 85}; rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), &screen); rtgui_rect_moveto_align(&screen, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); menu = rtgui_win_create(RTGUI_WIN(rtgui_widget_get_toplevel(parent)), "Folder Menu", &rect, RTGUI_WIN_STYLE_DEFAULT); if (menu != RT_NULL) { /* set user data on menu window */ menu->user_data = (rt_uint32_t)parent; rtgui_win_set_ondeactivate(menu, rtgui_filelist_view_on_menu_deactivate); listbox = rtgui_listbox_create(items, sizeof(items)/sizeof(items[0]), &rect); rtgui_listbox_set_onitem(listbox, rtgui_filelist_view_on_folder_item); rtgui_container_add_child(RTGUI_CONTAINER(menu), RTGUI_WIDGET(listbox)); rtgui_win_show(menu, RT_FALSE); rtgui_widget_focus(RTGUI_WIDGET(listbox)); rtgui_listbox_set_current_item(listbox, 0); } }
static void _rtgui_menu_constructor(rtgui_menu_t *menu) { /* set window style */ RTGUI_WIN(menu)->style = RTGUI_WIN_STYLE_NO_TITLE; /* set deactivate handler */ rtgui_win_set_ondeactivate(RTGUI_WIN(menu), rtgui_menu_on_deactivate); /* set proper of control */ menu->parent_menu = RT_NULL; menu->sub_menu = RT_NULL; menu->items = RT_NULL; menu->items_count = 0; menu->items_list = RT_NULL; menu->on_menupop = RT_NULL; menu->on_menuhide = RT_NULL; }