чување cf2bb3e3a3330ae79f5b71809a52c4e031ad87e2
родитељ 19ced272d9e06c3d24516f0d3e9104c7553f83cb
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Sun, 13 Feb 2022 20:24:53 +0100
Add basic movement (g/G/Home/End/PgUp/PgDn)
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
измењених датотека: 5, додавања: 107(+), брисања: 132(-)
diff --git a/TODO b/TODO
@@ -1,7 +1,9 @@
TODO
====
- [ ] Create a working base by migration from poe
+ [~] Create a working base by migration from poe
+
+ [ ] Implement "inverse vi mode"
Legend
diff --git a/config.def.h b/config.def.h
@@ -25,7 +25,7 @@ static const struct StatusSegment status_segments[] = {
.fg = TB_BLACK,
.bg = TB_WHITE,
.alignment = LEFT},
- {.format = "%ld/%ld (%ld%%)",
+ {.format = "%ld:%ld (%ld%%)",
.callback = format_position,
.fg = TB_WHITE | TB_BOLD,
.bg = TB_BLUE,
diff --git a/config.h b/config.h
@@ -25,7 +25,7 @@ static const struct StatusSegment status_segments[] = {
.fg = TB_BLACK,
.bg = TB_WHITE,
.alignment = LEFT},
- {.format = "%ld/%ld (%ld%%)",
+ {.format = "%ld:%ld (%ld%%)",
.callback = format_position,
.fg = TB_WHITE | TB_BOLD,
.bg = TB_BLUE,
diff --git a/draw.c b/draw.c
@@ -484,12 +484,15 @@ draw_screen(const struct DrawState* state)
if (current->text)
u32_draw_string(0, cy, TEXT_FG, TEXT_BG, current->text,
- state->maxx - 2, state->maxx, 1, 1, CENTER, 0,
- 0, NULL, 0, 0);
+ state->maxx, state->maxx, 0, 0, CENTER, 0, 0,
+ NULL, 0, 0);
i++;
cy++;
}
+ tb_set_cursor(state->display_column - state->first_shown_column,
+ state->row - state->first_shown_row);
+
return state;
}
diff --git a/sled.c b/sled.c
@@ -143,8 +143,9 @@ format_position(char* result, size_t result_size, const char* format,
{
if (!result)
return;
- snprintf(result, result_size, format, state->column, state->row,
- state->rows_count ? state->row / state->rows_count * 100 : 0);
+ snprintf(result, result_size, format, state->column + 1, state->row + 1,
+ state->rows_count ? (state->row * 100) / (state->rows_count - 1)
+ : 0);
}
void
@@ -530,82 +531,53 @@ paste_paste_buffer_to_input(struct DrawState* state)
void
move_up(struct DrawState* state)
{
- /*
- if (state->edit_info_focused)
- {
- if (state->info_first_shown_row > 0)
- state->info_first_shown_row--;
- return;
- }
-
- if (state->input_row > 0)
- state->input_row--;
- if (state->input_first_shown_row > state->input_row)
- state->input_first_shown_row = state->input_row;
+ if (state->row > 0)
+ state->row--;
+ if (state->first_shown_row > state->row)
+ state->first_shown_row = state->row;
if (state->saved_column == -1)
- state->saved_column = state->input_display_column;
- size_t dlen = display_length(state,
- state->input_buffer[state->input_row].text,
- state->input_buffer[state->input_row].length);
+ state->saved_column = state->display_column;
+ size_t dlen = display_length(state, state->buffer[state->row].text,
+ state->buffer[state->row].length);
if (dlen < state->saved_column)
- state->input_display_column = dlen;
+ state->display_column = dlen;
else
- state->input_display_column = state->saved_column;
- state->input_column = input_length(state,
- state->input_buffer[state->input_row].text,
- state->input_display_column);
- if (state->input_first_shown_column > state->input_display_column)
- state->input_first_shown_column = state->input_display_column;
- if (state->input_first_shown_column + state->edit_width - 4
- < state->input_display_column)
- state->input_first_shown_column
- = state->input_display_column - state->edit_width + 4;
- state->input_display_column = display_length(state,
- state->input_buffer[state->input_row].text,
- state->input_column);
- */
+ state->display_column = state->saved_column;
+ state->column = buffer_length(state, state->buffer[state->row].text,
+ state->display_column);
+ if (state->first_shown_column > state->display_column)
+ state->first_shown_column = state->display_column;
+ if (state->first_shown_column + state->maxx - 4 < state->display_column)
+ state->first_shown_column
+ = state->display_column - state->maxx + 4;
+ state->display_column = display_length(state,
+ state->buffer[state->row].text, state->column);
}
void
move_down(struct DrawState* state)
{
- /*
- if (state->edit_info_focused)
- {
- if (state->info_first_shown_row + (EDIT_HEIGHT - 3) / 2
- < state->info_rows_count)
- state->info_first_shown_row++;
- return;
- }
-
- if (state->input_row < state->input_rows_count - 1)
- state->input_row++;
- if (state->input_first_shown_row + (EDIT_HEIGHT - 3) / 2
- < state->input_row)
- state->input_first_shown_row
- = state->input_row - (EDIT_HEIGHT - 3) / 2;
+ if (state->row < state->rows_count - 1)
+ state->row++;
+ if (state->first_shown_row + (state->maxy - 2) < state->row)
+ state->first_shown_row = state->row - (state->maxy - 2);
if (state->saved_column == -1)
- state->saved_column = state->input_display_column;
- size_t dlen = display_length(state,
- state->input_buffer[state->input_row].text,
- state->input_buffer[state->input_row].length);
+ state->saved_column = state->display_column;
+ size_t dlen = display_length(state, state->buffer[state->row].text,
+ state->buffer[state->row].length);
if (dlen < state->saved_column)
- state->input_display_column = dlen;
+ state->display_column = dlen;
else
- state->input_display_column = state->saved_column;
- state->input_column = input_length(state,
- state->input_buffer[state->input_row].text,
- state->input_display_column);
- if (state->input_first_shown_column > state->input_display_column)
- state->input_first_shown_column = state->input_display_column;
- if (state->input_first_shown_column + state->edit_width - 4
- < state->input_display_column)
- state->input_first_shown_column
- = state->input_display_column - state->edit_width + 4;
- state->input_display_column = display_length(state,
- state->input_buffer[state->input_row].text,
- state->input_column);
- */
+ state->display_column = state->saved_column;
+ state->column = buffer_length(state, state->buffer[state->row].text,
+ state->display_column);
+ if (state->first_shown_column > state->display_column)
+ state->first_shown_column = state->display_column;
+ if (state->first_shown_column + state->maxx - 4 < state->display_column)
+ state->first_shown_column
+ = state->display_column - state->maxx + 4;
+ state->display_column = display_length(state,
+ state->buffer[state->row].text, state->column);
}
void
@@ -654,20 +626,20 @@ edit_page_down(struct DrawState* state)
}
void
-move_start(struct DrawState* state)
+move_top(struct DrawState* state)
{
- /*
- if (state->edit_info_focused)
- {
- state->info_first_shown_row = 0;
- state->info_first_shown_column = 0;
- return;
- }
+ state->row = 0;
+ state->first_shown_row = 0;
- state->input_column = 0;
- state->input_display_column = 0;
- state->input_first_shown_column = 0;
- */
+ move_start(state);
+}
+
+void
+move_start(struct DrawState* state)
+{
+ state->column = 0;
+ state->display_column = 0;
+ state->first_shown_column = 0;
}
void
@@ -829,29 +801,29 @@ erase_prev_word(struct DrawState* state)
}
void
-move_end(struct DrawState* state)
+move_bottom(struct DrawState* state)
{
- /*
- if (state->edit_info_focused)
- {
- if (state->info_rows_count > (EDIT_HEIGHT - 3) / 2)
- state->info_first_shown_row = state->info_rows_count
- - (EDIT_HEIGHT - 3) / 2;
- state->info_first_shown_column = 0;
- return;
- }
+ state->row = state->rows_count - 1;
+ state->first_shown_row
+ = state->row > state->maxy ? state->row - state->maxy + 2 : 0;
- size_t len = state->input_buffer[state->input_row].length;
- state->input_column = len;
- size_t dlen = display_length(state,
- state->input_buffer[state->input_row].text,
- state->input_column);
- state->input_display_column = dlen;
- if (dlen > state->edit_width - 4)
- state->input_first_shown_column = dlen - state->edit_width + 4;
+ move_start(state);
+}
+
+void
+move_end(struct DrawState* state)
+{
+ size_t len = state->buffer[state->row].length;
+ size_t dlen;
+
+ state->column = len;
+ dlen = display_length(state, state->buffer[state->row].text,
+ state->column);
+ state->display_column = dlen;
+ if (dlen > state->maxx - 4)
+ state->first_shown_column = dlen - state->maxx + 4;
else
- state->input_first_shown_column = 0;
- */
+ state->first_shown_column = 0;
}
void
@@ -906,37 +878,31 @@ move_list_end(struct DrawState* state)
}
void
-move_list_page_up(struct DrawState* state)
+move_page_up(struct DrawState* state)
{
- /*
- state->error[0] = 0;
- if (state->msgid_number > state->maxy - 2)
+ *state->error = 0;
+ if (state->row > state->maxy - 2)
{
- state->msgid_number -= state->maxy - 2;
- if (state->msgid_number < state->first_shown_msgid)
- state->first_shown_msgid = state->msgid_number;
+ state->row -= state->maxy - 2;
+ if (state->row < state->first_shown_row)
+ state->first_shown_row = state->row;
}
else
- move_list_start(state);
- */
+ move_top(state);
}
void
-move_list_page_down(struct DrawState* state)
+move_page_down(struct DrawState* state)
{
- /*
- state->error[0] = 0;
- if (state->msgid_number < state->msgid_count - state->maxy - 2)
+ *state->error = 0;
+ if (state->row < state->rows_count - state->maxy - 2)
{
- state->msgid_number += state->maxy - 2;
- if (state->msgid_number - state->first_shown_msgid
- > state->maxy - 2)
- state->first_shown_msgid
- = state->msgid_number - (state->maxy - 2);
+ state->row += state->maxy - 2;
+ if (state->row - state->first_shown_row > state->maxy - 2)
+ state->first_shown_row = state->row - (state->maxy - 2);
}
else
- move_list_end(state);
- */
+ move_bottom(state);
}
void
@@ -1354,13 +1320,13 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
else if (state->show_help)
strcpy(state->error, errors[ERR_DLG_OPEN]);
else if (ev->key == TB_KEY_ARROW_DOWN || ev->ch == 'j')
- move_list_down(state);
+ move_down(state);
else if (ev->key == TB_KEY_ARROW_UP || ev->ch == 'k')
- move_list_up(state);
+ move_up(state);
else if (ev->key == TB_KEY_CTRL_B || ev->key == TB_KEY_PGUP)
- move_list_page_up(state);
+ move_page_up(state);
else if (ev->key == TB_KEY_CTRL_F || ev->key == TB_KEY_PGDN)
- move_list_page_down(state);
+ move_page_down(state);
else if (ev->key == TB_KEY_CTRL_S || ev->ch == 'w')
{
if (!state->dirty)
@@ -1391,8 +1357,10 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
}
else if (ev->key == TB_KEY_CTRL_Z || ev->ch == 'z')
; // toggle_fuzzy(state);
- else if (ev->key == TB_KEY_END || ev->ch == 'G')
- move_list_end(state);
+ else if (ev->ch == 'G')
+ move_bottom(state);
+ else if (ev->key == TB_KEY_END)
+ move_end(state);
else if (ev->key == TB_KEY_ENTER)
{
/*
@@ -1420,8 +1388,10 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
; // next_untranslated(state);
else if (ev->key == TB_KEY_F9 || ev->ch == 'f')
; // next_fuzzy(state);
- else if (ev->key == TB_KEY_HOME || ev->ch == 'g')
- move_list_start(state);
+ else if (ev->ch == 'g')
+ move_top(state);
+ else if (ev->key == TB_KEY_HOME)
+ move_start(state);
else
strcpy(state->error, errors[ERR_UNKNOWN_KEY]);
}