graph_panel.cpp
来自「ncbi源码」· C++ 代码 · 共 285 行
CPP
285 行
/* * =========================================================================== * PRODUCTION $Log: graph_panel.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 20:49:23 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3 * PRODUCTION * =========================================================================== *//* $Id: graph_panel.cpp,v 1000.1 2004/06/01 20:49:23 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: Andrey Yazhuk * * File Description: * */#include <ncbi_pch.hpp>#include <gui/graph/graph_panel.hpp>BEGIN_NCBI_SCOPECGraphPanel::CGraphPanel(): m_pAxisArea(NULL), m_pLegend(NULL), m_rcAll(0,0,200,200), m_GraphOffsetX(80), m_GraphOffsetY(10), m_LegendOffsetX(80), m_LegendH(30), m_LimitsModeX(eGraphLimits), m_LimitsModeY(eGraphLimits), m_bDrawGrid(true), m_bDrawAxes(true), m_bAntiAliasing(true), m_BackColor(1.0f, 1.0f, 1.0f), m_GraphBackColor(1.0f, 1.0f, 1.0f){}CGraphPanel::~CGraphPanel(){ destroy_null(m_pLegend); destroy_null(m_pAxisArea);}void CGraphPanel::Create(){ m_pLegend = CreateLegend(); m_pAxisArea = CreateAxisArea(); if (m_pAxisArea) m_pAxisArea->SetupAxes();}void CGraphPanel::SetRect(const TVPRect& rcAll, bool bLayout){ m_rcAll = rcAll; if (bLayout) Layout();}void CGraphPanel::SetLayout( int GraphOffsetX, int GraphOffsetY, int LegendOffsetX, int LegendH, bool bLayout){ m_GraphOffsetX = GraphOffsetX; m_GraphOffsetY = GraphOffsetY; m_LegendOffsetX = LegendOffsetX; m_LegendH = LegendH; if (bLayout) Layout();}void CGraphPanel::Layout(){ TVPRect rc = m_rcAll; int y = rc.Bottom() + m_LegendH; rc.SetBottom(y); m_Pane.SetViewport(rc); // place Graph pane in the top right corner rc.MoveLeft(m_GraphOffsetX); rc.MoveBottom(m_GraphOffsetY); m_GraphPane.SetViewport(rc); // place Legend in the bottom rc = m_rcAll; rc.SetLeft(m_LegendOffsetX); rc.SetTop(y-1); m_LegendPane.SetViewport(rc); }void CGraphPanel::SetLimitsMode(ELimitsMode ModeX, ELimitsMode ModeY){ m_LimitsModeX = ModeX; m_LimitsModeY = ModeY;}void CGraphPanel::SetFixedLimits(const TModelRect& rcLimits){ TModelRect rc = m_GraphPane.GetModelLimitsRect(); if (m_LimitsModeX == eFixed) { rc.SetLeft(rcLimits.Left()); rc.SetRight(rcLimits.Right()); } if (m_LimitsModeY == eFixed) { rc.SetBottom(rcLimits.Bottom()); rc.SetTop(rcLimits.Top()); } m_GraphPane.SetModelLimitsRect(rc);}void CGraphPanel::UpdateLimits(){ TModelRect rcLimits = m_GraphPane.GetModelLimitsRect(); if(m_LimitsModeX == eGraphLimits || m_LimitsModeX == eRounded) { TModelRect rcX; NON_CONST_ITERATE(TGraphCont, it, m_Graphs) { rcX.CombineWith((*it)->GetLimits()); } if(m_LimitsModeX == eRounded) { //call extension function } if(rcX.Width() == 0) rcX.SetRight(1.0); rcLimits.SetLeft(rcX.Left()); rcLimits.SetRight(rcX.Right()); } if(m_LimitsModeY == eGraphLimits || m_LimitsModeY == eRounded) { TModelRect rcY; NON_CONST_ITERATE(TGraphCont, it, m_Graphs) { rcY.CombineWith((*it)->GetLimits()); } if(m_LimitsModeY == eRounded) { //call extension function } if (rcY.Height() == 0) rcY.SetTop(1.0); rcLimits.SetBottom(rcY.Bottom()); rcLimits.SetTop(rcY.Top()); } m_GraphPane.SetModelLimitsRect(rcLimits);}void CGraphPanel::SetIntegerMode(bool bIntegerX, bool bIntegerY){ m_Gen.SetIntegerMode(bIntegerX, bIntegerY);}void CGraphPanel::SetDrawGrid(bool bDraw){ m_bDrawGrid = bDraw;}void CGraphPanel::SetDrawAxes(bool bDraw){ m_bDrawAxes = bDraw;}void CGraphPanel::EnableAntiAliasing(bool bEn){ m_bAntiAliasing = bEn;}void CGraphPanel::SetBackColor(const CGlColor& Color, const CGlColor& GraphColor){ m_BackColor = Color; m_GraphBackColor = GraphColor;}void CGraphPanel::AddGraph(IGraph* pGraph){ m_Graphs.push_back(pGraph); UpdateLimits();}void CGraphPanel::RemoveAllGraphs(){ m_Graphs.clear(); UpdateLimits();}void CGraphPanel::Render(){ PrepareContext(); if (m_bDrawGrid) m_Grid.Render(&m_Pane, &m_GraphPane, &m_Gen); NON_CONST_ITERATE(TGraphCont, itGr, m_Graphs) { (*itGr)->Render(&m_GraphPane); } if (m_pAxisArea && m_bDrawAxes) m_pAxisArea->Render(&m_Pane, &m_GraphPane, &m_Gen); if (m_pLegend) m_pLegend->Render(&m_LegendPane);}void CGraphPanel::PrepareContext(){ if (m_bAntiAliasing) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); } else { glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); } glClearColor(m_BackColor.GetRed(), m_BackColor.GetGreen(), m_BackColor.GetBlue(), m_BackColor.GetAlpha()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_GraphPane.OpenPixels(); TVPRect rc = m_GraphPane.GetViewport(); glColorC(m_GraphBackColor); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glRectd(rc.Left(), rc.Bottom(), rc.Right(), rc.Top()); m_GraphPane.Close();}CAxisArea* CGraphPanel::CreateAxisArea(){ return new CAxisArea();}CLegend* CGraphPanel::CreateLegend(){ return new CLegend();}END_NCBI_SCOPE/* * =========================================================================== * $Log: graph_panel.cpp,v $ * Revision 1000.1 2004/06/01 20:49:23 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3 * * Revision 1.3 2004/05/21 22:27:42 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.2 2003/08/28 19:20:51 yazhuk * Changed CGlPane function names * * Revision 1.1 2003/08/14 17:56:31 yazhuk * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?