qtgui.cpp 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. // Copyright (C) 2018 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. /*********************************************************************
  4. * INJECT CODE
  5. ********************************************************************/
  6. // @snippet gui-declarations
  7. QT_BEGIN_NAMESPACE
  8. void qt_set_sequence_auto_mnemonic(bool);
  9. QT_END_NAMESPACE
  10. // @snippet gui-declarations
  11. // @snippet qaccessible-pysidefactory
  12. // Helper for QAccessible::installFactory() that forwards the calls to
  13. // Python callables.
  14. class PySideAccessibleFactory
  15. {
  16. PySideAccessibleFactory() = default;
  17. public:
  18. ~PySideAccessibleFactory();
  19. static PySideAccessibleFactory *instance() { return m_instance; }
  20. static PySideAccessibleFactory *ensureInstance();
  21. static void installFactory(PyObject *f);
  22. static void cleanup();
  23. static QAccessibleInterface *factory(const QString &key, QObject *o);
  24. private:
  25. QAccessibleInterface *callFactories(const QString &key, QObject *o);
  26. static PySideAccessibleFactory *m_instance;
  27. QList<PyObject *> m_factoryFunctions;
  28. QList<PyObject *> m_objects;
  29. };
  30. PySideAccessibleFactory *PySideAccessibleFactory::m_instance = nullptr;
  31. PySideAccessibleFactory::~PySideAccessibleFactory()
  32. {
  33. QAccessible::removeFactory(PySideAccessibleFactory::factory);
  34. if (!m_factoryFunctions.isEmpty()) {
  35. Shiboken::GilState state;
  36. for (auto *f : m_factoryFunctions)
  37. Py_DECREF(f);
  38. for (auto *o : m_objects)
  39. Py_DECREF(o);
  40. }
  41. }
  42. PySideAccessibleFactory *PySideAccessibleFactory::ensureInstance()
  43. {
  44. if (m_instance == nullptr) {
  45. m_instance = new PySideAccessibleFactory;
  46. QAccessible::installFactory(PySideAccessibleFactory::factory);
  47. qAddPostRoutine(PySideAccessibleFactory::cleanup);
  48. }
  49. return m_instance;
  50. }
  51. void PySideAccessibleFactory::installFactory(PyObject *f)
  52. {
  53. if (m_instance != nullptr) {
  54. Py_INCREF(f);
  55. m_instance->m_factoryFunctions.append(f);
  56. }
  57. }
  58. void PySideAccessibleFactory::cleanup()
  59. {
  60. delete m_instance;
  61. m_instance = nullptr;
  62. }
  63. QAccessibleInterface *PySideAccessibleFactory::factory(const QString &key, QObject *o)
  64. {
  65. return m_instance ? m_instance->callFactories(key, o) : nullptr;
  66. }
  67. QAccessibleInterface *PySideAccessibleFactory::callFactories(const QString &key, QObject *o)
  68. {
  69. Shiboken::GilState state;
  70. Shiboken::AutoDecRef arglist(PyTuple_New(2));
  71. PyTuple_SetItem(arglist, 0, %CONVERTTOPYTHON[QString](key));
  72. PyTuple_SetItem(arglist, 1, %CONVERTTOPYTHON[QObject *](o));
  73. for (auto *f : m_factoryFunctions) {
  74. if (PyObject *pyResult = PyObject_CallObject(f, arglist)) {
  75. if (pyResult != Py_None) {
  76. m_objects.append(pyResult);
  77. QAccessibleInterface* result = %CONVERTTOCPP[QAccessibleInterface *](pyResult);
  78. return result;
  79. }
  80. Py_DECREF(pyResult);
  81. }
  82. }
  83. return nullptr;
  84. }
  85. // @snippet qaccessible-pysidefactory
  86. // @snippet qaccessible-installfactory
  87. PySideAccessibleFactory::ensureInstance()->installFactory(%1);
  88. // @snippet qaccessible-installfactory
  89. // @snippet qaction-menu
  90. // %CPPSELF->menu(); // pretend it was called.
  91. QObject *object = %CPPSELF->menu<QObject *>();
  92. %PYARG_0 = %CONVERTTOPYTHON[QObject*](object);
  93. // @snippet qaction-menu
  94. // @snippet qopenglfunctions-glgetv-return-size
  95. // Return the number of return values of the glGetBoolean/Double/Integerv functions
  96. // cf https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGet.xhtml
  97. static int glGetVReturnSize(GLenum pname)
  98. {
  99. switch (pname) {
  100. case GL_ALIASED_LINE_WIDTH_RANGE:
  101. case GL_DEPTH_RANGE:
  102. case GL_MAX_VIEWPORT_DIMS:
  103. #if !QT_CONFIG(opengles2)
  104. case GL_POINT_SIZE_RANGE:
  105. case GL_SMOOTH_LINE_WIDTH_RANGE:
  106. case GL_VIEWPORT_BOUNDS_RANGE:
  107. #endif
  108. return 2;
  109. case GL_BLEND_COLOR:
  110. case GL_COLOR_CLEAR_VALUE:
  111. case GL_COLOR_WRITEMASK:
  112. case GL_SCISSOR_BOX:
  113. case GL_VIEWPORT:
  114. return 4;
  115. case GL_COMPRESSED_TEXTURE_FORMATS:
  116. return GL_NUM_COMPRESSED_TEXTURE_FORMATS;
  117. default:
  118. break;
  119. }
  120. return 1;
  121. }
  122. // @snippet qopenglfunctions-glgetv-return-size
  123. // @snippet qopenglextrafunctions-glgeti-v-return-size
  124. // Return the number of return values of the indexed
  125. // glGetBoolean/Double/Integeri_v functions
  126. // cf https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGet.xhtml
  127. static int glGetI_VReturnSize(GLenum pname)
  128. {
  129. return pname == GL_VIEWPORT ? 4 : 1;
  130. }
  131. // @snippet qopenglextrafunctions-glgeti-v-return-size
  132. // @snippet qopenglfunctions-glgetbooleanv
  133. const int size = glGetVReturnSize(%1);
  134. QVarLengthArray<GLboolean> result(size, GL_FALSE);
  135. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  136. if (size == 1) {
  137. %PYARG_0 = %CONVERTTOPYTHON[bool](result[0]);
  138. } else {
  139. %PYARG_0 = Shiboken::Numpy::createByteArray1(size, result.constData());
  140. }
  141. // @snippet qopenglfunctions-glgetbooleanv
  142. // @snippet qopenglfunctions-glgetdoublev
  143. const int size = glGetVReturnSize(%1);
  144. QVarLengthArray<GLdouble> result(size, 0);
  145. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  146. if (size == 1) {
  147. %PYARG_0 = %CONVERTTOPYTHON[double](result[0]);
  148. } else {
  149. %PYARG_0 = Shiboken::Numpy::createDoubleArray1(size, result.constData());
  150. }
  151. // @snippet qopenglfunctions-glgetdoublev
  152. // @snippet qopenglfunctions-glgetfloatv
  153. const int size = glGetVReturnSize(%1);
  154. QVarLengthArray<GLfloat> result(size, 0);
  155. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  156. if (size == 1) {
  157. %PYARG_0 = %CONVERTTOPYTHON[float](result[0]);
  158. } else {
  159. %PYARG_0 = Shiboken::Numpy::createFloatArray1(size, result.constData());
  160. }
  161. // @snippet qopenglfunctions-glgetfloatv
  162. // @snippet qopenglfunctions-glgetintegerv
  163. const int size = glGetVReturnSize(%1);
  164. QVarLengthArray<GLint> result(size, 0);
  165. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  166. if (size == 1) {
  167. %PYARG_0 = %CONVERTTOPYTHON[int](result[0]);
  168. } else {
  169. %PYARG_0 = Shiboken::Numpy::createIntArray1(size, result.constData());
  170. }
  171. // @snippet qopenglfunctions-glgetintegerv
  172. // @snippet qopenglextrafunctions-glgetbooleani-v
  173. const int size = glGetI_VReturnSize(%1);
  174. QVarLengthArray<GLboolean> result(size, GL_FALSE);
  175. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  176. if (size == 1) {
  177. %PYARG_0 = %CONVERTTOPYTHON[bool](result[0]);
  178. } else {
  179. %PYARG_0 = Shiboken::Numpy::createByteArray1(size, result.constData());
  180. }
  181. // @snippet qopenglextrafunctions-glgetbooleani-v
  182. // @snippet qopenglextrafunctions-glgetdoublei-v
  183. const int size = glGetI_VReturnSize(%1);
  184. QVarLengthArray<GLdouble> result(size, 0);
  185. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  186. if (size == 1) {
  187. %PYARG_0 = %CONVERTTOPYTHON[double](result[0]);
  188. } else {
  189. %PYARG_0 = Shiboken::Numpy::createDoubleArray1(size, result.constData());
  190. }
  191. // @snippet qopenglextrafunctions-glgetdoublei-v
  192. // @snippet qopenglextrafunctions-glgetfloati-v
  193. const int size = glGetI_VReturnSize(%1);
  194. QVarLengthArray<GLfloat> result(size, 0);
  195. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  196. if (size == 1) {
  197. %PYARG_0 = %CONVERTTOPYTHON[float](result[0]);
  198. } else {
  199. %PYARG_0 = Shiboken::Numpy::createFloatArray1(size, result.constData());
  200. }
  201. // @snippet qopenglextrafunctions-glgetfloati-v
  202. // @snippet qopenglextrafunctions-glgetintegeri-v
  203. const int size = glGetI_VReturnSize(%1);
  204. QVarLengthArray<GLint> result(size, 0);
  205. %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data());
  206. if (size == 1) {
  207. %PYARG_0 = %CONVERTTOPYTHON[int](result[0]);
  208. } else {
  209. %PYARG_0 = Shiboken::Numpy::createIntArray1(size, result.constData());
  210. }
  211. // @snippet qopenglextrafunctions-glgetintegeri-v
  212. // @snippet glgetshadersource
  213. GLsizei bufSize = 4096;
  214. GLsizei length = bufSize - 1;
  215. QByteArray buffer;
  216. for (; length == bufSize - 1; bufSize += 4096) {
  217. buffer.resize(qsizetype(bufSize));
  218. %CPPSELF->%FUNCTION_NAME(%1, bufSize, &length, buffer.data());
  219. if (%CPPSELF->glGetError() != GL_NO_ERROR) {
  220. buffer.clear();
  221. break;
  222. }
  223. }
  224. auto *data = buffer.constData();
  225. %PYARG_0 = %CONVERTTOPYTHON[char *](data);
  226. // @snippet glgetshadersource
  227. // @snippet glshadersource
  228. const QByteArray buffer = %2.toUtf8();
  229. const char *sources[] = {buffer.constData()};
  230. %CPPSELF->%FUNCTION_NAME(%1, 1, sources, nullptr);
  231. // @snippet glshadersource
  232. // @snippet glgetstring-return
  233. %PYARG_0 = %CONVERTTOPYTHON[const char *](%0);
  234. // @snippet glgetstring-return
  235. // @snippet qtransform-quadtoquad
  236. QTransform _result;
  237. if (QTransform::quadToQuad(%1, %2, _result)) {
  238. %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result);
  239. } else {
  240. Py_INCREF(Py_None);
  241. %PYARG_0 = Py_None;
  242. }
  243. // @snippet qtransform-quadtoquad
  244. // @snippet qtransform-quadtosquare
  245. QTransform _result;
  246. if (QTransform::quadToSquare(%1, _result)) {
  247. %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result);
  248. } else {
  249. Py_INCREF(Py_None);
  250. %PYARG_0 = Py_None;
  251. }
  252. // @snippet qtransform-quadtosquare
  253. // @snippet qtransform-squaretoquad
  254. QTransform _result;
  255. if (QTransform::squareToQuad(%1, _result)) {
  256. %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result);
  257. } else {
  258. Py_INCREF(Py_None);
  259. %PYARG_0 = Py_None;
  260. }
  261. // @snippet qtransform-squaretoquad
  262. // @snippet qbitmap-fromdata
  263. auto *buffer = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_2));
  264. QBitmap %0 = QBitmap::fromData(%1, buffer, %3);
  265. %PYARG_0 = %CONVERTTOPYTHON[QBitmap](%0);
  266. // @snippet qbitmap-fromdata
  267. // @snippet qtextline-cursortox
  268. %RETURN_TYPE %0 = %CPPSELF->::%TYPE::%FUNCTION_NAME(&%1, %2);
  269. %PYARG_0 = PyTuple_New(2);
  270. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0));
  271. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1));
  272. // @snippet qtextline-cursortox
  273. // @snippet qkeysequence-getitem
  274. const Py_ssize_t size = %CPPSELF.count();
  275. if (_i < 0 || _i >= size) {
  276. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  277. return nullptr;
  278. }
  279. QKeyCombination item = (*%CPPSELF)[_i];
  280. return %CONVERTTOPYTHON[QKeyCombination](item);
  281. // @snippet qkeysequence-getitem
  282. // @snippet qkeysequence-repr
  283. auto ObTuple_Type = reinterpret_cast<PyObject *>(&PyTuple_Type);
  284. auto ObSelf_Type = reinterpret_cast<PyObject *>(Py_TYPE(%PYSELF));
  285. Shiboken::AutoDecRef surrogate(PyObject_CallFunctionObjArgs(ObTuple_Type, %PYSELF, nullptr));
  286. Shiboken::AutoDecRef argstr(PyObject_Repr(surrogate));
  287. Shiboken::AutoDecRef name(PyObject_GetAttrString(ObSelf_Type, "__name__"));
  288. return PyUnicode_Concat(name, argstr);
  289. // @snippet qkeysequence-repr
  290. // @snippet qpicture-data
  291. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.data(), %CPPSELF.size());
  292. // @snippet qpicture-data
  293. // @snippet qtextblock-setuserdata
  294. const QTextDocument *doc = %CPPSELF.document();
  295. if (doc) {
  296. Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument *](doc));
  297. Shiboken::Object::setParent(pyDocument, %PYARG_1);
  298. }
  299. // @snippet qtextblock-setuserdata
  300. // @snippet qtextblock-userdata
  301. const QTextDocument *doc = %CPPSELF.document();
  302. if (doc) {
  303. Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument *](doc));
  304. Shiboken::Object::setParent(pyDocument, %PYARG_0);
  305. }
  306. // @snippet qtextblock-userdata
  307. // @snippet qpolygon-reduce
  308. const Py_ssize_t count = %CPPSELF.size();
  309. PyObject *points = PyList_New(count);
  310. for (Py_ssize_t i = 0; i < count; ++i){
  311. int x, y;
  312. %CPPSELF.point(i, &x, &y);
  313. QPoint pt{x, y};
  314. PyList_SetItem(points, i, %CONVERTTOPYTHON[QPoint](pt));
  315. }
  316. // @snippet qpolygon-reduce
  317. // @snippet qpolygon-operatorlowerlower
  318. // %FUNCTION_NAME()
  319. *%CPPSELF << %1;
  320. %PYARG_0 = %CONVERTTOPYTHON[QPolygon *](%CPPSELF);
  321. // @snippet qpolygon-operatorlowerlower
  322. // @snippet qpolygonf-operatorlowerlower
  323. *%CPPSELF << %1;
  324. %PYARG_0 = %CONVERTTOPYTHON[QPolygonF *](%CPPSELF);
  325. // @snippet qpolygonf-operatorlowerlower
  326. // @snippet qpixmap
  327. %0 = new %TYPE(QPixmap::fromImage(%1));
  328. // @snippet qpixmap
  329. // @snippet qpixmap-load-xpm
  330. Shiboken::AutoDecRef strList(PySequence_Fast(%PYARG_1, "Invalid sequence."));
  331. Py_ssize_t lineCount = PySequence_Size(strList.object());
  332. for (Py_ssize_t line = 0; line < lineCount; ++line) {
  333. Shiboken::AutoDecRef _obj(PySequence_GetItem(strList.object(), line));
  334. if (!Shiboken::String::check(_obj)) {
  335. PyErr_SetString(PyExc_TypeError, "The argument must be a sequence of strings.");
  336. break;
  337. }
  338. }
  339. // PySIDE-1735: Enums are now implemented in Python, so we need to avoid asserts.
  340. if (PyErr_Occurred())
  341. break;
  342. Shiboken::ArrayPointer<const char*> xpm(lineCount);
  343. for (Py_ssize_t line = 0; line < lineCount; ++line) {
  344. Shiboken::AutoDecRef _obj(PySequence_GetItem(strList.object(), line));
  345. xpm[line] = Shiboken::String::toCString(_obj);
  346. }
  347. %0 = new %TYPE(xpm);
  348. // @snippet qpixmap-load-xpm
  349. // @snippet qicon-addpixmap
  350. const auto path = PySide::pyPathToQString(%PYARG_1);
  351. %CPPSELF->addPixmap(path);
  352. // @snippet qicon-addpixmap
  353. // @snippet qclipboard-setpixmap
  354. const auto path = PySide::pyPathToQString(%PYARG_1);
  355. %CPPSELF->setPixmap(QPixmap(path));
  356. // @snippet qclipboard-setpixmap
  357. // @snippet qclipboard-setimage
  358. const auto path = PySide::pyPathToQString(%PYARG_1);
  359. %CPPSELF->setImage(QImage(path));
  360. // @snippet qclipboard-setimage
  361. // @snippet qimage-buffer-constructor
  362. Py_INCREF(%PYARG_1);
  363. auto *ptr = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_1));
  364. %0 = new %TYPE(ptr, %ARGS, imageDecrefDataHandler, %PYARG_1);
  365. // @snippet qimage-buffer-constructor
  366. // @snippet qimage-decref-image-data
  367. static void imageDecrefDataHandler(void *data)
  368. {
  369. // Avoid "Python memory allocator called without holding the GIL"
  370. auto state = PyGILState_Ensure();
  371. Py_DECREF(reinterpret_cast<PyObject *>(data));
  372. PyGILState_Release(state);
  373. }
  374. // @snippet qimage-decref-image-data
  375. // @snippet qimage-constbits
  376. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.sizeInBytes());
  377. // @snippet qimage-constbits
  378. // @snippet qimage-bits
  379. // byteCount() is only available on Qt4.7, so we use bytesPerLine * height
  380. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.bytesPerLine() * %CPPSELF.height(), Shiboken::Buffer::ReadWrite);
  381. // @snippet qimage-bits
  382. // @snippet qimage-constscanline
  383. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine());
  384. // @snippet qimage-constscanline
  385. // @snippet qimage-scanline
  386. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine(), Shiboken::Buffer::ReadWrite);
  387. // @snippet qimage-scanline
  388. // @snippet qcolor-setstate
  389. Shiboken::AutoDecRef func(PyObject_GetAttr(%PYSELF, PyTuple_GetItem(%1, 0)));
  390. PyObject *args = PyTuple_GetItem(%1, 1);
  391. %PYARG_0 = PyObject_Call(func, args, nullptr);
  392. // @snippet qcolor-setstate
  393. // @snippet qcolor-reduce
  394. switch (%CPPSELF.spec()) {
  395. case QColor::Rgb:
  396. {
  397. float r, g, b, a;
  398. %CPPSELF.getRgbF(&r, &g, &b, &a);
  399. %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0),
  400. "setRgbF", r, g, b, a);
  401. break;
  402. }
  403. case QColor::Hsv:
  404. {
  405. float h, s, v, a;
  406. %CPPSELF.getHsvF(&h, &s, &v, &a);
  407. %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0),
  408. "setHsvF", h, s, v, a);
  409. break;
  410. }
  411. case QColor::Cmyk:
  412. {
  413. float c, m, y, k, a;
  414. %CPPSELF.getCmykF(&c, &m, &y, &k, &a);
  415. %PYARG_0 = Py_BuildValue("(ON(s(fffff)))", Py_TYPE(%PYSELF), PyTuple_New(0),
  416. "setCmykF", c, m, y, k, a);
  417. break;
  418. }
  419. case QColor::Hsl:
  420. {
  421. float h, s, l, a;
  422. %CPPSELF.getHslF(&h, &s, &l, &a);
  423. %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0),
  424. "setHslF", h, s, l, a);
  425. break;
  426. }
  427. default:
  428. {
  429. %PYARG_0 = Py_BuildValue("(N(O))", PyObject_Type(%PYSELF), Py_None);
  430. }
  431. }
  432. // @snippet qcolor-reduce
  433. // @snippet qcolor-totuple
  434. switch (%CPPSELF.spec()) {
  435. case QColor::Rgb:
  436. {
  437. int r, g, b, a;
  438. %CPPSELF.getRgb(&r, &g, &b, &a);
  439. %PYARG_0 = Py_BuildValue("iiii", r, g, b, a);
  440. break;
  441. }
  442. case QColor::Hsv:
  443. {
  444. int h, s, v, a;
  445. %CPPSELF.getHsv(&h, &s, &v, &a);
  446. %PYARG_0 = Py_BuildValue("iiii", h, s, v, a);
  447. break;
  448. }
  449. case QColor::Cmyk:
  450. {
  451. int c, m, y, k, a;
  452. %CPPSELF.getCmyk(&c, &m, &y, &k, &a);
  453. %PYARG_0 = Py_BuildValue("iiiii", c, m, y, k, a);
  454. break;
  455. }
  456. case QColor::Hsl:
  457. {
  458. int h, s, l, a;
  459. %CPPSELF.getHsl(&h, &s, &l, &a);
  460. %PYARG_0 = Py_BuildValue("iiii", h, s, l, a);
  461. break;
  462. }
  463. default:
  464. {
  465. %PYARG_0 = 0;
  466. }
  467. }
  468. // @snippet qcolor-totuple
  469. // @snippet qcolor-repr
  470. QString repr;
  471. switch (%CPPSELF.spec()) {
  472. case QColor::Rgb: {
  473. float r, g, b, a;
  474. %CPPSELF.getRgbF(&r, &g, &b, &a);
  475. repr = QString::asprintf("PySide6.QtGui.QColor.fromRgbF(%.6f, %.6f, %.6f, %.6f)",
  476. r, g, b, a);
  477. break;
  478. }
  479. case QColor::Hsv: {
  480. float h, s, v, a;
  481. %CPPSELF.getHsvF(&h, &s, &v, &a);
  482. repr = QString::asprintf("PySide6.QtGui.QColor.fromHsvF(%.6f, %.6f, %.6f, %.6f)",
  483. h, s, v, a);
  484. break;
  485. }
  486. case QColor::Cmyk: {
  487. float c, m, y, k, a;
  488. %CPPSELF.getCmykF(&c, &m, &y, &k, &a);
  489. repr = QString::asprintf("PySide6.QtGui.QColor.fromCmykF(%.6f, %.6f, %.6f, %.6f, %.6f)",
  490. c, m, y, k, a);
  491. break;
  492. }
  493. case QColor::Hsl: {
  494. float h, s, l, a;
  495. %CPPSELF.getHslF(&h, &s, &l, &a);
  496. repr = QString::asprintf("PySide6.QtGui.QColor.fromHslF(%.6f, %.6f, %.6f, %.6f)",
  497. h, s, l, a);
  498. break;
  499. }
  500. default:
  501. repr = QLatin1StringView("PySide6.QtGui.QColor()");
  502. break;
  503. }
  504. %PYARG_0 = Shiboken::String::fromCString(qPrintable(repr));
  505. // @snippet qcolor-repr
  506. // @snippet qcolor
  507. if (%1.type() == QVariant::Color)
  508. %0 = new %TYPE(%1.value<QColor>());
  509. else
  510. PyErr_SetString(PyExc_TypeError, "QVariant must be holding a QColor");
  511. // @snippet qcolor
  512. // @snippet qfont-tag-from-str-helper
  513. using FontTagOptional = std::optional<QFont::Tag>;
  514. static std::optional<QFont::Tag> qFontTagFromString(PyObject *unicode)
  515. {
  516. FontTagOptional result;
  517. if (PyUnicode_GetLength(unicode) == 4)
  518. result = QFont::Tag::fromString(PySide::pyUnicodeToQString(unicode));
  519. if (!result.has_value())
  520. PyErr_SetString(PyExc_TypeError,
  521. "QFont::Tag(): The tag name must be exactly 4 characters long.");
  522. return result;
  523. }
  524. // @snippet qfont-tag-from-str-helper
  525. // @snippet qfont-tag-init-str
  526. const FontTagOptional tagO = qFontTagFromString(%PYARG_1);
  527. if (tagO.has_value())
  528. %0 = new QFont::Tag(tagO.value());
  529. // @snippet qfont-tag-init-str
  530. // @snippet qfont-tag-fromString
  531. const FontTagOptional tagO = qFontTagFromString(%PYARG_1);
  532. if (tagO.has_value()) {
  533. const auto &tag = tagO.value();
  534. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](tag);
  535. }
  536. // @snippet qfont-tag-fromString
  537. // @snippet qfont-tag-fromValue
  538. const FontTagOptional tagO = QFont::Tag::fromValue(PyLong_AsUnsignedLong(%PYARG_1));
  539. if (tagO.has_value()) {
  540. const auto &tag = tagO.value();
  541. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](tag);
  542. } else {
  543. PyErr_SetString(PyExc_TypeError, "QFont::Tag::fromValue(): Invalid value passed.");
  544. }
  545. // @snippet qfont-tag-fromValue
  546. // @snippet qfontmetrics-qfontcharfix
  547. if (Shiboken::String::len(%PYARG_1) == 1) {
  548. const char *str = Shiboken::String::toCString(%PYARG_1);
  549. const QChar ch(static_cast<unsigned short>(str[0]));
  550. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(ch);
  551. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  552. } else {
  553. PyErr_SetString(PyExc_TypeError, "String must have only one character");
  554. }
  555. // @snippet qfontmetrics-qfontcharfix
  556. // @snippet qfontmetricsf-boundingrect
  557. int *array = nullptr;
  558. bool errorOccurred = false;
  559. if (numArgs == 5) {
  560. array = Shiboken::sequenceToIntArray(%PYARG_5, true);
  561. if (PyErr_Occurred()) {
  562. delete [] array;
  563. errorOccurred = true;
  564. }
  565. }
  566. if (!errorOccurred) {
  567. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, array);
  568. delete [] array;
  569. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  570. }
  571. // @snippet qfontmetricsf-boundingrect
  572. // @snippet qfontmetricsf-size
  573. int *array = nullptr;
  574. bool errorOccurred = false;
  575. if (numArgs == 4) {
  576. array = Shiboken::sequenceToIntArray(%PYARG_4, true);
  577. if (PyErr_Occurred()) {
  578. delete [] array;
  579. errorOccurred = true;
  580. }
  581. }
  582. if (!errorOccurred) {
  583. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, array);
  584. delete [] array;
  585. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  586. }
  587. // @snippet qfontmetricsf-size
  588. // @snippet qfontmetrics-boundingrect-1
  589. int *array = nullptr;
  590. bool errorOccurred = false;
  591. if (numArgs == 8) {
  592. array = Shiboken::sequenceToIntArray(%PYARG_8, true);
  593. if (PyErr_Occurred()) {
  594. delete [] array;
  595. errorOccurred = true;
  596. }
  597. }
  598. if (!errorOccurred) {
  599. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, array);
  600. delete [] array;
  601. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  602. }
  603. // @snippet qfontmetrics-boundingrect-1
  604. // @snippet qfontmetrics-boundingrect-2
  605. int *array = nullptr;
  606. bool errorOccurred = false;
  607. if (numArgs == 5) {
  608. array = Shiboken::sequenceToIntArray(%PYARG_5, true);
  609. if (PyErr_Occurred()) {
  610. delete [] array;
  611. errorOccurred = true;
  612. }
  613. }
  614. if (!errorOccurred) {
  615. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, array);
  616. delete [] array;
  617. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  618. }
  619. // @snippet qfontmetrics-boundingrect-2
  620. // @snippet qfontmetrics-size
  621. int *array = nullptr;
  622. bool errorOccurred = false;
  623. if (numArgs == 4) {
  624. array = Shiboken::sequenceToIntArray(%PYARG_4, true);
  625. if (PyErr_Occurred()) {
  626. delete [] array;
  627. errorOccurred = true;
  628. }
  629. }
  630. if (!errorOccurred) {
  631. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, array);
  632. delete [] array;
  633. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  634. }
  635. // @snippet qfontmetrics-size
  636. // @snippet qpixmapcache-find
  637. QPixmap p;
  638. if (%CPPSELF.%FUNCTION_NAME(%1, &p)) {
  639. %PYARG_0 = %CONVERTTOPYTHON[QPixmap](p);
  640. } else {
  641. %PYARG_0 = Py_None;
  642. Py_INCREF(%PYARG_0);
  643. }
  644. // @snippet qpixmapcache-find
  645. // @snippet qstandarditem-setchild-1
  646. // Clear parent from the old child
  647. QStandardItem *_i = %CPPSELF->child(%1, %2);
  648. if (_i) {
  649. PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem *](_i);
  650. Shiboken::Object::setParent(nullptr, _pyI);
  651. }
  652. // @snippet qstandarditem-setchild-1
  653. // @snippet qstandarditem-setchild-2
  654. // Clear parent from the old child
  655. QStandardItem *_i = %CPPSELF->child(%1);
  656. if (_i) {
  657. PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem *](_i);
  658. Shiboken::Object::setParent(nullptr, _pyI);
  659. }
  660. // @snippet qstandarditem-setchild-2
  661. // @snippet qkeyevent-operatornotequal
  662. bool ret = !(&%CPPSELF == %1);
  663. %PYARG_0 = %CONVERTTOPYTHON[bool](ret);
  664. // @snippet qkeyevent-operatornotequal
  665. // @snippet qstandarditemmodel-setitem-1
  666. // Clear parent from the old child
  667. QStandardItem *_i = %CPPSELF->item(%1, %2);
  668. if (_i) {
  669. PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem *](_i);
  670. Shiboken::Object::setParent(nullptr, _pyI);
  671. }
  672. // @snippet qstandarditemmodel-setitem-1
  673. // @snippet qstandarditemmodel-setitem-2
  674. // Clear parent from the old child
  675. QStandardItem *_i = %CPPSELF->item(%1);
  676. if (_i) {
  677. PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem *](_i);
  678. Shiboken::Object::setParent(nullptr, _pyI);
  679. }
  680. // @snippet qstandarditemmodel-setitem-2
  681. // @snippet qstandarditemmodel-setverticalheaderitem
  682. // Clear parent from the old child
  683. QStandardItem *_i = %CPPSELF->verticalHeaderItem(%1);
  684. if (_i) {
  685. PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem *](_i);
  686. Shiboken::Object::setParent(nullptr, _pyI);
  687. }
  688. // @snippet qstandarditemmodel-setverticalheaderitem
  689. // @snippet qstandarditemmodel-clear
  690. Shiboken::BindingManager &bm = Shiboken::BindingManager::instance();
  691. SbkObject *pyRoot = bm.retrieveWrapper(%CPPSELF.invisibleRootItem());
  692. if (pyRoot) {
  693. Shiboken::Object::destroy(pyRoot, %CPPSELF.invisibleRootItem());
  694. }
  695. for (int r=0, r_max = %CPPSELF.rowCount(); r < r_max; r++) {
  696. QList<QStandardItem *> ri = %CPPSELF.takeRow(0);
  697. PyObject *pyResult = %CONVERTTOPYTHON[QList<QStandardItem * >](ri);
  698. Shiboken::Object::setParent(Py_None, pyResult);
  699. Py_XDECREF(pyResult);
  700. }
  701. // @snippet qstandarditemmodel-clear
  702. // @snippet qclipboard-text
  703. %BEGIN_ALLOW_THREADS
  704. %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2);
  705. %END_ALLOW_THREADS
  706. %PYARG_0 = PyTuple_New(2);
  707. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_));
  708. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1));
  709. // @snippet qclipboard-text
  710. // @snippet qpainter-drawpointsnp-numpy-x-y
  711. const auto points = PySide::Numpy::xyDataToQPointFList(%PYARG_1, %PYARG_2);
  712. %CPPSELF.drawPoints(points);
  713. // @snippet qpainter-drawpointsnp-numpy-x-y
  714. // @snippet qpainter-drawpolygon
  715. %CPPSELF.%FUNCTION_NAME(%1.constData(), %1.size(), %2);
  716. // @snippet qpainter-drawpolygon
  717. // @snippet qpainter-enter
  718. Py_INCREF(%PYSELF);
  719. pyResult = %PYSELF;
  720. // @snippet qpainter-enter
  721. // @snippet qpainter-exit
  722. %CPPSELF.end();
  723. // @snippet qpainter-exit
  724. // @snippet qmatrix4x4
  725. // PYSIDE-795: All PySequences can be made iterable with PySequence_Fast.
  726. Shiboken::AutoDecRef seq(PySequence_Fast(%PYARG_1, "Can't turn into sequence"));
  727. if (PySequence_Size(seq) == 16) {
  728. float values[16];
  729. for (Py_ssize_t i = 0; i < 16; ++i) {
  730. Shiboken::AutoDecRef pv(PySequence_GetItem(seq.object(), i));
  731. values[i] = PyFloat_AsDouble(pv);
  732. }
  733. %0 = new %TYPE(values[0], values[1], values[2], values[3],
  734. values[4], values[5], values[6], values[7],
  735. values[8], values[9], values[10], values[11],
  736. values[12], values[13], values[14], values[15]);
  737. }
  738. // @snippet qmatrix4x4
  739. // @snippet qmatrix4x4-copydatato
  740. float values[16];
  741. %CPPSELF.%FUNCTION_NAME(values);
  742. %PYARG_0 = PyTuple_New(16);
  743. for (Py_ssize_t i = 0; i < 16; ++i) {
  744. PyObject *v = PyFloat_FromDouble(values[i]);
  745. PyTuple_SetItem(%PYARG_0, i, v);
  746. }
  747. // @snippet qmatrix4x4-copydatato
  748. // @snippet qmatrix4x4-mgetitem
  749. if (PySequence_Check(_key)) {
  750. Shiboken::AutoDecRef key(PySequence_Fast(_key, "Invalid matrix index."));
  751. if (PySequence_Size(key.object()) == 2) {
  752. Shiboken::AutoDecRef posx(PySequence_GetItem(key.object(), 0));
  753. Shiboken::AutoDecRef posy(PySequence_GetItem(key.object(), 1));
  754. Py_ssize_t x = PyLong_AsSsize_t(posx);
  755. Py_ssize_t y = PyLong_AsSsize_t(posy);
  756. float ret = (*%CPPSELF)(x,y);
  757. return %CONVERTTOPYTHON[float](ret);
  758. }
  759. }
  760. PyErr_SetString(PyExc_IndexError, "Invalid matrix index.");
  761. return 0;
  762. // @snippet qmatrix4x4-mgetitem
  763. // @snippet qguiapplication-init
  764. static void QGuiApplicationConstructor(PyObject *self, PyObject *pyargv, QGuiApplicationWrapper **cptr)
  765. {
  766. static int argc;
  767. static char **argv;
  768. PyObject *stringlist = PyTuple_GetItem(pyargv, 0);
  769. if (Shiboken::listToArgcArgv(stringlist, &argc, &argv, "PySideApp")) {
  770. *cptr = new QGuiApplicationWrapper(argc, argv, 0);
  771. Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject *>(self));
  772. PySide::registerCleanupFunction(&PySide::destroyQCoreApplication);
  773. }
  774. }
  775. // @snippet qguiapplication-init
  776. // @snippet qguiapplication-1
  777. QGuiApplicationConstructor(%PYSELF, args, &%0);
  778. // @snippet qguiapplication-1
  779. // @snippet qguiapplication-2
  780. PyObject *empty = PyTuple_New(2);
  781. if (!PyTuple_SetItem(empty, 0, PyList_New(0))) {
  782. QGuiApplicationConstructor(%PYSELF, empty, &%0);
  783. }
  784. // @snippet qguiapplication-2
  785. // @snippet qguiapplication-setoverridecursor
  786. auto *cppResult = new QtGuiHelper::QOverrideCursorGuard();
  787. %PYARG_0 = %CONVERTTOPYTHON[QtGuiHelper::QOverrideCursorGuard*](cppResult);
  788. Shiboken::Object::getOwnership(%PYARG_0); // Ensure the guard is removed
  789. // @snippet qguiapplication-setoverridecursor
  790. // @snippet qguiapplication-nativeInterface
  791. bool hasNativeApp = false;
  792. #if QT_CONFIG(xcb)
  793. if (auto *x11App = %CPPSELF.nativeInterface<QNativeInterface::QX11Application>()) {
  794. hasNativeApp = true;
  795. %PYARG_0 = %CONVERTTOPYTHON[QNativeInterface::QX11Application*](x11App);
  796. }
  797. #endif // xcb
  798. #if QT_CONFIG(wayland)
  799. if (auto *waylandApp = %CPPSELF.nativeInterface<QNativeInterface::QWaylandApplication>()) {
  800. hasNativeApp = true;
  801. %PYARG_0 = %CONVERTTOPYTHON[QNativeInterface::QWaylandApplication*](waylandApp);
  802. }
  803. #endif // wayland
  804. if (!hasNativeApp) {
  805. Py_INCREF(Py_None);
  806. %PYARG_0 = Py_None;
  807. }
  808. // @snippet qguiapplication-nativeInterface
  809. // @snippet qscreen-grabWindow
  810. WId id = %1;
  811. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(id, %2, %3, %4, %5);
  812. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  813. // @snippet qscreen-grabWindow
  814. // @snippet qscreen-nativeInterface
  815. bool hasNativeScreen = false;
  816. #ifdef Q_OS_WIN
  817. if (auto *winScreen = %CPPSELF.nativeInterface<QNativeInterface::QWindowsScreen>()) {
  818. hasNativeScreen = true;
  819. %PYARG_0 = %CONVERTTOPYTHON[QNativeInterface::QWindowsScreen*](winScreen);
  820. }
  821. #endif
  822. if (!hasNativeScreen) {
  823. Py_INCREF(Py_None);
  824. %PYARG_0 = Py_None;
  825. }
  826. // @snippet qscreen-nativeInterface
  827. // Return 'int' from native interface's forward-declared structs like Display*
  828. // @snippet native-resource-ptr
  829. auto *resource = %CPPSELF.%FUNCTION_NAME();
  830. %PYARG_0 = PyLong_FromVoidPtr(resource);
  831. // @snippet native-resource-ptr
  832. // @snippet qwindow-fromWinId
  833. WId id = %1;
  834. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(id);
  835. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval);
  836. // @snippet qwindow-fromWinId
  837. // @snippet set-qtkey-shortcut
  838. %CPPSELF.%FUNCTION_NAME(QKeyCombination(%1));
  839. // @snippet set-qtkey-shortcut
  840. // @snippet qshortcut-1
  841. %0 = new %TYPE(%1, %2);
  842. // @snippet qshortcut-1
  843. // @snippet qshortcut-2
  844. Shiboken::AutoDecRef result(PyObject_CallMethod(%PYSELF, "connect", "OsO",
  845. %PYSELF, SIGNAL(activated()), %PYARG_3)
  846. );
  847. if (!result.isNull())
  848. Shiboken::Object::setParent(%PYARG_2, %PYSELF);
  849. // @snippet qshortcut-2
  850. // @snippet qguiapplication-exec
  851. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  852. "'exec_' will be removed in the future. "
  853. "Use 'exec' instead.",
  854. 1)) {
  855. return nullptr;
  856. }
  857. %BEGIN_ALLOW_THREADS
  858. int cppResult = %CPPSELF.exec();
  859. %END_ALLOW_THREADS
  860. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  861. // @snippet qguiapplication-exec
  862. // @snippet qdrag-exec-arg1
  863. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  864. "'exec_' will be removed in the future. "
  865. "Use 'exec' instead.",
  866. 1)) {
  867. return nullptr;
  868. }
  869. %BEGIN_ALLOW_THREADS
  870. int cppResult = %CPPSELF.exec(%1);
  871. %END_ALLOW_THREADS
  872. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  873. // @snippet qdrag-exec-arg1
  874. // @snippet qdrag-exec-arg2
  875. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  876. "'exec_' will be removed in the future. "
  877. "Use 'exec' instead.",
  878. 1)) {
  879. return nullptr;
  880. }
  881. %BEGIN_ALLOW_THREADS
  882. int cppResult;
  883. if (numArgs == 2)
  884. cppResult = %CPPSELF.exec(%1, %2);
  885. else if (numArgs == 1)
  886. cppResult = %CPPSELF.exec(%1);
  887. else
  888. cppResult = %CPPSELF.exec();
  889. %END_ALLOW_THREADS
  890. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  891. // @snippet qdrag-exec-arg2
  892. // @snippet qquaternion-getaxisandangle-vector3d-float
  893. QVector3D outVec{};
  894. float angle{};
  895. %CPPSELF.%FUNCTION_NAME(&outVec, &angle);
  896. %PYARG_0 = PyTuple_New(2);
  897. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[QVector3D](outVec));
  898. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[float](angle));
  899. // @snippet qquaternion-getaxisandangle-vector3d-float
  900. // @snippet qquaternion-geteulerangles
  901. float pitch{}, yaw{}, roll{};
  902. %CPPSELF.%FUNCTION_NAME(&pitch, &yaw, &roll);
  903. %PYARG_0 = PyTuple_New(3);
  904. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[float](pitch));
  905. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[float](yaw));
  906. PyTuple_SetItem(%PYARG_0, 2, %CONVERTTOPYTHON[float](roll));
  907. // @snippet qquaternion-geteulerangles
  908. // @snippet qregion-len
  909. return %CPPSELF.rectCount();
  910. // @snippet qregion-len
  911. // @snippet qregion-getitem
  912. const Py_ssize_t size = %CPPSELF.rectCount();
  913. if (_i < 0 || _i >= size) {
  914. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  915. return nullptr;
  916. }
  917. const QRect cppResult = *(%CPPSELF.cbegin() + _i);
  918. return %CONVERTTOPYTHON[QRect](cppResult);
  919. // @snippet qregion-getitem
  920. // Some RHI functions take a std::initializer_list<>. Add functions
  921. // to convert from list.
  922. // @snippet qrhi-initializer-list
  923. %CPPSELF.%FUNCTION_NAME(%1.cbegin(), %1.cend());
  924. // @snippet qrhi-initializer-list
  925. // @snippet qrhi-commandbuffer-setvertexinput
  926. %CPPSELF.%FUNCTION_NAME(%1, %2.size(), %2.constData(), %3, %4, %5);
  927. // @snippet qrhi-commandbuffer-setvertexinput
  928. // @snippet qpainterstateguard-restore
  929. %CPPSELF.restore();
  930. // @snippet qpainterstateguard-restore
  931. // @snippet qmatrix-repr-code
  932. QByteArray format(PepType_GetFullyQualifiedNameStr(Py_TYPE(%PYSELF)));
  933. format += QByteArrayLiteral("((");
  934. %MATRIX_TYPE data[%MATRIX_SIZE];
  935. %CPPSELF.copyDataTo(data);
  936. for (int i = 0; i < %MATRIX_SIZE; ++i) {
  937. if (i > 0)
  938. format += ", ";
  939. format += QByteArray::number(data[i]);
  940. }
  941. format += "))";
  942. %PYARG_0 = Shiboken::String::fromStringAndSize(format, format.size());
  943. // @snippet qmatrix-repr-code
  944. // @snippet qmatrix-reduce-code
  945. %MATRIX_TYPE data[%MATRIX_SIZE];
  946. %CPPSELF.copyDataTo(data);
  947. QList<%MATRIX_TYPE> cppArgs(data, data + %MATRIX_SIZE);
  948. PyObject *type = PyObject_Type(%PYSELF);
  949. PyObject *args = Py_BuildValue("(N)",
  950. %CONVERTTOPYTHON[QList<%MATRIX_TYPE>](cppArgs));
  951. %PYARG_0 = Py_BuildValue("(NN)", type, args);
  952. // @snippet qmatrix-reduce-code
  953. // @snippet qmatrix-data-function
  954. PyObject *pyData = PyTuple_New(%MATRIX_SIZE);
  955. if (const float *data = %CPPSELF.constData()) {
  956. for (int i = 0; i < %MATRIX_SIZE; ++i)
  957. PyTuple_SetItem(pyData, i, %CONVERTTOPYTHON[float](data[i]));
  958. }
  959. return pyData;
  960. // @snippet qmatrix-data-function
  961. // @snippet qmatrix-constructor
  962. // PYSIDE-795: All PySequences can be made iterable with PySequence_Fast.
  963. Shiboken::AutoDecRef seq(PySequence_Fast(%PYARG_1, "Can't turn into sequence"));
  964. if (PySequence_Size(seq) == %SIZE) {
  965. Shiboken::AutoDecRef fast(PySequence_Fast(seq,
  966. "Failed to parse sequence on %TYPE constructor."));
  967. float values[%SIZE];
  968. for (int i = 0; i < %SIZE; ++i) {
  969. Shiboken::AutoDecRef pv(PySequence_GetItem(fast.object(), i));
  970. values[i] = %CONVERTTOCPP[float](pv);
  971. }
  972. %0 = new %TYPE(values);
  973. }
  974. // @snippet qmatrix-constructor
  975. // @snippet validator-conversionrule
  976. QValidator::State %out;
  977. if (PySequence_Check(%PYARG_0)) {
  978. Shiboken::AutoDecRef seq(PySequence_Fast(%PYARG_0, 0));
  979. const Py_ssize_t size = PySequence_Size(seq.object());
  980. if (size > 1) {
  981. Shiboken::AutoDecRef _obj1(PySequence_GetItem(seq.object(), 1));
  982. if (%ISCONVERTIBLE[QString](_obj1))
  983. %1 = %CONVERTTOCPP[QString](_obj1);
  984. else
  985. qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to unicode.");
  986. }
  987. if (size > 2) {
  988. Shiboken::AutoDecRef _obj2(PySequence_GetItem(seq.object(), 2));
  989. if (%ISCONVERTIBLE[int](_obj2))
  990. %2 = %CONVERTTOCPP[int](_obj2);
  991. else
  992. qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to int.");
  993. }
  994. Shiboken::AutoDecRef _sobj(PySequence_GetItem(seq.object(), 0));
  995. %PYARG_0.reset(_sobj);
  996. Py_INCREF(%PYARG_0); // we need to incref, because "%PYARG_0 = ..." will decref the tuple and the tuple will be decrefed again at the end of this scope.
  997. }
  998. // check return value
  999. if (%ISCONVERTIBLE[QValidator::State](%PYARG_0)) {
  1000. %out = %CONVERTTOCPP[QValidator::State](%PYARG_0);
  1001. } else {
  1002. PyErr_Format(PyExc_TypeError, "Invalid return value in function %s, expected %s, got %s.",
  1003. "QValidator.validate",
  1004. "PySide6.QtGui.QValidator.State, (PySide6.QtGui.QValidator.State,), (PySide6.QtGui.QValidator.State, unicode) or (PySide6.QtGui.QValidator.State, unicode, int)",
  1005. Py_TYPE(pyResult)->tp_name);
  1006. return QValidator::State();
  1007. }
  1008. // @snippet validator-conversionrule
  1009. // @snippet fix_margins_return
  1010. PyObject *obj = %PYARG_0.object();
  1011. bool ok = false;
  1012. if (PySequence_Check(obj) != 0 && PySequence_Size(obj) == 4) {
  1013. Shiboken::AutoDecRef m0(PySequence_GetItem(obj, 0));
  1014. Shiboken::AutoDecRef m1(PySequence_GetItem(obj, 1));
  1015. Shiboken::AutoDecRef m2(PySequence_GetItem(obj, 2));
  1016. Shiboken::AutoDecRef m3(PySequence_GetItem(obj, 3));
  1017. ok = PyNumber_Check(m0) != 0 && PyNumber_Check(m1) != 0
  1018. && PyNumber_Check(m2) && PyNumber_Check(m3) != 0;
  1019. if (ok) {
  1020. *%1 = %CONVERTTOCPP[$TYPE](m0);
  1021. *%2 = %CONVERTTOCPP[$TYPE](m1);
  1022. *%3 = %CONVERTTOCPP[$TYPE](m2);
  1023. *%4 = %CONVERTTOCPP[$TYPE](m3);
  1024. }
  1025. }
  1026. if (!ok) {
  1027. PyErr_SetString(PyExc_TypeError, "Sequence of 4 numbers expected");
  1028. %1 = %2 = %3 = %4 = 0;
  1029. }
  1030. // @snippet fix_margins_return
  1031. /*********************************************************************
  1032. * CONVERSIONS
  1033. ********************************************************************/
  1034. // @snippet conversion-pylong
  1035. %out = reinterpret_cast<%OUTTYPE>(PyLong_AsVoidPtr(%in));
  1036. // @snippet conversion-pylong
  1037. /*********************************************************************
  1038. * NATIVE TO TARGET CONVERSIONS
  1039. ********************************************************************/
  1040. // @snippet return-pylong-voidptr
  1041. return PyLong_FromVoidPtr(reinterpret_cast<void *>(%in));
  1042. // @snippet return-pylong-voidptr