/* Advanced Standard Row1 Timer Timer Row2 Switch Switch Row3 Reset(perm)/ResetSwitch Reset(perm)/Start Row4 Start/Set-to Set-to */ static int row_cb(int absrow, int relrow, int y, void *data) { (void)data; (void)relrow; u8 space = LINE_SPACE; //Row 1 GUI_CreateLabelBox(&gui->name, LABEL_X, y, LABEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, timer_str_cb, NULL, (void *)(long)absrow); GUI_CreateTextSelectPlate(&gui->type, TEXTSEL_X, y, TEXTSEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, NULL, set_timertype_cb, (void *)(long)absrow); //Row 2 y += space; GUI_CreateLabelBox(&gui->switchlbl, LABEL_X, y, LABEL_WIDTH, LINE_HEIGHT,&DEFAULT_FONT, switch_str_cb, NULL, (void *)(long)absrow); GUI_CreateTextSourcePlate(&gui->src, TEXTSEL_X, y, TEXTSEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, toggle_source_cb, set_source_cb, set_input_source_cb, (void *)(long)absrow); //Row 3 y += space; /*prem-timer reset */ GUI_CreateLabelBox(&gui->resetpermlbl, LABEL_X, y , LABEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr("Reset")); GUI_CreateButtonPlateText(&gui->resetperm, RESET_X, y , RESET_WIDTH, LINE_HEIGHT,&DEFAULT_FONT, show_timerperm_cb, 0x0000, reset_timerperm_cb,(void *)(long)absrow); if(Model.mixer_mode != MIXER_STANDARD) { /* or Reset switch */ GUI_CreateLabelBox(&gui->resetlbl, LABEL_X, y , LABEL_WIDTH, LINE_HEIGHT,&DEFAULT_FONT, NULL, NULL, _tr("Reset sw")); GUI_CreateTextSourcePlate(&gui->resetsrc, TEXTSEL_X, y , TEXTSEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, toggle_resetsrc_cb, set_resetsrc_cb, set_input_rstsrc_cb, (void *)(long)absrow); y += space; } //Row 4 GUI_CreateLabelBox(&gui->startlbl, LABEL_X, y, START_WIDTH, // bug fix: label width and height can't be 0, otherwise, the label couldn't be hidden dynamically LINE_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr("Start")); GUI_CreateTextSelectPlate(&gui->start, TEXTSEL_X, y, TEXTSEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT,NULL, set_start_cb, (void *)(long)absrow); // don't include this in Devo7e due to memory restrictions #if HAS_PERMANENT_TIMER if(Model.mixer_mode == MIXER_STANDARD) y+= space; GUI_CreateButtonPlateText(&gui->setperm, RESET_X, y, RESET_WIDTH, LINE_HEIGHT,&DEFAULT_FONT, show_timerperm_cb, 0x0000, reset_timerperm_cb,(void *)(long)(absrow | 0x80)); #endif update_countdown(absrow); int selectable = (Model.timer[absrow].type < TIMER_COUNTDOWN) ? 2 : 3; if (Model.mixer_mode == MIXER_ADVANCED) selectable++; #if HAS_PERMANENT_TIMER if (Model.timer[absrow].type == TIMER_PERMANENT) selectable = 4; #endif return selectable; }
static int row_cb(int absrow, int relrow, int y, void *data) { int num_elems = (long)data; int y_ts = y; //show elements in order int row = -1; #if HAS_LAYOUT_EDITOR if (absrow == num_elems + NUM_QUICKPAGES) { GUI_CreateTextSelectPlate(&gui->value[relrow], NEWTEXTSEL_X, y_ts, NEWTEXTSEL_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, newelem_cb, NULL); GUI_CreateButtonPlateText(&gui->col1[relrow].button, NEWBUTTON_X, y, NEWBUTTON_W, LINE_HEIGHT, &BUTTON_FONT, add_dlgbut_str_cb, newelem_press_cb, (void *)1); return 2; } #endif if (absrow >= num_elems + NUM_QUICKPAGES) { GUI_CreateButtonPlateText(&gui->col1[relrow].button, QPBUTTON_X, y, QPBUTTON_W, LINE_HEIGHT, &BUTTON_FONT, add_dlgbut_str_cb, add_dlgbut_cb, (void *)0); return 1; } if (absrow >= num_elems && absrow < num_elems + NUM_QUICKPAGES) { GUI_CreateLabelBox(&gui->col1[relrow].label, MENULABEL_X, y, MENULABEL_W, LINE_HEIGHT, &LABEL_FONT, menulabel_cb, NULL, (void *)(long)(absrow - num_elems)); GUI_CreateTextSelectPlate(&gui->value[relrow], MENUTEXT_X, y + LINE_HEIGHT * LINE_OFFSET, MENUTEXT_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, menusel_cb, (void *)(long)(absrow - num_elems)); return 1; } for(int type = 0; type < ELEM_LAST; type++) { if (type == ELEM_BIGBOX || type == ELEM_HTRIM) continue; long nxt = -1; long item = -1; while((nxt = MAINPAGE_FindNextElem(type, nxt+1)) >= 0) { item = nxt; row++; if(row == absrow) break; } if (nxt == -1) continue; int selectable = 1; if (type == ELEM_TOGGLE) { GUI_CreateButtonPlateText(&gui->col1[relrow].button, ELEMBUT_X, y, ELEMBUT_W, LINE_HEIGHT, &BUTTON_FONT, cfglabel_cb, switchicon_press_cb, (void *)item); selectable = 2; } else GUI_CreateLabelBox(&gui->col1[relrow].label, ELEMLBL_X, y, ELEMLBL_W, LINE_HEIGHT, &LABEL_FONT, cfglabel_cb, NULL, (void *)item); GUI_CreateTextSelectPlate(&gui->value[relrow], ELEMTXT_X, y_ts, ELEMTXT_W, LINE_HEIGHT, &TEXTSEL_FONT, (void(*)(guiObject_t *, void *))dlgbut_cb, dlgts1_cb, (void *)item); return selectable; } return 0; }
static int row_cb(int absrow, int relrow, int y, void *data) { (void)data; (void)relrow; u8 space = ITEM_HEIGHT + 1; u8 w = 65; u8 x = 55; //Row 1 GUI_CreateLabelBox(&gui->name, 0, y, 0, ITEM_HEIGHT, &DEFAULT_FONT, timer_str_cb, NULL, (void *)(long)absrow); GUI_CreateTextSelectPlate(&gui->type, x, y, w, ITEM_HEIGHT, &DEFAULT_FONT, toggle_timertype_cb, set_timertype_cb, (void *)(long)absrow); //Row 2 y += space; GUI_CreateLabelBox(&gui->switchlbl, 0, y, 0, ITEM_HEIGHT,&DEFAULT_FONT, switch_str_cb, NULL, (void *)(long)absrow); GUI_CreateTextSelectPlate(&gui->src, x, y, w, ITEM_HEIGHT, &DEFAULT_FONT, toggle_source_cb, set_source_cb, (void *)(long)absrow); //Row 3 y += space; if(Model.mixer_mode != MIXER_STANDARD) { GUI_CreateLabelBox(&gui->resetlbl, 0, y , 55, ITEM_HEIGHT,&DEFAULT_FONT, NULL, NULL, _tr("Reset sw")); GUI_CreateTextSelectPlate(&gui->resetsrc, x, y , w, ITEM_HEIGHT, &DEFAULT_FONT, toggle_resetsrc_cb, set_resetsrc_cb, (void *)(long)absrow); /* or Reset Perm timer*/ GUI_CreateLabelBox(&gui->resetpermlbl, 0, y , 55, ITEM_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr("Reset")); GUI_CreateButtonPlateText(&gui->resetperm, x, y , 55, ITEM_HEIGHT,&DEFAULT_FONT, show_timerperm_cb, 0x0000, reset_timerperm_cb,(void *)(long)absrow); y += space; } else { GUI_CreateLabelBox(&gui->resetpermlbl, 0, y , 55, ITEM_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr("Reset")); GUI_CreateButtonPlateText(&gui->resetperm, x, y , 55, ITEM_HEIGHT,&DEFAULT_FONT, show_timerperm_cb, 0x0000, reset_timerperm_cb,(void *)(long)absrow); } //Row 4 GUI_CreateLabelBox(&gui->startlbl, 0, y , 50, // bug fix: label width and height can't be 0, otherwise, the label couldn't be hidden dynamically ITEM_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr("Start")); GUI_CreateTextSelectPlate(&gui->start, x, y, w, ITEM_HEIGHT, &DEFAULT_FONT,NULL, set_start_cb, (void *)(long)absrow); update_countdown(absrow); return 4; }
static int complex_row_cb(int absrow, int relrow, int y, void *data) { const char *label = NULL; void *tgl = NULL; void *value = NULL; data = NULL; int x = 0; int w = LEFT_VIEW_WIDTH; if (absrow + COMMON_LAST == COMPLEX_TRIM) { GUI_CreateButtonPlateText(&gui->value[relrow].but, x, y, w, ITEM_HEIGHT, &labelDesc, show_trim_cb, 0x0000, toggle_trim_cb, NULL); if (! MIXER_SourceHasTrim(MIXER_SRC(mp->mixer[0].src))) GUI_SetHidden((guiObject_t *)&gui->label[relrow], 1); return 1; } switch(absrow + COMMON_LAST) { case COMPLEX_MIXER: label = _tr_noop("Mixers"); value = set_nummixers_cb; break; case COMPLEX_PAGE: label = _tr_noop("Page"); tgl = reorder_cb; value = set_mixernum_cb; break; case COMPLEX_SWITCH: label = _tr_noop("Switch"); tgl = sourceselect_cb; value = set_drsource_cb; data = &mp->cur_mixer->sw; break; case COMPLEX_MUX: label = _tr_noop("Mux"); value = set_mux_cb; break; case COMPLEX_SRC: label = _tr_noop("Src"); tgl = sourceselect_cb; value = set_source_cb; data = &mp->cur_mixer->src; break; case COMPLEX_CURVE: label = _tr_noop("Curve"); tgl = curveselect_cb; value = set_curvename_cb; data = mp->cur_mixer; break; case COMPLEX_SCALE: label = _tr_noop("Scale"); value = set_number100_cb; data = &mp->cur_mixer->scalar; break; case COMPLEX_OFFSET: label = _tr_noop("Offset"); value = set_number100_cb; data = &mp->cur_mixer->offset; break; } labelDesc.style = LABEL_LEFTCENTER; GUI_CreateLabelBox(&gui->label[relrow], x, y, w, ITEM_HEIGHT, &labelDesc, NULL, NULL, _tr(label)); labelDesc.style = LABEL_CENTER; GUI_CreateTextSelectPlate(&gui->value[relrow].ts, x, y + ITEM_HEIGHT + 1, w, ITEM_HEIGHT, &labelDesc, tgl, value, data); if (absrow + COMMON_LAST == COMPLEX_SRC) set_src_enable(CURVE_TYPE(&mp->cur_mixer->curve)); return 1; }
static void _draw_page(u8 enable) { (void)enable; PAGE_ShowHeader(PAGE_GetName(PAGEID_SCANNER)); GUI_CreateButtonPlateText(&gui->enable, 0, HEADER_HEIGHT, 40, LINE_HEIGHT, &BUTTON_FONT, enablestr_cb, press_enable_cb, NULL); GUI_CreateTextSelectPlate(&gui->averaging, LCD_WIDTH/2 - 23, HEADER_HEIGHT, 46, LINE_HEIGHT, &TEXTSEL_FONT, mode_cb, average_cb, NULL); GUI_CreateTextSelectPlate(&gui->attenuator, LCD_WIDTH - 40, HEADER_HEIGHT, 40, LINE_HEIGHT, &TEXTSEL_FONT, NULL, attenuator_cb, NULL); }
static void _show_titlerow() { mp->entries_per_page = 4; memset(gui, 0, sizeof(*gui)); GUI_CreateLabelBox(&gui->title, TITLE_X, 0 , TITLE_W, HEADER_HEIGHT, &TITLE_FONT, MIXPAGE_ChanNameProtoCB, NULL, (void *)(long)mp->channel); GUI_CreateButtonPlateText(&gui->revert, REVERT_X, 0, REVERT_W, HEADER_WIDGET_HEIGHT, &BUTTON_FONT, NULL, revert_cb, (void *)_tr("Revert")); }
static void _show_page() { u8 h = 12; int i; PAGE_RemoveAllObjects(); PAGE_ShowHeader(_tr("Mixer")); memset(gui, 0, sizeof(*gui)); struct Mixer *mix = MIXER_GetAllMixers(); u8 space = ITEM_HEIGHT + 1; u8 row = space; u8 w1 = 50; u8 w2 = LCD_WIDTH - w1 - ARROW_WIDTH - 4; for (i = 0; row < space * 5; i++) { u8 idx; labelDesc.style = LABEL_LEFT; u8 ch = mp->top_channel + i; if (ch >= Model.num_channels) ch += (NUM_OUT_CHANNELS - Model.num_channels); if (ch < NUM_OUT_CHANNELS) { GUI_CreateButtonPlateText(&gui->limit[i], 0, row, w1, h,&labelDesc, MIXPAGE_ChanNameProtoCB, 0, limitselect_cb, (void *)((long)ch)); } else if(! _is_virt_cyclic(ch)) { GUI_CreateButtonPlateText(&gui->limit[i], 0, row, w1, h,&labelDesc, MIXPAGE_ChanNameProtoCB, 0, virtname_cb, (void *)((long)ch)); } else { GUI_CreateLabelBox(&gui->name[i], 0, row, w1, h, &labelDesc, MIXPAGE_ChanNameProtoCB, NULL, (const void *)((long)ch)); } labelDesc.style = LABEL_CENTER; GUI_CreateButtonPlateText(&gui->tmpl[i], w1 + 2, row, w2, h , &labelDesc, template_name_cb, 0, templateselect_cb, (void *)((long)ch)); row += space; // bug fix: dynamically showing/hiding items won't work in devo10, it causes crash when changing template from none to simple/expo/complex for (idx = 0; idx < NUM_MIXERS; idx++) if (mix[idx].src && mix[idx].dest == ch) break; if (idx != NUM_MIXERS) { enum TemplateType template = MIXER_GetTemplate(ch); labelDesc.style = LABEL_LEFTCENTER; GUI_CreateLabelBox(&gui->src[i], 0, row, w1, h, &labelDesc, show_source, NULL, &mix[idx].src); if (template == MIXERTEMPLATE_EXPO_DR) {
static void _show_titlerow() { mp->entries_per_page = 4; memset(gui, 0, sizeof(*gui)); labelDesc.style = LABEL_UNDERLINE; GUI_CreateLabelBox(&gui->title, TITLE_X, 0 , TITLE_W, HEADER_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, NULL, (void *)(long)mp->channel); labelDesc.style = LABEL_CENTER; GUI_CreateButtonPlateText(&gui->revert, REVERT_X, 0, REVERT_W, HEADER_WIDGET_HEIGHT, &labelDesc, NULL, 0, revert_cb, (void *)_tr("Revert")); }
static int row_cb(int absrow, int relrow, int y, void *data) { (void)data; struct Trim *trim = MIXER_GetAllTrims(); GUI_CreateButtonPlateText(&gui->src[relrow], BUTTON_X, y, BUTTON_WIDTH, LINE_HEIGHT, &BUTTON_FONT, trimsource_name_cb, edit_trim_cb, (void *)((long)absrow)); GUI_CreateTextSelectPlate(&gui->item[relrow], TEXTSEL_X, y, TEXTSEL_WIDTH, LINE_HEIGHT, &TINY_FONT, NULL, set_trimstep_cb, (void *)(long)(absrow + 0x000)); //0x000: Use Model.trims GUI_CreateLabelBox(&gui->name[relrow], LABEL_X, y, LABEL_WIDTH, LINE_HEIGHT, &TINY_FONT, GUI_Localize, NULL, (void *)INPUT_ButtonName(trim[absrow].pos)); return 2; }
void PAGE_TrimEditInit(int page) { struct Trim *trim = MIXER_GetAllTrims(); tp->index = page; tp->trim = trim[tp->index]; GUI_CreateLabelBox(&guit->header, 0, 0, LABEL2_WIDTH, HEADER_HEIGHT, &TITLE_FONT, GUI_Localize, NULL, _tr_noop("Edit")); GUI_CreateButtonPlateText(&guit->save, BUTTON2_X, BUTTON2_Y, BUTTON2_WIDTH, LINE_HEIGHT, &BUTTON_FONT, GUI_Localize, okcancel_cb, _tr_noop("Save")); GUI_CreateScrollable(&gui->scrollable, 0, HEADER_HEIGHT, LCD_WIDTH, LCD_HEIGHT - HEADER_HEIGHT, LINE_SPACE, ITEM_LAST, row2_cb, getobj2_cb, NULL, NULL); GUI_SetSelected(GUI_ShowScrollableRowOffset(&gui->scrollable, 0)); }
static int row_cb(int absrow, int relrow, int y, void *data) { (void)data; u8 w = 30; struct Trim *trim = MIXER_GetAllTrims(); GUI_CreateButtonPlateText(&gui->src[relrow], 0, y, w, ITEM_HEIGHT, &DEFAULT_FONT, trimsource_name_cb, 0x0000, _edit_cb, (void *)((long)absrow)); GUI_CreateTextSelectPlate(&gui->item[relrow], 32, y, 40, ITEM_HEIGHT, &TINY_FONT, NULL, set_trimstep_cb, (void *)(long)(absrow+0x000)); //0x000: Use Model.trims GUI_CreateLabelBox(&gui->name[relrow], 75, y, 50, ITEM_HEIGHT, &DEFAULT_FONT, NULL, NULL, (void *)INPUT_ButtonName(trim[absrow].pos)); return 1; }
static int row_cb(int absrow, int relrow, int y, void *data) { (void)data; u8 idx; struct Mixer *mix = MIXER_GetAllMixers(); int selectable = 2; int channel = absrow; if (channel >= Model.num_channels) channel += (NUM_OUT_CHANNELS - Model.num_channels); if (channel < NUM_OUT_CHANNELS) { labelDesc.style = LABEL_LEFT; GUI_CreateButtonPlateText(&gui->limit[relrow], COL1_X, y, COL1_W, LINE_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, 0, limitselect_cb, (void *)((long)channel)); } else if(! _is_virt_cyclic(channel)) { GUI_CreateButtonPlateText(&gui->limit[relrow], COL1_X, y, COL1_W, LINE_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, 0, virtname_cb, (void *)((long)channel)); } else { GUI_CreateLabelBox(&gui->name[relrow], COL1_X, y, COL1_W, LINE_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, NULL, (const void *)((long)channel)); selectable = 1; } labelDesc.style = LABEL_CENTER; GUI_CreateButtonPlateText(&gui->tmpl[relrow], COL2_X, y, COL2_W, LINE_HEIGHT , &labelDesc, template_name_cb, 0, templateselect_cb, (void *)((long)channel)); for (idx = 0; idx < NUM_MIXERS; idx++) if (mix[idx].src && mix[idx].dest == channel) break; if (idx != NUM_MIXERS) { // don't show source if curve type is fixed, works only for the first mix per channel if(CURVE_TYPE(&mix[idx].curve) != CURVE_FIXED) { labelDesc.style = LABEL_LEFT; GUI_CreateLabelBox(&gui->src[relrow], COL3_X, y, COL3_W , LINE_HEIGHT, &labelDesc, show_source, NULL, &mix[idx].src); } } return selectable; }
static void _show_titlerow() { (void)okcancel_cb; PAGE_SetActionCB(action_cb); mp->entries_per_page = 4; memset(gui, 0, sizeof(*gui)); labelDesc.style = LABEL_UNDERLINE; u8 w = 50; GUI_CreateLabelBox(&gui->title, 0, 0 , LCD_WIDTH, HEADER_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, NULL, (void *)(long)mp->channel); labelDesc.style = LABEL_CENTER; GUI_CreateButtonPlateText(&gui->revert, LCD_WIDTH - w, 0, w, HEADER_WIDGET_HEIGHT, &labelDesc, NULL, 0, revert_cb, (void *)_tr("Revert")); }
void PAGE_EditCurvesInit(int page) { (void)page; struct Curve *curve = edit->curveptr; u8 type = CURVE_TYPE(curve); PAGE_SetActionCB(action_cb); edit->pointnum = 0; edit->reverse = MIXER_SRC_IS_INV(pagemem.u.mixer_page.cur_mixer->src); if ((type == CURVE_EXPO || type == CURVE_DEADBAND) && curve->points[0] == curve->points[1]) { edit->pointnum = -1; } edit->curve = *curve; GUI_CreateTextSelectPlate(&gui->name, NAME_X, 0, NAME_W, HEADER_HEIGHT, &TEXTSEL_FONT, NULL, set_curvename_cb, NULL); GUI_CreateButtonPlateText(&gui->save, SAVE_X, 0, SAVE_W, HEADER_WIDGET_HEIGHT, &BUTTON_FONT , NULL, okcancel_cb, (void *)_tr("Save")); // Draw a line if (UNDERLINE) GUI_CreateRect(&gui->rect, 0, HEADER_WIDGET_HEIGHT, LCD_WIDTH, 1, &DEFAULT_FONT); u8 space = LINE_SPACE; u8 y = space; if (type >= CURVE_3POINT) { GUI_CreateLabelBox(&gui->smoothlbl, LABEL_X, y, LABEL1_W, LINE_HEIGHT, &LABEL_FONT, NULL, NULL, _tr("Smooth")); GUI_CreateTextSelectPlate(&gui->smooth, TEXTSEL1_X, y, TEXTSEL1_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, set_smooth_cb, NULL); y += space; GUI_CreateLabelBox(&gui->pointlbl, LABEL_X, y , LABEL2_W, LINE_HEIGHT, &LABEL_FONT, NULL, NULL, _tr("Point")); GUI_CreateTextSelectPlate(&gui->point, TEXTSEL2_X, y, TEXTSEL2_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, set_pointnum_cb, NULL); } else if(type == CURVE_DEADBAND || type == CURVE_EXPO) { GUI_CreateLabelBox(&gui->pointlbl, LABEL_X, y , LABEL_W, LINE_HEIGHT, &LABEL_FONT, NULL, NULL, _tr("Pos/Neg")); y += space; GUI_CreateTextSelectPlate(&gui->point, LABEL_X, y, LABEL_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, set_expopoint_cb, NULL); } y += space; GUI_CreateLabelBox(&gui->valuelbl, LABEL_X, y , LABEL_W, LINE_HEIGHT, &LABEL_FONT, NULL, NULL, _tr("Value")); y += VALUE_Y_OFFSET; GUI_CreateTextSelectPlate(&gui->value, VALUE_X, y, LABEL_W, LINE_HEIGHT, &TEXTSEL_FONT, NULL, set_value_cb, NULL); GUI_CreateXYGraph(&gui->graph, GRAPH_X, GRAPH_Y, GRAPH_W, GRAPH_H, CHAN_MIN_VALUE, CHAN_MIN_VALUE, CHAN_MAX_VALUE, CHAN_MAX_VALUE, 0, 0, //CHAN_MAX_VALUE / 4, CHAN_MAX_VALUE / 4, show_curve_cb, NULL, touch_cb, &edit->curve); GUI_SetSelected((guiObject_t *)&gui->point); }
static void _show_titlerow() { PAGE_SetActionCB(action_cb); mp->entries_per_page = 2; memset(gui, 0, sizeof(*gui)); labelDesc.style = LABEL_UNDERLINE; labelDesc.font_color = labelDesc.fill_color = labelDesc.outline_color = 0xffff; GUI_CreateLabelBox(&gui->chan, 0, 0 , LCD_WIDTH, ITEM_HEIGHT, &labelDesc, MIXPAGE_ChanNameProtoCB, NULL, (void *)((long)mp->cur_mixer->dest)); u8 x =40; u8 w = 50; labelDesc.style = LABEL_CENTER; GUI_CreateTextSelectPlate(&gui->tmpl, x, 0, w, ITEM_HEIGHT, &labelDesc, NULL, templatetype_cb, (void *)((long)mp->channel)); w = 38; GUI_CreateButtonPlateText(&gui->save, LCD_WIDTH - w, 0, w, ITEM_HEIGHT, &labelDesc, NULL, 0, okcancel_cb, (void *)_tr("Save")); }
static void _edit_cb(guiObject_t *obj, const void *data) { (void)obj; PAGE_SetActionCB(_sub_action_cb); struct Trim *trim = MIXER_GetAllTrims(); PAGE_SetModal(1); tp->index = (long)data; tp->trim = trim[tp->index]; PAGE_RemoveAllObjects(); PAGE_ShowHeader(""); // to draw a line only u8 w = 50; GUI_CreateButtonPlateText(&guit->save, LCD_WIDTH - w -1, 0, w, ITEM_HEIGHT, &DEFAULT_FONT, NULL, 0x0000, okcancel_cb, (void *)_tr("Save")); GUI_CreateScrollable(&gui->scrollable, 0, ITEM_HEIGHT + 1, LCD_WIDTH, LCD_HEIGHT - ITEM_HEIGHT -1, ITEM_SPACE, ITEM_LAST, row2_cb, getobj2_cb, NULL, NULL); GUI_SetSelected(GUI_ShowScrollableRowOffset(&gui->scrollable, 0)); }
static void show_iconsel_page(int SelectedIcon) { GUI_RemoveAllObjects(); memset(gui, 0, sizeof(*gui)); current_toggleicon = SelectedIcon; int toggleinput = MIXER_SRC(Model.pagecfg2.elem[tp->tglidx].src); //Header PAGE_ShowHeader(INPUT_SourceNameAbbrevSwitch(tempstring, toggleinput)); labelDesc.style = LABEL_CENTER; GUI_CreateButtonPlateText(&gui->revert, REVERT_X, 0, REVERT_W, HEADER_WIDGET_HEIGHT, &labelDesc, NULL, 0, revert_cb, (void *)_tr("Revert")); #if SEPARATOR GUI_CreateRect(&gui->separator, SEPARATOR_X, HEADER_WIDGET_HEIGHT, 1, LCD_HEIGHT-HEADER_HEIGHT, &labelDesc); #endif int row = ROW_Y; int num_positions = INPUT_NumSwitchPos(toggleinput); if(num_positions < 2) num_positions = 2; static const char * const tglidx[3] = {"0:", "1:", "2:"}; labelDesc.style = LABEL_INVERTED; for (int i = 0; i < num_positions; i++) { GUI_CreateLabelBox(&gui->togglelabel[i], LABEL_X, row, LABEL_W, LABEL_H, SelectedIcon == i ? &labelDesc : &DEFAULT_FONT, NULL, NULL, tglidx[i]); #ifdef HAS_CHAR_ICONS GUI_CreateLabelBox(&gui->toggleicon[i], ICON_X, row, ICON_W, LABEL_H, &DEFAULT_FONT, TGLICO_font_cb, NULL, (void *)(long)Model.pagecfg2.elem[tp->tglidx].extra[i]); #else struct ImageMap img = TGLICO_GetImage(Model.pagecfg2.elem[tp->tglidx].extra[i]); GUI_CreateImageOffset(&gui->toggleicon[i], ICON_X, row, ICON_W, LABEL_H, img.x_off, img.y_off, img.file, NULL, //SelectedIcon == 0 ? tglico_reset_cb : tglico_setpos_cb, (void *)(long)i); #endif row += ROW_INCREMENT; } int count = get_toggle_icon_count(); int rows = (count + NUM_COLS - 1) / NUM_COLS; GUI_CreateScrollable(&gui->scrollable, SCROLLABLE_X, SCROLLABLE_Y, LCD_WIDTH - SCROLLABLE_X, SCROLLABLE_H, SCROLL_ROW_H, rows, row_cb, NULL, NULL, (void *)(long)SelectedIcon); }
void PAGE_ReorderInit(int page) { (void)page; int i; int requested = rl.max; if (rl.max < rl.count) rl.max = rl.count; for(i = 0; i < rl.max; i++) { if (i < rl.count) rl.list[i] = i+1; else rl.list[i] = 0; } u8 space = LINE_HEIGHT; u8 y = 0; guiObject_t *obj = GUI_CreateButtonPlateText(&gui->up, ROW1_X, y, ROW1_W, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_UP); GUI_SetSelected(obj); GUI_CreateButtonPlateText(&gui->down, ROW2_X, y, ROW1_W , LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_DOWN); y += space; GUI_CreateTextSelectPlate(&gui->value, ROW1_X, y, BUTTON_W, LINE_HEIGHT, &DEFAULT_FONT, NULL, value_val_cb, NULL); y += space; GUI_CreateButtonPlateText(&gui->apply, ROW1_X, y, BUTTON_W, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)APPLY); y += space; GUI_CreateTextSelectPlate(&gui->copy, ROW1_X, y, BUTTON_W, LINE_HEIGHT, &DEFAULT_FONT, NULL, copy_val_cb, NULL); if (requested) { y += space; GUI_CreateButtonPlateText(&gui->insert, ROW1_X, y, ROW1_W, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)INSERT); GUI_CreateButtonPlateText(&gui->remove, ROW2_X, y, ROW1_W, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)REMOVE); } GUI_CreateButtonPlateText(&gui->save, SAVE_X, 0, SAVE_W, LINE_HEIGHT, &DEFAULT_FONT, NULL, 0x0000, okcancel_cb, (void *)_tr("Save")); GUI_CreateScrollable(&gui->scrollable, LABEL_X, LINE_HEIGHT, LCD_WIDTH - LABEL_X , LCD_HEIGHT-LINE_HEIGHT, LINE_SPACE, rl.max, row_cb, NULL, NULL, NULL); GUI_SetSelectable((guiObject_t *)&gui->scrollable, 0); }
static int row_cb(int absrow, int relrow, int y, void *data) { (void) data; u8 ts_x = DEFAULT_TEXTSEL_X; int count = 0; const void *label = NULL; void *ts_tgl = NULL; void *ts_value = NULL; void *but_txt = NULL; void *but_tgl = NULL; void *but_data = NULL; switch(absrow) { case ITEM_FILE: label = _tr_noop("File"); ts_tgl = file_press_cb; ts_value = file_val_cb; break; case ITEM_NAME: label = _tr_noop("Model name"); but_txt = show_text_cb; but_tgl = _changename_cb; but_data = Model.name; break; case ITEM_ICON: label = _tr_noop("Icon"); but_txt = show_icontext_cb; but_tgl = changeicon_cb; break; case ITEM_TYPE: label = _tr_noop("Model type"); ts_tgl = type_press_cb; ts_value = type_val_cb; break; case ITEM_TXPOWER: label = _tr_noop("Tx power"); ts_value = powerselect_cb; break; case ITEM_PPMIN: label = _tr_noop("PPM In"); ts_tgl = ppmin_press_cb; ts_value = ppmin_select_cb; break; #if HAS_VIDEO case ITEM_VIDEO: label = _tr_noop("Video"); but_data = _tr_noop("Setup"); but_tgl = video_settings_cb; break; #endif case ITEM_PROTO: ts_tgl = proto_press_cb; ts_value = protoselect_cb; ts_x = LEFT_TEXTSEL_X; but_txt = show_bindtext_cb; but_tgl = bind_cb; break; case ITEM_FIXEDID: label = _tr_noop("Fixed ID"); but_txt = show_text_cb; but_tgl = fixedid_cb; but_data = mp->fixed_id; break; case ITEM_NUMCHAN: label = _tr_noop("# Channels"); ts_value = numchanselect_cb; break; #if HAS_STANDARD_GUI case ITEM_GUI: label = _tr_noop("Mixer GUI"); ts_value = mixermode_cb; break; #endif } if (label) GUI_CreateLabelBox(&gui->col1[relrow].label, LABEL_X, y, LABEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr(label)); if (ts_value) { GUI_CreateTextSelectPlate(but_txt ? &gui->col1[relrow].ts : &gui->col2[relrow].ts, ts_x, y, TEXTSEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, ts_tgl, ts_value, NULL); count++; } if (but_tgl) { GUI_CreateButtonPlateText(&gui->col2[relrow].but, BUTTON_X, y, BUTTON_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, but_txt, 0x0000, but_tgl, but_data); count++; } return count; }
static int row_cb(int absrow, int relrow, int y, void *data) { data = NULL; const void *label = ""; const void *title = NULL; void *tgl = NULL; void *value = NULL; void *but_str = NULL; u8 x = LARGE_SEL_X_OFFSET; switch(absrow) { #ifndef NO_LANGUAGE_SUPPORT case ITEM_LANG: title = _tr_noop("Generic settings"); label = _tr_noop("Language"); but_str = langstr_cb; tgl = lang_select_cb; break; #endif case ITEM_MODE: #ifdef NO_LANGUAGE_SUPPORT title = _tr_noop("Generic settings"); #endif label = _tr_noop("Stick mode"); value = modeselect_cb; break; case ITEM_STICKS: label = _tr_noop("Sticks"); but_str = calibratestr_cb; tgl = press_cb; data = (void *)CALIB_STICK; break; case ITEM_BUZZ: title = _tr_noop("Buzz settings"); label = _tr_noop("Buzz volume"); value = _buzz_vol_cb; data = &Transmitter.volume; break; case ITEM_HAPTIC: label = _tr_noop("Vibration"); value = _vibration_state_cb; data = &Transmitter.vibration_state; break; case ITEM_BATT: label = _tr_noop("Batt alarm"); value = batalarm_select_cb; break; case ITEM_ALARM_INTV: label = _tr_noop("Alarm intvl"); value = batalarmwarn_select_cb; break; case ITEM_PWR_ALARM: label = _tr_noop("PwrOn alarm"); value = poweralarm_select_cb; break; case ITEM_PWRDN_ALARM: label = _tr_noop("PwrDn alert"); value = _music_shutdown_cb; break; case ITEM_BACKLIGHT: title = _tr_noop("LCD settings"); label = _tr_noop("Backlight"); value = backlight_select_cb; break; case ITEM_CONTRAST: label = _tr_noop("Contrast"); value = _contrast_select_cb; break; case ITEM_DIMTIME: label = _tr_noop("Dimmer time"); value = auto_dimmer_time_cb; x = SMALL_SEL_X_OFFSET; break; case ITEM_DIMVAL: label = _tr_noop("Dimmer target"); value = common_select_cb; data = &Transmitter.auto_dimmer.backlight_dim_value; x = MED_SEL_X_OFFSET; break; case ITEM_PREALERT: title = _tr_noop("Timer settings"); label = _tr_noop("Prealert time"); value = prealert_time_cb; data = (void *)0L; x = MED_SEL_X_OFFSET; break; case ITEM_PREALERT_IVAL: label = _tr_noop("Prealert intvl"); value = timer_interval_cb; data = &Transmitter.countdown_timer_settings.prealert_interval; x = SMALL_SEL_X_OFFSET; break; case ITEM_TIMEUP: label = _tr_noop("Timeup intvl"); value = timer_interval_cb; data = &Transmitter.countdown_timer_settings.timeup_interval; x = SMALL_SEL_X_OFFSET; break; case ITEM_TELEMTEMP: title = _tr_noop("Telemetry settings"); label = _tr_noop("Temperature"); value = units_cb; data = (void *)1L; break; case ITEM_TELEMLEN: label = _tr_noop("Length"); value = units_cb; data = (void *)0L; break; } if (title) { enum LabelType oldType = labelDesc.style; labelDesc.style = LABEL_UNDERLINE; GUI_CreateLabelBox(&gui->title[relrow], TITLE_X_OFFSET, y, TITLE_WIDTH, LINE_HEIGHT, &labelDesc, NULL, NULL, _tr(title)); labelDesc.style = oldType; y += LINE_SPACE; } GUI_CreateLabelBox(&gui->label[relrow], LABEL_X_OFFSET, y, LABEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, NULL, NULL, _tr(label)); if(but_str) { GUI_CreateButtonPlateText(&gui->value[relrow].but, x, y, TEXTSEL_X_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, but_str, 0x0000, tgl, data); } else { GUI_CreateTextSelectPlate(&gui->value[relrow].ts, x, y, TEXTSEL_X_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, NULL, value, data); } return 1; }
static int expo_row_cb(int absrow, int relrow, int y, void *data) { const char *label = NULL; int underline = 0; void * label_cb = NULL; void *tgl = NULL; void *value = NULL; data = NULL; void *but_tgl = NULL; void *but_txt = NULL; void *but_data = NULL; int disable = 0; int x = 0; int w = LEFT_VIEW_WIDTH; switch(absrow) { case COMMON_SRC: label = _tr("Src"); tgl = sourceselect_cb; value = set_source_cb; data = &mp->cur_mixer->src; break; case COMMON_CURVE: label = _tr("High-Rate"); tgl = curveselect_cb; value = set_curvename_cb; data = &mp->mixer[0]; break; case COMMON_SCALE: label = (void *)0; label_cb = scalestring_cb; value = set_number100_cb; data = &mp->mixer[0].scalar; break; case EXPO_SWITCH1: label = _tr("Switch1"); underline = 1; tgl = sourceselect_cb; value = set_drsource_cb; data = &mp->mixer[1].sw; break; case EXPO_LINK1: but_tgl = toggle_link_cb; but_txt = show_rate_cb; but_data = (void *)0; if(! MIXER_SRC(mp->mixer[1].sw)) disable = 1; break; case EXPO_CURVE1: tgl = curveselect_cb; value = set_curvename_cb; data = &mp->mixer[1]; if(! MIXER_SRC(mp->mixer[1].sw) || mp->link_curves & 0x01) disable = 1; break; case EXPO_SCALE1: label = (void *)1; label_cb = scalestring_cb; value = set_number100_cb; data = &mp->mixer[1].scalar; if(! MIXER_SRC(mp->mixer[1].sw)) disable = 1; break; case EXPO_SWITCH2: label = _tr("Switch2"); underline = 1; tgl = sourceselect_cb; value = set_drsource_cb; data = &mp->mixer[2].sw; break; case EXPO_LINK2: but_tgl = toggle_link_cb; but_txt = show_rate_cb; but_data = (void *)1; if(! MIXER_SRC(mp->mixer[2].sw)) disable = 1; break; case EXPO_CURVE2: tgl = curveselect_cb; value = set_curvename_cb; data = &mp->mixer[2]; if(! MIXER_SRC(mp->mixer[2].sw) || mp->link_curves & 0x02) disable = 1; break; case EXPO_SCALE2: label = (void *)2; label_cb = scalestring_cb; value = set_number100_cb; data = &mp->mixer[2].scalar; if(! MIXER_SRC(mp->mixer[2].sw)) disable = 1; break; } if(label || label_cb) { labelDesc.style = LABEL_LEFTCENTER; GUI_CreateLabelBox(&gui->label[relrow], x, y, w, ITEM_HEIGHT, &labelDesc, label_cb, NULL, label); if(underline) GUI_CreateRect(&gui->rect1, x, y, LEFT_VIEW_WIDTH, 1, &labelDesc); y += ITEM_HEIGHT + 1; } labelDesc.style = LABEL_CENTER; if(but_tgl) { GUI_CreateButtonPlateText(&gui->value[relrow].but, x, y, w, ITEM_HEIGHT, &labelDesc, but_txt, 0xffff, but_tgl, but_data); if(disable) { GUI_ButtonEnable((guiObject_t *)&gui->value[relrow].but, 0); } } else { GUI_CreateTextSelectPlate(&gui->value[relrow].ts, x, y, w, ITEM_HEIGHT, &labelDesc, tgl, value, data); if(disable) { GUI_TextSelectEnable(&gui->value[relrow].ts, 0); } } return 1; }
void PAGE_ShowReorderList(u8 *list, u8 count, u8 selected, u8 max_allowed, const char *(*text_cb)(u8 idx), void(*return_page)(u8 *)) { rl.return_page = return_page; rl.list = list; rl.selected = selected; rl.copyto = selected; rl.count = count; rl.text_cb = text_cb; rl.max = max_allowed; if (rl.max < count) rl.max = count; PAGE_RemoveAllObjects(); PAGE_SetModal(1); current_selected = 0; int i; for(i = 0; i < rl.max; i++) { if (i < count) list[i] = i+1; else list[i] = 0; } u8 space = LINE_HEIGHT; u8 y = 0; u8 w = 55; guiObject_t *obj = GUI_CreateButtonPlateText(&gui->up, 0, y, w/2 -2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_UP); GUI_SetSelected(obj); GUI_CreateButtonPlateText(&gui->down, w/2, y, w/2 -2 , LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_DOWN); y += space; GUI_CreateTextSelectPlate(&gui->value, 0, y, w, LINE_HEIGHT, &DEFAULT_FONT, NULL, copy_val_cb, NULL); y += space; GUI_CreateButtonPlateText(&gui->apply, 0, y, w, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)APPLY); if (max_allowed) { y += space; GUI_CreateButtonPlateText(&gui->insert, 0, y, w/2 -2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)INSERT); GUI_CreateButtonPlateText(&gui->remove, w/2, y, w/2 - 2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)REMOVE); } y += space; GUI_CreateButtonPlateText(&gui->save, (w -30)/2, y, 30, LINE_HEIGHT, &DEFAULT_FONT, NULL, 0x0000, _okcancel_cb, (void *)_tr("Save")); u8 x = w + 4; GUI_CreateListBoxPlateText(&gui->list, x, 0, LCD_WIDTH - x , LCD_HEIGHT, rl.max, selected, &DEFAULT_FONT, LISTBOX_KEY_RIGHTLEFT, string_cb, select_cb, NULL, NULL); GUI_SetSelectable((guiObject_t *)&gui->list, 0); PAGE_SetActionCB(NULL); // we need to grab the key handler from the listbox to let rl.textsel catch left/right keys when it is selected // hence registerCallback has to be used here BUTTON_RegisterCallback(&action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_PRIORITY, _action_cb, obj); }