чување d3c9fb339022d498a4111db601432b52e978e650
родитељ b39e5e9e8e2aefcb6118893e8cda089c01b2e6c0
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Fri, 9 Jul 2021 14:57:10 +0200
Continued work on search; corrected a bug in u32_draw_string
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | draw.c | | | 41 | +++++++++++++++++++++-------------------- |
| M | draw.h | | | 10 | +++++----- |
| M | poe.c | | | 130 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
измењених датотека: 3, додавања: 93(+), брисања: 88(-)
diff --git a/draw.c b/draw.c
@@ -96,9 +96,9 @@ init_drawstate(struct DrawState* state, char* error, char* filename,
state->info_first_shown_column = 0;
state->info_first_shown_row = 0;
state->info_rows_count = 0;
- state->search_input_column = 0;
- state->search_input_first_shown_column = 0;
- state->search_input_display_column = 0;
+ state->search_column = 0;
+ state->search_first_shown_column = 0;
+ state->search_display_column = 0;
state->prompt = prompt;
state->prompt_callback = NULL;
state->running = 1;
@@ -397,7 +397,7 @@ u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
j++)
tb_change_cell(x+d+p_l+sc+j, y,
' ', fg, bg);
- sc += (ts - (ssc % ts));
+ sc += ssc+(ts - (ssc % ts))-ds;
}
/* else, just increase counter
*
@@ -508,14 +508,13 @@ draw_editbox(const struct DrawState* state)
return NULL;
int startx, endx, starty, endy;
- int w = EDIT_WIDTH;
- int h = EDIT_HEIGHT;
- int maxx = state->maxx;
- int maxy = state->maxy;
- //uint32_t buf[MSGSTR_MAX];
+ int w = EDIT_WIDTH;
+ int h = EDIT_HEIGHT;
+ int maxx = state->maxx;
+ int maxy = state->maxy;
char flags_buf[MAXFLAGSBUF+4];
- struct PoEntry* entry = &state->entries[state->msgid_number-1];
- size_t dlen = 0;
+ struct PoEntry* entry = &state->entries[state->msgid_number-1];
+ size_t dlen = 0;
strcpy(flags_buf, "[ ");
format_flags(flags_buf+2, MAXFLAGSBUF, entry);
@@ -625,11 +624,12 @@ const struct DrawState*
draw_search(const struct DrawState* state)
{
int startx, endx, starty, endy;
- int w = SEARCH_WIDTH;
- int h = SEARCH_HEIGHT;
- int maxx = state->maxx;
- int maxy = state->maxy;
- size_t len = u32_strlen(state->search);
+ int w = SEARCH_WIDTH;
+ int h = SEARCH_HEIGHT;
+ int maxx = state->maxx;
+ int maxy = state->maxy;
+ size_t len = u32_strlen(state->search);
+ size_t dlen = 0;
startx = w > maxx ? 0 : (maxx - w) / 2;
endx = w > maxx ? maxx-1 : maxx-startx;
@@ -640,13 +640,14 @@ draw_search(const struct DrawState* state)
draw_box(startx, endx, starty, endy, SEARCH_FG, SEARCH_BG);
draw_rect(startx+1, endx-1, starty+1, endy-2, SEARCH_EDIT_FG,
SEARCH_EDIT_BG);
- if (len > state->search_input_first_shown_column)
+ dlen = display_length(state, state->search, len);
+ if (dlen > state->search_first_shown_column)
u32_draw_string(startx+1, starty+1,
SEARCH_EDIT_FG, SEARCH_EDIT_BG, state->search,
- w-3, w-3, 0, 0, LEFT, state->input_first_shown_column,
+ w-2, w-2, 1, 1, LEFT, state->search_first_shown_column,
1);
- tb_set_cursor(startx+1+state->search_input_display_column -
- state->search_input_first_shown_column,
+ tb_set_cursor(startx+2+state->search_display_column -
+ state->search_first_shown_column,
starty+1);
return state;
}
diff --git a/draw.h b/draw.h
@@ -14,10 +14,10 @@
#define EDIT_HEIGHT 20
#define HELP_WIDTH 50
#define HELP_HEIGHT 21
-#define SEARCH_WIDTH 15
+#define SEARCH_WIDTH 20
#define SEARCH_HEIGHT 4
#define TAB_SIZE 8
-#define MAXSEARCH (255+1)
+#define MAXSEARCH (512+1)
typedef enum {
LEFT,
@@ -51,9 +51,9 @@ struct DrawState {
int info_first_shown_row;
int info_rows_count;
int info_rows_maxlen;
- int search_input_column;
- int search_input_first_shown_column;
- int search_input_display_column;
+ int search_column;
+ int search_first_shown_column;
+ int search_display_column;
struct PoEntry* entries;
void (*prompt_callback)(struct DrawState*, struct tb_event*);
int running;
diff --git a/poe.c b/poe.c
@@ -451,9 +451,9 @@ void
show_search(struct DrawState* state)
{
state->show_search = 1;
- state->search_input_column = 0;
- state->search_input_display_column = 0;
- state->search_input_first_shown_column = 0;
+ state->search_column = 0;
+ state->search_display_column = 0;
+ state->search_first_shown_column = 0;
if (!state->search)
state->search = calloc(MAXSEARCH, sizeof(uint32_t));
state->search[0] = 0;
@@ -479,98 +479,102 @@ cancel_search(struct DrawState* state)
void
move_search_start(struct DrawState* state)
{
- state->search_input_column = 0;
- state->search_input_display_column = 0;
- state->search_input_first_shown_column = 0;
+ state->search_column = 0;
+ state->search_display_column = 0;
+ state->search_first_shown_column = 0;
}
void
move_search_left(struct DrawState* state)
{
- if (state->search_input_column == 0)
+ if (state->search_column == 0)
return;
- if (state->search[state->search_input_column-1] == '\t')
- state->search_input_display_column = display_length(state,
- state->search, state->search_input_column-1);
+ if (state->search[state->search_column-1] == '\t')
+ state->search_display_column = display_length(state,
+ state->search, state->search_column-1);
else
- state->search_input_display_column--;
- state->search_input_column--;
+ state->search_display_column--;
+ state->search_column--;
- if (state->search_input_display_column <
- state->search_input_first_shown_column)
- state->search_input_first_shown_column =
- state->search_input_display_column;
+ if (state->search_display_column <
+ state->search_first_shown_column)
+ state->search_first_shown_column =
+ state->search_display_column;
}
void
move_search_right(struct DrawState* state)
{
size_t len = u32_strlen(state->search);
- if (state->search_input_column == len)
+ if (state->search_column == len)
return;
- if (state->search[state->search_input_column] == '\t')
- state->search_input_display_column = display_length(state,
- state->search, state->search_input_column+1);
+ if (state->search[state->search_column] == '\t')
+ state->search_display_column = display_length(state,
+ state->search, state->search_column+1);
else
- state->search_input_display_column++;
- state->search_input_column++;
+ state->search_display_column++;
+ state->search_column++;
- if (state->search_input_display_column -
- state->search_input_first_shown_column > SEARCH_WIDTH-3)
- state->search_input_first_shown_column =
- state->search_input_display_column - SEARCH_WIDTH+3;
+ if (state->search_display_column -
+ state->search_first_shown_column > SEARCH_WIDTH-4)
+ state->search_first_shown_column =
+ state->search_display_column - SEARCH_WIDTH+4;
}
void
move_search_end(struct DrawState* state)
{
size_t len = u32_strlen(state->search);
- state->search_input_column = len;
- size_t dlen = display_length(state, state->search,
- state->search_input_column);
- state->search_input_display_column = dlen;
- if (dlen > SEARCH_WIDTH-3)
- state->search_input_first_shown_column = dlen - SEARCH_WIDTH+3;
+ state->search_column = len;
+ size_t dlen = display_length(state, state->search, state->search_column);
+ state->search_display_column = dlen;
+ if (dlen > SEARCH_WIDTH-4)
+ state->search_first_shown_column = dlen - SEARCH_WIDTH+4;
else
- state->search_input_first_shown_column = 0;
+ state->search_first_shown_column = 0;
}
void
insert_search_char(struct DrawState* state, uint32_t ch)
{
size_t len = u32_strlen(state->search);
- if (state->search_input_column < MAXSEARCH-1)
+ if (state->search_column < MAXSEARCH-1)
{
size_t i = len;
- int add_null = state->search[state->search_input_column] == 0;
- while (i < MAXSEARCH-2 && i > state->search_input_column)
+ int add_null = state->search[state->search_column] == 0;
+ while (i < MAXSEARCH-2 && i > state->search_column)
{
state->search[i] = state->search[i-1];
i--;
}
- state->search[state->search_input_column++] = ch;
- if (state->search_input_column == MAXSEARCH)
- state->search_input_column = MAXSEARCH-1;
- state->search_input_display_column = display_length(state,
+ state->search[state->search_column++] = ch;
+ if (state->search_column == MAXSEARCH)
+ state->search_column = MAXSEARCH-1;
+ state->search_display_column = display_length(state,
state->search,
- state->search_input_column);
+ state->search_column);
+ if (state->search_display_column -
+ state->search_first_shown_column >
+ SEARCH_WIDTH-4)
+ {
+ state->search_first_shown_column =
+ state->search_display_column - SEARCH_WIDTH+4;
+ state->search_display_column = display_length(state,
+ state->search, state->search_column);
+ }
if (add_null)
- state->search[state->search_input_column] = 0;
+ state->search[state->search_column] = 0;
}
- if (state->search_input_display_column -
- state->search_input_first_shown_column > SEARCH_WIDTH-3)
- state->search_input_first_shown_column =
- state->search_input_display_column - SEARCH_WIDTH+3;
}
void
erase_search_backwards(struct DrawState* state)
{
- if (state->search_input_column > 0)
+ if (state->search_column > 0)
{
- size_t i = state->search_input_column;
+ size_t i = state->search_column;
do
{
state->search[i-1] = state->search[i];
@@ -578,29 +582,29 @@ erase_search_backwards(struct DrawState* state)
}
while (state->search[i]);
state->search[i-1] = 0;
- state->search_input_column--;
- if (state->search_input_column <
- state->search_input_first_shown_column)
+ state->search_column--;
+ if (state->search_column <
+ state->search_first_shown_column)
{
- if (state->search_input_column > SEARCH_WIDTH-4)
- state->search_input_first_shown_column =
- state->search_input_column
+ if (state->search_column > SEARCH_WIDTH-4)
+ state->search_first_shown_column =
+ state->search_column
- SEARCH_WIDTH+4;
else
- state->search_input_first_shown_column = 0;
+ state->search_first_shown_column = 0;
}
- state->search_input_display_column = display_length(state,
+ state->search_display_column = display_length(state,
state->search,
- state->search_input_column);
+ state->search_column);
}
}
void
erase_search_forward(struct DrawState* state)
{
- if (state->search[state->search_input_column])
+ if (state->search[state->search_column])
{
- size_t i = state->search_input_column;
+ size_t i = state->search_column;
while (i < MAXSEARCH-2 && state->search[i+1])
{
state->search[i] = state->search[i+1];
@@ -613,22 +617,22 @@ erase_search_forward(struct DrawState* state)
void
erase_search_to_start(struct DrawState* state)
{
- size_t i = state->search_input_column;
+ size_t i = state->search_column;
size_t len = u32_strlen(state->search);
do
{
- state->search[i-state->search_input_column] = state->search[i];
+ state->search[i-state->search_column] = state->search[i];
i++;
}
while (state->search[i]);
- state->search[len-state->search_input_column] = 0;
+ state->search[len-state->search_column] = 0;
move_search_start(state);
}
void
erase_search_to_end(struct DrawState* state)
{
- state->search[state->search_input_column] = 0;
+ state->search[state->search_column] = 0;
move_search_end(state);
}