/* Copyright © 2010 yan Verdavaine This file is part of QExtend. QExtend is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. QExtend 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 General Public License for more details. You should have received a copy of the GNU General Public License along with QExtend. If not, see . */ #ifndef QEXTEND_CONNECTOR_H #define QEXTEND_CONNECTOR_H #include "extendptr.hpp" #include namespace QExtend { class Receiver; //! \~english Interfaces a QObject instance with one of its signal. //! \~french Interface une instance de QObject avec un de ses signal. /*! \~english Emitter is use to simplify connexion lisibility with connect coding like a stream. Emitter could be connect to a Receiver or another Emitter. \~french Emitter est utilisé pour simplifier la lisibilité des connexions avec l'écriture des connect comme un flux. Un Emitter peut être connecté vers un Receiver ou un autre Emitter. */ class QEXTEND_EXPORT Emitter { ExtendPtr m_emitter; const char * m_signal; mutable Qt::ConnectionType m_type; public: //! \~english Create a Emitter //! \~french Crée un Emitter. /*! \~english Create a Emitter \param obj QObject pointer. \param signal Object signal signature. Like normal connect, you should use SIGNAL macro. \~french Créé un Emitter. \param obj Pointeur sur l'objet. \param signal Signature du signal de l'objet. Comme pour un connect, vous devez utiliser la macro SIGNAL. \~ */ Emitter(const QObject * obj = 0, const char * signal = 0); //! \~english Creates an Emitter to a specific signal. //! \~french Crée un Emitter pour un signal précis. /*! \~english Creates an Emitter to a spécific signal \param signal Object signal signature. like normale connect, you should use SIGNAL macro. \~french Crée un Emitter pour un signal précis. \param signal Signature du signal de l'objet. Comme pour un connect, vous devez utiliser la macro SIGNAL. \~ */ Emitter(const char * signal ); //! \~english Gives the interfaced QObject Emitter. If QObject has been deleted, this function returns 0. //! \~french Accès au QObject interfacé qui émet un signal. Si l'object as été détruit, la fonction retourne 0. const QObject * emitter() const; //! \~english Gives the interfaced signal signature. //! \~french Accès à la signature du siganl du QObject. const char * signal() const; //! \~english Replaces the interfaced QObject. //! \~french Remplace le QObject interfacé. /*! \~english Replaces interfaced QObject \param obj QObject pointer. \~french Remplace le QObject interfacé. \param obj Pointeur sur l'objet. \~ */ void replaceObject(const QObject * obj); //! \~english Replaces the signal signature. //! \~french Remplace la signature du signal. /*! \~english Replace signal signature. \param signal Object signal signature. Like normal connect, you should use SIGNAL macro. \~french Remplace la signature du signal. \param signal Signature du signal de l'objet. Comme pour un connect, vous devez utiliser la macro SIGNAL. \~ */ void replaceSignal( const char * signal); //! \~english Replaces the interfaced QObject and the signal signature. //! \~french Remplace le QObject interfacé et la signature du signal /*! \~english Replaces interfaced QObject and signal signature. \param obj QObject pointer. \param signal Object signal signature. Like normal connect, you should use SIGNAL macro. \~french Remplace le QObject interfacé et la signature du signal. \param obj Pointeur sur l'objet. \param signal Signature du signal de l'objet. Comme pour un connect, vous devez utiliser la macro SIGNAL. \~ */ void replaceEmitter(const QObject * obj, const char * signal); //! \~english Connects an Emitter to a Receiver //! \~french Connecte un Emitter vers un Receiver /*! \~english Connects an Emitter to a Receiver \param r Target Receiver. \~french Connecte un Emitter vers un Receiver \param r le Recpter cible. \~ */ const Emitter & operator >> (const Receiver & r) const; //! \~english Connects Emitter to another Emitter //! \~french Connect un Emitter vers un autre Emitter /*! \~english Connect Emitter to another Emitter \param e Emitter target. \~french Connecte un Emitter vers un Receiver \param e l'Emitter cible. \~ */ const Emitter & operator >> (const Emitter & e) const; const Emitter & operator << (const Emitter & e) const; //! \~english Modify the next connexion type. //! \~french Modifie le type de la prochaine connexion. /*! \~english By default connexion type is Qt::AutoConnection. After the next connection, type is reinitialized to Qt::AutoConnection. \param type Connection type. \~french Par défaut, le type de connection est Qt::AutoConnection. Après la prochaine connexion, le type est réinitialisé à Qt::AutoConnection. \param type Type de connexion. \~ */ const Emitter & operator >> (Qt::ConnectionType type) const ; }; //! \~english Interfaces a QObject instance with one of its slot or signal that will be connected to a signal //! \~french Interface une instance de QObject avec un de ses slots ou signaux qui seront connectés à un signal /*! \~english Receiver is used to simplify connection lisibility with connect coded like streams. Receiver could be connected to an Emitter. \~french Receiver est utilisé pour simplifier la lisibilité des connexions avec l'écriture des connect comme un flux. Un Receiver peut être connecté vers un Emitter. */ class QEXTEND_EXPORT Receiver { ExtendPtr m_receiver; const char * m_slot; mutable Qt::ConnectionType m_type; public: //! \~english Create a Receiver //! \~french Créé un Receiver. /*! \~english Create a Receiver \param obj QObject pointer. \param slot Object slot signature. like normale connect, you should use SLOT macro. \~french Créé un Receiver. \param obj Pointeur sur l'objet. \param slot Signature du slot de l'objet. Comme pour un connet, vous devez utiliser la macro SLOT. \~ */ Receiver(const QObject * obj = 0, const char * slot = 0); //! \~english Create a Receiver //! \~french Créé un Receiver. /*! \~english Create a Receiver to a spécific slot \param slot Object slot signature. like normale connect, you should use SLOT macro. \~french Créé un Receiver pour un slot spécifique. \param slot Signature du slot de l'objet. Comme pour un connet, vous devez utiliser la macro SLOT. \~ */ Receiver( const char * slot ); //! \~english Give interfaced QObject Receiver. If QObject has been deleted, this function return 0. //! \~french Accés au QObject interfacé. Si l'object as été détruit, a fonction retourne 0. const QObject * receiver() const; //! \~english Give interfaced slot signature. //! \~french Accés à la signature du slot du QObject. const char * slot() const; //! \~english Replace interfaced QObject //! \~french Remplace le QObject interfacé. /*! \~english Replace interfaced QObject \param obj QObject pointer. \~french Remplace le QObject interfacé. \param obj Pointeur sur l'objet. \~ */ void replaceObject(const QObject * obj); //! \~english Replace slot signature. //! \~french Remplace la signature du slot. /*! \~english Replace slot signature. \param slot Object slot signature. like normale connect, you should use SLOT macro. \~french Remplace le slot du signal. \param signal Signature du slot de l'objet. Comme pour un connet, vous devez utiliser la macro SLOT. \~ */ void replaceSlot( const char * slot); //! \~english Replace interfaced QObject ans slot signature. //! \~french remplace le QObject interfacé et la signature du slot. /*! \~english Create a Receiver \param obj QObject pointer. \param slot Object slot signature. like normale connect, you should use SLOT macro. \~french Créé un Receiver. \param obj Pointeur sur l'objet. \param slot Signature du slot de l'objet. Comme pour un connet, vous devez utiliser la macro SLOT. \~ */ void replaceReceiver(const QObject * obj, const char * slot); //! \~english Connect an Emitter to Receiver //! \~french Connect un Emitter vers le Receiver /*! \~english Connect an Emitter to Receiver \param e Emitter source. \~french Connect un Emitter vers un Receiver \param e l'Emitter source. \~ */ const Receiver & operator << (const Emitter & e) const; //! \~english Modify the next connexion type. //! \~french Modifie le type de la prochaine connexion. /*! \~english By default connexion type is Qt::AutoConnection. After the next connexion, type is reinitialized to Qt::AutoConnection. \param type Connexion type. \~french Par défaut, le type de connection est Qt::AutoConnection. Aprés la prochaine connection, le type est reinitialisé à Qt::AutoConnection. \param type type de connexion. \~ */ const Receiver & operator << (Qt::ConnectionType type) const; }; //! \~english Macro to simplify Emitter creation. It's hide the SIGNAL macro call. //! \~french Macro simpifiant la création d'un Emitter. Il cache l'appel à la macro SIGNAL. /*! \~english Macro to simplify Emitter creation. It's hide the SIGNAL macro call. \param x object emitter. \param y signal signature. SIGNAL macro is used internally. \~french Macro simpifiant la création d'un Emitter. Il cache l'appel à la macro SIGNAL. \param x L'objet emitter. \param y Signature du dignal. La macro SIGNAL est utilisé à l'interieur. */ #define EMITTER(x,y) Emitter(x,SIGNAL(y)) //! \~english Macro to simplify Receiver creation. It's hide the SLOT macro call. //! \~french Macro simpifiant la création d'un Receiver. Il cache l'appel à la macro SLOT. /*! \~english Macro to simplify Emitter creation. It's hide the SLOT macro call. \param x Object Receiver. \param y SLot signature. SIGNAL macro is used internally. \~french Macro simpifiant la création d'un Receiver. Il cache l'appel à la macro SLOT. \param x L'objet receveur. \param y Slot du dignal. La macro SIGNAL est utilisée à l'interieur. */ #define RECEIVER(x,y) Receiver(x,SLOT(y)) } #endif