void BasicGrid::set_cursor( UI::index_type col, UI::index_type row ) noexcept { col = value_clamp(col, 0, max_ce(0, col_count() - 1)); row = value_clamp(row, 0, max_ce(0, row_count() - 1)); if (col != m_cursor.col || row != m_cursor.row) { if ( value_in_bounds(m_cursor.row, 0, row_count()) && value_in_bounds(m_cursor.col, 0, col_count()) ) { queue_cell_render( m_cursor.row, m_cursor.row + 1, m_cursor.col, m_cursor.col + 1 ); } if (row_count() > 0) { queue_cell_render( row, row + 1, col, col + 1 ); } enqueue_actions( UI::UpdateActions::render | UI::UpdateActions::flag_noclear ); m_cursor.col = col; m_cursor.row = row; adjust_view(); if (is_focused()) { App::instance.m_ui.csline->set_location( std::to_string(m_cursor.row) + ", " + std::to_string(m_cursor.col) ); } } }
find_cell_text_row(TableUI *tui, unsigned row, unsigned col, char *text) { Table *table = tui->table; unsigned r,c; /* Find in current row after current column */ for (r = row, c = col + 1; c < col_count(table, r); c++) if (cell_has_text(table, r, c, text)) goto found; /* Find in rows after current */ for (r = row + 1; r < row_count(table); r++) for (c = 0; c < col_count(table, r); c++) if (cell_has_text(table, r, c, text)) goto found; /* Wrap around and find in rows before current */ for (r = 0; r < row; r++) for (c = 0; c < col_count(table, r); c++) if (cell_has_text(table, r, c, text)) goto found; return 0; found: jump_cursor(tui, r, c); return 1; }
void BasicGrid::resize_grid( UI::index_type new_col_count, UI::index_type new_row_count ) { m_sel.resize(new_row_count); set_row_count(new_row_count); set_col_count(new_col_count); set_cursor(0, 0); update_view( 0, view().fit_count, 0, col_count(), false ); queue_header_render(); queue_cell_render(0, row_count()); enqueue_actions( UI::UpdateActions::render ); }
void BasicGrid::adjust_view() noexcept { auto const& view = this->view(); if ( view.row_range.x > m_cursor.row || view.row_range.y <= m_cursor.row || view.col_range.x > m_cursor.col || view.col_range.y <= m_cursor.col ) { auto row_begin = m_cursor.row; if (view.row_range.y <= m_cursor.row) { row_begin -= view.fit_count - 1; } update_view( row_begin, row_begin + view.fit_count, 0, col_count(), true ); enqueue_actions(UI::UpdateActions::render); } }
command(TableUI *tui, int cmd) { switch (cmd) { case CmdClearFile: clear_file(tui); break; case CmdOpenFile: clear_and_open(tui, tui->filename); if (row_count(tui->table) < MAX_ROWS_FOR_FIT && max_col_count(tui->table) < MAX_COLS_FOR_FIT) { unsigned i; for (i = 0; i < max_col_count(tui->table); i++) auto_resize_col(tui, i); } break; case CmdSaveFile: save_csv(tui, tui->filename); break; case CmdSetAnchor: set_anchor(tui); break; case CmdClearAnchor: clear_anchor(tui); break; case CmdClearRow: clear_selected_rows(tui); break; case CmdDeleteRow: delete_selected_rows(tui); break; case CmdDeleteCell: delete_selected_cells(tui); break; case CmdClearCell: clear_selected_cells(tui); break; case CmdCopy: copy_to_clipboard(tui); break; case CmdCutClear: copy_to_clipboard(tui); clear_selected_cells(tui); break; case CmdCutDelete: copy_to_clipboard(tui); delete_selected_cells(tui); break; case CmdPaste: clear_anchor(tui); paste_clipboard(tui); break; case CmdReturn: clear_anchor(tui); move_cursor(tui, 1, 0); break; case CmdTab: clear_anchor(tui); move_cursor(tui, 0, 1); break; case CmdUnReturn: clear_anchor(tui); move_cursor(tui, -1, 0); break; case CmdUnTab: clear_anchor(tui); move_cursor(tui, 0, -1); break; case CmdEditCell: start_edit(tui, 1); break; case CmdEditCellClear: start_edit(tui, 0); break; case CmdCommitEdit: end_edit(tui); break; case CmdCancelEdit: cancel_edit(tui); break; case CmdMoveUp: move_cursor(tui, -1, 0); break; case CmdMoveDown: move_cursor(tui, 1, 0); break; case CmdMoveLeft: move_cursor(tui, 0, -1); break; case CmdMoveRight: move_cursor(tui, 0, 1); break; case CmdScrollUp: scroll(tui, -1, 0); break; case CmdScrollDown: scroll(tui, 1, 0); break; case CmdScrollLeft: scroll(tui, 0, -1); break; case CmdScrollRight: scroll(tui, 0, 1); break; case CmdHomeCol: jump_cursor(tui, 0, tui->cur_col); break; case CmdHomeRow: jump_cursor(tui, tui->cur_row, 0); break; case CmdEndCol: jump_cursor(tui, row_count(tui->table) - 1, tui->cur_col); break; case CmdEndRow: jump_cursor(tui, tui->cur_row, col_count(tui->table, tui->cur_row) - 1); break; case CmdInsertDate: insert_datetime(tui, 0); break; case CmdInsertDateTime: insert_datetime(tui, 1); break; case CmdInsertCell: insert_cells(tui->table, tui->cur_row, tui->cur_col, 1); redraw_rows(tui, tui->cur_row, tui->cur_row); break; case CmdInsertRow: insert_rows(tui->table, tui->cur_row, 1); redraw_rows(tui, tui->cur_row, -1); break; case CmdFindColumn: find_cell_text_col(tui, tui->cur_row, tui->cur_col, tui->find_text); break; case CmdFindRow: find_cell_text_row(tui, tui->cur_row, tui->cur_col, tui->find_text); break; } }