+ Add method getEditorMode() to see if a property is hidden or read-only in the property editor

This commit is contained in:
wmayer 2014-07-29 11:36:42 +02:00
parent dc7ccc41af
commit c54311123b
2 changed files with 64 additions and 4 deletions

View File

@ -37,6 +37,15 @@
</UserDocu>
</Documentation>
</Methode>
<Methode Name="getEditorMode">
<Documentation>
<UserDocu>Get the behaviour of the property in the property editor.
It returns a list of strings with the current mode. If the list is empty there are no special restrictions.
If the list contains 'ReadOnly' then the item appears in the property editor but is disabled.
If the list contains 'Hidden' then the item even doesn't appear in the property editor.
</UserDocu>
</Documentation>
</Methode>
<Methode Name="getGroupOfProperty">
<Documentation>
<UserDocu>Return the name of the group which the property belongs to in this class. The properties sorted in differnt named groups for convenience.</UserDocu>

View File

@ -103,15 +103,66 @@ PyObject* PropertyContainerPy::setEditorMode(PyObject *args)
{
char* name;
short type;
if (!PyArg_ParseTuple(args, "sh", &name, &type)) // convert args: Python->C
if (PyArg_ParseTuple(args, "sh", &name, &type)) {
App::Property* prop = getPropertyContainerPtr()->getPropertyByName(name);
if (!prop) {
PyErr_Format(PyExc_AttributeError, "Property container has no property '%s'", name);
return 0;
}
prop->StatusBits.set(2,(type & 1) > 0);
prop->StatusBits.set(3,(type & 2) > 0);
Py_Return;
}
PyErr_Clear();
PyObject *iter;
if (PyArg_ParseTuple(args, "sO", &name, &iter)) {
if (PyTuple_Check(iter) || PyList_Check(iter)) {
Py::Sequence seq(iter);
App::Property* prop = getPropertyContainerPtr()->getPropertyByName(name);
if (!prop) {
PyErr_Format(PyExc_AttributeError, "Property container has no property '%s'", name);
return 0;
}
// reset all bits first
prop->StatusBits.reset(2);
prop->StatusBits.reset(3);
for (Py::Sequence::iterator it = seq.begin();it!=seq.end();++it) {
std::string str = (std::string)Py::String(*it);
if (str == "ReadOnly")
prop->StatusBits.set(2);
else if (str == "Hidden")
prop->StatusBits.set(3);
}
Py_Return;
}
}
PyErr_SetString(PyExc_TypeError, "First argument must be str, second can be int, list or tuple");
return 0;
}
PyObject* PropertyContainerPy::getEditorMode(PyObject *args)
{
char* name;
if (!PyArg_ParseTuple(args, "s", &name)) // convert args: Python->C
return NULL; // NULL triggers exception
App::Property* prop = getPropertyContainerPtr()->getPropertyByName(name);
Py::List ret;
if (prop) {
prop->StatusBits.set(2,(type & 1) > 0);
prop->StatusBits.set(3,(type & 2) > 0);
short Type = prop->getType();
if ((prop->StatusBits.test(2)) || (Type & Prop_ReadOnly))
ret.append(Py::String("ReadOnly"));
if ((prop->StatusBits.test(3)) || (Type & Prop_Hidden))
ret.append(Py::String("Hidden"));
}
Py_Return;
return Py::new_reference_to(ret);
}
PyObject* PropertyContainerPy::getGroupOfProperty(PyObject *args)