TaskResult Char(const KeyInfo& info) override{ auto handleKeyPress = [&](){ m_autoComplete.Forget(); return handle_key_press(info.key, m_textObject->GetTextBuffer()) ? TaskResult::DRAW : TaskResult::NONE; }; if (is_exit_key(info.key)){ return Commit(info.layerType); } else if (info.key.Is(key::tab) && m_settings.Get(ts_ParseExpressions)){ return handle_completion(m_autoComplete, m_textObject->GetTextBuffer()) ? TaskResult::DRAW : handleKeyPress(); } return handle_command_key(info.key, m_textObject).Visit( [&](TextChange& cmd){ m_autoComplete.Forget(); // Fixme: Need to support undo cmd.Do(); m_states.Did(cmd); return TaskResult::DRAW; }, handleKeyPress); }
int ui_browser__run(struct ui_browser *self, struct newtExitStruct *es) { if (ui_browser__refresh(self) < 0) return -1; while (1) { off_t offset; newtFormRun(self->form, es); if (es->reason != NEWT_EXIT_HOTKEY) break; if (is_exit_key(es->u.key)) return es->u.key; switch (es->u.key) { case NEWT_KEY_DOWN: if (self->index == self->nr_entries - 1) break; ++self->index; if (self->index == self->top_idx + self->height) { ++self->top_idx; self->seek(self, +1, SEEK_CUR); } break; case NEWT_KEY_UP: if (self->index == 0) break; --self->index; if (self->index < self->top_idx) { --self->top_idx; self->seek(self, -1, SEEK_CUR); } break; case NEWT_KEY_PGDN: case ' ': if (self->top_idx + self->height > self->nr_entries - 1) break; offset = self->height; if (self->index + offset > self->nr_entries - 1) offset = self->nr_entries - 1 - self->index; self->index += offset; self->top_idx += offset; self->seek(self, +offset, SEEK_CUR); break; case NEWT_KEY_PGUP: if (self->top_idx == 0) break; if (self->top_idx < self->height) offset = self->top_idx; else offset = self->height; self->index -= offset; self->top_idx -= offset; self->seek(self, -offset, SEEK_CUR); break; case NEWT_KEY_HOME: ui_browser__reset_index(self); break; case NEWT_KEY_END: offset = self->height - 1; if (offset >= self->nr_entries) offset = self->nr_entries - 1; self->index = self->nr_entries - 1; self->top_idx = self->index - offset; self->seek(self, -offset, SEEK_END); break; default: return es->u.key; } if (ui_browser__refresh(self) < 0) return -1; } return 0; }