struct Document <br/>{<br/> Concept *root;<br/> struct Iter <br/> {<br/> Concept *start;<br/> Concept *cur;<br/> Concept *bottom;<br/> }iter;<br/> <br/> Concept* Begin(Concept *c)<br/> {<br/> iter.start = c;<br/> iter.cur = c;<br/> iter.bottom = 0 ;<br/> return Next();<br/> }<br/> Concept * Next()<br/> {<br/> if (!iter.cur) return 0 ;<br/> <br/> while (iter.cur != iter.bottom && iter.cur->first_child)<br/> iter.cur = iter.cur->first_child;<br/> <br/> Concept *ret = iter.cur;<br/> <br/> if (iter.cur == iter.start)<br/> iter.cur = 0 ;<br/> else if (iter.cur->next)<br/> iter.cur = iter.cur->next;<br/> else <br/> {<br/> iter.cur = iter.cur->parent;<br/> iter.bottom = iter.cur;<br/> }<br/> return ret;<br/> }<br/>};<br/> <br/>
Concept *clicked = ConceptFromMouse();<br/> for (Concept *c = document->Begin(clicked); c; c=document->Next())<br/>{<br/> DoSomething( c );<br/>} <br/>
void DoSomethingHelper(root)<br/>{<br/> for (Concept *c = root; c; c=c->next)<br/> {<br/> DoSomethingHelper(c->first_child);<br/> }<br/> DoSomething(root);<br/>}<br/> <br/>
void DocumentEditor::OnDrag( Concept *con, float dx, float dy )<br/>{<br/> // drag with childs <br/> for (Concept *c = document->Begin(con); c; c=document->Next())<br/> {<br/> c->x += dx;<br/> c->y += dy;<br/> }<br/>} <br/>
Source: https://habr.com/ru/post/97841/
All Articles