Delegate.h
1 /*
2  * Copyright (C) 2005-2013 by Dr. Marc Boris Duerner
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef Pt_Delegate_h
30 #define Pt_Delegate_h
31 
32 #include <Pt/Void.h>
33 #include <Pt/Slot.h>
34 #include <Pt/Function.h>
35 #include <Pt/Method.h>
36 #include <Pt/ConstMethod.h>
37 #include <Pt/Connectable.h>
38 #include <stdexcept>
39 
40 namespace Pt {
41 
42 class DelegateBase : public Connectable
43 {
44  public:
45  DelegateBase()
46  { }
47 
48  DelegateBase(const DelegateBase& rhs)
49  { DelegateBase::operator=(rhs); }
50 
51  DelegateBase& operator=(const DelegateBase& other)
52  {
53  _target.close();
54 
55  if( other._target.isValid() )
56  {
57  const Slot* slot = other._target.slot();
58  _target = Connection( *this, slot->clone() );
59  }
60 
61  return *this;
62  }
63 
64  bool isConnected() const
65  {
66  return _target.isValid();
67  }
68 
69  virtual void onConnectionOpen(const Connection& c)
70  {
71  const Connectable* sender = c.sender();
72 
73  if( sender == this )
74  {
75  _target.close();
76  _target = c;
77  }
78 
79  Connectable::onConnectionOpen(c);
80  }
81 
82  virtual void onConnectionClose(const Connection& c)
83  {
84  Connectable::onConnectionClose(c);
85  }
86 
87  protected:
88  void disconnectSlot()
89  {
90  _target.close();
91  }
92 
93  void disconnectSlot(const Slot& slot)
94  {
95  if( _target.isValid() && _target.slot()->equals(slot) )
96  {
97  _target.close();
98  }
99  }
100 
101  protected:
102  Connection _target;
103 };
104 
105 #include <Pt/Delegate.tpp>
106 
107 } // namespace Pt
108 
109 #endif
Endpoint of a signal/slot connection.
Definition: Slot.h:21
Connectable & operator=(const Connectable &rhs)
Assignment operator.
Connectable()
Default constructor.