From c8e908097207d8852e17e99585ae88a17e3af144 Mon Sep 17 00:00:00 2001 From: Hugo Lima Date: Tue, 15 Dec 2009 19:24:30 -0200 Subject: Initial port of signal slots infrastructure from PySide to the Shiboken version. --- libpyside/proxyslot.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 libpyside/proxyslot.cpp (limited to 'libpyside/proxyslot.cpp') diff --git a/libpyside/proxyslot.cpp b/libpyside/proxyslot.cpp new file mode 100644 index 000000000..59467056f --- /dev/null +++ b/libpyside/proxyslot.cpp @@ -0,0 +1,88 @@ +/* +* This file is part of the Shiboken Python Bindings Generator project. +* +* Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +* +* Contact: PySide team +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License +* version 2.1 as published by the Free Software Foundation. Please +* review the following information to ensure the GNU Lesser General +* Public License version 2.1 requirements will be met: +* http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +* +* As a special exception to the GNU Lesser General Public License +* version 2.1, the object code form of a "work that uses the Library" +* may incorporate material from a header file that is part of the +* Library. You may distribute such object code under terms of your +* choice, provided that the incorporated material (i) does not exceed +* more than 5% of the total size of the Library; and (ii) is limited to +* numerical parameters, data structure layouts, accessors, macros, +* inline functions and templates. +* +* This program 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. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +* 02110-1301 USA +*/ + +#include +#include +#include "proxyslot.h" +#include "abstractqobjectconnection.h" +#include "signalmanager.h" + +using namespace PySide; + +ProxySlot::ProxySlot(QObject* signalSource) : m_signalSource(signalSource) +{ + m_nextSlotIndex = m_signalSource->metaObject()->methodCount()-1; +} + +bool ProxySlot::connect(AbstractQObjectConnection* connection) +{ + QObject* source = connection->source(); + attachAbstractConnection(connection); + int slotIndex = connection->slotIndex(); + int signalIndex = connection->signalIndex(); + + qDebug() << "conectando" << signalIndex << "em" << slotIndex; + if (signalIndex >= 0) { + return QMetaObject::connect(source, signalIndex, this, slotIndex, connection->type()); + } else { // dynamic signals! + // TODO: Register dynamic signal + } + return true; + +} + +void ProxySlot::attachAbstractConnection(AbstractQObjectConnection* connection) +{ + m_nextSlotIndex++; + m_connections[m_nextSlotIndex] = connection; + connection->setSlotIndex(m_nextSlotIndex); +} + +int ProxySlot::qt_metacall(QMetaObject::Call callType, int slotIndex, void** args) +{ + // 2 is the index of deleteLater slot + if (slotIndex == 2) { + deleteLater(); + SignalManager::instance().removeProxySlot(m_signalSource); + } + + if (m_connections.contains(slotIndex)) { +// thread_locker lock; + m_connections[slotIndex]->trigger(args); + return -1; + } + + return QObject::qt_metacall(callType, slotIndex, args); +} + -- cgit v1.2.3