diff options
author | Christian Tismer <tismer@stackless.com> | 2021-01-28 15:17:49 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-01-29 17:22:48 +0000 |
commit | 3c55228a2c3d8938a83f34e6f430f392792ea887 (patch) | |
tree | 024cc588cdd12f3c4fc3b615dae5b2761e62cbf6 | |
parent | 071a90d8e6d4b2642531957ab8201b6c3376f258 (diff) |
feature: delete setter after creating property only if standard
Some features like QWidget.size are defined by Qt with a
non-standard setter name. For size, the standard setter name
would be setSize, and in the property creation process
this setter would be deleted.
We changed rules in this way:
If a setter name is non-standard (like resize), the setter will
not be removed but still can be used.
Actually it would make more sense if "size" was a read-only
property.
Task-number: PYSIDE-1019
Change-Id: I9ded7e9c1dbd2932aa4c5616385b90ed673bfaee
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
(cherry picked from commit e675a51ce48875800c1f9137cedd49144c62af58)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | sources/pyside6/libpyside/feature_select.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sources/pyside6/libpyside/feature_select.cpp b/sources/pyside6/libpyside/feature_select.cpp index b87751271..db7fb1389 100644 --- a/sources/pyside6/libpyside/feature_select.cpp +++ b/sources/pyside6/libpyside/feature_select.cpp @@ -606,7 +606,7 @@ static PyObject *createProperty(PyTypeObject *type, PyObject *getter, PyObject * return prop; } -static QStringList parseFields(const char *propstr) +static QStringList parseFields(const char *propstr, bool *stdwrite) { /* * Break the string into subfields at ':' and add defaults. @@ -616,12 +616,14 @@ static QStringList parseFields(const char *propstr) assert(list.size() == 2 || list.size() == 3); auto name = list[0]; auto read = list[1]; - if (read.size() == 0) + if (read.isEmpty()) list[1] = name; if (list.size() == 2) return list; auto write = list[2]; - if (write.size() == 0) { + if (stdwrite) + *stdwrite = write.isEmpty(); + if (write.isEmpty()) { list[2] = QLatin1String("set") + name; list[2][3] = list[2][3].toUpper(); } @@ -661,8 +663,9 @@ static bool feature_02_true_property(PyTypeObject *type, PyObject *prev_dict, in if (props == nullptr || *props == nullptr) return true; for (; *props != nullptr; ++props) { + bool isStdWrite; auto propstr = *props; - auto fields = parseFields(propstr); + auto fields = parseFields(propstr, &isStdWrite); bool haveWrite = fields.size() == 3; PyObject *name = make_snake_case(fields[0], lower); PyObject *read = make_snake_case(fields[1], lower); @@ -685,9 +688,10 @@ static bool feature_02_true_property(PyTypeObject *type, PyObject *prev_dict, in return false; // Theoretically, we need to check for multiple signatures to be exact. // But we don't do so intentionally because it would be confusing. - if (haveWrite && PyDict_GetItem(prop_dict, write)) + if (haveWrite && PyDict_GetItem(prop_dict, write) && isStdWrite) { if (PyDict_DelItem(prop_dict, write) < 0) return false; + } } return true; } |