alnmulti_renderer.cpp
来自「ncbi源码」· C++ 代码 · 共 636 行 · 第 1/2 页
CPP
636 行
pane.SetClipRect(NULL); } }}// renders all columns within the given Row, vp_top_y is OpenGL viewport// coordinate of the top pixel in the rowvoid CAlnMultiRenderer::x_RenderRow(IAlignRow* p_row, CGlPane& pane, int state, int vp_top_y, TAreaVector* p_areas){ _ASSERT(p_row); m_RowToList[p_row] = true; // update "on-screen" attribute SetupPaneForRow(pane, p_row, vp_top_y); int col_n = GetColumnsCount(); for( int i_col = 0; i_col < col_n; i_col++ ) { const SColumn& col = GetColumn(i_col); if(col.VisibleWidth()) { SetupPaneForColumn(pane, i_col); EColumnType type = x_GetColumnType(col); p_row->RenderColumn(type, pane, state); if(p_areas) { p_row->GetHTMLActiveAreas(type, pane, *p_areas); } } }}void CAlnMultiRenderer::SetupPaneForRow(CGlPane& pane, const IAlignRow* p_row, int vp_top_y) const{ const CGlPane& port = x_GetContext()->GetAlignPort(); int vp_bottom_y = vp_top_y - (p_row->GetHeightPixels() - 1); // setup model space TModelRect rcLim = port.GetModelLimitsRect(); rcLim.SetVert(vp_top_y, vp_bottom_y); pane.SetModelLimitsRect(rcLim); TModelRect rcV = port.GetVisibleRect(); rcV.SetVert(vp_top_y, vp_bottom_y); pane.SetVisibleRect(rcV); TVPRect rc_vp(0, vp_bottom_y, m_rcBounds.Width() - 1, vp_top_y); pane.SetViewport(rc_vp);}void CAlnMultiRenderer::SetupPaneForColumn(CGlPane& pane, int i_col) const{ const SColumn& col = GetColumn(i_col); pane.GetViewport().SetHorz(col.m_Pos, col.m_Pos + col.m_Width - 1);}int CAlnMultiRenderer::GetVPListTop() const{ return m_rcBounds.Height() - 1 - m_RulerAreaHeight - m_MasterAreaHeight;}int CAlnMultiRenderer::x_GetLineByWindowY(int WinY) const{ int vpY = WinY - GetListTop(); int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top(); return x_GetContext()->GetLineByModelY(vpY + OffsetY);}TVPRect CAlnMultiRenderer::x_GetLineRect(int Index){ int Top = 0, H = 0; if(x_GetContext() && Index >= 0) { int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top(); Top = x_GetContext()->GetLinePosY(Index) - OffsetY; H = x_GetContext()->GetLineHeight(Index); } return TVPRect(0, Top + H -1, m_rcBounds.Width() - 1, Top);}void CAlnMultiRenderer::x_ResetRowListMap(){ NON_CONST_ITERATE(TRowToList, it, m_RowToList) { it->second = false; }}void CAlnMultiRenderer::x_PurgeRowListMap(){ for( TRowToList::iterator it = m_RowToList.begin(); it != m_RowToList.end(); ) { if(! it->second) { //row is off-screen now - purge cached graphics (it->first)->GraphicsCacheCmd(IAlignRow::eDelete); TRowToList::iterator next = it; ++next; m_RowToList.erase(it); it = next; } else it++; }}const int kDefColumnWidth = 50;CAlnMultiRenderer::SColumn::SColumn(): m_Pos(0), m_Width(kDefColumnWidth), m_UserData(0), m_bVisible(true), m_Share(-1.0){}int CAlnMultiRenderer::GetColumnsCount() const{ return m_vColumns.size();}const CAlnMultiRenderer::SColumn& CAlnMultiRenderer::GetColumn(int index) const{ _ASSERT(index >= 0 && index < (int) m_vColumns.size()); return m_vColumns[index];}int CAlnMultiRenderer::AddColumn(){ return AddColumn(kDefColumnWidth, "", 0);}int CAlnMultiRenderer::AddColumn(int width, const string& label, int data, double share){ int index = GetColumnsCount(); return InsertColumn(index, width, label, data, share);}int CAlnMultiRenderer::InsertColumn(int index, int width, const string& label, int data, double share){ _ASSERT(index >= 0 && index <= (int) m_vColumns.size()); SColumn col; col.m_Width = width; col.m_Label = label; col.m_UserData = data; col.m_Share = share; //###col.m_Pos = m_rcBounds.Width(); TColumnVector::const_iterator it = m_vColumns.insert(m_vColumns.begin() + index, col); return it - m_vColumns.begin();}void CAlnMultiRenderer::SetColumnWidth(int index, int width){ _ASSERT(index >= 0 && index < (int) m_vColumns.size()); _ASSERT(width >= 0); SColumn& col = m_vColumns[index]; int delta = width - col.m_Width; col.m_Width = width; for( int i = index + 1; delta != 0 && i < (int) m_vColumns.size(); i++) { m_vColumns[i].m_Pos += delta; }}void CAlnMultiRenderer::SetColumnUserData(int index, int data){ _ASSERT(index >= 0 && index < (int) m_vColumns.size()); m_vColumns[index].m_UserData = data;}void CAlnMultiRenderer::SetColumnVisible(int index, bool b_visible){ _ASSERT(index >= 0 && index < (int) m_vColumns.size()); SColumn& col = m_vColumns[index]; if(col.m_bVisible != b_visible) { col.m_bVisible = b_visible; int delta = b_visible ? col.m_Width : -col.m_Width; for( int i = index + 1; delta != 0 && i < (int) m_vColumns.size(); i++) { m_vColumns[i].m_Pos += delta; } }}int CAlnMultiRenderer::GetColumnIndexByX(int x) const{ ITERATE(TColumnVector, it, m_vColumns) { if(x >= it->m_Pos && x < it->m_Pos + it->m_Width) return it - m_vColumns.begin(); } return -1;}void CAlnMultiRenderer::UpdateColumns(){ Resize(m_rcBounds);}void CAlnMultiRenderer::x_LayoutColumns(){ int w = m_rcBounds.Width(); int n_col = (int) m_vColumns.size(); if(w > 0 && n_col > 0) { // resize all columns // getting statistics int total_w = 0; double total_share = 0.0; // sum of m_Share for all resizable columns int last_sh_index = -1; // index of last resizable column for( int j = 0; j < n_col; j++ ) { SColumn& col = m_vColumns[j]; if(col.m_bVisible) { if(col.m_Share < 0.0) { total_w += col.m_Width; } else { total_share += col.m_Share; last_sh_index = j; } } } if(total_w < w) { // there is some space left for resizable columns int share_w = w - total_w; double K = share_w / total_share; // proportion int pos = 0, share_spent = 0; for( int j = 0; j < n_col; j++ ) { SColumn& col = m_vColumns[j]; if(col.m_bVisible) { col.m_Pos = pos; if(col.m_Share >= 0.0) { // resizable column if(j == last_sh_index) { col.m_Width = share_w - share_spent; // the rest } else { col.m_Width = (int) (0.5 + share_w * K); share_spent += col.m_Pos; } } pos += col.m_Width; } } } else { // barely enough for fixed size columns int pos = 0; for( int j = 0; j < n_col; j++ ) { SColumn& col = m_vColumns[j]; if(col.m_bVisible) { col.m_Pos = pos; if(col.m_Share >= 0.0) { col.m_Width = 0; } pos += col.m_Width; } } } }} END_NCBI_SCOPE/* * =========================================================================== * $Log: alnmulti_renderer.cpp,v $ * Revision 1000.1 2004/06/01 21:07:11 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12 * * Revision 1.12 2004/05/21 22:27:52 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.11 2004/05/10 17:46:35 yazhuk * Addressed GCC warnings * * Revision 1.10 2004/04/22 17:10:34 yazhuk * Fixed rendering of focus state * * Revision 1.9 2004/04/06 19:08:59 yazhuk * Added "TAreaVector* p_areas" argument ot x_RenderRuler, generation of * CHTMLActiveArea object for Ruler and alignment graphics * * Revision 1.8 2004/04/06 16:02:22 yazhuk * Added cloumns management API to CAlnMultiRenderer, eliminated CColumnWidget * * Revision 1.7 2004/04/06 13:37:09 dicuccio * Formatting changes - trimmed trailing white space * * Revision 1.6 2004/04/05 15:34:38 johnson * added a few consts to SetupPane methods * * Revision 1.5 2004/03/29 19:04:42 yazhuk * Support for CHTMLActiveArea-s generation * * Revision 1.4 2004/03/26 15:02:59 yazhuk * Changed width of "Icons" column * * Revision 1.3 2004/03/25 13:05:49 dicuccio * Use _TRACE() instead of cout * * Revision 1.2 2004/03/09 21:03:39 yazhuk * Clean-up * * Revision 1.1 2004/03/08 15:36:47 yazhuk * Initial revision * * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?