Esempio n. 1
0
void rtgui_menu_pop(struct rtgui_menu* menu, int x, int y)
{
	rtgui_rect_t rect;
	struct rtgui_event_resize eresize;

	if (menu == RT_NULL) return;

	/* set window extent */
	rect.x1 = 0; rect.y1 = 0;
	rect.x2 = 100; rect.y2 = menu->items_count * (rtgui_theme_get_selected_height() + 2) + 5;
	rtgui_rect_moveto(&rect, x, y);
	rtgui_win_set_rect(RTGUI_WIN(menu), &rect);
	rtgui_rect_inflate(&rect, -1);
	rtgui_widget_set_rect(RTGUI_WIDGET(menu->items_list), &rect);

	eresize.parent.type = RTGUI_EVENT_RESIZE;
	eresize.x = rect.x1; eresize.y = rect.y1;
	eresize.h = rect.y2 - rect.y1; eresize.w = rect.x2 - rect.x1;
	rtgui_listctrl_event_handler(RTGUI_WIDGET(menu->items_list), &(eresize.parent));

	/* on menu pop handler */
	if (menu->on_menupop != RT_NULL)
	{
		menu->on_menupop(RTGUI_WIDGET(menu), RT_NULL);
	}

	/* show menu window */
	rtgui_win_show(RTGUI_WIN(menu), RT_FALSE);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
    }
}
Esempio n. 4
0
rt_bool_t on_window_close(struct rtgui_object* object, struct rtgui_event* event)
{
	rt_kprintf("win %s(%p) closing\n",
			rtgui_win_get_title(RTGUI_WIN(object)),
			object);
	return RT_TRUE;
}
static rt_bool_t _rtgui_menu_onitem(struct rtgui_object* object, struct rtgui_event* event)
{
	struct rtgui_menu* menu;

	/* event will be NULL, don't check it. */
	RT_ASSERT(object);

	/* get menu */
	menu = RTGUI_MENU(rtgui_widget_get_toplevel(RTGUI_WIDGET(object)));
	if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU)
	{
		const rtgui_menu_item_t* items;
		rt_uint16_t count;
		rtgui_rect_t item_rect;

		items = (rtgui_menu_item_t*)menu->items[menu->items_list->current_item].submenu;
		count = menu->items[menu->items_list->current_item].submenu_count;
		if (menu->sub_menu != RT_NULL)
		{
			if (menu->sub_menu->items == items)
			{
				if (!RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(menu->sub_menu)))
				{
					/* hide this sub menu */
					rtgui_win_hiden(RTGUI_WIN(menu->sub_menu));
					return RT_FALSE;
				}

				/* show this sub menu */
				rtgui_listctrl_get_item_rect(menu->items_list, menu->items_list->current_item, &item_rect);
				rtgui_menu_pop(menu->sub_menu, item_rect.x2, item_rect.y1);
				return RT_FALSE;
			}

			/* delete sub menu */
			rtgui_menu_destroy(menu->sub_menu);
			menu->sub_menu = RT_NULL;
		}

		/* create sub menu */
		menu->sub_menu = rtgui_menu_create("submenu", menu, items, count);

		rtgui_listctrl_get_item_rect(menu->items_list, menu->items_list->current_item, &item_rect);
		rtgui_menu_pop(menu->sub_menu, item_rect.x2 + 5, item_rect.y1);
	}
	else /* other menu item */
	{
		/* invoke action */
		if (menu->items[menu->items_list->current_item].on_menuaction != RT_NULL)
			menu->items[menu->items_list->current_item].on_menuaction(RTGUI_OBJECT(menu), RT_NULL);

		/* hide sub-menu */
		if (menu->sub_menu != RT_NULL)
		{
			rtgui_menu_hiden(menu->sub_menu);
		}
		rtgui_menu_hiden(menu);
	}
	return RT_FALSE;
}
Esempio n. 6
0
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);
	}
}
Esempio n. 7
0
rtgui_win_t* rtgui_win_create(struct rtgui_win* parent_window,
		                      const char* title,
							  rtgui_rect_t *rect,
							  rt_uint16_t style)
{
	struct rtgui_win* win;

	/* allocate win memory */
	win = RTGUI_WIN(rtgui_widget_create(RTGUI_WIN_TYPE));
	if (win == RT_NULL)
		return RT_NULL;

	/* set parent toplevel */
	win->parent_window = parent_window;

	/* set title, rect and style */
	if (title != RT_NULL)
		win->title = rt_strdup(title);
	else
		win->title = RT_NULL;

	rtgui_widget_set_rect(RTGUI_WIDGET(win), rect);
	win->style = style;

	if (_rtgui_win_create_in_server(win) == RT_FALSE)
	{
		goto __on_err;
	}
	return win;

__on_err:
	rtgui_widget_destroy(RTGUI_WIDGET(win));
	return RT_NULL;
}
static rt_bool_t rtgui_combobox_pulldown_hide(struct rtgui_object* object, struct rtgui_event* event)
{
    struct rtgui_widget *widget;
    struct rtgui_combobox *box;

    RT_ASSERT(object != RT_NULL);
    RT_ASSERT(event != RT_NULL);

    widget = RTGUI_WIDGET(object);
    box = RTGUI_COMBOBOX(object);

    if (widget == RT_NULL) return RT_TRUE;

    box = (struct rtgui_combobox*) (((struct rtgui_win*)widget)->user_data);
    if (box == RT_NULL) return RT_TRUE;

    /* hide pull down window */
    rtgui_win_hiden(RTGUI_WIN(box->pd_win));

    /* clear pull down button state */
    box->pd_pressed = RT_FALSE;
    rtgui_widget_update(RTGUI_WIDGET(box));

    return RT_TRUE;
}
Esempio n. 9
0
void rtgui_menu_hiden(struct rtgui_menu* menu)
{
	rtgui_win_hiden(RTGUI_WIN(menu));

	if (menu->parent_menu != RT_NULL)
		rtgui_menu_hiden(menu->parent_menu);
}
Esempio n. 10
0
void rtgui_win_end_modal(struct rtgui_win* win, rtgui_modal_code_t modal_code)
{
	if (win->parent_toplevel != RT_NULL)
	{
		if (RTGUI_IS_WORKBENCH(win->parent_toplevel))
		{
			rtgui_workbench_t* workbench;

			/* which is shown under workbench */
			workbench = RTGUI_WORKBENCH(win->parent_toplevel);
			workbench->modal_code = modal_code;
			workbench->flag &= ~RTGUI_WORKBENCH_FLAG_MODAL_MODE;
		}
		else if (RTGUI_IS_WIN(win->parent_toplevel))
		{
			rtgui_win_t* parent_win;

			/* which is shown under win */
			parent_win = RTGUI_WIN(win->parent_toplevel);
			parent_win->modal_code = modal_code;
			parent_win->style &= ~RTGUI_WIN_STYLE_UNDER_MODAL;		
		}
	}
	else
	{
		/* which is a stand alone window */
		win->modal_code = modal_code;
	}

	/* remove modal mode */
	win->style &= ~RTGUI_WIN_STYLE_MODAL;
}
Esempio n. 11
0
struct rtgui_menu* rtgui_menu_create(const char* title, struct rtgui_menu* parent_menu, 
	const struct rtgui_menu_item* items, rt_uint16_t count)
{
	rtgui_rect_t rect = {0, 0, 100, 100};
    struct rtgui_menu* menu;

    menu = (struct rtgui_menu*) rtgui_widget_create ( RTGUI_MENU_TYPE );
	if (menu != RT_NULL)
	{
		rtgui_win_set_title(RTGUI_WIN(menu), title);
		menu->parent_menu = parent_menu;
		menu->items = items;
		menu->items_count = count;

		rtgui_widget_set_rect(RTGUI_WIDGET(menu), &rect);
		rtgui_rect_inflate(&rect, -1);
		/* create menu item list */
		menu->items_list = rtgui_listctrl_create((rt_uint32_t)items, count, &rect, _rtgui_menu_item_ondraw); 
		RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(menu->items_list)) = rtgui_theme_default_bc();
		rtgui_container_add_child(RTGUI_CONTAINER(menu), RTGUI_WIDGET(menu->items_list));
		rtgui_listctrl_set_onitem(menu->items_list, _rtgui_menu_onitem);
	}

	return menu;
}
static rt_bool_t rtgui_menu_on_deactivate(struct rtgui_object *object, rtgui_event_t* event)
{
	rtgui_menu_t* menu;
	RTGUI_WIDGET_EVENT_HANDLER_PREPARE

	menu = RTGUI_MENU(object);
	if (menu->parent_menu != RT_NULL)
	{
		/* whether click on parent menu */
		if (rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_TRUE &&
			menu->parent_menu->items[menu->parent_menu->items_list->current_item].submenu
				== (struct rtgui_menu_item_t *)menu->items)
			return RT_TRUE;
	}

	/* submenu is activate */
	if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU)
	{
		/* if sub menu activated, not hide menu. But we cannot use the
		 * activated flag as criteria since the old window is deactivated
		 * before the new window got activated. But the window will be shown in
		 * this context, so use 'is not hide'. */
		if (menu->sub_menu != RT_NULL &&
			!RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(menu->sub_menu)))
			return RT_TRUE;
	}

	rtgui_win_hiden(RTGUI_WIN(menu));
	if (menu->on_menuhide != RT_NULL)
	{
		menu->on_menuhide(RTGUI_OBJECT(menu), RT_NULL);
	}

	/* un-select item */
	menu->items_list->current_item = -1;

	/* if it's a submenu, try to hide parent menu */
	if (menu->parent_menu != RT_NULL &&
		rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_FALSE)
	{
		rtgui_menu_on_deactivate(RTGUI_OBJECT(menu->parent_menu), event);
	}

	return RT_TRUE;
}
void rtgui_menu_hiden(struct rtgui_menu* menu)
{
	rtgui_win_hiden(RTGUI_WIN(menu));
	/* un-select item */
	menu->items_list->current_item = -1;

	if (menu->parent_menu != RT_NULL)
		rtgui_menu_hiden(menu->parent_menu);
}
Esempio n. 14
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;
}
Esempio n. 15
0
static void demo_close_ntitle_window(struct rtgui_object *object, rtgui_event_t *event)
{
    rtgui_win_t *win;

    /* 获得最顶层控件 */
    win = RTGUI_WIN(rtgui_widget_get_toplevel(RTGUI_WIDGET(object)));

    /* 销毁窗口 */
    rtgui_win_destroy(win);
}
Esempio n. 16
0
/* 窗口关闭时的事件处理 */
void window_demo_close(struct rtgui_widget* widget, rtgui_event_t *even)
{
	rtgui_win_t* win;

	/* 获得最顶层控件 */
	win = RTGUI_WIN(rtgui_widget_get_toplevel(widget));

	/* 销毁窗口 */
	rtgui_win_destroy(win);
}
Esempio n. 17
0
static rt_bool_t rtgui_filelist_view_on_menu_deactivate(rtgui_object_t *object, struct rtgui_event *event)
{
    rtgui_win_t *menu;
    menu = RTGUI_WIN(rtgui_widget_get_toplevel(RTGUI_WIDGET(object)));

    /* destroy menu window */
    rtgui_win_destroy(menu);

    return RT_TRUE;
}
Esempio n. 18
0
static rt_bool_t rtgui_menu_on_deactivate(rtgui_widget_t* widget, rtgui_event_t* event)
{
	rtgui_menu_t* menu = (rtgui_menu_t*) widget;

	if (menu->parent_menu != RT_NULL)
	{
		/* whether click on parent menu */
		if (rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_TRUE &&
			menu->parent_menu->items[menu->parent_menu->items_list->current_item].submenu == (struct rtgui_menu_item_t *)menu->items)
			return RT_TRUE;
	}

	/* submenu is activate */
	if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU)
	{
		/* if sub menu activated, not hide menu */
		if (menu->sub_menu != RT_NULL && 
			rtgui_win_is_activated(RTGUI_WIN(menu->sub_menu)) == RT_TRUE)
			return RT_TRUE;
	}

	rtgui_win_hiden(RTGUI_WIN(menu));
	if (menu->on_menuhide != RT_NULL)
	{
		menu->on_menuhide(RTGUI_WIDGET(menu), RT_NULL);
	}

	/* un-select item */
	menu->items_list->current_item = -1;

	/* if it's a submenu, try to hide parent menu */
	if (menu->parent_menu != RT_NULL &&
		rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_FALSE)
	{
		rtgui_menu_on_deactivate(RTGUI_WIDGET(menu->parent_menu), event);
	}

	return RT_TRUE;
}
Esempio n. 19
0
rtgui_win_t* rtgui_win_create(struct rtgui_win* parent_window,
                              const char* title,
                              rtgui_rect_t *rect,
                              rt_uint16_t style)
{
    struct rtgui_win* win;

    /* allocate win memory */
    win = RTGUI_WIN(rtgui_widget_create(RTGUI_WIN_TYPE));
    if (win == RT_NULL)
        return RT_NULL;

    /* set parent toplevel */
#ifdef RTGUI_USING_DESKTOP_WINDOW
    if (style & RTGUI_WIN_STYLE_DESKTOP)
    {
        RT_ASSERT(the_desktop_window == RT_NULL);
        win->parent_window = RT_NULL;
        the_desktop_window = win;
    }
    else if (parent_window == RT_NULL)
    {
        RT_ASSERT(the_desktop_window != RT_NULL);
        win->parent_window = the_desktop_window;
    }
    else
        win->parent_window = parent_window;
#else
    win->parent_window = parent_window;
#endif

    /* set title, rect and style */
    if (title != RT_NULL)
        win->title = rt_strdup(title);
    else
        win->title = RT_NULL;

    rtgui_widget_set_rect(RTGUI_WIDGET(win), rect);
    win->style = style;

    if (_rtgui_win_create_in_server(win) == RT_FALSE)
    {
        goto __on_err;
    }
    return win;

__on_err:
    rtgui_widget_destroy(RTGUI_WIDGET(win));
    return RT_NULL;
}
Esempio n. 20
0
void rtgui_combobox_pdwin_onitem(struct rtgui_widget* widget, struct rtgui_event* event)
{
	rtgui_win_t* pd_win;
	rtgui_combobox_t* combo;
	rtgui_listbox_t* list;

	list = RTGUI_LISTBOX(widget);
	pd_win = RTGUI_WIN(rtgui_widget_get_toplevel(widget));
	combo = RTGUI_COMBOBOX(pd_win->user_data);
	combo->current_item = list->current_item;

	if (combo->on_selected != RT_NULL)
		combo->on_selected(RTGUI_WIDGET(combo), RT_NULL);

	rtgui_win_hiden(pd_win);
	rtgui_widget_update(RTGUI_WIDGET(combo));

	return ;
}
rt_bool_t rtgui_combobox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
    struct rtgui_combobox *box;
    RTGUI_WIDGET_EVENT_HANDLER_PREPARE

    box = RTGUI_COMBOBOX(object);

    switch (event->type)
    {
    case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
        if (widget->on_draw != RT_NULL)
            widget->on_draw(RTGUI_OBJECT(widget), event);
        else
#endif
            rtgui_combobox_ondraw(box);

        break;

    case RTGUI_EVENT_MOUSE_BUTTON:
        return rtgui_combobox_onmouse_button(box, (struct rtgui_event_mouse*)event);

    case RTGUI_EVENT_FOCUSED:
    {
        /* item focused */
        struct rtgui_event_focused* focused;

        focused = (struct rtgui_event_focused*) event;

        if (focused->widget != RT_NULL)
        {
            /* hide pull down window */
            rtgui_win_hiden(RTGUI_WIN(box->pd_win));
            rtgui_combobox_ondraw(box);
        }
    }
    break;
    default:
        return rtgui_widget_event_handler(object, event);
    }

    return RT_FALSE;
}
Esempio n. 22
0
static rt_bool_t rtgui_filelist_view_on_folder_item(rtgui_object_t *object, struct rtgui_event *event)
{
    rtgui_win_t *menu;
    rtgui_listbox_t *listbox;
    rtgui_filelist_view_t *view;

    listbox = RTGUI_LISTBOX(object);
    menu = RTGUI_WIN(rtgui_widget_get_toplevel(RTGUI_WIDGET(object)));
    view = RTGUI_FILELIST_VIEW(menu->user_data);

    /* hide window */
    rtgui_win_hide(menu);

    switch (listbox->current_item)
    {
    case 0:
    {
        char *dir_ptr;

        /* destroy menu window */
        rtgui_win_destroy(menu);

        dir_ptr = (char *) rtgui_malloc(256);
        rtgui_filelist_view_get_fullpath(view, dir_ptr, 256);
        rtgui_filelist_view_set_directory(view, dir_ptr);
        rtgui_free(dir_ptr);
    }
    break;
    case 1:
        /* destroy menu window */
        rtgui_win_destroy(menu);
        break;

    default:
        /* destroy menu window */
        rtgui_win_destroy(menu);
        break;
    }

    return RT_TRUE;
}
Esempio n. 23
0
rt_bool_t rtgui_combobox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
	struct rtgui_combobox* box = (struct rtgui_combobox*)widget;

	switch (event->type)
	{
	case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
		if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
		else
#endif
			rtgui_combobox_ondraw(box);

		break;

	case RTGUI_EVENT_MOUSE_BUTTON:
		return rtgui_combobox_onmouse_button(box, (struct rtgui_event_mouse*)event);

	case RTGUI_EVENT_FOCUSED:
		{
			/* item focused */
			struct rtgui_item* item;
			struct rtgui_event_focused* focused;

			focused = (struct rtgui_event_focused*) event;

			item = (struct rtgui_item*) (focused->widget);
			if (item != RT_NULL)
			{
				/* hide pull down window */
				rtgui_win_hiden(RTGUI_WIN(box->pd_win));
				rtgui_combobox_ondraw(box);
			}
		}
		break;
	}

	return RT_FALSE;
}
rt_bool_t rtgui_combobox_pdwin_onitem(struct rtgui_object* object, struct rtgui_event* event)
{
    struct rtgui_widget *widget;
    rtgui_win_t* pd_win;
    rtgui_combobox_t* combo;
    rtgui_listbox_t* list;

    RT_ASSERT(object != RT_NULL);

    widget = RTGUI_WIDGET(object);
    list = RTGUI_LISTBOX(widget);
    pd_win = RTGUI_WIN(rtgui_widget_get_toplevel(widget));
    combo = RTGUI_COMBOBOX(pd_win->user_data);
    combo->current_item = list->current_item;

    if (combo->on_selected != RT_NULL)
        combo->on_selected(RTGUI_OBJECT(combo), RT_NULL);

    rtgui_win_hiden(pd_win);
    rtgui_widget_update(RTGUI_WIDGET(combo));

    return RT_FALSE;
}
Esempio n. 25
0
struct rtgui_win *rtgui_app_get_main_win(struct rtgui_app *app)
{
    return RTGUI_WIN(app->main_object);
}
Esempio n. 26
0
rt_bool_t rtgui_win_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
    struct rtgui_win* win;

    RT_ASSERT(object != RT_NULL);
    RT_ASSERT(event != RT_NULL);

    win = RTGUI_WIN(object);

    switch (event->type)
    {
    case RTGUI_EVENT_WIN_SHOW:
        rtgui_win_show(win, RT_FALSE);
        break;

    case RTGUI_EVENT_WIN_HIDE:
        rtgui_win_hiden(win);
        break;

    case RTGUI_EVENT_WIN_CLOSE:
        _rtgui_win_deal_close(win, event);
        /* don't broadcast WIN_CLOSE event to others */
        return RT_TRUE;

    case RTGUI_EVENT_WIN_MOVE:
    {
        struct rtgui_event_win_move* emove = (struct rtgui_event_win_move*)event;

        /* move window */
        rtgui_win_move(win, emove->x, emove->y);
    }
    break;

    case RTGUI_EVENT_WIN_ACTIVATE:
        if (RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(win)))
        {
            /* activate a hide window */
            return RT_TRUE;
        }

        win->flag |= RTGUI_WIN_FLAG_ACTIVATE;
#ifndef RTGUI_USING_SMALL_SIZE
        if (RTGUI_WIDGET(object)->on_draw != RT_NULL)
            RTGUI_WIDGET(object)->on_draw(object, event);
        else
#endif
            rtgui_widget_update(RTGUI_WIDGET(win));

        if (win->on_activate != RT_NULL)
        {
            win->on_activate(RTGUI_OBJECT(object), event);
        }
        break;

    case RTGUI_EVENT_WIN_DEACTIVATE:
        if (win->flag & RTGUI_WIN_FLAG_MODAL)
        {
            /* FIXME: make modal concept clear and easy. See the comment of
             * rtgui_topwin_modal_enter. */
            /* There are various reason that a modal window got deactivated:
             *     1, it has child windows and the user activate one of them.
             *     2, the application has more than one root window and the
             *     user switched to one of the others.
             *
             * In any of the cases, we have nothing to do here.
             */
        }
        else
        {
            win->flag &= ~RTGUI_WIN_FLAG_ACTIVATE;
#ifndef RTGUI_USING_SMALL_SIZE
            if (RTGUI_WIDGET(object)->on_draw != RT_NULL)
                RTGUI_WIDGET(object)->on_draw(object, event);
            else
#endif
                rtgui_widget_update(RTGUI_WIDGET(win));

            if (win->on_deactivate != RT_NULL)
            {
                win->on_deactivate(RTGUI_OBJECT(object), event);
            }
        }
        break;

    case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
        if (RTGUI_WIDGET(object)->on_draw != RT_NULL)
            RTGUI_WIDGET(object)->on_draw(object, event);
        else
#endif
            rtgui_win_ondraw(win);
        break;

    case RTGUI_EVENT_MOUSE_BUTTON:
        /* check whether has widget which handled mouse event before */
        if (win->last_mevent_widget != RT_NULL)
        {
            RTGUI_OBJECT(win->last_mevent_widget)->event_handler(
                RTGUI_OBJECT(win->last_mevent_widget),
                event);

            /* clean last mouse event handled widget */
            win->last_mevent_widget = RT_NULL;
        }
        else if (rtgui_container_dispatch_mouse_event(RTGUI_CONTAINER(win),
                 (struct rtgui_event_mouse*)event) == RT_FALSE)
        {
#ifndef RTGUI_USING_SMALL_SIZE
            if (RTGUI_WIDGET(object)->on_mouseclick != RT_NULL)
            {
                return RTGUI_WIDGET(object)->on_mouseclick(object, event);
            }
#endif
        }
        break;

    case RTGUI_EVENT_MOUSE_MOTION:
#if 0
        if (rtgui_widget_dispatch_mouse_event(widget,
                                              (struct rtgui_event_mouse*)event) == RT_FALSE)
        {
#ifndef RTGUI_USING_SMALL_SIZE
            /* handle event in current widget */
            if (widget->on_mousemotion != RT_NULL)
            {
                return widget->on_mousemotion(widget, event);
            }
#endif
        }
        else return RT_TRUE;
#endif
        break;

    case RTGUI_EVENT_KBD:
        /* we should dispatch key event firstly */
        if (!(win->flag & RTGUI_WIN_FLAG_HANDLE_KEY))
        {
            rt_bool_t res = RT_FALSE;
            /* we should dispatch the key event just once. Once entered the
             * dispatch mode, we should swtich to key handling mode. */
            win->flag |= RTGUI_WIN_FLAG_HANDLE_KEY;

            /* dispatch the key event */
            if (win->focused_widget != RT_NULL &&
                    RTGUI_OBJECT(win->focused_widget)->event_handler != RT_NULL)
                res = RTGUI_OBJECT(win->focused_widget)->event_handler(
                          RTGUI_OBJECT(win->focused_widget), event);

            /* if the focused widget doesn't handle it, I will handle it. */
            if (res != RT_TRUE && win->on_key != RT_NULL)
                res = win->on_key(RTGUI_OBJECT(win), event);

            win->flag &= ~RTGUI_WIN_FLAG_HANDLE_KEY;
            return res;
        }
        else
        {
            /* in key handling mode(it may reach here in
             * win->focused_widget->event_handler call) */
            if (win->on_key != RT_NULL)
                return win->on_key(RTGUI_OBJECT(win), event);
        }
        break;

    default:
        /* call parent event handler */
        return rtgui_toplevel_event_handler(object, event);
    }

    return RT_FALSE;
}
Esempio n. 27
0
rt_bool_t rtgui_app_event_handler(struct rtgui_object* object, rtgui_event_t* event)
{
	struct rtgui_app* app;

	RT_ASSERT(object != RT_NULL);
	RT_ASSERT(event != RT_NULL);

	app = RTGUI_APP(object);

	switch (event->type)
	{
	case RTGUI_EVENT_PAINT:
	case RTGUI_EVENT_CLIP_INFO:
	case RTGUI_EVENT_WIN_ACTIVATE:
	case RTGUI_EVENT_WIN_DEACTIVATE:
	case RTGUI_EVENT_WIN_CLOSE:
	case RTGUI_EVENT_WIN_MOVE:
	case RTGUI_EVENT_KBD:
		_rtgui_application_dest_handle(app, event);
		break;

	case RTGUI_EVENT_APP_ACTIVATE:
		if (app->main_object != RT_NULL)
		{
			rtgui_win_activate(RTGUI_WIN(app->main_object));
			if (app->modal_object != RT_NULL)
				rtgui_win_activate(RTGUI_WIN(app->modal_object));
		}
		else if (app->modal_object != RT_NULL)
		{
			rtgui_win_activate(RTGUI_WIN(app->modal_object));
		}
		break;

	case RTGUI_EVENT_APP_DESTROY:
		rtgui_app_exit(app, 0);
		break;

	case RTGUI_EVENT_MOUSE_BUTTON:
	case RTGUI_EVENT_MOUSE_MOTION:
		{
			struct rtgui_event_win* wevent = (struct rtgui_event_win*)event;
			struct rtgui_object* dest_object = RTGUI_OBJECT(wevent->wid);

			// FIXME: let application determine the dest_wiget but not in sever
			// so we can combine this handler with above one
			if (app->modal_object != RT_NULL &&
				dest_object != app->modal_object)
			{
//				rt_kprintf("discard event %s that is not sent to modal object\n",
//						   event_string[event->type]);
			}
			else
			{
				_rtgui_application_dest_handle(app, event);
			}
		}
		break;

	case RTGUI_EVENT_TIMER:
		{
			struct rtgui_timer* timer;
			struct rtgui_event_timer* etimer = (struct rtgui_event_timer*) event;

			timer = etimer->timer;
			if (timer->timeout != RT_NULL)
			{
				/* call timeout function */
				timer->timeout(timer, timer->user_data);
			}
		}
		break;

        case RTGUI_EVENT_COMMAND:
        {
            struct rtgui_event_command *ecmd = (struct rtgui_event_command*)event;

            if (ecmd->wid != RT_NULL)
                    return _rtgui_application_dest_handle(app, event);
        }
	}

	return rtgui_object_event_handler(object, event);
}
Esempio n. 28
0
rtgui_modal_code_t rtgui_win_show(struct rtgui_win* win, rt_bool_t is_modal)
{
	rtgui_modal_code_t result;

	RT_ASSERT(win != RT_NULL);
	result = RTGUI_MODAL_CANCEL;

	/* if it does not register into server, create it in server */
	if (RTGUI_TOPLEVEL(win)->server == RT_NULL)
	{
		if (_rtgui_win_create_in_server(win) == RT_FALSE)
			return result;
	}

	if (RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(win)))
	{
		/* send show message to server */
		struct rtgui_event_win_show eshow;
		RTGUI_EVENT_WIN_SHOW_INIT(&eshow);
		eshow.wid = win;

		if (rtgui_thread_send_sync(RTGUI_TOPLEVEL(win)->server, RTGUI_EVENT(&eshow),
			sizeof(struct rtgui_event_win_show)) != RT_EOK)
		{
			/* hide window failed */
			return result;
		}

		/* set window unhidden */
		RTGUI_WIDGET_UNHIDE(RTGUI_WIDGET(win));
	}
	else rtgui_widget_update(RTGUI_WIDGET(win));

	if (is_modal == RT_TRUE)
	{
		if (win->parent_toplevel != RT_NULL)
		{
			rtgui_widget_t *parent_widget;

			/* set style */
			win->style |= RTGUI_WIN_STYLE_MODAL;

			/* get root toplevel */
			parent_widget = RTGUI_WIDGET(win->parent_toplevel);
			if (RTGUI_IS_WORKBENCH(parent_widget))
			{
				rtgui_workbench_t* workbench;
				workbench = RTGUI_WORKBENCH(win->parent_toplevel);
				workbench->flag |= RTGUI_WORKBENCH_FLAG_MODAL_MODE;
				workbench->modal_widget = RTGUI_WIDGET(win);

				rtgui_workbench_event_loop(workbench);
				result = workbench->modal_code;
				workbench->flag &= ~RTGUI_WORKBENCH_FLAG_MODAL_MODE;
				workbench->modal_widget = RT_NULL;
			}
			else if (RTGUI_IS_WIN(parent_widget))
			{
				rtgui_win_t* parent_win;
				parent_win = RTGUI_WIN(win->parent_toplevel);
				parent_win->style |= RTGUI_WIN_STYLE_UNDER_MODAL;
				parent_win->modal_widget = RTGUI_WIDGET(win);

				rtgui_win_event_loop(parent_win);
				result = parent_win->modal_code;
				parent_win->style &= ~RTGUI_WIN_STYLE_UNDER_MODAL;
				parent_win->modal_widget = RT_NULL;
			}
		}
		else
		{
			/* which is a root window */
			win->style |= RTGUI_WIN_STYLE_MODAL;
			rtgui_win_event_loop(win);

			result = win->modal_code;
			win->style &= ~RTGUI_WIN_STYLE_MODAL;
		}
	}

	return result;
}
Esempio n. 29
0
rt_bool_t calibration_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
	switch (event->type)
	{
	case RTGUI_EVENT_PAINT:
	{
		struct rtgui_dc* dc;
		struct rtgui_rect rect;

		dc = rtgui_dc_begin_drawing(widget);
		if (dc == RT_NULL) break;

		/* get rect information */
		rtgui_widget_get_rect(widget, &rect);

		/* clear whole window */
		RTGUI_WIDGET_BACKGROUND(widget) = white;
		rtgui_dc_fill_rect(dc, &rect);

		/* reset color */
		RTGUI_WIDGET_BACKGROUND(widget) = green;
		RTGUI_WIDGET_FOREGROUND(widget) = black;

		switch (calibration_ptr->step)
		{
			case CALIBRATION_STEP_LEFTTOP:
				rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, CALIBRATION_HEIGHT);
				rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
				RTGUI_WIDGET_FOREGROUND(widget) = red;
				rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
				break;

			case CALIBRATION_STEP_RIGHTTOP:
				rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
					calibration_ptr->width, CALIBRATION_HEIGHT);
				rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
				RTGUI_WIDGET_FOREGROUND(widget) = red;
				rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
				break;

			case CALIBRATION_STEP_LEFTBOTTOM:
				rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT);
				rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
				RTGUI_WIDGET_FOREGROUND(widget) = red;
				rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
				break;

			case CALIBRATION_STEP_RIGHTBOTTOM:
				rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
					calibration_ptr->width, calibration_ptr->height - CALIBRATION_HEIGHT);
				rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
				RTGUI_WIDGET_FOREGROUND(widget) = red;
				rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
				break;

			case CALIBRATION_STEP_CENTER:
				rtgui_dc_draw_hline(dc, calibration_ptr->width/2 - CALIBRATION_WIDTH, calibration_ptr->width/2 + CALIBRATION_WIDTH, calibration_ptr->height/2);
				rtgui_dc_draw_vline(dc, calibration_ptr->width/2, calibration_ptr->height/2 - CALIBRATION_HEIGHT, calibration_ptr->height/2 + CALIBRATION_HEIGHT);
				RTGUI_WIDGET_FOREGROUND(widget) = red;
				rtgui_dc_fill_circle(dc, calibration_ptr->width/2, calibration_ptr->height/2, 4);
				break;
		}
		rtgui_dc_end_drawing(dc);
	}
		break;

	case RTGUI_EVENT_COMMAND:
		{
			struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;

			switch (ecmd->command_id)
			{
			case TOUCH_WIN_UPDATE:
				rtgui_widget_update(widget);
				break;
			case TOUCH_WIN_CLOSE:
				rtgui_win_close(RTGUI_WIN(widget));
				break;
			}
		}
		return RT_TRUE;

	default:
		rtgui_win_event_handler(widget, event);
	}

	return RT_FALSE;
}
Esempio n. 30
0
rt_bool_t rtgui_combobox_pdwin_ondeactive(struct rtgui_widget* widget, struct rtgui_event* event)
{
	rtgui_win_hiden(RTGUI_WIN(widget));
	return RT_TRUE;
}