diff options
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r-- | desktop/treeview.c | 245 |
1 files changed, 127 insertions, 118 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c index feb1a7c6e..98ef80ce2 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -41,6 +41,7 @@ #include "content/hlcache.h" #include "css/utils.h" +#include "desktop/bitmap.h" #include "desktop/knockout.h" #include "desktop/textarea.h" #include "desktop/treeview.h" @@ -247,7 +248,6 @@ struct treeview { const struct treeview_callback_table *callbacks; /**< For node events */ - const struct core_window_callback_table *cw_t; /**< Window cb table */ struct core_window *cw_h; /**< Core window handle */ }; @@ -354,8 +354,8 @@ static inline void treeview__cw_invalidate_area( const struct treeview *tree, const struct rect *r) { - if (tree->cw_t != NULL) { - tree->cw_t->invalidate(tree->cw_h, r); + if (tree->cw_h != NULL) { + guit->corewindow->invalidate(tree->cw_h, r); } } @@ -368,14 +368,14 @@ static inline void treeview__cw_invalidate_area( static inline void treeview__cw_full_redraw( const struct treeview *tree) { - if (tree->cw_t != NULL) { + if (tree->cw_h != NULL) { static const struct rect r = { .x0 = 0, .y0 = 0, .x1 = REDRAW_MAX, .y1 = REDRAW_MAX, }; - tree->cw_t->invalidate(tree->cw_h, &r); + guit->corewindow->invalidate(tree->cw_h, &r); } } @@ -405,9 +405,10 @@ static inline void treeview__cw_update_size( const struct treeview *tree, int width, int height) { - if (tree->cw_t != NULL) { - tree->cw_t->update_size(tree->cw_h, width, - height + treeview__get_search_height(tree)); + if (tree->cw_h != NULL) { + guit->corewindow->set_extent(tree->cw_h, + width, + height + treeview__get_search_height(tree)); } } @@ -427,10 +428,9 @@ static inline void treeview__cw_scroll_top( .y1 = tree_g.line_height, }; - cw_helper_scroll_visible(tree->cw_t, tree->cw_h, &r); + cw_helper_scroll_visible(tree->cw_h, &r); } - /** * Corewindow callback wrapper: Get window viewport dimensions * @@ -442,8 +442,8 @@ static inline void treeview__cw_get_window_dimensions( const struct treeview *tree, int *width, int *height) { - if (tree->cw_t != NULL) { - tree->cw_t->get_window_dimensions(tree->cw_h, width, height); + if (tree->cw_h != NULL) { + guit->corewindow->get_dimensions(tree->cw_h, width, height); } } @@ -458,8 +458,8 @@ static inline void treeview__cw_drag_status( const struct treeview *tree, core_window_drag_status ds) { - if (tree->cw_t != NULL) { - tree->cw_t->drag_status(tree->cw_h, ds); + if (tree->cw_h != NULL) { + guit->corewindow->drag_status(tree->cw_h, ds); } } @@ -599,13 +599,13 @@ static inline void treeview__cw_scroll_to_node( .x0 = 0, .y0 = treeview_node_y(tree, node), .x1 = 1, - .y1 = ((node->type == TREE_NODE_ENTRY) ? + .y1 = (((node != NULL) && (node->type == TREE_NODE_ENTRY)) ? node->height : tree_g.line_height), }; r.y1 += r.y0; /* Apply the Y offset to the second Y coordinate */ - cw_helper_scroll_visible(tree->cw_t, tree->cw_h, &r); + cw_helper_scroll_visible(tree->cw_h, &r); } @@ -2019,18 +2019,17 @@ static struct textarea *treeview__create_textarea( /* Exported interface, documented in treeview.h */ nserror -treeview_create(treeview **tree, +treeview_create(treeview **treeout, const struct treeview_callback_table *callbacks, int n_fields, struct treeview_field_desc fields[], - const struct core_window_callback_table *cw_t, struct core_window *cw, treeview_flags flags) { + treeview *tree; nserror error; - int i; + int fldidx; - assert((cw_t == NULL && cw == NULL) || (cw_t != NULL && cw != NULL)); assert(callbacks != NULL); assert(fields != NULL); @@ -2038,86 +2037,91 @@ treeview_create(treeview **tree, assert(fields[n_fields - 1].flags & TREE_FLAG_DEFAULT); assert(n_fields >= 2); - *tree = malloc(sizeof(struct treeview)); - if (*tree == NULL) { + tree = malloc(sizeof(struct treeview)); + if (tree == NULL) { return NSERROR_NOMEM; } - (*tree)->fields = malloc(sizeof(struct treeview_field) * n_fields); - if ((*tree)->fields == NULL) { - free(*tree); + tree->fields = malloc(sizeof(struct treeview_field) * n_fields); + if (tree->fields == NULL) { + free(tree); return NSERROR_NOMEM; } - error = treeview_create_node_root(&((*tree)->root)); + error = treeview_create_node_root(&(tree->root)); if (error != NSERROR_OK) { - free((*tree)->fields); - free(*tree); + free(tree->fields); + free(tree); return error; } - (*tree)->field_width = 0; - for (i = 0; i < n_fields; i++) { - struct treeview_field *f = &((*tree)->fields[i]); + tree->field_width = 0; + for (fldidx = 0; fldidx < n_fields; fldidx++) { + struct treeview_field *f = &(tree->fields[fldidx]); - f->flags = fields[i].flags; - f->field = lwc_string_ref(fields[i].field); - f->value.data = lwc_string_data(fields[i].field); - f->value.len = lwc_string_length(fields[i].field); + f->flags = fields[fldidx].flags; + f->field = lwc_string_ref(fields[fldidx].field); + f->value.data = lwc_string_data(fields[fldidx].field); + f->value.len = lwc_string_length(fields[fldidx].field); - guit->layout->width(&plot_style_odd.text, f->value.data, - f->value.len, &(f->value.width)); + guit->layout->width(&plot_style_odd.text, + f->value.data, + f->value.len, + &(f->value.width)); - if (f->flags & TREE_FLAG_SHOW_NAME) - if ((*tree)->field_width < f->value.width) - (*tree)->field_width = f->value.width; + if (f->flags & TREE_FLAG_SHOW_NAME) { + if (tree->field_width < f->value.width) { + tree->field_width = f->value.width; + } + } } - (*tree)->field_width += tree_g.step_width; + tree->field_width += tree_g.step_width; - (*tree)->callbacks = callbacks; - (*tree)->n_fields = n_fields - 1; + tree->callbacks = callbacks; + tree->n_fields = n_fields - 1; - (*tree)->drag.type = TV_DRAG_NONE; - (*tree)->drag.start_node = NULL; - (*tree)->drag.start.x = 0; - (*tree)->drag.start.y = 0; - (*tree)->drag.start.node_y = 0; - (*tree)->drag.start.node_h = 0; - (*tree)->drag.prev.x = 0; - (*tree)->drag.prev.y = 0; - (*tree)->drag.prev.node_y = 0; - (*tree)->drag.prev.node_h = 0; + tree->drag.type = TV_DRAG_NONE; + tree->drag.start_node = NULL; + tree->drag.start.x = 0; + tree->drag.start.y = 0; + tree->drag.start.node_y = 0; + tree->drag.start.node_h = 0; + tree->drag.prev.x = 0; + tree->drag.prev.y = 0; + tree->drag.prev.node_y = 0; + tree->drag.prev.node_h = 0; - (*tree)->move.root = NULL; - (*tree)->move.target = NULL; - (*tree)->move.target_pos = TV_TARGET_NONE; + tree->move.root = NULL; + tree->move.target = NULL; + tree->move.target_pos = TV_TARGET_NONE; - (*tree)->edit.textarea = NULL; - (*tree)->edit.node = NULL; + tree->edit.textarea = NULL; + tree->edit.node = NULL; if (flags & TREEVIEW_SEARCHABLE) { - (*tree)->search.textarea = treeview__create_textarea( - *tree, 600, tree_g.line_height, + tree->search.textarea = treeview__create_textarea( + tree, 600, tree_g.line_height, nscolours[NSCOLOUR_TEXT_INPUT_BG], nscolours[NSCOLOUR_TEXT_INPUT_BG], nscolours[NSCOLOUR_TEXT_INPUT_FG], plot_style_odd.text, treeview_textarea_search_callback); - if ((*tree)->search.textarea == NULL) { - treeview_destroy(*tree); + if (tree->search.textarea == NULL) { + treeview_destroy(tree); return NSERROR_NOMEM; } } else { - (*tree)->search.textarea = NULL; + tree->search.textarea = NULL; } - (*tree)->search.active = false; - (*tree)->search.search = false; + tree->search.active = false; + tree->search.search = false; + + tree->flags = flags; - (*tree)->flags = flags; + tree->cw_h = cw; - (*tree)->cw_t = cw_t; - (*tree)->cw_h = cw; + *treeout = tree; return NSERROR_OK; } @@ -2125,18 +2129,14 @@ treeview_create(treeview **tree, /* Exported interface, documented in treeview.h */ nserror -treeview_cw_attach(treeview *tree, - const struct core_window_callback_table *cw_t, - struct core_window *cw) +treeview_cw_attach(treeview *tree, struct core_window *cw) { - assert(cw_t != NULL); assert(cw != NULL); - if (tree->cw_t != NULL || tree->cw_h != NULL) { + if (tree->cw_h != NULL) { NSLOG(netsurf, INFO, "Treeview already attached."); return NSERROR_UNKNOWN; } - tree->cw_t = cw_t; tree->cw_h = cw; return NSERROR_OK; @@ -2146,7 +2146,6 @@ treeview_cw_attach(treeview *tree, /* Exported interface, documented in treeview.h */ nserror treeview_cw_detach(treeview *tree) { - tree->cw_t = NULL; tree->cw_h = NULL; treeview__search_cancel(tree, true); @@ -5077,7 +5076,7 @@ treeview_generate_triangle_bitmap(colour bg, colour fg, int size) colour colour4 = fg; /* Create the bitmap */ - b = guit->bitmap->create(size, size, BITMAP_NEW | BITMAP_OPAQUE); + b = guit->bitmap->create(size, size, BITMAP_OPAQUE); if (b == NULL) return NULL; @@ -5091,58 +5090,68 @@ treeview_generate_triangle_bitmap(colour bg, colour fg, int size) if (y < size / 2) { /* Top half */ for (x = 0; x < y * 2; x++) { - *(pos++) = red_from_colour(colour4); - *(pos++) = green_from_colour(colour4); - *(pos++) = blue_from_colour(colour4); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour4); + pos[bitmap_layout.g] = green_from_colour(colour4); + pos[bitmap_layout.b] = blue_from_colour(colour4); + pos[bitmap_layout.a] = 0xff; + pos += 4; } - *(pos++) = red_from_colour(colour3); - *(pos++) = green_from_colour(colour3); - *(pos++) = blue_from_colour(colour3); - *(pos++) = 0xff; - *(pos++) = red_from_colour(colour1); - *(pos++) = green_from_colour(colour1); - *(pos++) = blue_from_colour(colour1); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour3); + pos[bitmap_layout.g] = green_from_colour(colour3); + pos[bitmap_layout.b] = blue_from_colour(colour3); + pos[bitmap_layout.a] = 0xff; + pos += 4; + pos[bitmap_layout.r] = red_from_colour(colour1); + pos[bitmap_layout.g] = green_from_colour(colour1); + pos[bitmap_layout.b] = blue_from_colour(colour1); + pos[bitmap_layout.a] = 0xff; + pos += 4; for (x = y * 2 + 2; x < size ; x++) { - *(pos++) = red_from_colour(colour0); - *(pos++) = green_from_colour(colour0); - *(pos++) = blue_from_colour(colour0); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour0); + pos[bitmap_layout.g] = green_from_colour(colour0); + pos[bitmap_layout.b] = blue_from_colour(colour0); + pos[bitmap_layout.a] = 0xff; + pos += 4; } } else if ((y == size / 2) && (size & 0x1)) { /* Middle row */ for (x = 0; x < size - 1; x++) { - *(pos++) = red_from_colour(colour4); - *(pos++) = green_from_colour(colour4); - *(pos++) = blue_from_colour(colour4); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour4); + pos[bitmap_layout.g] = green_from_colour(colour4); + pos[bitmap_layout.b] = blue_from_colour(colour4); + pos[bitmap_layout.a] = 0xff; + pos += 4; } - *(pos++) = red_from_colour(colour2); - *(pos++) = green_from_colour(colour2); - *(pos++) = blue_from_colour(colour2); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour2); + pos[bitmap_layout.g] = green_from_colour(colour2); + pos[bitmap_layout.b] = blue_from_colour(colour2); + pos[bitmap_layout.a] = 0xff; + pos += 4; } else { /* Bottom half */ for (x = 0; x < (size - y - 1) * 2; x++) { - *(pos++) = red_from_colour(colour4); - *(pos++) = green_from_colour(colour4); - *(pos++) = blue_from_colour(colour4); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour4); + pos[bitmap_layout.g] = green_from_colour(colour4); + pos[bitmap_layout.b] = blue_from_colour(colour4); + pos[bitmap_layout.a] = 0xff; + pos += 4; } - *(pos++) = red_from_colour(colour3); - *(pos++) = green_from_colour(colour3); - *(pos++) = blue_from_colour(colour3); - *(pos++) = 0xff; - *(pos++) = red_from_colour(colour1); - *(pos++) = green_from_colour(colour1); - *(pos++) = blue_from_colour(colour1); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour3); + pos[bitmap_layout.g] = green_from_colour(colour3); + pos[bitmap_layout.b] = blue_from_colour(colour3); + pos[bitmap_layout.a] = 0xff; + pos += 4; + pos[bitmap_layout.r] = red_from_colour(colour1); + pos[bitmap_layout.g] = green_from_colour(colour1); + pos[bitmap_layout.b] = blue_from_colour(colour1); + pos[bitmap_layout.a] = 0xff; + pos += 4; for (x = (size - y) * 2; x < size ; x++) { - *(pos++) = red_from_colour(colour0); - *(pos++) = green_from_colour(colour0); - *(pos++) = blue_from_colour(colour0); - *(pos++) = 0xff; + pos[bitmap_layout.r] = red_from_colour(colour0); + pos[bitmap_layout.g] = green_from_colour(colour0); + pos[bitmap_layout.b] = blue_from_colour(colour0); + pos[bitmap_layout.a] = 0xff; + pos += 4; } } @@ -5176,7 +5185,7 @@ treeview_generate_copy_bitmap(struct bitmap *orig, int size) assert(size == guit->bitmap->get_height(orig)); /* Create the bitmap */ - b = guit->bitmap->create(size, size, BITMAP_NEW | BITMAP_OPAQUE); + b = guit->bitmap->create(size, size, BITMAP_OPAQUE); if (b == NULL) return NULL; @@ -5224,7 +5233,7 @@ treeview_generate_rotate_bitmap(struct bitmap *orig, int size) assert(size == guit->bitmap->get_height(orig)); /* Create the bitmap */ - b = guit->bitmap->create(size, size, BITMAP_NEW | BITMAP_OPAQUE); + b = guit->bitmap->create(size, size, BITMAP_OPAQUE); if (b == NULL) return NULL; |