PythonQtStdDecorators.cpp
322 lines
| 9.0 KiB
| text/x-c
|
CppLexer
/ src / PythonQtStdDecorators.cpp
ezust
|
r0 | /* | |
* | |||
florianlink
|
r133 | * Copyright (C) 2010 MeVis Medical Solutions AG All Rights Reserved. | |
ezust
|
r0 | * | |
* This library is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 2.1 of the License, or (at your option) any later version. | |||
* | |||
* This library is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* Further, this software is distributed without any warranty that it is | |||
* free of the rightful claim of any third person regarding infringement | |||
* or the like. Any license provided herein, whether implied or | |||
* otherwise, applies only to this software file. Patent licenses, if | |||
* any, provided herein do not apply to combinations of this program with | |||
* other software, or any other product whatsoever. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public | |||
* License along with this library; if not, write to the Free Software | |||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
* | |||
florianlink
|
r133 | * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29, | |
ezust
|
r0 | * 28359 Bremen, Germany or: | |
* | |||
* http://www.mevis.de | |||
* | |||
*/ | |||
//---------------------------------------------------------------------------------- | |||
/*! | |||
// \file PythonQtStdDecorators.cpp | |||
// \author Florian Link | |||
// \author Last changed by $Author: florian $ | |||
// \date 2007-04 | |||
*/ | |||
//---------------------------------------------------------------------------------- | |||
#include "PythonQtStdDecorators.h" | |||
#include "PythonQt.h" | |||
#include "PythonQtClassInfo.h" | |||
florianlink
|
r68 | #include <QCoreApplication> | |
ezust
|
r0 | ||
bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, PyObject* callable) | |||
{ | |||
florianlink
|
r158 | bool result = false; | |
florianlink
|
r62 | QByteArray signalTmp; | |
char first = signal.at(0); | |||
if (first>='0' && first<='9') { | |||
signalTmp = signal; | |||
} else { | |||
signalTmp = "2" + signal; | |||
} | |||
florianlink
|
r157 | ||
ezust
|
r0 | if (sender) { | |
florianlink
|
r158 | result = PythonQt::self()->addSignalHandler(sender, signalTmp, callable); | |
if (!result) { | |||
if (sender->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(signalTmp.constData()+1)) == -1) { | |||
qWarning("PythonQt: QObject::connect() signal '%s' does not exist on %s", signal.constData(), sender->metaObject()->className()); | |||
} | |||
} | |||
ezust
|
r0 | } | |
florianlink
|
r158 | return result; | |
ezust
|
r0 | } | |
florianlink
|
r180 | bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot, Qt::ConnectionType type) | |
ezust
|
r0 | { | |
bool r = false; | |||
if (sender && receiver) { | |||
florianlink
|
r62 | QByteArray signalTmp; | |
char first = signal.at(0); | |||
if (first>='0' && first<='9') { | |||
signalTmp = signal; | |||
} else { | |||
signalTmp = "2" + signal; | |||
} | |||
QByteArray slotTmp; | |||
first = slot.at(0); | |||
if (first>='0' && first<='9') { | |||
slotTmp = slot; | |||
} else { | |||
slotTmp = "1" + slot; | |||
ezust
|
r0 | } | |
florianlink
|
r180 | r = QObject::connect(sender, signalTmp, receiver, slotTmp, type); | |
ezust
|
r0 | } | |
return r; | |||
} | |||
bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, PyObject* callable) | |||
{ | |||
florianlink
|
r158 | bool result = false; | |
florianlink
|
r62 | QByteArray signalTmp; | |
char first = signal.at(0); | |||
if (first>='0' && first<='9') { | |||
signalTmp = signal; | |||
} else { | |||
signalTmp = "2" + signal; | |||
} | |||
ezust
|
r0 | if (sender) { | |
florianlink
|
r158 | result = PythonQt::self()->removeSignalHandler(sender, signalTmp, callable); | |
florianlink
|
r173 | if (callable == NULL) { | |
result |= QObject::disconnect(sender, signalTmp, NULL, NULL); | |||
} | |||
florianlink
|
r158 | if (!result) { | |
if (sender->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(signalTmp.constData()+1)) == -1) { | |||
qWarning("PythonQt: QObject::disconnect() signal '%s' does not exist on %s", signal.constData(), sender->metaObject()->className()); | |||
} | |||
} | |||
ezust
|
r0 | } | |
florianlink
|
r158 | return result; | |
ezust
|
r0 | } | |
bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot) | |||
{ | |||
bool r = false; | |||
if (sender && receiver) { | |||
florianlink
|
r62 | QByteArray signalTmp; | |
char first = signal.at(0); | |||
if (first>='0' && first<='9') { | |||
signalTmp = signal; | |||
} else { | |||
signalTmp = "2" + signal; | |||
} | |||
florianlink
|
r157 | ||
florianlink
|
r62 | QByteArray slotTmp; | |
first = slot.at(0); | |||
if (first>='0' && first<='9') { | |||
slotTmp = slot; | |||
} else { | |||
slotTmp = "1" + slot; | |||
ezust
|
r0 | } | |
florianlink
|
r157 | ||
florianlink
|
r62 | r = QObject::disconnect(sender, signalTmp, receiver, slotTmp); | |
ezust
|
r0 | } | |
return r; | |||
} | |||
QObject* PythonQtStdDecorators::parent(QObject* o) { | |||
return o->parent(); | |||
} | |||
void PythonQtStdDecorators::setParent(QObject* o, QObject* parent) | |||
{ | |||
o->setParent(parent); | |||
} | |||
florianlink
|
r77 | const QObjectList* PythonQtStdDecorators::children(QObject* o) | |
ezust
|
r0 | { | |
florianlink
|
r77 | return &o->children(); | |
ezust
|
r0 | } | |
florianlink
|
r68 | ||
florianlink
|
r85 | bool PythonQtStdDecorators::setProperty(QObject* o, const char* name, const QVariant& value) | |
{ | |||
return o->setProperty(name, value); | |||
} | |||
QVariant PythonQtStdDecorators::property(QObject* o, const char* name) | |||
{ | |||
return o->property(name); | |||
} | |||
florianlink
|
r68 | QString PythonQtStdDecorators::tr(QObject* obj, const QByteArray& text, const QByteArray& ambig, int n) | |
{ | |||
return QCoreApplication::translate(obj->metaObject()->className(), text.constData(), ambig.constData(), QCoreApplication::CodecForTr, n); | |||
} | |||
florianlink
|
r79 | QObject* PythonQtStdDecorators::findChild(QObject* parent, PyObject* type, const QString& name) | |
{ | |||
const QMetaObject* meta = NULL; | |||
const char* typeName = NULL; | |||
if (PyObject_TypeCheck(type, &PythonQtClassWrapper_Type)) { | |||
meta = ((PythonQtClassWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyObject_TypeCheck(type, &PythonQtInstanceWrapper_Type)) { | |||
meta = ((PythonQtInstanceWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyString_Check(type)) { | |||
typeName = PyString_AsString(type); | |||
} | |||
if (!typeName && !meta) | |||
return NULL; | |||
return findChild(parent, typeName, meta, name); | |||
} | |||
QList<QObject*> PythonQtStdDecorators::findChildren(QObject* parent, PyObject* type, const QString& name) | |||
{ | |||
const QMetaObject* meta = NULL; | |||
const char* typeName = NULL; | |||
if (PyObject_TypeCheck(type, &PythonQtClassWrapper_Type)) { | |||
meta = ((PythonQtClassWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyObject_TypeCheck(type, &PythonQtInstanceWrapper_Type)) { | |||
meta = ((PythonQtInstanceWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyString_Check(type)) { | |||
typeName = PyString_AsString(type); | |||
} | |||
QList<QObject*> list; | |||
if (!typeName && !meta) | |||
return list; | |||
findChildren(parent, typeName, meta, name, list); | |||
return list; | |||
} | |||
QList<QObject*> PythonQtStdDecorators::findChildren(QObject* parent, PyObject* type, const QRegExp& regExp) | |||
{ | |||
const QMetaObject* meta = NULL; | |||
const char* typeName = NULL; | |||
if (PyObject_TypeCheck(type, &PythonQtClassWrapper_Type)) { | |||
meta = ((PythonQtClassWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyObject_TypeCheck(type, &PythonQtInstanceWrapper_Type)) { | |||
meta = ((PythonQtInstanceWrapper*)type)->classInfo()->metaObject(); | |||
} else if (PyString_Check(type)) { | |||
typeName = PyString_AsString(type); | |||
} | |||
QList<QObject*> list; | |||
if (!typeName && !meta) | |||
return list; | |||
findChildren(parent, typeName, meta, regExp, list); | |||
return list; | |||
} | |||
QObject* PythonQtStdDecorators::findChild(QObject* parent, const char* typeName, const QMetaObject* meta, const QString& name) | |||
{ | |||
const QObjectList &children = parent->children(); | |||
int i; | |||
for (i = 0; i < children.size(); ++i) { | |||
QObject* obj = children.at(i); | |||
if (!obj) | |||
return NULL; | |||
// Skip if the name doesn't match. | |||
if (!name.isNull() && obj->objectName() != name) | |||
continue; | |||
florianlink
|
r157 | if ((typeName && obj->inherits(typeName)) || | |
florianlink
|
r79 | (meta && meta->cast(obj))) | |
return obj; | |||
} | |||
for (i = 0; i < children.size(); ++i) { | |||
QObject* obj = findChild(children.at(i), typeName, meta, name); | |||
if (obj != NULL) | |||
return obj; | |||
} | |||
return NULL; | |||
} | |||
int PythonQtStdDecorators::findChildren(QObject* parent, const char* typeName, const QMetaObject* meta, const QString& name, QList<QObject*>& list) | |||
{ | |||
const QObjectList& children = parent->children(); | |||
int i; | |||
for (i = 0; i < children.size(); ++i) { | |||
QObject* obj = children.at(i); | |||
if (!obj) | |||
return -1; | |||
// Skip if the name doesn't match. | |||
if (!name.isNull() && obj->objectName() != name) | |||
continue; | |||
florianlink
|
r157 | if ((typeName && obj->inherits(typeName)) || | |
florianlink
|
r79 | (meta && meta->cast(obj))) { | |
list += obj; | |||
} | |||
if (findChildren(obj, typeName, meta, name, list) < 0) | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
int PythonQtStdDecorators::findChildren(QObject* parent, const char* typeName, const QMetaObject* meta, const QRegExp& regExp, QList<QObject*>& list) | |||
{ | |||
const QObjectList& children = parent->children(); | |||
int i; | |||
for (i = 0; i < children.size(); ++i) { | |||
QObject* obj = children.at(i); | |||
if (!obj) | |||
return -1; | |||
// Skip if the name doesn't match. | |||
if (regExp.indexIn(obj->objectName()) == -1) | |||
continue; | |||
florianlink
|
r157 | if ((typeName && obj->inherits(typeName)) || | |
florianlink
|
r79 | (meta && meta->cast(obj))) { | |
list += obj; | |||
} | |||
if (findChildren(obj, typeName, meta, regExp, list) < 0) | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
florianlink
|
r180 | ||
const QMetaObject* PythonQtStdDecorators::metaObject( QObject* obj ) | |||
{ | |||
return obj->metaObject(); | |||
} |