예제 #1
0
void CDasherModel::HandleOutput(Dasher::VECTOR_SYMBOL_PROB* pAdded, int* pNumDeleted) {
  CDasherNode *pNewNode = Get_node_under_crosshair();
  DASHER_ASSERT(pNewNode != NULL);
  
  //  std::cout << "HandleOutput: " << m_pLastOutput << " => " << pNewNode << std::endl;
  
  CDasherNode *pLastSeen = pNewNode;
  while (pLastSeen && !pLastSeen->GetFlag(NF_SEEN))
    pLastSeen = pLastSeen->Parent();
  
  while (m_pLastOutput != pLastSeen) {
    m_pLastOutput->Undo();
    m_pLastOutput->Leave(); //Should we? I think so, but the old code didn't...?
    m_pLastOutput->SetFlag(NF_SEEN, false);
    // TODO: Is this the right place to trap output?
    if(pNumDeleted != NULL)
      (*pNumDeleted) += m_pLastOutput->m_iNumSymbols;
    
    m_pLastOutput = m_pLastOutput->Parent();
    if (m_pLastOutput) m_pLastOutput->Enter();
  }
  
  if(!pNewNode->GetFlag(NF_SEEN)) {
    RecursiveOutput(pNewNode, pAdded);
  }
}
예제 #2
0
bool CDasherModel::CheckForNewRoot(CDasherView *pView) {
  DASHER_ASSERT(m_Root != NULL);
  // TODO: pView is redundant here

#ifdef DEBUG
  CDasherNode *pOldNode = Get_node_under_crosshair();
#endif

  CDasherNode *root(m_Root);

  if(!(m_Root->GetFlag(NF_SUPER))) {
    Reparent_root(root->Lbnd(), root->Hbnd());
    return(m_Root != root);
  }

  CDasherNode *pNewRoot = NULL;

  for (CDasherNode::ChildMap::const_iterator it = m_Root->GetChildren().begin(); it != m_Root->GetChildren().end(); it++) {
    if ((*it)->GetFlag(NF_SUPER)) {
      //at most one child should have NF_SUPER set...
      DASHER_ASSERT(pNewRoot == NULL);
      pNewRoot = *it;
#ifndef DEBUG
      break;
#endif
    }
  }
  ////GAME MODE TEMP - only change the root if it is on the game path/////////
  if (pNewRoot && (!m_bGameMode || pNewRoot->GetFlag(NF_GAME))) {
    m_Root->DeleteNephews(pNewRoot);
    RecursiveMakeRoot(pNewRoot);
  }

  DASHER_ASSERT(Get_node_under_crosshair() == pOldNode);

  return false;
}