Blender V4.3
outliner_context.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2017 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BKE_context.hh"
10
11#include "DNA_space_types.h"
12
13#include "outliner_intern.hh"
14#include "tree/tree_iterator.hh"
15
16namespace blender::ed::outliner {
17
18static void outliner_context_selected_ids(const SpaceOutliner *space_outliner,
19 bContextDataResult *result)
20{
21 tree_iterator::all(*space_outliner, [&](const TreeElement *te) {
22 const TreeStoreElem *tse = TREESTORE(te);
24 CTX_data_id_list_add(result, tse->id);
25 }
26 });
28}
29
30static const char *outliner_context_dir[] = {
31 "id",
32 "selected_ids",
33 nullptr,
34};
35
36int /*eContextResult*/ outliner_main_region_context(const bContext *C,
37 const char *member,
38 bContextDataResult *result)
39{
40 SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
41
42 if (CTX_data_dir(member)) {
44 return CTX_RESULT_OK;
45 }
46
47 if (CTX_data_equals(member, "id")) {
48 const TreeElement *active_element = outliner_find_element_with_flag(&space_outliner->tree,
50 if (!active_element) {
51 return CTX_RESULT_NO_DATA;
52 }
53 const TreeStoreElem *active_tse = TREESTORE(active_element);
54 if (!TSE_IS_REAL_ID(active_tse)) {
55 return CTX_RESULT_NO_DATA;
56 }
57
58 CTX_data_id_pointer_set(result, active_tse->id);
59 return CTX_RESULT_OK;
60 }
61
62 if (CTX_data_equals(member, "selected_ids")) {
63 outliner_context_selected_ids(space_outliner, result);
64 return CTX_RESULT_OK;
65 }
66 /* NOTE: Querying non-ID selection could also work if tree elements stored their matching RNA
67 * struct type. */
68
70}
71
72} // namespace blender::ed::outliner
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
void CTX_data_id_list_add(bContextDataResult *result, ID *id)
bool CTX_data_equals(const char *member, const char *str)
SpaceOutliner * CTX_wm_space_outliner(const bContext *C)
bool CTX_data_dir(const char *member)
void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_RESULT_OK
@ CTX_RESULT_NO_DATA
@ CTX_DATA_TYPE_COLLECTION
void CTX_data_type_set(bContextDataResult *result, short type)
#define ELEM(...)
#define TSE_IS_REAL_ID(_tse)
@ TSE_LAYER_COLLECTION
@ TSE_SOME_ID
@ TSE_SELECTED
@ TSE_ACTIVE
void all(const SpaceOutliner &space_outliner, const VisitorFn visitor)
static const char * outliner_context_dir[]
int outliner_main_region_context(const bContext *C, const char *member, bContextDataResult *result)
static void outliner_context_selected_ids(const SpaceOutliner *space_outliner, bContextDataResult *result)
TreeElement * outliner_find_element_with_flag(const ListBase *lb, short flag)
#define TREESTORE(a)