Java tutorial
/* * Copyright 2016 Nathan Howard * * This file is part of OpenGrave * * OpenGrave is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenGrave is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenGrave. If not, see <http://www.gnu.org/licenses/>. */ package com.opengrave.og.gui; import org.lwjgl.opengl.GL11; import com.opengrave.og.MainThread; import com.opengrave.og.util.Vector4f; public class ScrollBox extends UIParent { int scrolly; public ScrollBox(ElementData ed) { super(ed); } @Override public void setSize(int width, int height, int mwidth, int mheight) { this.width = width; this.height = height; synchronized (children) { children.get(0).setSize(width, height, -1, -1);// No max size } } @Override public void repopulateQuads() { UIQuad q = new UIQuad().setPos(0, 0, width, height).setColour(1f, 1f, 1f, 0.7f); addQuad(q); } /** * Special cases Ho! */ @Override public void render(int totalx, int totaly) { synchronized (children) { UIElement e = children.get(0); // GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); // GL11.glEnable(GL11.GL_DEPTH_TEST); // GL11.glDepthFunc(GL11.GL_LESS); // Render box at location // location2d = new Vector3f(totalx, totaly, 0); // render(null, RenderStyle.NORMAL); // GL11.glDepthFunc(GL11.GL_EQUAL); // Render contents minus scroll ammount if (width < 0 || height < 0) { return; } GL11.glScissor(totalx, MainThread.lastH - (totaly + height), width, height); GL11.glEnable(GL11.GL_SCISSOR_TEST); e.render(totalx, (int) (totaly - scrolly)); // GL11.glDepthFunc(GL11.GL_LESS); GL11.glDisable(GL11.GL_SCISSOR_TEST); } } public void renderForPicking(int totalx, int totaly) { synchronized (children) { UIElement e = children.get(0); // GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); // GL11.glEnable(GL11.GL_DEPTH_TEST); // GL11.glDepthFunc(GL11.GL_LESS); // Render box at location // location2d = new Vector3f(totalx, totaly, 0); // render(null, RenderStyle.NORMAL); // GL11.glDepthFunc(GL11.GL_EQUAL); // Render contents minus scroll ammount if (width < 0 || height < 0) { return; } GL11.glScissor(x, MainThread.lastH - (totaly + height), width, height); GL11.glEnable(GL11.GL_SCISSOR_TEST); e.renderForPicking(totalx, (int) (totaly - scrolly)); GL11.glDisable(GL11.GL_SCISSOR_TEST); } } @Override public boolean isFocusable() { return false; } @Override protected boolean shouldRenderForPicking() { return true; } public void scrollTo(UIElement a) { if (this.containsChildSomewhere(a)) { // contained somewhere in here. scrollTo(getPos(a)); } } public void scrollTo(Vector4f vec) { int w = (int) (vec.z - vec.x); int h = (int) (vec.w - vec.y); if (w > width) { // scrollx = vec.x } if (h > height) { scrolly = (int) vec.y; } else { if (scrolly < vec.y) { if (scrolly + height > vec.w) { return; } else { scrolly = (int) (vec.w - height); } } else { scrolly = (int) vec.y; } } synchronized (children) { UIElement c = children.get(0); if (scrolly > c.height - height) { scrolly = c.height - height; } if (scrolly < 0) { scrolly = 0; } } } public Vector4f getPos(UIElement ele) { Vector4f vec = new Vector4f(0f, 0f, 0f, 0f); UIParent p = ele.parent; UIElement e = ele; while (p != this) { vec.x = vec.x + e.x; vec.y = vec.y + e.y; e = p; p = p.parent; } vec.z = vec.x + ele.width; vec.w = vec.y + ele.height; return vec; } }