mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-04 20:04:21 +08:00
152 lines
3.8 KiB
C++
152 lines
3.8 KiB
C++
|
|
/*
|
|
A* -------------------------------------------------------------------
|
|
B* This file contains source code for the PyMOL computer program
|
|
C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
|
|
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_std.h"
|
|
#include"os_predef.h"
|
|
#include"Base.h"
|
|
#include"Ortho.h"
|
|
#include"Pop.h"
|
|
#include"MemoryDebug.h"
|
|
|
|
#define cPopMargin 3
|
|
|
|
struct CPop : public Block {
|
|
CPop(PyMOLGlobals * G) : Block(G){}
|
|
|
|
void reshape(int width, int height) override;
|
|
};
|
|
|
|
|
|
/*========================================================================*/
|
|
void CPop::reshape(int width, int height)
|
|
{
|
|
rect.top = height;
|
|
rect.right = width;
|
|
}
|
|
|
|
|
|
/*========================================================================*/
|
|
Block *PopGetBlock(PyMOLGlobals * G)
|
|
{
|
|
CPop *I = G->Pop;
|
|
{
|
|
return (I);
|
|
}
|
|
}
|
|
|
|
|
|
/*========================================================================*/
|
|
void PopFree(PyMOLGlobals * G)
|
|
{
|
|
DeleteP(G->Pop);
|
|
}
|
|
|
|
|
|
/*========================================================================*/
|
|
int PopInit(PyMOLGlobals * G)
|
|
{
|
|
CPop *I = nullptr;
|
|
if((I = (G->Pop = new CPop(G)))) {
|
|
|
|
I->active = false;
|
|
|
|
I->rect.top = 10;
|
|
I->rect.bottom = 14;
|
|
I->rect.left = 0;
|
|
I->rect.right = 10;
|
|
|
|
OrthoAttach(G, I, cOrthoHidden);
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*========================================================================*/
|
|
void PopFitBlock(Block * block)
|
|
{
|
|
CPop *I = block->m_G->Pop; // TODO: Three indirections for a 'this' lol
|
|
int delta;
|
|
|
|
if((block->rect.bottom - cPopMargin) < (I->rect.bottom)) {
|
|
delta = (I->rect.bottom - block->rect.bottom) + cPopMargin;
|
|
block->rect.top += delta;
|
|
block->rect.bottom += delta;
|
|
}
|
|
|
|
if((block->rect.right + cPopMargin) > (I->rect.right)) {
|
|
delta = (block->rect.right - (I->rect.right)) + cPopMargin;
|
|
block->rect.left -= delta;
|
|
block->rect.right -= delta;
|
|
}
|
|
|
|
if((block->rect.left - cPopMargin) < (I->rect.left)) {
|
|
delta = (I->rect.left - block->rect.left) + cPopMargin;
|
|
block->rect.right += delta;
|
|
block->rect.left += delta;
|
|
}
|
|
|
|
if((block->rect.top + cPopMargin) > (I->rect.top)) {
|
|
delta = (block->rect.top - (I->rect.top)) + cPopMargin;
|
|
block->rect.top -= delta;
|
|
block->rect.bottom -= delta;
|
|
}
|
|
}
|
|
|
|
|
|
/*========================================================================*/
|
|
int PopPlaceChild(Block * block, int left_x, int right_x, int row_y, int affinity)
|
|
{
|
|
|
|
int width = block->rect.right - block->rect.left;
|
|
int height = block->rect.top - block->rect.bottom;
|
|
int target_x;
|
|
|
|
block->rect.top = row_y;
|
|
block->rect.bottom = row_y - height;
|
|
|
|
if(affinity >= 0) {
|
|
affinity = 1;
|
|
target_x = right_x - 2;
|
|
block->rect.left = target_x;
|
|
block->rect.right = target_x + width;
|
|
} else {
|
|
affinity = -1;
|
|
target_x = left_x - width + 2;
|
|
block->rect.left = target_x;
|
|
block->rect.right = target_x + width;
|
|
}
|
|
PopFitBlock(block);
|
|
if(affinity >= 0) {
|
|
if(block->rect.left != target_x) {
|
|
affinity = -1;
|
|
target_x = left_x - width + 2;
|
|
block->rect.left = target_x;
|
|
block->rect.right = target_x + width;
|
|
PopFitBlock(block);
|
|
}
|
|
} else {
|
|
if(block->rect.left != target_x) {
|
|
affinity = 1;
|
|
target_x = right_x - 2;
|
|
block->rect.left = target_x;
|
|
block->rect.right = target_x + width;
|
|
PopFitBlock(block);
|
|
}
|
|
}
|
|
return affinity;
|
|
}
|