cross_aln_render.cpp
来自「ncbi源码」· C++ 代码 · 共 668 行 · 第 1/2 页
CPP
668 行
TModelRect& rcV2 = m_FP2.GetVisibleRect(); rcV2.SetTop(0); rcV2.SetBottom( m_FP2.GetViewport().Height() ); m_FP2.SetVisibleRect(rcV2); m_MaxZoomX = log(m_FP1.GetModelLimitsRect().Width() / rc.Width());}// this function takes an absolute mouse coordinate and determines if any// features lie underneath the mouse position// x & y are GL coordinatesconst CLayoutObject* CCrossAlnRenderer::HitTest(int x, int y){ // Main Feature Panel if (PanelHitTest(x, y) == eFeatures1) { return m_FeatPanel1.HitTest(m_FP1, x, y); } if (PanelHitTest(x, y) == eFeatures2) { return m_FeatPanel2.HitTest(m_FP2, x, y); } return NULL;}CCrossAlnRenderer::TRendererPanelCCrossAlnRenderer::PanelHitTest(int x, int y) const{ if (m_FP1.GetViewport().PtInRect(x, y)) return eFeatures1; if (m_FP2.GetViewport().PtInRect(x, y)) return eFeatures2; if (m_CP.GetViewport().PtInRect(x, y)) return eCross; return eNone;}CGlPane*CCrossAlnRenderer::PaneHitTest(int x, int y){ if (m_FP1.GetViewport().PtInRect(x, y)) return &m_FP1; if (m_FP2.GetViewport().PtInRect(x, y)) return &m_FP2; if (m_CP.GetViewport().PtInRect(x, y)) return &m_CP; return NULL;}void CCrossAlnRenderer::GetTooltip(int x, int y, string* title){ *title = ""; const CLayoutObject* obj = HitTest(x, y); if (!obj) return; TRendererPanel pan = PanelHitTest(x, y); if (pan == eFeatures1) m_FeatPanel1.GetTooltip(obj, title); if (pan == eFeatures2) m_FeatPanel2.GetTooltip(obj, title);}void CCrossAlnRenderer::SelectObject(const CObject* obj){ m_SelectedObjects.push_back( CRef<CObject>(const_cast<CObject*>(obj)));}float CCrossAlnRenderer::GetZoomX(void) const{ TModelUnit scale_x = log(m_FP1.GetScaleX()); return 1.0f - (scale_x - m_MinZoomX) / (m_MaxZoomX - m_MinZoomX);}void CCrossAlnRenderer::SetZoomX(float value){ // slider is set up from 0 to 1. Convert to our units: TModelUnit scale = m_MinZoomX + (m_MaxZoomX - m_MinZoomX) * (1.0f - value); NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes1) { CGlPane& pane = **iter; pane.SetScale(exp(scale), pane.GetScaleY(), pane.GetVisibleRect().CenterPoint() ); }}void CCrossAlnRenderer::ZoomInCenter(){ ITERATE(TGlPanes, iter, m_ScrollXPanes1) { (*iter)->ZoomInCenter(); }}void CCrossAlnRenderer::ZoomOutCenter(){ ITERATE(TGlPanes, iter, m_ScrollXPanes1) { (*iter)->ZoomOutCenter(); }} void CCrossAlnRenderer::x_AdjustCrossPane(){ TModelUnit p_scale = m_CP.GetScaleX() / m_FP2.GetScaleX(); m_CrossPanel.SetProportions(p_scale, m_Offset2); m_CrossPanel.SetShifts(m_FP1.GetVisibleRect().Left(), m_FP2.GetVisibleRect().Left());}void CCrossAlnRenderer::SetScaleRef1(TModelUnit scale_x, TModelUnit scale_y, const TModelPoint& point){ if(scale_x > m_FP1.GetMinScaleX()) { ITERATE(TGlPanes, iter, m_ScrollXPanes1) { TModelPoint ref_p(point.X(), (*iter)->GetVisibleRect().Top()); (*iter)->SetScaleRefPoint(scale_x, *iter == &m_CP ? -1 : 1, ref_p); } } x_AdjustCrossPane();}void CCrossAlnRenderer::SetScaleRef2(TModelUnit scale_x, TModelUnit scale_y, const TModelPoint& point){ if(scale_x > m_FP2.GetMinScaleX()) { ITERATE(TGlPanes, iter, m_ScrollXPanes2) { TModelPoint ref_p(point.X(), (*iter)->GetVisibleRect().Top()); (*iter)->SetScaleRefPoint(scale_x, *iter == &m_RP2 ? 1 : -1, ref_p); } } x_AdjustCrossPane();}void CCrossAlnRenderer::SetScaleRefC(TModelUnit scale_x, TModelUnit scale_y, const TModelPoint& point){ if(scale_x > m_CP.GetMinScaleX()) { ITERATE(TGlPanes, iter, m_AllPanes) { TModelPoint ref_p(point.X(), (*iter)->GetVisibleRect().Top()); (*iter)->SetScaleRefPoint(scale_x, (*iter == &m_CP || *iter == &m_FP2) ? -1 : 1, ref_p); } } x_AdjustCrossPane();}void CCrossAlnRenderer::ZoomOnObject(const CLayoutObject* obj){ if (!obj) return; TSeqRange range = obj->GetLocation().GetTotalRange(); ZoomOnRange(range);}void CCrossAlnRenderer::ZoomOnRange(const TSeqRange& range){ ITERATE(TGlPanes, iter, m_AllPanes) { TModelRect rc = (*iter)->GetVisibleRect(); rc.SetLeft (range.GetFrom()); rc.SetRight (range.GetTo()); (*iter)->ZoomRect(rc); } x_AdjustCrossPane();}void CCrossAlnRenderer::ZoomOnAlignment(){ const TSeqRange& range = m_DS->GetTotalRange(); ZoomOnRange(range);}void CCrossAlnRenderer::FitToWindow(void){ // FixMe}void CCrossAlnRenderer::ZoomToSequence(void){ // FixMe}CGlPane& CCrossAlnRenderer::GetFeatGlPane1(){ return m_FP1;}CGlPane& CCrossAlnRenderer::GetFeatGlPane2(){ return m_FP2;}CGlPane& CCrossAlnRenderer::GetCrossGlPane(){ return m_CP;} void CCrossAlnRenderer::Scroll(TModelUnit x1, TModelUnit y1, TModelUnit x2, TModelUnit y2){ const TModelRect& rc1 = m_FP1.GetVisibleRect(); const TModelRect& rc2 = m_FP2.GetVisibleRect(); double dX1 = x1 - rc1.Left(); double dY1 = y1 - rc1.Bottom(); double dX2 = x2 - rc2.Left(); double dY2 = y2 - rc2.Top(); // Handle horizintal scrollbar ITERATE(TGlPanes, iter, m_ScrollXPanes1) (*iter)->Scroll(dX1, 0.0f); ITERATE(TGlPanes, iter, m_ScrollXPanes2) (*iter)->Scroll(dX2, 0.0f); m_FP1.Scroll(0.0f, dY1); // Handle vertical scrollbar 1 m_FP2.Scroll(0.0f, dY2); // Handle vertical scrollbar 2 x_AdjustCrossPane();}TModelUnit CCrossAlnRenderer::GetScrollLineSize1(){ m_FP1.OpenOrtho(); TModelUnit value = m_FP1.UnProjectWidth(kMaxPixelsBase); m_FP1.Close(); return value;}TModelUnit CCrossAlnRenderer::GetScrollLineSize2(){ m_FP2.OpenOrtho(); TModelUnit value = m_FP2.UnProjectWidth(kMaxPixelsBase); m_FP2.Close(); return value;} END_NCBI_SCOPE/* * =========================================================================== * $Log: cross_aln_render.cpp,v $ * Revision 1000.2 2004/06/01 21:06:30 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13 * * Revision 1.13 2004/05/21 22:27:52 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.12 2004/05/14 15:57:18 lebedev * Optional argument to specify the type of title/tooltip added * * Revision 1.11 2004/04/16 12:44:37 lebedev * Use default layout policy for both feature panels. * * Revision 1.10 2004/03/11 17:50:41 dicuccio * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange * instead of TRange * * Revision 1.9 2004/02/13 19:00:07 lebedev * Do not use EnableViewOption in graphical widget any more * * Revision 1.8 2004/01/30 17:18:47 dicuccio * Use CBioseq_Handle::GetBioseqLength() instead of creating a CSeqVector * * Revision 1.7 2004/01/27 16:20:41 lebedev * Changed stored selection from CLayoutObject to CObject * * Revision 1.6 2004/01/20 18:19:53 dicuccio * Minot code rearrangement * * Revision 1.5 2004/01/16 19:17:06 tereshko * Removed const modifyer for GetTooltip method * * Revision 1.4 2004/01/16 13:40:39 lebedev * Tooltips added * * Revision 1.3 2003/12/22 19:37:43 dicuccio * Fixed compiler warnings about double -> float conversion * * Revision 1.2 2003/12/22 16:51:32 lebedev * Use CHitElemDataAdapter to get start/length from datasource * * Revision 1.1 2003/12/22 13:12:33 lebedev * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?