Files
pymol-open-source/layer0/Block.cpp
2019-03-06 11:37:11 +01:00

155 lines
3.9 KiB
C++

/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* Copyright (c) Schrodinger, LLC.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#include"os_python.h"
#include"os_predef.h"
#include"os_gl.h"
#include"Block.h"
#include"main.h"
#include"CGO.h"
int Block::getWidth() const {
return rect.right - rect.left;
}
/*========================================================================*/
int Block::getHeight() const {
return rect.top - rect.bottom;
}
/*========================================================================*/
void Block::fill(CGO *orthoCGO)
{
if(m_G->HaveGUI && m_G->ValidContext) {
if (orthoCGO){
CGOBegin(orthoCGO, GL_TRIANGLE_STRIP);
CGOVertex(orthoCGO, rect.right, rect.top, 0.f);
CGOVertex(orthoCGO, rect.right, rect.bottom, 0.f);
CGOVertex(orthoCGO, rect.left, rect.top, 0.f);
CGOVertex(orthoCGO, rect.left, rect.bottom, 0.f);
CGOEnd(orthoCGO);
} else {
glBegin(GL_POLYGON);
glVertex2i(rect.right, rect.top);
glVertex2i(rect.right, rect.bottom);
glVertex2i(rect.left, rect.bottom);
glVertex2i(rect.left, rect.top);
glEnd();
}
}
}
/*========================================================================*/
void Block::drawLeftEdge(CGO *orthoCGO)
{
if(m_G->HaveGUI && m_G->ValidContext) {
if (orthoCGO){
CGOColor(orthoCGO, .3f, .3f, .3f);
CGOBegin(orthoCGO, GL_TRIANGLE_STRIP);
CGOVertex(orthoCGO, rect.left, rect.bottom, 0.f);
CGOVertex(orthoCGO, rect.left + 1.f, rect.bottom, 0.f);
CGOVertex(orthoCGO, rect.left, rect.top, 0.f);
CGOVertex(orthoCGO, rect.left + 1.f, rect.top, 0.f);
CGOEnd(orthoCGO);
} else {
if(m_G->HaveGUI && m_G->ValidContext) {
glColor3f(0.3, 0.3, 0.3);
glBegin(GL_LINES);
glVertex2i(rect.left, rect.bottom);
glVertex2i(rect.left, rect.top);
glEnd();
}
}
}
}
/*========================================================================*/
void Block::drawTopEdge()
{
#ifndef PURE_OPENGL_ES_2
if(m_G->HaveGUI && m_G->ValidContext) {
glColor3f(0.3, 0.3, 0.3);
glBegin(GL_LINES);
glVertex2i(rect.right, rect.top);
glVertex2i(rect.left, rect.top);
glEnd();
}
#endif
}
/*========================================================================*/
void Block::setMargin(int t, int l, int b, int r)
{
margin.top = t;
margin.left = l;
margin.bottom = b;
margin.right = r;
}
/*========================================================================*/
void Block::reshape(int width, int height)
{
rect.top = (height - margin.top);
rect.left = margin.left;
rect.bottom = margin.bottom;
rect.right = (width - margin.right);
}
/*========================================================================*/
void Block::translate(int dx, int dy)
{
rect.top += dy;
rect.left += dx;
rect.bottom += dy;
rect.right += dx;
}
/*========================================================================*/
void Block::recursiveDraw(CGO* orthoCGO)
{
if (active) {
draw(orthoCGO);
}
}
bool Block::recursiveFastDraw(CGO* orthoCGO)
{
bool ret = false;
if (active) {
ret |= fastDraw(orthoCGO);
}
return ret;
}
Block* Block::recursiveFind(int x, int y)
{
if (!active || !rectXYInside(x, y)) {
return nullptr;
}
return this;
}
bool Block::rectXYInside(int x, int y) const
{
return ((y <= rect.top) && (y >= rect.bottom) &&
(x <= rect.right) && (x >= rect.left));
}