Blender V4.3
tree_iterator.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "DNA_space_types.h"
10
11#include "BLI_listbase.h"
12
13#include "../outliner_intern.hh"
14
15#include "tree_iterator.hh"
16
18
19void all(const SpaceOutliner &space_outliner, const VisitorFn visitor)
20{
21 all_open(space_outliner, space_outliner.tree, visitor);
22}
23
24void all(const ListBase &subtree, const VisitorFn visitor)
25{
26 LISTBASE_FOREACH_MUTABLE (TreeElement *, element, &subtree) {
27 /* Get needed data out in case element gets freed. */
28 const ListBase subtree = element->subtree;
29
30 visitor(element);
31 /* Don't access element from now on, it may be freed. */
32
33 all(subtree, visitor);
34 }
35}
36
37void all_open(const SpaceOutliner &space_outliner, const VisitorFn visitor)
38{
39 all_open(space_outliner, space_outliner.tree, visitor);
40}
41
42void all_open(const SpaceOutliner &space_outliner,
43 const ListBase &subtree,
44 const VisitorFn visitor)
45{
46 LISTBASE_FOREACH_MUTABLE (TreeElement *, element, &subtree) {
47 /* Get needed data out in case element gets freed. */
48 const TreeStoreElem *tselem = TREESTORE(element);
49 const ListBase subtree = element->subtree;
50
51 visitor(element);
52 /* Don't access element from now on, it may be freed. Note that the open/collapsed state may
53 * also have been changed in the visitor callback. */
54
55 if (TSELEM_OPEN(tselem, &space_outliner)) {
56 all_open(space_outliner, subtree, visitor);
57 }
58 }
59}
60
61} // namespace blender::ed::outliner::tree_iterator
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void all_open(const SpaceOutliner &space_outliner, const VisitorFn visitor)
void all(const SpaceOutliner &space_outliner, const VisitorFn visitor)
#define TREESTORE(a)
#define TSELEM_OPEN(telm, sv)