mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-04 20:04:21 +08:00
155 lines
3.9 KiB
C++
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));
|
|
}
|