static void save_handler(struct rtgui_widget* widget, rtgui_event_t* event) { extern void brightness_set(unsigned int value); rt_uint32_t vol, bri; vol = rtgui_slider_get_value(slider_volume); bri = rtgui_slider_get_value(slider_brightness); //更新背光 brightness_set(bri); //更新音量 { rt_device_t dev = RT_NULL; dev = rt_device_find("snd"); dev->control(dev, CODEC_CMD_VOLUME, &vol); } //保存配置 radio_setup.default_volume = vol; radio_setup.lcd_brightness = bri; save_setup(); //保存完毕,销毁本界面 { rtgui_view_t* view; rtgui_workbench_t* workbench; /* remove view in workbench */ view = RTGUI_VIEW(widget->parent); workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent); rtgui_workbench_remove_view(workbench, view); rtgui_view_destroy(view); } }
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; }
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 open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) { rtgui_filelist_view_t *view; rtgui_workbench_t *workbench; rtgui_rect_t rect; /* 获得顶层的workbench对象 */ workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); /* 针对Win32平台和其他平台做的不同的其实目录位置 */ #ifdef _WIN32 view = rtgui_filelist_view_create(workbench, "d:\\", "*.*", &rect); #else view = rtgui_filelist_view_create(workbench, "/", "*.*", &rect); #endif /* 采用模式形式显示文件列表视图 */ if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) { char path[32]; /* 在文件列表视图中成功选择文件,这里获得相应的路径名 */ rtgui_filelist_view_get_fullpath(view, path, sizeof(path)); /* 设置文件路径到文本标签 */ rtgui_label_set_text(label, path); } /* 删除 文件列表 视图 */ rtgui_view_destroy(RTGUI_VIEW(view)); }
/* 打开按钮的回调函数 */ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) { rtgui_filelist_view_t *view; rtgui_workbench_t *workbench; rtgui_rect_t rect; /* 获得顶层的workbench */ workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); /* WIN32平台上和真实设备上的初始路径处理 */ #ifdef _WIN32 view = rtgui_filelist_view_create(workbench, "d:\\", "*.*", &rect); #else view = rtgui_filelist_view_create(workbench, "/", "*.*", &rect); #endif /* 模态显示一个文件列表视图,以提供给用户选择图像文件 */ if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) { char path[32], image_type[8]; /* 设置文件路径的标签 */ rtgui_filelist_view_get_fullpath(view, path, sizeof(path)); if (image != RT_NULL) { rtgui_image_destroy(image); image = RT_NULL; } rt_memset(image_type, 0, sizeof(image_type)); /* 获得图像的类型 */ if (rt_strstr(path, ".bmp") != RT_NULL || rt_strstr(path, ".BMP") != RT_NULL) strcat(image_type, "bmp"); if (rt_strstr(path, ".png") != RT_NULL || rt_strstr(path, ".PNG") != RT_NULL) strcat(image_type, "png"); if (rt_strstr(path, ".jpg") != RT_NULL || rt_strstr(path, ".JPG") != RT_NULL) strcat(image_type, "jpeg"); if (rt_strstr(path, ".hdc") != RT_NULL || rt_strstr(path, ".HDC") != RT_NULL) strcat(image_type, "hdc"); /* 如果图像文件有效,创建相应的rtgui_image对象 */ if (image_type[0] != '\0') image = rtgui_image_create_from_file(image_type, path, RT_TRUE); } /* 删除 文件列表 视图 */ rtgui_view_destroy(RTGUI_VIEW(view)); rtgui_view_show(_view, RT_FALSE); }
static void cancel_handler(struct rtgui_widget* widget, rtgui_event_t* event) { rtgui_view_t* view; rtgui_workbench_t* workbench; /* remove view in workbench */ view = RTGUI_VIEW(widget->parent); workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent); rtgui_workbench_remove_view(workbench, view); rtgui_view_destroy(view); }
static rt_bool_t update_radio_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { switch (event->type) { case RTGUI_EVENT_COMMAND: { struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event; switch(ecmd->type) { case RTGUI_EVENT_PAINT: drawing_update_state_info(widget); /* this event has handled, return TRUE */ return RT_TRUE; } return RT_FALSE; } case RTGUI_EVENT_PAINT: { drawing_update_state_info(widget); return RT_FALSE; } case RTGUI_EVENT_KBD: { struct rtgui_event_kbd* ekbd; ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) { rtgui_workbench_t* workbench; workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(update_radio_list_view)->parent); rtgui_workbench_remove_view(workbench, update_radio_list_view); rtgui_view_destroy(update_radio_list_view); update_radio_list_view = RT_NULL; } } return RT_FALSE; } /* use parent event handler */ return rtgui_view_event_handler(widget, event); }
/* 打开列表视图用的按钮触发函数 */ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) { rtgui_rect_t rect; rt_uint32_t index; /* 获得顶层的workbench */ workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); /* 初始化图标列表 */ if (items == RT_NULL) { char item_name[32]; items = (struct rtgui_list_item *) rtgui_malloc((ITEM_MAX + 1) * sizeof(struct rtgui_list_item)); for (index = 0; index < ITEM_MAX; index ++) { rt_snprintf(item_name, sizeof(item_name), "图标%d", index); items[index].action = listitem_action; items[index].image = item_icon; items[index].name = rt_strdup(item_name); items[index].parameter = (void*) index; } items[ITEM_MAX].action = return_action; items[ITEM_MAX].image = exit_icon; items[ITEM_MAX].name = "退出"; items[ITEM_MAX].parameter = RT_NULL; } /* 创建一个列表视图, 项指定为items */ _view = rtgui_list_view_create(items, ITEM_MAX + 1, &rect, RTGUI_LIST_VIEW_ICON); /* 在workbench中添加相应的视图 */ rtgui_workbench_add_view(workbench, RTGUI_VIEW(_view)); /* 模式显示视图 */ rtgui_view_show(RTGUI_VIEW(_view), RT_TRUE); rtgui_view_destroy(RTGUI_VIEW(_view)); _view = RT_NULL; }
static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { if (event->type == RTGUI_EVENT_KBD) { struct rtgui_event_kbd* ekbd; ekbd = (struct rtgui_event_kbd*) event; if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) { rtgui_view_t* view; rtgui_workbench_t* workbench; /* remove view in workbench */ view = RTGUI_VIEW(widget); workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent); rtgui_workbench_remove_view(workbench, view); rtgui_view_destroy(view); return RT_TRUE; } return RT_FALSE; } return rtgui_view_event_handler(widget, event); }
/* 打开按钮的回调函数 */ static void open_btn_onbutton(rtgui_widget_t *widget, struct rtgui_event *event) { rtgui_filelist_view_t *view; rtgui_workbench_t *workbench; rtgui_rect_t rect; /* 获得顶层的workbench */ workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); /* WIN32平台上和真实设备上的初始路径处理 */ #ifdef _WIN32 view = rtgui_filelist_view_create(workbench, "d:\\", "*.*", &rect); #else view = rtgui_filelist_view_create(workbench, "/", "*.*", &rect); #endif /* 模态显示一个文件列表视图,以提供给用户选择图像文件 */ if (rtgui_container_show(RTGUI_CONTAINER(view), RT_TRUE) == RTGUI_MODAL_OK) { char path[32], name[8]; /* 设置文件路径的标签 */ rtgui_filelist_view_get_fullpath(view, path, sizeof(path)); rt_memset(name, 0, sizeof(name)); /* 获得应用模块的类型 */ if (rt_strstr(path, ".mo") != RT_NULL || rt_strstr(path, ".so") != RT_NULL) { rt_module_open(path); } } /* 删除 文件列表 视图 */ rtgui_container_destroy(RTGUI_CONTAINER(view)); rtgui_container_show(_view, RT_FALSE); }
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; }
/* * Device Information View * Device: Win32 or Cortex-M3 etc * Memory: * Thread: * IP Address: * Gateway: * DNS: */ static rt_bool_t view_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; char* line; rt_uint32_t total, used, max_used; line = rtgui_malloc(256); if (line == RT_NULL) return RT_FALSE; dc = rtgui_dc_begin_drawing(widget); if (dc == RT_NULL) { rtgui_free(line); return RT_FALSE; } rtgui_widget_get_rect(widget, &rect); /* fill background */ rtgui_dc_fill_rect(dc, &rect); rect.y2 = rect.y1 + 18; { rt_uint32_t dev_index, rev_index; dev_index = DBGMCU_GetDEVID(); dev_index = (dev_index - 0x410)/2; rev_index = DBGMCU_GetREVID(); switch (rev_index) { case 0x1000: case 0x0000: rev_index = 0; /* Revision A */ break; case 0x1001: case 0x2001: rev_index = 3; /* Revision Z */ break; case 0x2000: rev_index = 1; /* Revision B */ break; case 0x2002: rev_index = 2; /* Revision Y */ break; default: rev_index = 4; /* Unknown */ break; }; /* check device index */ if (dev_index > 4) dev_index = 3; /* draw each information */ sprintf(line, "设备: %s %s", stm32_devname[dev_index], stm32_revname[rev_index]); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; } rt_memory_info(&total, &used, &max_used); sprintf(line, "内存: 当前使用 %d 字节", used); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; { rt_uint16_t rect_width; rtgui_color_t saved; rtgui_rect_t mem_rect = rect; rtgui_rect_inflate(&mem_rect, -2); rtgui_dc_draw_rect(dc, &mem_rect); rtgui_rect_inflate(&mem_rect, -1); rect_width = rtgui_rect_width(mem_rect); saved = RTGUI_WIDGET_BACKGROUND(widget); RTGUI_WIDGET_BACKGROUND(widget) = light_grey; mem_rect.x2 = mem_rect.x1 + (max_used * rect_width / total); rtgui_dc_fill_rect(dc, &mem_rect); RTGUI_WIDGET_BACKGROUND(widget) = blue; mem_rect.x2 = mem_rect.x1 + (used * rect_width / total); rtgui_dc_fill_rect(dc, &mem_rect); /* restore color */ RTGUI_WIDGET_BACKGROUND(widget) = saved; } rect.y1 += 18; rect.y2 += 18; sprintf(line, "线程数: %d", get_thread_cnt()); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #ifdef RT_USING_LWIP { struct ip_addr ip_addr; struct _ip_addr { rt_uint8_t addr0, addr1, addr2, addr3; } *addr; addr = (struct _ip_addr*)&netif_default->ip_addr.addr; sprintf(line, "IP地址 : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; addr = (struct _ip_addr*)&netif_default->gw.addr; sprintf(line, "网关地址: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; addr = (struct _ip_addr*)&netif_default->netmask.addr; sprintf(line, "网络掩码: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #if LWIP_DNS ip_addr = dns_getserver(0); addr = (struct _ip_addr*)&ip_addr; sprintf(line, "DNS地址 : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; #endif } #endif rtgui_dc_end_drawing(dc); rtgui_free(line); return RT_FALSE; } case RTGUI_EVENT_KBD: { struct rtgui_event_kbd* ekbd; ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) { rtgui_workbench_t* workbench; workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(device_view)->parent); rtgui_workbench_remove_view(workbench, device_view); rtgui_view_destroy(device_view); device_view = RT_NULL; } } return RT_FALSE; } /* use parent event handler */ return rtgui_view_event_handler(widget, event); }