/*! * \par Description: * 消息提示型对话框控制流实现。 * \param[in] style_id ui editor工具设计的对话框控件模板 * \param[in] type 对话框类型,只能是 DIALOG_BUTTON_ANYKEY,DIALOG_INFOR_WAIT, * DIALOG_INFOR_IMMEDIATE 中的一种 * \param[in] str_id 多国语言字符串ID * \param[out] none * \return app_result_e * \retval RESULT_DIALOG_XXX 选择了有效按键后返回,详细参见 app_result_e 定义 * \retval RESULT_REDRAW 无效返回,AP需要重绘UI * \retval other 收到返回值不为 RESULT_NULL 应用消息返回,见 app_result_e 定义 * \ingroup controls * \par exmaple code * \code app_result_e result; result = gui_dialog_msg(DIALOG_MSG, DIALOG_INFOR_IMMEDIATE, S_WAITING);//显示“请稍后…” if(result == RESULT_REDRAW)//显示正常结束返回,重绘UI { } else//其他返回结果,需要做特殊处理 { } * \endcode * \note * \li 对话框类型只能是 DIALOG_BUTTON_ANYKEY,DIALOG_INFOR_WAIT,DIALOG_INFOR_IMMEDIATE * 中的一种,否则强制为 DIALOG_INFOR_WAIT。 *******************************************************************************/ app_result_e gui_dialog_msg(uint16 style_id, dialog_type_e type, uint16 str_id) { dialog_com_data_t dialog_param; string_desc_t str_desc; str_desc.data.id = str_id; str_desc.language = UNICODEID; //对话框类型 提示 if (type == DIALOG_BUTTON_INCLUDE) { type = DIALOG_INFOR_WAIT; } dialog_param.dialog_type = type; dialog_param.icon_id = -1; //字符串 dialog_param.string_desc = &str_desc; //按键类型 dialog_param.button_type = BUTTON_NO_BUTTON; //调用 gui_dialog 提示消息 return gui_dialog(style_id, &dialog_param); }
void gui_value_loop() { char tmp[20]; uint8_t f_h; uint8_t sec; uint8_t min; uint8_t hour; uint8_t day; uint8_t wday; uint8_t month; uint16_t year; gui_dialog(gui_value_label); disp.LoadFont(F_TEXT_L); f_h = disp.GetTextHeight(); switch(gui_value_type) { case(GUI_VAL_NUMBER): sprintf(tmp, gui_value_format, gui_value_tmp); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); break; case(GUI_VAL_NUMBER_DISABLE): if (gui_value_tmp > 0) sprintf(tmp, gui_value_format, gui_value_tmp); else strcpy_P(tmp, PSTR("disabled")); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); break; case(GUI_VAL_VARIO_TEST): sprintf(tmp, gui_value_format, gui_value_tmp); gui_raligh_text(tmp, GUI_DIALOG_RIGHT - 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); disp.LoadFont(F_TEXT_S); f_h = disp.GetTextHeight(); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 2); fprintf(lcd_out, "f=%0.0f", audio_vario_freq); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 4 + f_h); fprintf(lcd_out, "l=%4u", audio_vario_length / 31); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 6 + f_h * 2); fprintf(lcd_out, "p=%4u", audio_vario_pause / 31); break; case(GUI_VAL_TIME): time_from_epoch(time_get_actual(), &sec, &min, &hour); sprintf_P(tmp, PSTR("%02d : %02d . %02d"), hour, min, sec); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); if (gui_value_index == 0) disp.Invert(18, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 32, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 1) disp.Invert(36, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 2) disp.Invert(54, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 68, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); break; case(GUI_VAL_DATE): datetime_from_epoch(time_get_actual(), &sec, &min, &hour, &day, &wday, &month, &year); sprintf_P(tmp, PSTR("%02d / %02d / %04d"), day, month, year); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); if (gui_value_index == 0) disp.Invert(10, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 24, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 1) disp.Invert(30, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 44, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 2) disp.Invert(50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 76, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); break; case(GUI_VAL_CONTRAST): gui_value_draw_bar(); break; case(GUI_VAL_BRIGTHNES): gui_value_draw_bar(); break; case(GUI_VAL_VOLUME): gui_value_draw_bar(); break; } if (button_hold(B_LEFT)) { uint8_t t_param = BE_CLICK; gui_value_irqh(TASK_IRQ_BUTTON_L, &t_param); } if (button_hold(B_RIGHT)) { uint8_t t_param = BE_CLICK; gui_value_irqh(TASK_IRQ_BUTTON_R, &t_param); } }
void gui_dialog_loop() { if (gui_dialog_style & GUI_STYLE_NO_TITLE) { //no title mode (GUI_STYLE_NO_TITLE is set) disp.DrawRectangle(0, 0, GUI_DISP_WIDTH - 2, GUI_DISP_HEIGHT - 2, 1, false); } else { //normal mode gui_dialog(gui_dialog_msg_line0); } disp.LoadFont(F_TEXT_M); uint8_t f_h = disp.GetTextHeight(); if ((gui_dialog_style & GUI_STYLE_MASK) == GUI_STYLE_STATS) { //if new flight has begin exit the stat screen if (fc.flight.state != FLIGHT_LAND) { gui_dialog_cb(1); } uint32_t diff = fc.flight.timer / 1000; uint8_t hour, min; hour = diff / 3600; diff %= 3600; min = diff / 60; diff %= 60; char tmp[32]; disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 0); if (hour > 0) fprintf_P(lcd_out, PSTR("%02d:%02d"), hour, min); else fprintf_P(lcd_out, PSTR("%02d.%02d"), min, diff); strcpy_P(tmp, PSTR("Alt")); gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 0); strcpy_P(tmp, PSTR("Vario")); gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 0); sprintf_P(tmp, PSTR("%dm"), fc.flight.stats.max_alt); gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 1); sprintf_P(tmp, PSTR("%dm"), fc.flight.stats.min_alt); gui_raligh_text(tmp, (GUI_DIALOG_WIDTH * 2) / 3 - 2, GUI_DIALOG_TOP + f_h * 2); sprintf_P(tmp, PSTR("%0.1fm"), (float)fc.flight.stats.max_climb / 100.0); gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 1); sprintf_P(tmp, PSTR("%0.1fm"), (float)fc.flight.stats.max_sink / 100.0); gui_raligh_text(tmp, GUI_DIALOG_RIGHT + 1, GUI_DIALOG_TOP + f_h * 2); disp.LoadFont(F_TEXT_S); disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 1 + 2); fprintf_P(lcd_out, PSTR("max")); disp.GotoXY(GUI_DIALOG_LEFT, GUI_DIALOG_TOP + f_h * 2 + 2); fprintf_P(lcd_out, PSTR("min")); } else { uint8_t top; if (gui_dialog_style & GUI_STYLE_NO_TITLE) { //no title mode (GUI_STYLE_NO_TITLE is set) top = 3; disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 0); fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line0); } else { //normal mode top = GUI_DIALOG_TOP - f_h; } disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 1); fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line1); disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 2); fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line2); disp.GotoXY(GUI_DIALOG_LEFT, top + f_h * 3); fprintf_P(lcd_out, PSTR("%s"), gui_dialog_msg_line3); } disp.LoadFont(F_TEXT_S); f_h = disp.GetAHeight(); switch (gui_dialog_style & GUI_STYLE_MASK) { case(GUI_STYLE_OK): case(GUI_STYLE_STATS): gui_caligh_text_P(PSTR("OK"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h); break; case(GUI_STYLE_OKCANCEL): gui_caligh_text_P(PSTR("OK"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h); gui_raligh_text_P(PSTR("Cancel"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h); break; case(GUI_STYLE_YESNO): gui_caligh_text_P(PSTR("Yes"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h); gui_raligh_text_P(PSTR("No"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h); break; case(GUI_STYLE_TIMESET): gui_caligh_text_P(PSTR("GPS"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h); gui_raligh_text_P(PSTR("Manual"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h); break; case(GUI_STYLE_FORMAT): gui_caligh_text_P(PSTR("No"), GUI_DIALOG_LEFT + GUI_DIALOG_WIDTH / 2, GUI_DIALOG_BOTTOM - f_h); gui_raligh_text_P(PSTR("Yes"), GUI_DIALOG_RIGHT - 1, GUI_DIALOG_BOTTOM - f_h); break; } }
/*! * \par Description: * 删除文件或目录控件控制流实现。 * \param[in] path_info 要删除文件(目录)的路径结构体 * \param[in] del_com 删除控制结构体指针 * \param[out] path_info 删除文件(目录)后更新的路径结构体 * \return app_result_e * \retval RESULT_REDRAW 询问是否删除对话框取消返回AP,重绘UI。 * \retval RESULT_DELETE_FILE 删除文件成功返回。 * \retval RESULT_DELETE_DIRLIST 删除文件夹或列表成功返回。 * \retval RESULT_DELETE_DIRLIST_NOSELF 删除文件夹或列表(不删除自身)成功返回。 * \retval RESULT_ERROR 删除文件失败返回 。 * \retval dialog other 直接返回其他从 dialog 返回的消息,详细参见 app_result_e 定义。 * \retval delete other 收到返回值不为 RESULT_NULL 应用消息返回,见 app_result_e 定义。 * \ingroup controls * \par exmaple code * \code del_com_data_t del_com; app_result_e result; fsel_browser_select(list_no); fsel_browser_get_location(&path_info.file_path, FSEL_TYPE_COMMONDIR);//path_info在之前已经初始化过 del_com.filename = g_file_name; del_com.del_mode = DEL_MODE_FILE; del_com.del_playing = FALSE; del_com.del_self = TRUE; del_com.del_func = ebook_del_func; result = gui_delete(&path_info, &del_com); if(result == RESULT_DELETE_FILE)//删除文件成功返回 { //返回更新列表等 } else if(result == RESULT_REDRAW)//取消删除,返回重绘 { } else//其他返回结果,需要做特殊处理 { } * \endcode * \note * \li 用户必须确保文件系统和文件选择器已经初始化过,并且 path_info 指向要删除的文件或列表。 *******************************************************************************/ app_result_e gui_delete(file_path_info_t *path_info, del_com_data_t *del_com) { msg_apps_t msg; dialog_com_data_t dialog_com; string_desc_t delete_ask_str; app_result_e result = RESULT_NULL; bool ret, restart_music = FALSE; uint8 tag_backup; gui_direct_e tmp_direct; tag_backup = g_this_app_timer_tag;//get_app_timer_tag(); change_app_timer_tag(APP_TIEMR_TAG_DELETE); tmp_direct = com_get_gui_direction(); //把文件名转换为 "部分..." 形式,在整个 gui_delete 生命周期有效 com_ellipsis_to_longname(del_com->filename, com_name_buffer, 52); //询问是否要删除文件或目录 delete_ask_str.data.str = com_str_buffer; //初始化对话框 dialog_com.dialog_type = DIALOG_BUTTON_INCLUDE; dialog_com.button_type = BUTTON_YESNO; dialog_com.icon_id = -1; dialog_com.string_desc = &delete_ask_str; dialog_com.active_default = 1; //for 16KB page nandflash if ((g_app_info_state.type == ENGINE_MUSIC)//正在播放音乐 && (g_app_info_state.state == ENGINE_STATE_PLAYING) && ((g_this_app_info->app_id != APP_ID_MUSIC) || (del_com->del_playing != TRUE)))//允许删除正在播放的音乐文件 { delete_string_format(&delete_ask_str, S_CLOSE_MUSIC_DEL, com_name_buffer); //询问是否 先关闭音乐播放器后再删除文件 result = gui_dialog(DIALOG_ASK, &dialog_com); if (result != RESULT_DIALOG_YES) { g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup); return result; } //向 manager ap 发消息要求后台退出 msg.type = MSG_MENGINE_PAUSE_SYNC; send_sync_msg(APP_ID_MENGINE, &msg, NULL, 0); restart_music = TRUE;//删除完成后恢复音乐播放 } else { delete_string_format(&delete_ask_str, S_DEL_FILE_ASK, com_name_buffer); //询问是否 删除文件 if (tmp_direct == GUI_DIRECT_NORMAL)//正常竖屏 { result = gui_dialog(DIALOG_ASK, &dialog_com); if (result != RESULT_DIALOG_YES) { g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup); return result; } } /*else//横屏模式 { result = gui_dialog (DIALOG_ASK_V, &dialog_com); if(result != RESULT_DIALOG_YES) { g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup); return result; } }*/ } //显示 正在删除文件 if (tmp_direct == GUI_DIRECT_NORMAL)//正常竖屏 { gui_dialog_msg(DIALOG_MSG, DIALOG_INFOR_IMMEDIATE, S_DEL_FILE_ING); } else//横屏模式 { // gui_dialog_msg (DIALOG_MSG_V, DIALOG_INFOR_IMMEDIATE, S_DEL_FILE_ING); } //执行删除回调函数 if (del_com->del_func != NULL) { del_com->del_func(); } //确定删除,删除文件 if (del_com->del_mode == DEL_MODE_FILE) { //执行删除文件 ret = delete_just_file(0, path_info, BROW_DEL_FILE, del_com->del_playing); if (ret == TRUE) { result = deleted_file_display(com_name_buffer); if ((result == RESULT_NULL) || (result == RESULT_REDRAW)) { result = RESULT_DELETE_FILE; //删除文件完成返回 } } else { result = RESULT_ERROR; } } //确定删除,删除文件夹或播放列表 else { result = deleted_all(path_info, del_com); if (result == RESULT_DELETE_DIRLIST) { result = deleted_file_display(com_name_buffer); if (result == RESULT_NULL) { if (del_com->del_self == TRUE) { result = RESULT_DELETE_DIRLIST; //删除文件夹或列表完成返回 } else { result = RESULT_DELETE_DIRLIST_NOSELF; //删除文件夹或列表(不删除自身)完成返回 } } } } //恢复音乐播放 if (restart_music == TRUE) { //向 manager ap 发消息恢复后台音乐播放 _resume_music_after_delete(path_info); } g_this_app_timer_tag = tag_backup;//change_app_timer_tag(tag_backup); return result; }