summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-09-03 13:32:46 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-09-03 13:32:46 +0100
commit1569e9e2a89f0bc8806050a972e25c1f0c73a2f2 (patch)
tree2ceeb25acbd4eeb654661e3979a177eece4d5311 /desktop
parentf2b4a7a997b8fc952ab96cadb68477ee5d5a434a (diff)
downloadnetsurf-1569e9e2a89f0bc8806050a972e25c1f0c73a2f2.tar.gz
netsurf-1569e9e2a89f0bc8806050a972e25c1f0c73a2f2.tar.bz2
Change recursife node collapse behaviour slightly.
Diffstat (limited to 'desktop')
-rw-r--r--desktop/treeview.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 0f011b373..992b6d892 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1422,10 +1422,13 @@ nserror treeview_node_expand(treeview *tree, treeview_node *node)
}
-
+struct treeview_contract_data {
+ bool only_entries;
+};
/** Treewalk node callback for handling node contraction. */
static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end)
{
+ struct treeview_contract_data *data = ctx;
int h_reduction;
assert(n != NULL);
@@ -1433,7 +1436,8 @@ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end)
n->flags &= ~TREE_NODE_SELECTED;
- if ((n->flags & TREE_NODE_EXPANDED) == false) {
+ if ((n->flags & TREE_NODE_EXPANDED) == false ||
+ (n->type == TREE_NODE_FOLDER && data->only_entries)) {
/* Nothing to do. */
return NSERROR_OK;
}
@@ -1453,6 +1457,7 @@ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end)
/* Exported interface, documented in treeview.h */
nserror treeview_node_contract(treeview *tree, treeview_node *node)
{
+ struct treeview_contract_data data;
bool selected;
assert(node != NULL);
@@ -1462,14 +1467,15 @@ nserror treeview_node_contract(treeview *tree, treeview_node *node)
return NSERROR_OK;
}
+ data.only_entries = false;
selected = node->flags & TREE_NODE_SELECTED;
/* Contract children. */
treeview_walk_internal(node, false, treeview_node_contract_cb,
- NULL, NULL);
+ NULL, &data);
/* Contract node */
- treeview_node_contract_cb(node, NULL, false);
+ treeview_node_contract_cb(node, &data, false);
if (selected)
node->flags |= TREE_NODE_SELECTED;
@@ -1484,30 +1490,31 @@ nserror treeview_node_contract(treeview *tree, treeview_node *node)
/* Exported interface, documented in treeview.h */
nserror treeview_contract(treeview *tree, bool all)
{
+ struct treeview_contract_data data;
bool selected;
treeview_node *n;
assert(tree != NULL);
assert(tree->root != NULL);
+ data.only_entries = !all;
+
for (n = tree->root->children; n != NULL; n = n->next_sib) {
if ((n->flags & TREE_NODE_EXPANDED) == false) {
continue;
}
- if (n->type == TREE_NODE_FOLDER || all) {
- selected = n->flags & TREE_NODE_SELECTED;
+ selected = n->flags & TREE_NODE_SELECTED;
- /* Contract children. */
- treeview_walk_internal(n, false,
- treeview_node_contract_cb, NULL, NULL);
+ /* Contract children. */
+ treeview_walk_internal(n, false,
+ treeview_node_contract_cb, NULL, &data);
- /* Contract node */
- treeview_node_contract_cb(n, NULL, false);
+ /* Contract node */
+ treeview_node_contract_cb(n, &data, false);
- if (selected)
- n->flags |= TREE_NODE_SELECTED;
- }
+ if (selected)
+ n->flags |= TREE_NODE_SELECTED;
}
/* Inform front end of change in dimensions */
@@ -1517,7 +1524,7 @@ nserror treeview_contract(treeview *tree, bool all)
}
-struct treeview_contract_data {
+struct treeview_expand_data {
treeview *tree;
bool only_folders;
};
@@ -1525,7 +1532,7 @@ struct treeview_contract_data {
static nserror treeview_expand_cb(treeview_node *n, void *ctx,
bool *skip_children, bool *end)
{
- struct treeview_contract_data *data = ctx;
+ struct treeview_expand_data *data = ctx;
nserror err;
assert(n != NULL);
@@ -1544,7 +1551,7 @@ static nserror treeview_expand_cb(treeview_node *n, void *ctx,
/* Exported interface, documented in treeview.h */
nserror treeview_expand(treeview *tree, bool only_folders)
{
- struct treeview_contract_data data;
+ struct treeview_expand_data data;
assert(tree != NULL);
assert(tree->root != NULL);