diff options
author | Richard Wilson <rjw@netsurf-browser.org> | 2005-06-23 17:24:23 +0000 |
---|---|---|
committer | Richard Wilson <rjw@netsurf-browser.org> | 2005-06-23 17:24:23 +0000 |
commit | f559054c1a1b0819e52e0f9d04fc55be484746c5 (patch) | |
tree | 2c6652666c751a1a368920679da0ba85b01854d8 /riscos/treeview.c | |
parent | b88a81b9d9570c3219dc924c3dd2b424d99ee4c3 (diff) | |
download | netsurf-f559054c1a1b0819e52e0f9d04fc55be484746c5.tar.gz netsurf-f559054c1a1b0819e52e0f9d04fc55be484746c5.tar.bz2 |
[project @ 2005-06-23 17:24:23 by rjw]
Allow images to be unloaded to disk or compressed in memory. Provide thumbnails in all tree windows (hotlist, history). Optimise the application initialisation times. Part 2 of 2.
svn path=/import/netsurf/; revision=1762
Diffstat (limited to 'riscos/treeview.c')
-rw-r--r-- | riscos/treeview.c | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/riscos/treeview.c b/riscos/treeview.c index d2096a2ed..5a1a77752 100644 --- a/riscos/treeview.c +++ b/riscos/treeview.c @@ -2,7 +2,7 @@ * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, * http://www.opensource.org/licenses/gpl-license - * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net> + * Copyright 2005 Richard Wilson <info@tinct.net> */ /** \file @@ -20,8 +20,12 @@ #include "oslib/osbyte.h" #include "oslib/osspriteop.h" #include "oslib/wimp.h" +#include "netsurf/content/url_store.h" +#include "netsurf/desktop/browser.h" #include "netsurf/desktop/tree.h" +#include "netsurf/riscos/bitmap.h" #include "netsurf/riscos/gui.h" +#include "netsurf/riscos/image.h" #include "netsurf/riscos/menus.h" #include "netsurf/riscos/theme.h" #include "netsurf/riscos/tinct.h" @@ -38,6 +42,7 @@ static bool ro_gui_tree_initialise_sprite(const char *name, int number); static void ro_gui_tree_launch_selected_node(struct node *node, bool all); static bool ro_gui_tree_launch_node(struct node *node); +static void tree_handle_node_changed_callback(void *p); /* an array of sprite addresses for Tinct */ static char *ro_gui_tree_sprites[2]; @@ -61,6 +66,12 @@ static wimp_icon_create ro_gui_tree_edit_icon; /* dragging information */ static char ro_gui_tree_drag_name[12]; +/* callback update */ +struct node_update { + struct tree *tree; + struct node *node; +}; + /** * Performs any initialisation for tree rendering @@ -181,6 +192,10 @@ void tree_draw_node_element(struct tree *tree, struct node_element *element) { os_error *error; int temp; int toolbar_height = 0; + struct node_element *url_element; + struct bitmap *bitmap = NULL; + struct node_update *update; + char *frame; assert(tree); assert(element); @@ -265,6 +280,50 @@ void tree_draw_node_element(struct tree *tree, struct node_element *element) { ro_gui_tree_icon.data.indirected_sprite.size = strlen(element->sprite->name); break; + case NODE_ELEMENT_THUMBNAIL: + url_element = tree_find_element(element->parent, TREE_ELEMENT_URL); + if (url_element) + bitmap = url_store_get_thumbnail(url_element->text); + if (bitmap) { + frame = bitmap_get_buffer(bitmap); + if (!frame) + url_store_add_thumbnail(url_element->text, NULL); + if ((!frame) || (element->box.width == 0)) { + update = calloc(sizeof(struct node_update), 1); + if (!update) + return; + update->tree = tree; + update->node = element->parent; + schedule(0, tree_handle_node_changed_callback, + update); + return; + } + image_redraw(bitmap->sprite_area, + ro_gui_tree_origin_x + element->box.x + 2, + ro_gui_tree_origin_y - element->box.y, + bitmap->width, bitmap->height, + bitmap->width, bitmap->height, + 0xffffff, + false, false, false, + IMAGE_PLOT_TINCT_OPAQUE); + tree_draw_line(tree, element->box.x, + element->box.y, + element->box.width - 1, + 0); + tree_draw_line(tree, element->box.x, + element->box.y, + 0, + element->box.height - 3); + tree_draw_line(tree, element->box.x, + element->box.y + element->box.height - 3, + element->box.width - 1, + 0); + tree_draw_line(tree, element->box.x + element->box.width - 1, + element->box.y, + 0, + element->box.height - 3); + } + return; } error = xwimp_plot_icon(&ro_gui_tree_icon); @@ -276,6 +335,14 @@ void tree_draw_node_element(struct tree *tree, struct node_element *element) { } +void tree_handle_node_changed_callback(void *p) { + struct node_update *update = p; + + tree_handle_node_changed(update->tree, update->node, true, false); + free(update); +} + + /** * Draws an elements expansion icon * @@ -342,6 +409,8 @@ void tree_recalculate_node_element(struct node_element *element) { int sprite_width; int sprite_height; osspriteop_flags flags; + struct bitmap *bitmap = NULL; + struct node_element *url_element; assert(element); @@ -384,6 +453,17 @@ void tree_recalculate_node_element(struct node_element *element) { if (element->box.height < TREE_TEXT_HEIGHT) element->box.height = TREE_TEXT_HEIGHT; break; + case NODE_ELEMENT_THUMBNAIL: + url_element = tree_find_element(element->parent, TREE_ELEMENT_URL); + if (url_element) + bitmap = url_store_get_thumbnail(url_element->text); + if (bitmap) { + element->box.width = bitmap->width * 2 + 2; + element->box.height = bitmap->height * 2 + 4; + } else { + element->box.width = 0; + element->box.height = 0; + } } } @@ -502,7 +582,6 @@ void tree_update_URL_node(struct node *node) { element->user_data); element->text = strdup(buffer); } - } |