qobject.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * The MiniQt Library
  3. *
  4. * Copyright (C) 1999 Sandro Sigala <ssigala@globalnet.it>
  5. */
  6. #include "qobject.h"
  7. #include "qstring.h"
  8. struct QObjectPrivate {
  9. const char *name;
  10. QObject *parent;
  11. QObjectList childs;
  12. // Meta object data
  13. QList<QString> existing_signals;
  14. struct SignalLink {
  15. const char *signame;
  16. const char *slotname;
  17. QObject *dest;
  18. };
  19. QList<SignalLink> signal_links;
  20. struct SlotLink {
  21. const char *slotname;
  22. QObject *dest;
  23. QMember member;
  24. };
  25. QList<SlotLink> slot_links;
  26. };
  27. /*
  28. * Public
  29. */
  30. QObject::QObject(QObject *parent, const char *name)
  31. {
  32. #ifdef DEBUG
  33. qDebug("obj", "QObject::constructor of \"%s\"", name ? name : "unnamed");
  34. #endif
  35. d = new QObjectPrivate;
  36. d->parent = parent;
  37. d->name = name;
  38. if (d->parent)
  39. parent->registerChild(this);
  40. // Meta object
  41. d->existing_signals.setAutoDelete(TRUE);
  42. d->signal_links.setAutoDelete(TRUE);
  43. d->slot_links.setAutoDelete(TRUE);
  44. }
  45. QObject::~QObject()
  46. {
  47. #ifdef DEBUG
  48. qDebug("obj", "QObject::destructor of \"%s\"", name("unnamed"));
  49. #endif
  50. if (d->parent)
  51. d->parent->unregisterChild(this);
  52. deleteChilds();
  53. delete d;
  54. }
  55. const char *QObject::name() const
  56. {
  57. return d->name;
  58. }
  59. const char *QObject::name(char *defname) const
  60. {
  61. return d->name ? d->name : defname;
  62. }
  63. void QObject::setName(const char *name)
  64. {
  65. d->name = name;
  66. }
  67. QObject *QObject::parent() const
  68. {
  69. return d->parent;
  70. }
  71. const QObjectList *QObject::children()
  72. {
  73. return &d->childs;
  74. }
  75. bool QObject::isWidgetType() const
  76. {
  77. return FALSE;
  78. }
  79. const char *QObject::className() const
  80. {
  81. return "QObject";
  82. }
  83. void QObject::connect(QObject *src, const char *signame, QObject *dest, const char *slotname)
  84. {
  85. src->initMetaObject();
  86. dest->initMetaObject();
  87. src->addConnection(signame, dest, slotname);
  88. }
  89. /*
  90. * Protected
  91. */
  92. void QObject::initMetaObject()
  93. {
  94. qWarning("QObject::initMetaObject(): called base function instead of moc function");
  95. }
  96. void QObject::registerSignal(const char *signame)
  97. {
  98. qDebug("moc", "registering signal %s into \"%s\"", signame, name("unnamed"));
  99. d->existing_signals.append(new QString(signame));
  100. }
  101. void QObject::calledSignal(const char *signame)
  102. {
  103. #ifdef DEBUG
  104. qDebug("moc", "called signal %s of \"%s\"", signame, name("unnamed"));
  105. #endif
  106. bool found = FALSE;
  107. for (QString *sp = d->existing_signals.first(); sp != 0; sp = d->existing_signals.next())
  108. if (*sp == signame) {
  109. found = TRUE;
  110. break;
  111. }
  112. if (!found) {
  113. qWarning("QObject::calledSignal(): no such signal %s", signame);
  114. return;
  115. }
  116. for (QObjectPrivate::SignalLink *l = d->signal_links.first(); l != 0; l = d->signal_links.next())
  117. if (!strcmp(l->signame, signame)) {
  118. l->dest->calledSlot(l->slotname);
  119. }
  120. }
  121. void QObject::registerSlot(const char *slotname, QObject *dest, QMember member)
  122. {
  123. qDebug("moc", "registering slot %s into \"%s\"", slotname, name("unnamed"));
  124. QObjectPrivate::SlotLink *l = new QObjectPrivate::SlotLink;
  125. l->slotname = slotname;
  126. l->dest = dest;
  127. l->member = member;
  128. d->slot_links.append(l);
  129. }
  130. void QObject::calledSlot(const char *slotname)
  131. {
  132. #ifdef DEBUG
  133. qDebug("moc", "calling slot %s of \"%s\"", slotname, name("unnamed"));
  134. #endif
  135. for (QObjectPrivate::SlotLink *l = d->slot_links.first(); l != 0; l = d->slot_links.next())
  136. if (!strcmp(l->slotname, slotname)) {
  137. QObject *o = l->dest;
  138. QMember member = l->member;
  139. (o->*member)();
  140. return;
  141. }
  142. qWarning("QObject::calledSlot(): no such slot %s", slotname);
  143. }
  144. /*
  145. * Private
  146. */
  147. void QObject::registerChild(QObject *child)
  148. {
  149. #ifdef DEBUG
  150. qDebug("child", "registering child \"%s\" into \"%s\"", child->name("unnamed"), name("unnamed"));
  151. #endif
  152. d->childs.append(child);
  153. }
  154. void QObject::unregisterChild(QObject *child)
  155. {
  156. #ifdef DEBUG
  157. qDebug("child", "unregistering child \"%s\" from \"%s\"", child->name("unnamed"), name("unnamed"));
  158. #endif
  159. d->childs.take(child);
  160. }
  161. void QObject::deleteChilds()
  162. {
  163. for (QObject *o = d->childs.first(); o != 0; o = d->childs.current()) {
  164. #ifdef DEBUG
  165. qDebug("child", "deleting child \"%s\" from \"%s\"", o->name("unnamed"), name("unnamed"));
  166. #endif
  167. d->childs.remove(o);
  168. delete o;
  169. }
  170. }
  171. void QObject::addConnection(const char *signame, QObject *dest, const char *slotname)
  172. {
  173. qDebug("moc", "connecting signal %s of \"%s\" to slot %s of \"%s\"",
  174. signame, name("unnamed"), slotname, dest->name("unnamed"));
  175. QObjectPrivate::SignalLink *l = new QObjectPrivate::SignalLink;
  176. l->signame = signame;
  177. l->slotname = slotname;
  178. l->dest = dest;
  179. d->signal_links.append(l);
  180. }