void PAGE_USBInit(int page) { (void)page; PAGE_SetModal(0); _draw_page(0); BUTTON_RegisterCallback(&up->action, CHAN_ButtonMask(BUT_ENTER), BUTTON_PRESS | BUTTON_RELEASE | BUTTON_PRIORITY, usb_cb, NULL); }
guiObject_t *GUI_CreateKeyboard(guiKeyboard_t *keyboard, enum KeyboardType type, char *text, s32 max_size, void (*CallBack)(struct guiObject *obj, void *data), void *cb_data) { struct guiObject *obj = (guiObject_t *)keyboard; CLEAR_OBJ(keyboard); obj->Type = Keyboard; OBJ_SET_MODAL(obj, 1); connect_object(obj); keyboard->type = type; keyboard->text = text; keyboard->flags = FLAG_BUTTON; keyboard->max_size = max_size; keyboard->last_row = 0; keyboard->last_col = 0; keyboard->lastchar = array[keyboard->type][0][0]; BUTTON_RegisterCallback(&keyboard->action, CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN) | CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_PRIORITY, press_cb, obj); keyboard->CallBack = CallBack; keyboard->cb_data = cb_data; return obj; }
void PAGE_MainLayoutInit(int page) { (void)page; memset(lp, 0, sizeof(*lp)); BUTTON_RegisterCallback(&action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_PRIORITY, _action_cb, NULL); PAGE_ShowHeader(NULL); lp->long_press = 0; lp->newelem = 0; lp->selected_x = 0; const u16 color[5] = { RGB888_to_RGB565(0xaa, 0x44, 0x44), RGB888_to_RGB565(0x44, 0xaa, 0x44), RGB888_to_RGB565(0x44, 0x44, 0xaa), RGB888_to_RGB565(0x44, 0x44, 0x44), RGB888_to_RGB565(0x33, 0x33, 0x33), }; for (int i = 0 ; i < 5; i++) gui->desc[i] = (struct LabelDesc){ .font = 0, .font_color = 0xffff, .fill_color = color[i], .outline_color = 0, .style = LABEL_FILL}; gui->desc[1].font = TINY_FONT.font; //Special case for trims GUI_CreateIcon(&gui->newelem, 32, 0, &icons[ICON_LAYOUT_ADD], add_dlg_cb, NULL); GUI_CreateIcon(&gui->editelem, 64, 0, &icons[ICON_LAYOUT_CFG], cfg_cb, NULL); GUI_SetHidden((guiObject_t *)&gui->editelem, 1); //GUI_CreateTextSelect(&gui->newelem, 36, 12, TEXTSELECT_96, newelem_press_cb, newelem_cb, NULL); GUI_CreateLabel(&gui->xlbl, 80+18, 9, NULL, TITLE_FONT, "X"); GUI_CreateTextSelect(&gui->x, 88+18, 8, TEXTSELECT_64, NULL, xpos_cb, NULL); GUI_CreateLabel(&gui->ylbl, 164+16, 9, NULL, TITLE_FONT, "Y"); GUI_CreateTextSelect(&gui->y, 172+16, 8, TEXTSELECT_64, NULL, ypos_cb, NULL); GUI_SelectionNotify(notify_cb); draw_elements(); if (show_config_menu) { lp->selected_for_move = show_config_menu; show_config(); show_config_menu = 0; } } void PAGE_MainLayoutEvent() { } void PAGE_MainLayoutExit() { BUTTON_UnregisterCallback(&action); }
// Bug fix: Unlike devo8, devo10's page always has 1 default selected objects. When a dialog, e.g. saftydialog, // got poped up, the following statement in handle_buttons() will never get satisfied, the dialog hence is stuck. // ... // if (! objTOUCHED || objTOUCHED == objSELECTED) { // So the modal buttons handler must separate, hence devo8's modal button handling logic keeps as current // while have a new logic for devo10 void GUI_HandleModalButtons(u8 enable) { if (! enable) BUTTON_UnregisterCallback(&button_modalaction); else BUTTON_RegisterCallback(&button_modalaction, 0xFFFFFFFF, BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, _handle_modalbuttons_devo10, NULL); }
void MIXER_RegisterTrimButtons() { int i; BUTTON_UnregisterCallback(&button_action); u32 mask = 0; for (i = 0; i < NUM_TRIMS; i++) { mask |= CHAN_ButtonMask(Model.trims[i].neg); mask |= CHAN_ButtonMask(Model.trims[i].pos); } BUTTON_RegisterCallback(&button_action, mask, BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_RELEASE, MIXER_UpdateTrim, NULL); }
void PAGE_Init() { cur_page = sizeof(pages) / sizeof(struct page) - 1; cur_section = 0; modal = 0; GUI_RemoveAllObjects(); enter_cmd = NULL; exit_cmd = NULL; BUTTON_RegisterCallback(&button_action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_LEFT), BUTTON_PRESS | BUTTON_LONGPRESS, page_change_cb, NULL); PAGE_ChangeByID(PAGEID_SPLASH); //PAGE_ChangeByID(PAGEID_MAIN); }
void GUI_HandleButtons(u8 enable) { if (! enable) BUTTON_UnregisterCallback(&button_action); else BUTTON_RegisterCallback(&button_action, CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN) | CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT), BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, handle_buttons, NULL); }
void PAGE_Init() { cur_page = 0; modal = 0; page_scrollable = NULL; GUI_RemoveAllObjects(); enter_cmd = NULL; exit_cmd = NULL; BUTTON_RegisterCallback(&button_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_RELEASE | BUTTON_PRIORITY, page_change_cb, NULL); PAGE_ChangeByID(PAGEID_SPLASH, 0); //PAGE_ChangeByID(PAGEID_MAIN); }
static void show_button_page() { // show elements where they are located on the real tx enum { OFFSET_X = ((LCD_WIDTH - 320) / 2), // center on Devo12-screen OFFSET_Y = ((LCD_HEIGHT - 240) / 2), }; enum {X = 0, Y = 1}; struct LabelDesc alignRight = { .font = DEFAULT_FONT.font, .align = ALIGN_RIGHT, .font_color = DEFAULT_FONT.font_color, .fill_color = DEFAULT_FONT.fill_color, .outline_color = DEFAULT_FONT.outline_color }; const int label_pos[NUM_TX_BUTTONS][2] = CHANTEST_BUTTON_PLACEMENT; cp->is_locked = 3; GUI_CreateLabelBox(&gui->lock, OFFSET_X, 34, 320, 20, &NARROW_FONT, lockstr_cb, NULL, NULL); for (int i = 0; i < NUM_TX_BUTTONS; i++) { if ((1 << (i + 1)) & Transmitter.ignore_buttons) continue; GUI_CreateLabelBox(&gui->value[i], OFFSET_X + (label_pos[i][X] > 0 ? label_pos[i][X] + 50 : -label_pos[i][X] -20), // >0? box at left side of label, otherwise right OFFSET_Y + label_pos[i][Y], 16, 16, &SMALLBOX_FONT, NULL, NULL, (void *)""); GUI_CreateLabelBox(&gui->chan[i], OFFSET_X + abs(label_pos[i][X]), // no differencing for the label OFFSET_Y + label_pos[i][Y], 48, 16, label_pos[i][X] > 0 ? &alignRight : &DEFAULT_FONT, button_str_cb, NULL, (void *)(long)i); } } void _handle_button_test() { if (cp->is_locked == 0 && SPITouch_IRQ()) { BUTTON_RegisterCallback(&cp->action, 0xFFFFFFFF, BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, button_capture_cb, NULL); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 1 && ! SPITouch_IRQ()) { cp->is_locked++; } else if (cp->is_locked == 2 && SPITouch_IRQ()) { BUTTON_UnregisterCallback(&cp->action); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 3 && ! SPITouch_IRQ()) { cp->is_locked = 0; } u32 buttons = ScanButtons(); for (int i = 0; i < NUM_TX_BUTTONS; i++) { GUI_SetLabelDesc(&gui->value[i], CHAN_ButtonIsPressed(buttons, i+1) ? &SMALLBOXNEG_FONT : &SMALLBOX_FONT); } return; } static inline guiObject_t *_get_obj(int chan, int objid) { return objid == ITEM_GRAPH ? (guiObject_t *)&gui->bar[chan] : (guiObject_t *)&gui->value[chan]; } static const char *channum_cb(guiObject_t *obj, const void *data) { (void)obj; int disp = (long)data; int ch = get_channel_idx(cur_row * NUM_BARS_PER_ROW + disp); if (cp->type) { char *p = tempstring; if (disp & 0x01) { *p = '\n'; p++; } CONFIG_EnableLanguage(0); //Disable translation because tiny font is limited in character set INPUT_SourceName(p, ch+1); CONFIG_EnableLanguage(1); if (! (disp & 0x01)) { sprintf(p + strlen(p), "\n"); } } else { ch -= NUM_INPUTS; if (ch < NUM_OUT_CHANNELS) { sprintf(tempstring, "\n%d", ch+1); } else { ch -= NUM_OUT_CHANNELS; if (Model.virtname[ch][0]) { tempstring_cpy(Model.virtname[ch]) ; } else { sprintf(tempstring, "%s%d", _tr("Virt"), ch+1); } } } return tempstring; }
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); }