local_history: Add concept of a cursor to the local history
So that we can eventually navigate around local history by keyboard, add the concept of a history cursor to the local history core window. Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
parent
ad67eeff4b
commit
1ee32fe962
|
@ -40,6 +40,8 @@
|
|||
|
||||
#define WIDTH 100
|
||||
#define HEIGHT 86
|
||||
#define RIGHT_MARGIN 50
|
||||
#define BOTTOM_MARGIN 30
|
||||
|
||||
/**
|
||||
* local history viewer context
|
||||
|
@ -48,6 +50,7 @@ struct local_history_session {
|
|||
struct browser_window *bw;
|
||||
struct core_window_callback_table *cw_t;
|
||||
void *core_window_handle;
|
||||
struct history_entry *cursor;
|
||||
};
|
||||
|
||||
|
||||
|
@ -86,6 +89,15 @@ static plot_style_t pstyle_rect_sel = {
|
|||
};
|
||||
|
||||
|
||||
/**
|
||||
* plot style for drawing rectangle round the cursor node
|
||||
*/
|
||||
static plot_style_t pstyle_rect_cursor = {
|
||||
.stroke_type = PLOT_OP_TYPE_DASH,
|
||||
.stroke_width = plot_style_int_to_fixed(3),
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* plot style for font on unselected nodes
|
||||
*/
|
||||
|
@ -121,6 +133,7 @@ static plot_font_style_t pfstyle_node_sel = {
|
|||
static nserror
|
||||
redraw_entry(struct history *history,
|
||||
struct history_entry *entry,
|
||||
struct history_entry *cursor,
|
||||
struct rect *clip,
|
||||
int x, int y,
|
||||
const struct redraw_context *ctx)
|
||||
|
@ -167,6 +180,15 @@ redraw_entry(struct history *history,
|
|||
return res;
|
||||
}
|
||||
|
||||
/* If this is the cursor, show that */
|
||||
if (entry == cursor) {
|
||||
rect.x0 -= 1;
|
||||
rect.y0 -= 1;
|
||||
rect.x1 += 2;
|
||||
rect.y1 += 2;
|
||||
ctx->plot->rectangle(ctx, &pstyle_rect_cursor, &rect);
|
||||
}
|
||||
|
||||
res = guit->layout->position(plot_style_font, entry->page.title,
|
||||
strlen(entry->page.title), WIDTH,
|
||||
&char_offset, &actual_x);
|
||||
|
@ -213,7 +235,7 @@ redraw_entry(struct history *history,
|
|||
return res;
|
||||
}
|
||||
|
||||
res = redraw_entry(history, child, clip, x, y, ctx);
|
||||
res = redraw_entry(history, child, cursor, clip, x, y, ctx);
|
||||
if (res != NSERROR_OK) {
|
||||
return res;
|
||||
}
|
||||
|
@ -258,6 +280,25 @@ find_entry_position(struct history_entry *entry, int x, int y)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* exported interface documented in desktop/local_history.h */
|
||||
nserror
|
||||
local_history_scroll_to_cursor(struct local_history_session *session)
|
||||
{
|
||||
rect cursor;
|
||||
|
||||
if (session->cursor == NULL) {
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
cursor.x0 = session->cursor->x - RIGHT_MARGIN / 2;
|
||||
cursor.y0 = session->cursor->y - BOTTOM_MARGIN / 2;
|
||||
cursor.x1 = cursor.x0 + WIDTH + RIGHT_MARGIN / 2;
|
||||
cursor.y1 = cursor.y0 + HEIGHT + BOTTOM_MARGIN / 2;
|
||||
|
||||
session->cw_t->scroll_visible(session->core_window_handle, &cursor);
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/* exported interface documented in desktop/local_history.h */
|
||||
nserror
|
||||
|
@ -283,12 +324,17 @@ local_history_init(struct core_window_callback_table *cw_t,
|
|||
pstyle_rect.stroke_colour = pstyle_line.stroke_colour;
|
||||
pfstyle_node.foreground = pstyle_line.stroke_colour;
|
||||
|
||||
res = ns_system_colour_char("Highlight", &pstyle_rect_sel.stroke_colour);
|
||||
res = ns_system_colour_char("ButtonText", &pstyle_rect_sel.stroke_colour);
|
||||
if (res != NSERROR_OK) {
|
||||
return res;
|
||||
}
|
||||
pfstyle_node_sel.foreground = pstyle_rect_sel.stroke_colour;
|
||||
|
||||
res = ns_system_colour_char("Highlight", &pstyle_rect_cursor.stroke_colour);
|
||||
if (res != NSERROR_OK) {
|
||||
return res;
|
||||
}
|
||||
|
||||
nses = calloc(1, sizeof(struct local_history_session));
|
||||
if (nses == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
|
@ -339,11 +385,13 @@ local_history_redraw(struct local_history_session *session,
|
|||
ctx->plot->clip(ctx, &r);
|
||||
ctx->plot->rectangle(ctx, &pstyle_bg, &r);
|
||||
|
||||
return redraw_entry(session->bw->history,
|
||||
session->bw->history->start,
|
||||
clip,
|
||||
x, y,
|
||||
ctx);
|
||||
return redraw_entry(
|
||||
session->bw->history,
|
||||
session->bw->history->start,
|
||||
session->cursor,
|
||||
clip,
|
||||
x, y,
|
||||
ctx);
|
||||
}
|
||||
|
||||
/* exported interface documented in desktop/local_history.h */
|
||||
|
@ -399,12 +447,16 @@ local_history_set(struct local_history_session *session,
|
|||
struct browser_window *bw)
|
||||
{
|
||||
session->bw = bw;
|
||||
session->cursor = NULL;
|
||||
|
||||
if (bw != NULL) {
|
||||
assert(session->bw->history != NULL);
|
||||
session->cursor = bw->history->current;
|
||||
|
||||
session->cw_t->update_size(session->core_window_handle,
|
||||
session->bw->history->width,
|
||||
session->bw->history->height);
|
||||
local_history_scroll_to_cursor(session);
|
||||
}
|
||||
|
||||
return NSERROR_OK;
|
||||
|
|
|
@ -140,5 +140,12 @@ nserror local_history_get_size(struct local_history_session *session, int *width
|
|||
*/
|
||||
nserror local_history_get_url(struct local_history_session *session, int x, int y, struct nsurl **url_out);
|
||||
|
||||
/**
|
||||
* Scroll the local history window to ensure the current cursor is shown.
|
||||
*
|
||||
* \param session The local history session
|
||||
*/
|
||||
nserror local_history_scroll_to_cursor(struct local_history_session *session);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue