textaln_panel.cpp
来自「ncbi源码」· C++ 代码 · 共 890 行 · 第 1/2 页
CPP
890 行
void CTextAlnPanel::x_DrawSeqNumPanel(void){ x_ActivateViewPort(m_NP); x_DrawSelection(m_NP[3], eCol); TSeqPos startX = m_ScrX; TSeqPos finishX = m_ScrX + m_NP[2] / kCellWidth; TDim len = NStr::UIntToString(m_AlnWidth).length(); gl_color(m_GridColor); glBegin(GL_LINES); for (TSeqPos x = startX; x != finishX; x++) { GLfloat xx = GLfloat(x - m_ScrX) * kCellWidth; glVertex2f(xx, 0.0f); glVertex2f(xx, m_NP[3]); } for (TNumrow y = 0; y != len; y++) { GLfloat yy = y * kFontSize; glVertex2f(0.0f, yy); glVertex2f(m_NP[2], yy); } glEnd(); gl_color(FL_GRAY); // Draw thick separation line x_DrawLine(0.0f, len * kFontSize + 1, m_NP[2], len * kFontSize + 1, 2.0f); gl_color(m_NumbersColor); // draw labels CGlBitmapFont f(CGlBitmapFont::eHelvetica10); for (TSeqPos x = startX; x != finishX + 1; x++) { GLfloat xx = GLfloat(x - m_ScrX) * kCellWidth; if (x % 10 == 0) { string s = NStr::UIntToString(x); int start = len - s.length(); for (TNumrow y = start, p = 0; y!= len; y++, p++) { string to_draw = s.substr(p, 1); GLfloat yy = y * kFontSize + kFontSize - 1; f.TextOut(xx + 2, yy, to_draw.c_str()); } } else if (x % 5 == 0) { // draw tick marks x_DrawLine(xx + kCellWidth / 2, m_NP[3] - 3 - kFontSize, xx + kCellWidth / 2, m_NP[3] - 3, 1.0f); } } glPopAttrib();} void CTextAlnPanel::x_DrawLabelPanel(void){ x_ActivateViewPort(m_LP); x_DrawSelection(m_LP[2], eRow); string label_draw; for (TNumrow row = 0; row != m_ParaG.size(); row++) { if (m_ParaG[row].GetType() == CParaG::eFeature) { string feat_label; feature::GetLabel(m_ParaG[row].Feature()->GetFeature(), &feat_label, feature::eBoth); CGlBitmapFont f(CGlBitmapFont::eHelvetica10); GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight + kCellHeight - 3; gl_color(m_SequenceColor); f.TextOut(2, yy, feat_label.c_str()); } if (m_ParaG[row].GetType() != CParaG::eSequence) continue; GLfloat yy = GLfloat(row - m_ScrY + 1) * kCellHeight + 1; if (m_Anchor == m_ParaG[row].GetIndex()) { // draw anchor mark x_DrawAnchorMark(row); } gl_color(m_NumbersColor); const CSeq_id& id = sequence::GetId(m_DS->GetAlnMgr(). GetBioseqHandle(m_ParaG[row].GetIndex()), sequence::eGetId_Best); id.GetLabel(&label_draw); for (TSeqPos x = 0; x != label_draw.length(); x++) { GLfloat xx = kCellWidth + GLfloat(x * kCellWidth) + kCellWidth / 2; string seq_this = label_draw.substr(x, 1); m_Font_8x13.TextOut(xx, yy - 2, seq_this.c_str()); } } gl_color(FL_GRAY); // Draw thick separation line x_DrawLine(m_LP[2] - 2, m_LP[1], m_LP[2] - 2, m_LP[3], 2.0f); glPopAttrib();}void CTextAlnPanel::x_DrawAnchorMark(TNumrow row) const{ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); gl_color(FL_GREEN); GLfloat xx = kCellWidth / 2; GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight; glBegin(GL_QUADS); glVertex2f(xx , yy + kCellHeight / 2); glVertex2f(xx + kCellWidth / 2, yy + kCellHeight); glVertex2f(xx + kCellWidth , yy + kCellHeight / 2); glVertex2f(xx + kCellWidth / 2, yy); glEnd(); glDisable(GL_BLEND); glDisable(GL_POLYGON_SMOOTH);}void CTextAlnPanel::x_DrawInfoPanel(void){ x_ActivateViewPort(m_IP); TDim len = NStr::UIntToString(m_AlnWidth).length(); gl_color(FL_GRAY); // Draw thick separation line x_DrawLine(m_IP[2] - 2, 0.0f, m_IP[2] - 2, m_IP[3], 2.0f); x_DrawLine(0.0f, len * kFontSize + 1, m_IP[2], len * kFontSize + 1, 2.0f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); x_DrawLine(0.0f, 0.0f, m_IP[2], len * kFontSize + 1, 2.0f); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glLineWidth(1.0f); gl_color(m_NumbersColor); CGlBitmapFont f(CGlBitmapFont::eHelvetica10); f.TextOut(kCellWidth / 2, len * kFontSize - 2, kLabels.c_str()); GLfloat xx = m_IP[2] - gl_width(kPosition.c_str()) - kCellWidth; f.TextOut(xx, kFontSize - 1, kPosition.c_str()); glPopAttrib();}void CTextAlnPanel::draw(){ if (!valid()) { x_SetViewPorts (); x_AdjustScrollBars(); } glClearColor(1, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if ( !m_DS ) return; x_DrawInfoPanel (); x_DrawSeqNumPanel(); x_DrawTextPanel (); x_DrawLabelPanel (); return;}void CTextAlnPanel::x_DrawLine(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2, GLfloat width) const{ glLineWidth(width); glBegin(GL_LINES); glVertex2f(x1, y1); glVertex2f(x2, y2); glEnd(); glLineWidth(1.0f);}void CTextAlnPanel::x_SetViewPorts(void){ m_Width = w(); m_Height = h(); gl_font(FL_BOLD, kFontSize); TDim m_NPHeight = gl_height() * NStr::UIntToString(m_AlnWidth).length(); TDim m_LPWidth = 0; // find out the longest string for (TNumrow row = 0; row != m_AlnHeight; row++) { const CSeq_id& id = sequence::GetId(m_DS->GetAlnMgr().GetBioseqHandle(row), sequence::eGetId_Best); string str_label; id.GetLabel(&str_label); TDim len = str_label.length(); m_LPWidth = max(m_LPWidth, len); } m_LPWidth = (m_LPWidth + 2) * kCellWidth; // add extra space // Numbers panel (on top) m_NP[0] = m_LPWidth; m_NP[1] = m_Height - m_NPHeight; m_NP[2] = m_Width - m_LPWidth; m_NP[3] = m_NPHeight; // Text panel m_BP[0] = m_LPWidth; m_BP[1] = 0; m_BP[2] = m_Width - m_LPWidth; m_BP[3] = m_Height - m_NPHeight; // Label panel (on the left) m_LP[0] = 0; m_LP[1] = 0; m_LP[2] = m_LPWidth; m_LP[3] = m_Height - m_NPHeight; // Info panel (on the left/top corner) m_IP[0] = 0; m_IP[1] = m_Height - m_NPHeight; m_IP[2] = m_LPWidth; m_IP[3] = m_NPHeight;}void CTextAlnPanel::x_AdjustScrollBars(void){ Fl_Scrollbar* scrollX = (Fl_Scrollbar*)(parent()->child(0)); Fl_Scrollbar* scrollY = (Fl_Scrollbar*)(parent()->child(1)); scrollX->linesize(1); scrollY->linesize(1); scrollX->value(m_ScrX, m_BP[2] / kCellWidth, 0, m_AlnWidth + 1); if (m_AlnWidth * kCellWidth < m_BP[2]) scrollX->hide(); else scrollX->show(); scrollY->value(m_ScrY, m_BP[3] / kCellHeight, 0, m_ParaG.size()); if (m_ParaG.size() * kCellHeight < m_BP[3]) scrollY->hide(); else scrollY->show();}string CTextAlnPanel::x_PreprocessSeq(const string& s) const{ if (s.length() <= 10) { return s; } else { return s.substr(0, 4) + "..." + s.substr(s.length() - 5, 4); }}void CTextAlnPanel::x_ActivateViewPort(GLuint* port) const{ glPushAttrib(GL_VIEWPORT_BIT); glShadeModel(GL_FLAT); glViewport(port[0], port[1], port[2], port[3]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, port[2], port[3], 0, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int CTextAlnPanel::handle(int event){ static int s_X, s_Y; static bool s_Drag; switch (event) { case FL_PUSH: s_X = Fl::event_x(); s_Y = Fl::event_y(); s_Drag = false; return 1; case FL_DRAG: s_Drag = true; if (Fl::event_shift()) { int pos = Fl::event_x() + m_ScrX * kCellWidth - m_LP[2]; size_t x = pos / kCellWidth; if ( pos < 0 || x < 0 || x >= m_AlnWidth) return 1; m_ColSelect[x] = !Fl::event_ctrl(); redraw(); } else { size_t idx = x_GetAtXY(Fl::event_x(), Fl::event_y()); if (idx != kUnknowIdx) { m_RowSelect[idx] = !Fl::event_ctrl(); redraw(); } } return 1; case FL_RELEASE: if (s_Drag) { s_Drag = false; } else { size_t idx = x_GetAtXY(Fl::event_x(), Fl::event_y()); if (idx != kUnknowIdx) { m_RowSelect[idx] = !Fl::event_ctrl(); redraw(); } } return 1; default: return Fl_Gl_Window::handle(event); } return 0;}size_t CTextAlnPanel::x_GetAtXY(int x, int y) const{ int pos = y + m_ScrY * kCellHeight - m_NP[3]; //if (pos < 0) return kUnknowIdx; size_t idx = pos / kCellHeight; if ( pos < 0 || idx >= m_ParaG.size()) return kUnknowIdx; else return m_ParaG[idx].GetIndex();}// --- Scrolling --------------------------------------------------void CTextAlnPanel::Scroll(TSeqPos xPos, TSeqPos yPos){ m_ScrX = xPos; m_ScrY = yPos; redraw();}void CTextAlnPanel::SetFeatureDisplay(CTextAlnView::EFeatureDisplay disp){ if ( !m_DS ) return; m_featDisp = disp; x_PrepareData(); invalidate(); redraw();}// Colorsvoid CTextAlnPanel::SetColor(CTextAlnView::EDisplayElement elem, Fl_Color color){ switch (elem) { case CTextAlnView::eBackground: { m_BackgroundColor = color; break; } case CTextAlnView::eGrid: { m_GridColor = color; break; } case CTextAlnView::eNumbers: { m_NumbersColor = color; break; } case CTextAlnView::eSelection: { m_SelectionColor = color; break; } case CTextAlnView::eSequence: { m_SequenceColor = color; break; } case CTextAlnView::eMismatch: { m_MismatchColor = color; break; } } redraw();}Fl_Color CTextAlnPanel::GetColor(CTextAlnView::EDisplayElement elem) const{ switch (elem) { case CTextAlnView::eBackground: return m_BackgroundColor; case CTextAlnView::eGrid: return m_GridColor; case CTextAlnView::eNumbers: return m_NumbersColor; case CTextAlnView::eSelection: return m_SelectionColor; case CTextAlnView::eSequence: return m_SequenceColor; case CTextAlnView::eMismatch: return m_MismatchColor; } return FL_BLACK;}END_NCBI_SCOPE/* * =========================================================================== * $Log: textaln_panel.cpp,v $ * Revision 1000.2 2004/06/01 21:08:00 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/03/11 17:50:41 dicuccio * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange * instead of TRange * * Revision 1.10 2004/03/05 17:39:13 dicuccio * Use sequence::Getid() instead of CSeq_id::GetStringDescr() * * Revision 1.9 2003/09/29 15:49:58 dicuccio * Use CGlBitmapFont instead of home-grown font. * * Revision 1.8 2003/09/24 19:24:41 ucko * ~CTextAlnPanel: stop explicitly deleting m_DS, which is now a CRef. * * Revision 1.7 2003/09/24 18:34:58 dicuccio * Use new generic alignment data source. Removed USING_SCOPE(objects) from * headers; used objects:: where necessary * * Revision 1.6 2003/09/17 16:29:03 dicuccio * Use CGlBitmapFont instead of CGlutFont * * Revision 1.5 2003/08/18 15:23:40 lebedev * Changed nales: CFeature -> CLayoutFeat * * Revision 1.4 2003/07/21 20:28:27 dicuccio * Fixed creation of CFeature to match new API * * Revision 1.3 2003/06/02 16:06:27 dicuccio * Rearranged src/objects/ subtree. This includes the following shifts: * - src/objects/asn2asn --> arc/app/asn2asn * - src/objects/testmedline --> src/objects/ncbimime/test * - src/objects/objmgr --> src/objmgr * - src/objects/util --> src/objmgr/util * - src/objects/alnmgr --> src/objtools/alnmgr * - src/objects/flat --> src/objtools/flat * - src/objects/validator --> src/objtools/validator * - src/objects/cddalignview --> src/objtools/cddalignview * In addition, libseq now includes six of the objects/seq... libs, and libmmdb * replaces the three libmmdb? libs. * * Revision 1.2 2003/03/27 20:38:57 dicuccio * Fixed compilation errors under Linux (gcc-3.0.4) * * Revision 1.1 2003/03/27 17:04:32 lebedev * Text Alignment Widget: Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?