forked from PixarAnimationStudios/OpenUSD
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchildrenUtils.h
160 lines (134 loc) · 4.83 KB
/
childrenUtils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//
// Copyright 2016 Pixar
//
// Licensed under the terms set forth in the LICENSE.txt file available at
// https://openusd.org/license.
//
#ifndef PXR_USD_SDF_CHILDREN_UTILS_H
#define PXR_USD_SDF_CHILDREN_UTILS_H
/// \file sdf/childrenUtils.h
#include "pxr/pxr.h"
#include "pxr/usd/sdf/api.h"
#include "pxr/usd/sdf/allowed.h"
#include "pxr/usd/sdf/types.h"
PXR_NAMESPACE_OPEN_SCOPE
/// \class Sdf_ChildrenUtils
///
/// Helper functions for creating and manipulating the children
/// of a spec. A ChildPolicy must be provided that specifies which type
/// of children to edit. (See childrenPolicies.h for details).
///
template<class ChildPolicy>
class Sdf_ChildrenUtils
{
public:
/// The type of the key that identifies a child. This is usually
/// a std::string or an SdfPath.
typedef typename ChildPolicy::KeyType KeyType;
/// The type of the child identifier as it's stored in the layer's data.
/// This is usually a TfToken.
typedef typename ChildPolicy::FieldType FieldType;
/// Create a new spec in \a layer at \childPath and add it to its parent's
/// field named \childrenKey. Emit an error and return false if the new spec
/// couldn't be created.
static bool CreateSpec(
const SdfLayerHandle &layer,
const SdfPath &childPath,
SdfSpecType specType,
bool inert=true) {
return CreateSpec(get_pointer(layer), childPath, specType, inert);
}
// This overload is intended primarily for internal use.
SDF_API
static bool CreateSpec(
SdfLayer *layer,
const SdfPath &childPath,
SdfSpecType specType,
bool inert=true);
/// \name Rename API
/// @{
/// Return whether \a newName is a valid name for a child.
SDF_API
static bool IsValidName(const FieldType &newName);
/// Return whether \a newName is a valid name for a child.
SDF_API
static bool IsValidName(const std::string &newName);
/// Return whether \a spec can be renamed to \a newName.
static SdfAllowed CanRename(
const SdfSpec &spec,
const FieldType &newName);
/// Rename \a spec to \a newName. If \a fixPrimListEdits is true,
/// then also fix up the name children order. It's an error for
/// \a fixPrimListEdits to be true if spec is not a PrimSpec.
SDF_API
static bool Rename(
const SdfSpec &spec,
const FieldType &newName);
/// @}
/// \name Children List API
/// @{
/// Replace the children of the spec at \a path with the specs in \a
/// values. This will delete existing children that aren't in \a values and
/// reparent children from other locations in the layer.
SDF_API
static bool SetChildren(
const SdfLayerHandle &layer,
const SdfPath &path,
const std::vector<typename ChildPolicy::ValueType> &values);
/// Insert \a value as a child of \a path at the specified index.
SDF_API
static bool InsertChild(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::ValueType& value,
int index);
/// Remove the child identified by \a key.
SDF_API
static bool RemoveChild(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::KeyType& key);
/// @}
/// \name Batch editing API
/// @{
/// Insert \a value as a child of \a path at the specified index with
/// the new name \p newName.
SDF_API
static bool MoveChildForBatchNamespaceEdit(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::ValueType& value,
const typename ChildPolicy::FieldType& newName,
int index);
/// Remove the child identified by \a key.
SDF_API
static bool RemoveChildForBatchNamespaceEdit(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::KeyType& key)
{
return RemoveChild(layer, path, key);
}
/// Returns \c true if \p value can be inserted as a child of \p path
/// with the new name \p newName at the index \p index, otherwise
/// returns \c false and sets \p whyNot.
SDF_API
static bool CanMoveChildForBatchNamespaceEdit(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::ValueType& value,
const typename ChildPolicy::FieldType& newName,
int index,
std::string* whyNot);
/// Returns \c true if the child of \p path identified by \p key can
/// be removed, otherwise returns \c false and sets \p whyNot.
SDF_API
static bool CanRemoveChildForBatchNamespaceEdit(
const SdfLayerHandle &layer,
const SdfPath &path,
const typename ChildPolicy::FieldType& key,
std::string* whyNot);
/// @}
};
PXR_NAMESPACE_CLOSE_SCOPE
#endif // PXR_USD_SDF_CHILDREN_UTILS_H