genome_policy.cpp

来自「ncbi源码」· C++ 代码 · 共 428 行

CPP
428
字号
/* * =========================================================================== * PRODUCTION $Log: genome_policy.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 21:12:41  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10 * PRODUCTION * =========================================================================== *//*  $Id: genome_policy.cpp,v 1000.2 2004/06/01 21:12:41 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Vlad Lebedev * * File Description: * */#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <gui/widgets/seq_graphic/genome_policy.hpp>#include <objmgr/util/sequence.hpp>#include <gui/objutils/label.hpp>BEGIN_NCBI_SCOPEUSING_SCOPE(objects);//const TModelUnit kOneRowHeight      = 6.0f;TModelUnit kGenomeSpacerSize = 3.0f; // 3 pixels befween layout objectsCGenomePolicy::CGenomePolicy(){}//// draw a given feature in a given mode//void CGenomePolicy::x_DrawFeature(CGlPane& pane, const CLayoutFeat* feat,                     GLfloat row_y, EObj_IterMode mode, bool selected) const{    const TModelRect& rcV = pane.GetVisibleRect();    const TModelRect& rcM = pane.GetModelLimitsRect();        TModelUnit offsetX = pane.GetOffsetX();    TModelUnit offsetY = pane.GetOffsetY();        TSeqPos from = feat->GetLocation().GetTotalRange().GetFrom();    TSeqPos to   = feat->GetLocation().GetTotalRange().GetTo();        TModelRect frc;    frc.SetLeft(from);    frc.SetRight(to);        TModelRect inrc = frc.IntersectWith(rcV);        GLfloat th = m_Font_Helv8.TextHeight();        GLfloat line_y1  = feat->IsHiddenLabel() ? row_y + 2 : row_y + th + 5;    GLfloat line_y2  = line_y1 + 3;    GLfloat line_ym  = line_y1 + 1;        GLfloat title_y  = row_y + th + 2;    GLfloat off      = rcM.Top() > 0 ? th : 0;    switch (mode) {    default:        break;    case eDrawObjectLines:        // straight line        x_SetFeatureColor(feat);        glVertex2f(from - offsetX, line_ym - offsetY);        glVertex2f(to - offsetX,   line_ym - offsetY);        // Draw selection        if (selected) {            x_Color(CSeqGraphicColorConfig::eSelection_Feature);            x_DrawSelection(pane, from, line_y1, to, line_y2);        }                        break;    case eDrawObjectQuads:        // Highlight named Seq Annotations        if (feat->GetMappedFeature().GetAnnot().IsNamed()) {            CSeq_annot_Handle annot = feat->GetMappedFeature().GetAnnot();            size_t idx = x_GetSeqAnnotIndex(annot);                        TModelUnit h = x_GetRowHeight(pane, feat, selected);            CGlColor color = m_ColorTable.GetColor(idx);            glColor4f(color.GetRed(), color.GetGreen(), color.GetBlue(), 0.1f);                        // add small overhang of 5 pixels (left and right)            TModelUnit over = pane.UnProjectWidth(5);                        glVertex2f(from - offsetX - over, row_y - offsetY);            glVertex2f(from - offsetX - over, row_y+h - offsetY);            glVertex2f(to - offsetX+1+over, row_y+h - offsetY);            glVertex2f(to - offsetX+1+over, row_y - offsetY);        }        x_SetFeatureColor(feat);                // quad for each interval (exon)        ITERATE (vector<TSeqRange>, iter, feat->GetIntervals()) {            const TSeqRange& curr = *iter;            TModelUnit f = curr.GetFrom();            TModelUnit t = curr.GetTo()+1;// + (neg_strand ? 0.0f : 1.0f);                        if (pane.ProjectX(t) - pane.ProjectX(f) <= 1.0f) {                t = f + pane.UnProjectWidth(1);            }            glVertex2f(f - offsetX, line_y1 - offsetY);            glVertex2f(f - offsetX, line_y2 - offsetY);            glVertex2f(t - offsetX, line_y2 - offsetY);            glVertex2f(t - offsetX, line_y1 - offsetY);        }                break;    case eDrawObjectLabel:        if (feat->IsHiddenLabel()) return;        // do not even try to draw labels if less than 1 letter width        if (inrc.Width() <= pane.UnProjectWidth(m_MinLabelWidth)) {            return;        }                string fl_both;        string fl_type;        string fl_content;        string fl_out;        x_GetLabels(feat->GetFeature(), m_Handle.GetScope(),                    &fl_type, &fl_content, &fl_both);        GLfloat widthP     = inrc.Width() / pane.GetScaleX(); // width in pixels        GLfloat lw_type    = m_Font_Helv8.TextWidth(fl_type.c_str() );        if ( lw_type * 3 < widthP) { // 3 widths of eType label width            fl_out = m_Font_Helv8.Truncate(fl_both.c_str(), widthP);        } else {            fl_out = m_Font_Helv8.Truncate(fl_content.c_str(), widthP);        }                    if (selected) {            x_Color(CSeqGraphicColorConfig::eSelLabel_Feature);        } else {            x_Color(CSeqGraphicColorConfig::eLabel_Feature);        }        GLfloat xM = x_CenterText(pane, inrc,                     m_Font_Helv8.TextWidth(fl_out.c_str()));        m_Font_Helv8.TextOut(xM - offsetX,                     title_y - off - offsetY, fl_out.c_str());        break;    }}void CGenomePolicy::x_DrawFeatPack(CGlPane& pane, const CLayoutFeatPack* pack,                    GLfloat row_y, EObj_IterMode mode, bool selected) const{    const TModelRect& rcV = pane.GetVisibleRect();    const TModelRect& rcM = pane.GetModelLimitsRect();        TModelUnit offsetX = pane.GetOffsetX();    TModelUnit offsetY = pane.GetOffsetY();        TSeqPos from = pack->GetLocation().GetTotalRange().GetFrom();    TSeqPos to   = pack->GetLocation().GetTotalRange().GetTo();        TModelRect frc;    frc.SetLeft(from);    frc.SetRight(to);        TModelRect inrc = frc.IntersectWith(rcV);    GLfloat th       = m_Font_Helv8.TextHeight();    GLfloat title_y  = row_y + th + 2;    GLfloat off      = rcM.Top() > 0 ? th : 0;        switch (mode) {    default:        break;    case eDrawObjectLines:    case eDrawObjectQuads:        ITERATE (CLayoutFeat::TFeatList, iter, pack->GetFeatures()) {            const CLayoutFeat* feat = *iter;            x_DrawFeature(pane, feat, row_y, mode, selected);        }            break;    case eDrawObjectLabel:        // do not even try to draw labels if less than 1 letter width        if (inrc.Width() <= pane.UnProjectWidth(m_MinLabelWidth)) {            return;        }        string out = NStr::UIntToString(pack->GetFeatures().size()) + " mRNA(s)";                GLfloat widthP     = inrc.Width() / pane.GetScaleX(); // width in pixels        string fl_out = m_Font_Helv8.Truncate(out.c_str(), widthP);                if (selected) {            x_Color(CSeqGraphicColorConfig::eSelLabel_Feature);        } else {            x_Color(CSeqGraphicColorConfig::eLabel_Feature);        }        GLfloat xM = x_CenterText(pane, inrc,                     m_Font_Helv8.TextWidth(fl_out.c_str()));        m_Font_Helv8.TextOut(xM - offsetX,                     title_y - off - offsetY, fl_out.c_str());        break;    }}void CGenomePolicy::x_DrawComments(CGlPane& pane, const CLayoutComment* comm,                    GLfloat row_y, EObj_IterMode mode, bool selected) const{    const TModelRect& rcV = pane.GetVisibleRect();    const TModelRect& rcM = pane.GetModelLimitsRect();        TModelUnit offsetX = pane.GetOffsetX();    TModelUnit offsetY = pane.GetOffsetY();        GLfloat th = m_Font_Helv8.TextHeight();    GLfloat title_y  = row_y + th + 1;    GLfloat off = rcM.Top() > 0 ? th : 0;    switch (mode) {    default:    case eDrawObjectLines:    case eDrawObjectQuads:        break;    case eDrawObjectLabel:        const string& out = comm->GetComment();        x_Color(CSeqGraphicColorConfig::eFG_Comment);        m_Font_Helv8.TextOut(rcV.Left() - offsetX,                     title_y - off - offsetY, out.c_str());        break;    }}// draw proteint product and label only when selectedvoid CGenomePolicy::x_DrawProteinProduct(CGlPane& pane, const CLayoutFeat* feat,                     GLfloat row_y, EProtSeqType type, bool selected) const{    // label for original protein only and when product is accessible    if (type == eTranslatedSeq  ||  !feat->GetFeature().IsSetProduct()) {        return; // not drawing labels or no product    }        const TModelRect& rcV = pane.GetVisibleRect();    const TModelRect& rcM = pane.GetModelLimitsRect();        TModelUnit offsetX = pane.GetOffsetX();    TModelUnit offsetY = pane.GetOffsetY();        TSeqPos from = feat->GetLocation().GetTotalRange().GetFrom();    TSeqPos to   = feat->GetLocation().GetTotalRange().GetTo();    TModelRect frc;    frc.SetLeft(from);    frc.SetRight(to);    TModelRect inrc = frc.IntersectWith(rcV);        // do not do anything if there is no spac for even one letter    if (inrc.Width() < pane.UnProjectWidth(m_MinLabelWidth)) {        return;    }    GLfloat scaleX  = pane.GetScaleX();    GLfloat th      = m_Font_Helv8.TextHeight();    GLfloat title_y = row_y + th + 2;    GLfloat off     = rcM.Top() > 0 ? th - 1 : 0;    const CSeq_loc& product = feat->GetFeature().GetProduct();    string prot_label;    CLabel::GetLabel(product, &prot_label,                     CLabel::eDefault, &m_Handle.GetScope());    string out = m_Font_Helv10.Truncate(prot_label.c_str(),                                 inrc.Width() / scaleX);    GLfloat xM = x_CenterText(pane, inrc,                                 m_Font_Helv10.TextWidth(out.c_str()));    x_Color(selected ? CSeqGraphicColorConfig::eSelLabel_ProtProduct :                       CSeqGraphicColorConfig::eLabel_ProtProduct);    m_Font_Helv8.TextOut(xM - offsetX, title_y - off - offsetY, out.c_str());}TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane,                 const CLayoutFeatPack* pack, bool selected) const{    return 12.0f;}TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane,                 const CLayoutFeat* feat, bool selected) const{    if (feat->IsHiddenLabel()) {        return 3.0f + kGenomeSpacerSize; // 3 pixel is the width of feature    } else {        return 3.0f + m_Font_Helv8.TextHeight() + 2 * kGenomeSpacerSize; // 3 pixel is the width of feature    }}TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane,                     const CLayoutProtProd* prot, bool selected) const{    if (prot->IsHiddenLabel()) {        return 3.0f + kGenomeSpacerSize; // 3 pixel is the width of feature    } else {        return 3.0f + m_Font_Helv8.TextHeight() + 2 * kGenomeSpacerSize; // 3 pixel is the width of feature    }}TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane,                     const CLayoutComment* comm, bool selected) const{    return m_Font_Helv8.TextHeight() + kGenomeSpacerSize;    }TModelUnit CGenomePolicy::x_GetRowHeight(CGlPane& pane,                     const CLayoutHistogram* hist, bool selected) const{    return 10.0f + kGenomeSpacerSize; // 10 pixels for histogram in this policy}void CGenomePolicy::x_GetTitle(const CLayoutFeatPack* pack, string* title,        CLabel::ELabelType type) const{    *title = NStr::UIntToString(pack->GetFeatures().size()) + " mRNA(s)";}END_NCBI_SCOPE/* * =========================================================================== * $Log: genome_policy.cpp,v $ * Revision 1000.2  2004/06/01 21:12:41  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10 * * Revision 1.10  2004/05/21 22:27:55  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.9  2004/05/14 15:57:11  lebedev * Optional argument to specify the type of title/tooltip added * * Revision 1.8  2004/05/07 15:37:35  dicuccio * Use CLabel instead of CSeqUtils::GetLabel() * * Revision 1.7  2004/04/14 11:25:02  lebedev * Use x_DrawSelection from the base class * * Revision 1.6  2004/04/07 13:11:46  dicuccio * Use CSeq_annot_Handle for proper annotation name handling * * Revision 1.5  2004/03/30 13:58:37  lebedev * Use elements colors from configuration instead of setting colors directly. * * Revision 1.4  2004/03/23 12:33:56  lebedev * Made sequence and histograms bars a layout objects in the object panel. * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel. * * Revision 1.3  2004/03/11 17:53:06  dicuccio * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange * * Revision 1.2  2004/03/05 17:41:29  dicuccio * Use sequence::GetId() instead of CSeq_id::GetStringDescr() * * Revision 1.1  2004/02/24 14:43:49  lebedev * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?