static void simplePageHandler(const edit_element_t *elements, uint8_t len) { NOKEYRETURN; edit_element_t element; elementKey(len); if (KEY4) // CHANGE? { memcpy_P(&element, &elements[elementIndex], sizeof(element)); startEditMode(element.valuePtr, element.loLimit, element.hiLimit, TYPE_UINT8); return; } for (uint8_t i = 0; i < len; i++) { memcpy_P(&element, &elements[i], sizeof(element)); writeValue(element.X, element.Y, *(uint8_t*)element.valuePtr, element.len, i); } }
static void _hCPPMSettings() { NOKEYRETURN; uint8_t oldsubpage = elementIndex / 4; elementKey(8); uint8_t subpage = elementIndex / 4; if (KEYINIT || KEYREFRESH || oldsubpage != subpage) writeCPPMScreen(subpage); if (KEY4) // CHANGE? { startEditMode(&Config.RX_chmap[subpage * 4 + elementIndex - 1], 1, 8, TYPE_UINT8); return; } for (int i = 0; i < 4; i++) writeValue(2 + i, 13*6, Config.RX_chmap[subpage * 4 + i], 1, i + subpage * 4); }
static void _hMixerEditor() { NOKEYRETURN; if (KEY4) // CHANGE? { if (elementIndex == 0) subpage = (subpage + 1) % length(Config.Mixer); else if (elementIndex <= 5) { startEditMode(&Config.Mixer[subpage].I8[elementIndex - 1], -127, 127, TYPE_INT8); return; } else if (elementIndex == 6) // type { if (Config.Mixer[subpage].Flags == 0) Config.Mixer[subpage].Flags = FLAG_ESC | FLAG_HIGH; else if (Config.Mixer[subpage].IsMotor) Config.Mixer[subpage].Flags = FLAG_SERVO; else Config.Mixer[subpage].Flags = FLAG_NONE; } else Config.Mixer[subpage].Flags ^= FLAG_HIGH; } elementKey(8); writeValue(0, 120, subpage + 1, 1, 0); for (uint8_t i = 0; i < 5; i++) writeValue(i, 60, Config.Mixer[subpage].I8[i], 4, i + 1); const char *s; if (Config.Mixer[subpage].IsMotor) s = strESC; else if (Config.Mixer[subpage].IsServo) s = strServo; else s = strOff; writeString_P(5, 36, s, 5, 6); writeString_P(5, 108, Config.Mixer[subpage].IsMotor || Config.Mixer[subpage].IsHiRate ? strHigh : strLow, 3, 7); }
static void _hPIEditor() { NOKEYRETURN; elementKey(5); uint8_t index = subpage; if (Config.LinkRollPitch) index = subpage & 0xFE; if (KEY4) // CHANGE { if (elementIndex == 0) { subpage = (subpage + 1) % 3; index = subpage; if (Config.LinkRollPitch) index = subpage & 0xFE; } else { startEditMode(&Config.PID[index].UI8[elementIndex - 1], 0, 200, TYPE_UINT8); return; } } lcdSetPos(0, 30); lcdReverse(elementIndex == 0); switch (subpage) { case 0: writePadded_P(strRollAil, 16); break; case 1: writePadded_P(strPitchEle, 16); break; default: writePadded_P(strYawRud, 16); break; } for (uint8_t i = 0; i < 4; i++) writeValue(i + 2, 60, Config.PID[index].UI8[i], 5, i + 1); }
bool ListWidget::handleKeyDown(Common::KeyState state) { bool handled = true; bool dirty = false; int oldSelectedItem = _selectedItem; if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) { // Quick selection mode: Go to first list item starting with this key // (or a substring accumulated from the last couple key presses). // Only works in a useful fashion if the list entries are sorted. uint32 time = g_system->getMillis(); if (_quickSelectTime < time) { _quickSelectStr = (char)state.ascii; } else { _quickSelectStr += (char)state.ascii; } _quickSelectTime = time + 300; // TODO: Turn this into a proper constant (kQuickSelectDelay ?) if (_quickSelect) { // FIXME: This is bad slow code (it scans the list linearly each time a // key is pressed); it could be much faster. Only of importance if we have // quite big lists to deal with -- so for now we can live with this lazy // implementation :-) int newSelectedItem = 0; int bestMatch = 0; bool stop; for (StringArray::const_iterator i = _list.begin(); i != _list.end(); ++i) { const int match = matchingCharsIgnoringCase(i->c_str(), _quickSelectStr.c_str(), stop); if (match > bestMatch || stop) { _selectedItem = newSelectedItem; bestMatch = match; if (stop) break; } newSelectedItem++; } scrollToCurrent(); } else { sendCommand(_cmd, 0); } } else if (_editMode) { // Class EditableWidget handles all text editing related key presses for us handled = EditableWidget::handleKeyDown(state); } else { // not editmode switch (state.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_KP_ENTER: if (_selectedItem >= 0) { // override continuous enter keydown if (_editable && (_currentKeyDown != Common::KEYCODE_RETURN && _currentKeyDown != Common::KEYCODE_KP_ENTER)) { dirty = true; startEditMode(); } else sendCommand(kListItemActivatedCmd, _selectedItem); } break; // Keypad & special keys // - if num lock is set, we do not handle the keypress // - if num lock is not set, we either fall down to the special key case // or ignore the key press for 0, 4, 5 and 6 case Common::KEYCODE_KP_PERIOD: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_BACKSPACE: case Common::KEYCODE_DELETE: if (_selectedItem >= 0) { if (_editable) { // Ignore delete and backspace when the list item is editable } else { sendCommand(kListItemRemovalRequestCmd, _selectedItem); } } break; case Common::KEYCODE_KP1: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_END: _selectedItem = _list.size() - 1; break; case Common::KEYCODE_KP2: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_DOWN: if (_selectedItem < (int)_list.size() - 1) _selectedItem++; break; case Common::KEYCODE_KP3: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_PAGEDOWN: _selectedItem += _entriesPerPage - 1; if (_selectedItem >= (int)_list.size() ) _selectedItem = _list.size() - 1; break; case Common::KEYCODE_KP7: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_HOME: _selectedItem = 0; break; case Common::KEYCODE_KP8: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_UP: if (_selectedItem > 0) _selectedItem--; break; case Common::KEYCODE_KP9: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_PAGEUP: _selectedItem -= _entriesPerPage - 1; if (_selectedItem < 0) _selectedItem = 0; break; default: handled = false; } scrollToCurrent(); } if (dirty || _selectedItem != oldSelectedItem) draw(); if (_selectedItem != oldSelectedItem) { sendCommand(kListSelectionChangedCmd, _selectedItem); // also draw scrollbar _scrollBar->draw(); } return handled; }