Made joints easier to create
[qml-box2d:anubhavtiwaris-qml-box2d.git] / box2djoint.cpp
1 /*
2  * Box2D QML plugin
3  * Copyright (C) 2010 Nokia Corporation
4  *
5  * This file is part of the Box2D QML plugin.
6  *
7  * This library is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library;  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "box2djoint.h"
22 #include "box2dbody.h"
23
24 Box2DJoint::Box2DJoint(QDeclarativeItem *parent) :
25     QDeclarativeItem(parent),
26     mInitializePending(false),
27     mWorld(0),
28     mCollideConnected(false),
29     mBodyA(0),
30     mBodyB(0)
31 {
32 }
33
34 bool Box2DJoint::collideConnected() const
35 {
36     return mCollideConnected;
37 }
38
39 void Box2DJoint::setCollideConnected(bool collideConnected)
40 {
41     if (mCollideConnected == collideConnected)
42         return;
43
44     mCollideConnected = collideConnected;
45
46     emit collideConnectedChanged();
47 }
48
49 Box2DBody *Box2DJoint::bodyA() const
50 {
51     return mBodyA;
52 }
53
54 void Box2DJoint::setBodyA(Box2DBody *bodyA)
55 {
56     if (mBodyA)
57         return;
58
59     if (bodyA->body() != NULL) {
60         mBodyA = bodyA;
61         emit bodyAChanged();
62         initialize(mWorld);
63     }
64     else
65         connect(bodyA, SIGNAL(bodyCreated()), this, SLOT(bodyACreated()));
66 }
67
68 Box2DBody *Box2DJoint::bodyB() const
69 {
70     return mBodyB;
71 }
72
73 void Box2DJoint::setBodyB(Box2DBody *bodyB)
74 {
75     if (mBodyB)
76         return;
77
78     if (bodyB->body() != NULL) {
79         mBodyB = bodyB;
80         emit bodyBChanged();
81         initialize(mWorld);
82     }
83     else
84         connect(bodyB, SIGNAL(bodyCreated()), this, SLOT(bodyBCreated()));
85 }
86
87 void Box2DJoint::initialize(b2World *world)
88 {
89     if (world)
90         mWorld = world;
91
92     if (!isComponentComplete() || !mBodyA || !mBodyB || !mWorld) {
93         // When components are created dynamically, they get their parent
94         // assigned before they have been completely initialized. In that case
95         // we need to delay initialization.
96         mInitializePending = true;
97         return;
98     }
99
100     createJoint();
101 }
102
103 void Box2DJoint::componentComplete()
104 {
105     QDeclarativeItem::componentComplete();
106
107     if (mInitializePending)
108         initialize(mWorld);
109 }
110
111 b2World *Box2DJoint::world() const
112 {
113     return mWorld;
114 }
115
116 void Box2DJoint::bodyACreated()
117 {
118     mBodyA = static_cast<Box2DBody*>(sender());
119     emit bodyAChanged();
120     initialize(mWorld);
121 }
122
123 void Box2DJoint::bodyBCreated()
124 {
125     mBodyB = static_cast<Box2DBody*>(sender());
126     emit bodyBChanged();
127     initialize(mWorld);
128 }