void CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree, tree_update *arg ) { (void)rTree; if( arg->type == arg->ItemInserted ) { if( isItemVisible( arg->it ) ) { makeImage(); notifyLayout(); } setSliderFromFirst(); } else if( arg->type == arg->ItemUpdated ) { if( arg->it->isPlaying() ) { m_rTree.ensureExpanded( arg->it ); ensureVisible( arg->it ); makeImage(); notifyLayout(); setSliderFromFirst(); } else if( isItemVisible( arg->it ) ) { makeImage(); notifyLayout(); } } else if( arg->type == arg->DeletingItem ) { if( isItemVisible( arg->it ) ) m_bRefreshOnDelete = true; // remove all references to arg->it // if it is the one about to be deleted if( m_firstPos == arg->it ) { m_firstPos = getNearestItem( arg->it ); } if( m_lastClicked == arg->it ) { m_lastClicked = getNearestItem( arg->it ); m_lastClicked->setSelected( arg->it->isSelected() ); } } else if( arg->type == arg->ItemDeleted ) { if( m_bRefreshOnDelete ) { m_bRefreshOnDelete = false; makeImage(); notifyLayout(); } setSliderFromFirst(); } else if( arg->type == arg->ResetAll ) { m_lastClicked = m_rTree.end(); m_firstPos = getFirstFromSlider(); makeImage(); notifyLayout(); setSliderFromFirst(); } else if( arg->type == arg->SliderChanged ) { Iterator it = getFirstFromSlider(); if( m_firstPos != it ) { m_firstPos = it; makeImage(); notifyLayout(); } } }
VecItem* KdTree::getNearestItem(VecItem* item){ return getNearestItem(item->getPosition()); }