mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[escher/responder] Clean commonAncestor method
This commit is contained in:
committed by
EmilieNumworks
parent
0412a45cea
commit
4e96a11a4c
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user