[escher/responder] Clean commonAncestor method

This commit is contained in:
Léa Saviot
2019-12-19 15:55:10 +01:00
committed by EmilieNumworks
parent 0412a45cea
commit 4e96a11a4c
2 changed files with 20 additions and 28 deletions

View File

@@ -15,6 +15,7 @@ public:
Responder * commonAncestorWith(Responder * responder);
void setParentResponder(Responder * responder) { m_parentResponder = responder; }
private:
bool hasAncestor(Responder * responder) const;
Responder * m_parentResponder;
};

View File

@@ -7,33 +7,24 @@ Responder * Responder::commonAncestorWith(Responder * responder) {
if (responder == nullptr) {
return nullptr;
}
if (this == responder) {
return this;
Responder * p = this;
while (p != nullptr) {
if (responder->hasAncestor(p)) {
return p;
}
p = p->parentResponder();
}
Responder * rootResponder = this;
while (rootResponder->parentResponder() != responder && rootResponder->parentResponder() != nullptr) {
rootResponder = rootResponder->parentResponder();
}
if (rootResponder->parentResponder() == responder) {
return responder;
}
rootResponder = responder;
while (rootResponder->parentResponder() != this && rootResponder->parentResponder() != nullptr) {
rootResponder = rootResponder->parentResponder();
}
if (rootResponder->parentResponder() == this) {
return this;
}
Responder * r = nullptr;
if (parentResponder()) {
r = parentResponder()->commonAncestorWith(responder);
}
Responder * s = nullptr;
if (responder->parentResponder()) {
s = commonAncestorWith(responder->parentResponder());
}
if (r) {
return r;
}
return s;
return nullptr;
}
bool Responder::hasAncestor(Responder * responder) const {
assert(responder != nullptr);
Responder * p = const_cast<Responder *>(this);
while (p != nullptr) {
if (p == responder) {
return true;
}
p = p->parentResponder();
}
return false;
}