Cleanup: Reduce `void *` reliance of new RNA C++ Outliner elements
Continuation of the previous commit, this time addressing the same for RNA tree-elements.
This commit is contained in:
parent
fc0dd5583c
commit
b57db4b79e
|
@ -81,6 +81,7 @@
|
|||
#include "outliner_intern.hh"
|
||||
#include "tree/tree_display.hh"
|
||||
#include "tree/tree_element.hh"
|
||||
#include "tree/tree_element_rna.hh"
|
||||
|
||||
using namespace blender::ed::outliner;
|
||||
|
||||
|
@ -1915,9 +1916,9 @@ static void outliner_draw_rnabuts(
|
|||
LISTBASE_FOREACH (TreeElement *, te, lb) {
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
if (te->ys + 2 * UI_UNIT_Y >= region->v2d.cur.ymin && te->ys <= region->v2d.cur.ymax) {
|
||||
if (tselem->type == TSE_RNA_PROPERTY) {
|
||||
if (TreeElementRNAProperty *te_rna_prop = tree_element_cast<TreeElementRNAProperty>(te)) {
|
||||
ptr = &te->rnaptr;
|
||||
prop = reinterpret_cast<PropertyRNA *>(te->directdata);
|
||||
prop = te_rna_prop->getRNAProperty();
|
||||
|
||||
if (!TSELEM_OPEN(tselem, space_outliner)) {
|
||||
if (RNA_property_type(prop) == PROP_POINTER) {
|
||||
|
@ -1959,9 +1960,10 @@ static void outliner_draw_rnabuts(
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (tselem->type == TSE_RNA_ARRAY_ELEM) {
|
||||
else if (TreeElementRNAArrayElement *te_rna_array_elem =
|
||||
tree_element_cast<TreeElementRNAArrayElement>(te)) {
|
||||
ptr = &te->rnaptr;
|
||||
prop = reinterpret_cast<PropertyRNA *>(te->directdata);
|
||||
prop = te_rna_array_elem->getRNAProperty();
|
||||
|
||||
uiDefAutoButR(block,
|
||||
ptr,
|
||||
|
|
|
@ -74,6 +74,9 @@
|
|||
#include "GPU_material.h"
|
||||
|
||||
#include "outliner_intern.hh"
|
||||
#include "tree/tree_element_rna.hh"
|
||||
|
||||
using namespace blender::ed::outliner;
|
||||
|
||||
static void outliner_show_active(SpaceOutliner *space_outliner,
|
||||
ARegion *region,
|
||||
|
@ -1718,7 +1721,6 @@ static void tree_element_to_path(TreeElement *te,
|
|||
TreeElement *tem, *temnext;
|
||||
TreeStoreElem *tse /* , *tsenext */ /* UNUSED */;
|
||||
PointerRNA *ptr, *nextptr;
|
||||
PropertyRNA *prop;
|
||||
char *newpath = nullptr;
|
||||
|
||||
/* optimize tricks:
|
||||
|
@ -1751,7 +1753,6 @@ static void tree_element_to_path(TreeElement *te,
|
|||
tem = (TreeElement *)ld->data;
|
||||
tse = TREESTORE(tem);
|
||||
ptr = &tem->rnaptr;
|
||||
prop = reinterpret_cast<PropertyRNA *>(tem->directdata);
|
||||
|
||||
/* check if we're looking for first ID, or appending to path */
|
||||
if (*id) {
|
||||
|
@ -1759,7 +1760,9 @@ static void tree_element_to_path(TreeElement *te,
|
|||
* - to prevent memory leaks, we must write to newpath not path,
|
||||
* then free old path + swap them.
|
||||
*/
|
||||
if (tse->type == TSE_RNA_PROPERTY) {
|
||||
if (TreeElementRNAProperty *tem_rna_prop = tree_element_cast<TreeElementRNAProperty>(tem)) {
|
||||
PropertyRNA *prop = tem_rna_prop->getRNAProperty();
|
||||
|
||||
if (RNA_property_type(prop) == PROP_POINTER) {
|
||||
/* for pointer we just append property name */
|
||||
newpath = RNA_path_append(*path, ptr, prop, 0, nullptr);
|
||||
|
@ -1827,8 +1830,7 @@ static void tree_element_to_path(TreeElement *te,
|
|||
/* step 3: if we've got an ID, add the current item to the path */
|
||||
if (*id) {
|
||||
/* add the active property to the path */
|
||||
ptr = &te->rnaptr;
|
||||
prop = reinterpret_cast<PropertyRNA *>(te->directdata);
|
||||
PropertyRNA *prop = tree_element_cast<TreeElementRNACommon>(te)->getRNAProperty();
|
||||
|
||||
/* array checks */
|
||||
if (tselem->type == TSE_RNA_ARRAY_ELEM) {
|
||||
|
@ -1886,9 +1888,11 @@ static void do_outliner_drivers_editop(SpaceOutliner *space_outliner,
|
|||
short flag = 0;
|
||||
short groupmode = KSP_GROUP_KSNAME;
|
||||
|
||||
TreeElementRNACommon *te_rna = tree_element_cast<TreeElementRNACommon>(te);
|
||||
PropertyRNA *prop = te_rna ? te_rna->getRNAProperty() : nullptr;
|
||||
|
||||
/* check if RNA-property described by this selected element is an animatable prop */
|
||||
if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) &&
|
||||
RNA_property_animateable(&te->rnaptr, reinterpret_cast<PropertyRNA *>(te->directdata))) {
|
||||
if (prop && RNA_property_animateable(&te->rnaptr, prop)) {
|
||||
/* get id + path + index info from the selected element */
|
||||
tree_element_to_path(te, tselem, &id, &path, &array_index, &flag, &groupmode);
|
||||
}
|
||||
|
@ -1901,8 +1905,7 @@ static void do_outliner_drivers_editop(SpaceOutliner *space_outliner,
|
|||
/* array checks */
|
||||
if (flag & KSP_FLAG_WHOLE_ARRAY) {
|
||||
/* entire array was selected, so add drivers for all */
|
||||
arraylen = RNA_property_array_length(&te->rnaptr,
|
||||
reinterpret_cast<PropertyRNA *>(te->directdata));
|
||||
arraylen = RNA_property_array_length(&te->rnaptr, prop);
|
||||
}
|
||||
else {
|
||||
arraylen = array_index;
|
||||
|
@ -2084,8 +2087,9 @@ static void do_outliner_keyingset_editop(SpaceOutliner *space_outliner,
|
|||
short groupmode = KSP_GROUP_KSNAME;
|
||||
|
||||
/* check if RNA-property described by this selected element is an animatable prop */
|
||||
if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) &&
|
||||
RNA_property_animateable(&te->rnaptr, reinterpret_cast<PropertyRNA *>(te->directdata))) {
|
||||
if (TreeElementRNACommon *te_rna = tree_element_cast<TreeElementRNACommon>(te);
|
||||
te_rna && te_rna->getRNAProperty() &&
|
||||
RNA_property_animateable(&te->rnaptr, te_rna->getRNAProperty())) {
|
||||
/* get id + path + index info from the selected element */
|
||||
tree_element_to_path(te, tselem, &id, &path, &array_index, &flag, &groupmode);
|
||||
}
|
||||
|
|
|
@ -73,6 +73,11 @@ bool TreeElementRNACommon::expandPoll(const SpaceOutliner &) const
|
|||
return isRNAValid();
|
||||
}
|
||||
|
||||
PropertyRNA *TreeElementRNACommon::getRNAProperty() const
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* RNA Struct */
|
||||
|
||||
|
@ -108,10 +113,12 @@ void TreeElementRNAStruct::expand(SpaceOutliner &space_outliner) const
|
|||
int tot = RNA_property_collection_length(ptr, iterprop);
|
||||
CLAMP_MAX(tot, max_index);
|
||||
|
||||
TreeElementRNAProperty *parent_prop_te = legacy_te_.parent ?
|
||||
tree_element_cast<TreeElementRNAProperty>(
|
||||
legacy_te_.parent) :
|
||||
nullptr;
|
||||
/* auto open these cases */
|
||||
if (!legacy_te_.parent ||
|
||||
(RNA_property_type(reinterpret_cast<PropertyRNA *>(legacy_te_.parent->directdata))) ==
|
||||
PROP_POINTER) {
|
||||
if (!parent_prop_te || (RNA_property_type(parent_prop_te->getRNAProperty()) == PROP_POINTER)) {
|
||||
if (!tselem.used) {
|
||||
tselem.flag &= ~TSE_CLOSED;
|
||||
}
|
||||
|
@ -157,7 +164,6 @@ TreeElementRNAProperty::TreeElementRNAProperty(TreeElement &legacy_te,
|
|||
PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(propptr.data);
|
||||
|
||||
legacy_te_.name = RNA_property_ui_name(prop);
|
||||
legacy_te_.directdata = prop;
|
||||
rna_prop_ = prop;
|
||||
}
|
||||
|
||||
|
@ -225,6 +231,11 @@ void TreeElementRNAProperty::expand(SpaceOutliner &space_outliner) const
|
|||
}
|
||||
}
|
||||
|
||||
PropertyRNA *TreeElementRNAProperty::getRNAProperty() const
|
||||
{
|
||||
return rna_prop_;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* RNA Array Element */
|
||||
|
||||
|
@ -236,11 +247,9 @@ TreeElementRNAArrayElement::TreeElementRNAArrayElement(TreeElement &legacy_te,
|
|||
BLI_assert(legacy_te.store_elem->type == TSE_RNA_ARRAY_ELEM);
|
||||
|
||||
BLI_assert(legacy_te.parent && (legacy_te.parent->store_elem->type == TSE_RNA_PROPERTY));
|
||||
PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(legacy_te_.parent->directdata);
|
||||
legacy_te_.directdata = prop;
|
||||
legacy_te_.index = index;
|
||||
|
||||
char c = RNA_property_array_item_char(prop, index);
|
||||
char c = RNA_property_array_item_char(TreeElementRNAArrayElement::getRNAProperty(), index);
|
||||
|
||||
legacy_te_.name = reinterpret_cast<char *>(
|
||||
MEM_callocN(sizeof(char[20]), "OutlinerRNAArrayName"));
|
||||
|
@ -253,4 +262,12 @@ TreeElementRNAArrayElement::TreeElementRNAArrayElement(TreeElement &legacy_te,
|
|||
legacy_te_.flag |= TE_FREE_NAME;
|
||||
}
|
||||
|
||||
PropertyRNA *TreeElementRNAArrayElement::getRNAProperty() const
|
||||
{
|
||||
/* Forward query to the parent (which is expected to be a #TreeElementRNAProperty). */
|
||||
const TreeElementRNAProperty *parent_prop_te = tree_element_cast<TreeElementRNAProperty>(
|
||||
legacy_te_.parent);
|
||||
return parent_prop_te ? parent_prop_te->getRNAProperty() : nullptr;
|
||||
}
|
||||
|
||||
} // namespace blender::ed::outliner
|
||||
|
|
|
@ -43,6 +43,12 @@ class TreeElementRNACommon : public AbstractTreeElement {
|
|||
bool isExpandValid() const override;
|
||||
bool expandPoll(const SpaceOutliner &) const override;
|
||||
|
||||
/**
|
||||
* If this element represents a property or is part of a property (array element), this returns
|
||||
* the property. Otherwise nullptr.
|
||||
*/
|
||||
virtual PropertyRNA *getRNAProperty() const;
|
||||
|
||||
bool isRNAValid() const;
|
||||
};
|
||||
|
||||
|
@ -63,6 +69,8 @@ class TreeElementRNAProperty : public TreeElementRNACommon {
|
|||
public:
|
||||
TreeElementRNAProperty(TreeElement &legacy_te, PointerRNA &rna_ptr, int index);
|
||||
void expand(SpaceOutliner &space_outliner) const override;
|
||||
|
||||
PropertyRNA *getRNAProperty() const override;
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
@ -70,6 +78,8 @@ class TreeElementRNAProperty : public TreeElementRNACommon {
|
|||
class TreeElementRNAArrayElement : public TreeElementRNACommon {
|
||||
public:
|
||||
TreeElementRNAArrayElement(TreeElement &legacy_te, PointerRNA &rna_ptr, int index);
|
||||
|
||||
PropertyRNA *getRNAProperty() const override;
|
||||
};
|
||||
|
||||
} // namespace blender::ed::outliner
|
||||
|
|
Loading…
Reference in New Issue