summaryrefslogtreecommitdiff
path: root/desktop/treeview.c
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r--desktop/treeview.c245
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;