demo_workbench.c 3.1 KB
Newer Older
B
bernard.xiong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>

#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>

static rt_bool_t demo_workbench_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
	/* 我们目前只对按键事件感兴趣。如果当前workbench处于模式显示状态,忽略它  */
	if ((event->type == RTGUI_EVENT_KBD) && !RTGUI_WORKBENCH_IS_MODAL_MODE(RTGUI_WORKBENCH(widget)))
	{
		struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;

		if (ekbd->type == RTGUI_KEYDOWN)
		{
			if (ekbd->key == RTGUIK_RIGHT)
			{
				demo_view_next(RT_NULL, RT_NULL);
				return RT_TRUE;
			}
			else if (ekbd->key == RTGUIK_LEFT)
			{
				demo_view_prev(RT_NULL, RT_NULL);
				return RT_TRUE;
			}
		}
	}

	/* 如果不是绘制事件,使用view原来的事件处理函数处理 */
	return rtgui_workbench_event_handler(widget, event);
}

static void workbench_entry(void* parameter)
{
	rt_mq_t mq;
	struct rtgui_workbench* workbench;

	/* 创建GUI应用需要的消息队列 */
#ifdef RTGUI_USING_SMALL_SIZE
B
bernard.xiong 已提交
40
	mq = rt_mq_create("workbench", 32, 32, RT_IPC_FLAG_FIFO);
B
bernard.xiong 已提交
41
#else
B
bernard.xiong 已提交
42
	mq = rt_mq_create("workbench", 256, 32, RT_IPC_FLAG_FIFO);
B
bernard.xiong 已提交
43 44 45 46 47 48 49 50 51 52 53
#endif
	/* 注册当前线程为GUI线程 */
	rtgui_thread_register(rt_thread_self(), mq);

	/* 创建一个工作台 */
	workbench = rtgui_workbench_create("main", "workbench");
	if (workbench == RT_NULL) return;

	rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), demo_workbench_event_handler);

	/* 初始化各个例子的视图 */
54
#if RT_VERSION == 4
B
bernard.xiong 已提交
55
	demo_view_benchmark(workbench);
56 57
#endif

B
bernard.xiong 已提交
58
	demo_view_dc(workbench);
59
#if RT_VERSION == 4
B
bernard.xiong 已提交
60 61 62
#ifdef RTGUI_USING_TTF
	demo_view_ttf(workbench);
#endif
63 64
#endif

65
#ifndef RTGUI_USING_SMALL_SIZE
66
	demo_view_dc_buffer(workbench);
67
#endif
B
bernard.xiong 已提交
68
	demo_view_animation(workbench);
69
#ifndef RTGUI_USING_SMALL_SIZE
B
bernard.xiong 已提交
70
	demo_view_buffer_animation(workbench);
71
	demo_view_instrument_panel(workbench);
72
#endif
B
bernard.xiong 已提交
73 74 75 76 77
	demo_view_window(workbench);
	demo_view_label(workbench);
	demo_view_button(workbench);
	demo_view_checkbox(workbench);
	demo_view_progressbar(workbench);
B
bernard.xiong 已提交
78
	demo_view_scrollbar(workbench);
B
bernard.xiong 已提交
79 80
	demo_view_radiobox(workbench);
	demo_view_textbox(workbench);
B
bernard.xiong 已提交
81
	demo_view_listbox(workbench);
B
bernard.xiong 已提交
82 83 84
	demo_view_slider(workbench);
	demo_view_mywidget(workbench);
	demo_view_image(workbench);
qiuyiuestc's avatar
qiuyiuestc 已提交
85 86 87
#ifdef RT_USING_MODULE	
	demo_view_module(workbench);
#endif
B
bernard.xiong 已提交
88
	demo_listview_view(workbench);
B
bernard.xiong 已提交
89
	demo_listview_icon_view(workbench);
B
bernard.xiong 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
	demo_fn_view(workbench);

	/* 显示视图 */
	demo_view_show();

	/* 执行工作台事件循环 */
	rtgui_workbench_event_loop(workbench);

	/* 去注册GUI线程 */
	rtgui_thread_deregister(rt_thread_self());
	rt_mq_delete(mq);
}

void workbench_init()
{
	static rt_bool_t inited = RT_FALSE;

	if (inited == RT_FALSE) /* 避免重复初始化而做的保护 */
	{
		rt_thread_t tid;

		tid = rt_thread_create("wb",
			workbench_entry, RT_NULL,
			2048, 25, 10);

		if (tid != RT_NULL) rt_thread_startup(tid);

		inited = RT_TRUE;
	}
}

#ifdef RT_USING_RTGUI
#include <finsh.h>
void workbench()
{
	workbench_init();
}
/* finsh的命令输出,可以直接执行workbench()函数以执行上面的函数 */
FINSH_FUNCTION_EXPORT(workbench, workbench demo)
#endif