bool SelectNodesOP::onMouseLeftDown(int x, int y) { Vector pos = m_editPanel->transPosScreenToProject(x, y); ChainSelectedNodes* selected = NULL; m_shapeImpl->traverseShapes(PosQueryVisitor(pos, &selected), e_visible); if (selected) { if (wxGetKeyState(WXK_CONTROL)) { bool isExist = false; for (size_t i = 0, n = m_nodeSelection.size(); i < n && !isExist; ++i) { ChainSelectedNodes* chainNodes = m_nodeSelection[i]; if (chainNodes->chain != selected->chain) continue; for (size_t j = 0, m = chainNodes->selectedNodes.size(); j < m && !isExist; ++j) { if (Math::getDistance(pos, chainNodes->selectedNodes[j]) < getThreshold()) { chainNodes->selectedNodes.erase(chainNodes->selectedNodes.begin() + j); if (chainNodes->selectedNodes.empty()) m_nodeSelection.erase(m_nodeSelection.begin() + i); isExist = true; } } } if (!isExist) m_nodeSelection.push_back(selected); else delete selected; } else { bool isExist = false; for (size_t i = 0, n = m_nodeSelection.size(); i < n && !isExist; ++i) { ChainSelectedNodes* chainNodes = m_nodeSelection[i]; if (chainNodes->chain != selected->chain) continue; for (size_t j = 0, m = chainNodes->selectedNodes.size(); j < m && !isExist; ++j) { if (Math::getDistance(pos, chainNodes->selectedNodes[j]) < getThreshold()) isExist = true; } } if (!isExist) { clearSelectedNodes(); m_nodeSelection.push_back(selected); } else delete selected; } m_firstPos.setInvalid(); } else { DrawRectangleOP::onMouseLeftDown(x, y); m_firstPos = pos; if (!wxGetKeyState(WXK_CONTROL)) clearSelectedNodes(); m_editPanel->Refresh(); } return false; }
bool SelectNodesOP::OnMouseLeftDown(int x, int y) { sm::vec2 pos = m_stage->TransPosScrToProj(x, y); ChainSelectedNodes* selected = NULL; m_shape_impl->TraverseShapes(PosQueryVisitor(pos, &selected), ee::DT_VISIBLE); if (selected) { if (m_stage->GetKeyState(WXK_CONTROL)) { bool isExist = false; for (size_t i = 0, n = m_node_selection.size(); i < n && !isExist; ++i) { ChainSelectedNodes* chainNodes = m_node_selection[i]; if (chainNodes->polyline != selected->polyline) continue; for (size_t j = 0, m = chainNodes->selectedNodes.size(); j < m && !isExist; ++j) { if (sm::dis_pos_to_pos(pos, chainNodes->selectedNodes[j]) < GetThreshold()) { chainNodes->selectedNodes.erase(chainNodes->selectedNodes.begin() + j); if (chainNodes->selectedNodes.empty()) m_node_selection.erase(m_node_selection.begin() + i); isExist = true; } } } if (!isExist) m_node_selection.push_back(selected); else delete selected; } else { bool isExist = false; for (size_t i = 0, n = m_node_selection.size(); i < n && !isExist; ++i) { ChainSelectedNodes* chainNodes = m_node_selection[i]; if (chainNodes->polyline != selected->polyline) continue; for (size_t j = 0, m = chainNodes->selectedNodes.size(); j < m && !isExist; ++j) { if (sm::dis_pos_to_pos(pos, chainNodes->selectedNodes[j]) < GetThreshold()) isExist = true; } } if (!isExist) { ClearSelectedNodes(); m_node_selection.push_back(selected); } else delete selected; } m_first_pos.MakeInvalid(); } else { DrawRectangleOP::OnMouseLeftDown(x, y); m_first_pos = pos; if (!m_stage->GetKeyState(WXK_CONTROL)) ClearSelectedNodes(); } return false; }