Make READ_ONLY flag a combinator for NO_MOVES and NO_DELETES. Implement NO_DELETES.

This commit is contained in:
Michael Drake 2013-07-03 11:50:23 +01:00
parent c010535fbe
commit 26befde81c
2 changed files with 31 additions and 9 deletions

View File

@ -469,16 +469,30 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
/* Exported interface, documented in treeview.h */
nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
/**
* Delete a treeview node
*
* \param tree Treeview object to delete node from
* \param n Node to delete
* \param interaction Delete is result of user interaction with treeview
* \return NSERROR_OK on success, appropriate error otherwise
*
* Will emit folder or entry deletion msg callback.
*/
static nserror treeview_delete_node_internal(struct treeview *tree,
struct treeview_node *n, bool interaction)
{
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
return NSERROR_OK;
}
/* Destroy children first */
while (n->children != NULL) {
treeview_delete_node(tree, n->children);
treeview_delete_node_internal(tree, n->children, interaction);
}
/* Unlink node from tree */
@ -527,6 +541,13 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
}
/* Exported interface, documented in treeview.h */
nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
{
return treeview_delete_node_internal(tree, n, false);
}
/* Exported interface, documented in treeview.h */
nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
@ -614,7 +635,7 @@ nserror treeview_destroy(struct treeview *tree)
assert(tree != NULL);
/* Destroy nodes */
treeview_delete_node(tree, tree->root);
treeview_delete_node_internal(tree, tree->root, false);
/* Destroy feilds */
for (f = 0; f <= tree->n_fields; f++) {
@ -1086,7 +1107,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
case TREEVIEW_WALK_DELETE_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
treeview_delete_node(sw->tree, node);
treeview_delete_node_internal(sw->tree, node, true);
changed = true;
}
break;

View File

@ -44,10 +44,11 @@ typedef enum {
} treeview_node_create_flags; /**< Relationship between nodes */
typedef enum {
TREEVIEW_NO_FLAGS = (0), /* No flags set */
TREEVIEW_READ_ONLY = (1 << 0), /* No edits */
TREEVIEW_NO_MOVES = (1 << 1), /* No node drags */
TREEVIEW_DELETE_EMPTY_DIRS = (1 << 2) /* Del. dirs on empty */
TREEVIEW_NO_FLAGS = (0), /**< No flags set */
TREEVIEW_NO_MOVES = (1 << 0), /**< No node drags */
TREEVIEW_NO_DELETES = (1 << 1), /**< No node deletes */
TREEVIEW_READ_ONLY = TREEVIEW_NO_MOVES | TREEVIEW_NO_DELETES,
TREEVIEW_DEL_EMPTY_DIRS = (1 << 2) /**< Delete dirs on empty */
} treeview_flags;
enum treeview_msg {