use of com.spinyowl.legui.component.Component in project legui by SpinyOwl.
the class Example method main.
// private static String json =
// IOUtil.loadResourceAsString("com/spinyowl/legui/demo/json.json", 1024);
public static void main(String[] args) {
System.setProperty("joml.nounsafe", Boolean.TRUE.toString());
System.setProperty("java.awt.headless", Boolean.TRUE.toString());
if (!glfwInit()) {
throw new RuntimeException("Can't initialize GLFW");
}
// create glfw window
long window = glfwCreateWindow(WIDTH, HEIGHT, "Example", NULL, NULL);
// show window
glfwShowWindow(window);
// make window current on thread
glfwMakeContextCurrent(window);
GL.createCapabilities();
glfwSwapInterval(0);
// read monitors
PointerBuffer pointerBuffer = glfwGetMonitors();
int remaining = pointerBuffer.remaining();
monitors = new long[remaining];
for (int i = 0; i < remaining; i++) {
monitors[i] = pointerBuffer.get(i);
}
// create LEGUI theme and set it as default
// Themes.setDefaultTheme(new FlatColoredTheme(
// rgba(255, 255, 255, 1), // backgroundColor
// rgba(176, 190, 197, 1), // borderColor
// rgba(176, 190, 197, 1), // sliderColor
// rgba(100, 181, 246, 1), // strokeColor
// rgba(194, 219, 245, 1), // allowColor
// rgba(239, 154, 154, 1), // denyColor
// ColorConstants.transparent(), // shadowColor
// ColorConstants.darkGray(), // text color
// FontRegistry.getDefaultFont(), // font
// FlatColoredTheme.FONT_SIZE
// ));
// Firstly we need to create frame component for window.
// new Frame(WIDTH, HEIGHT);
Frame frame = new Frame(WIDTH, HEIGHT);
createGuiElements(frame, WIDTH, HEIGHT);
// also we can create frame for example just by unmarshal it
// frame = GsonMarshalUtil.unmarshal(json);
// frame.setSize(WIDTH, HEIGHT);
// We need to create legui instance one for window
// which hold all necessary library components
// or if you want some customizations you can do it by yourself.
DefaultInitializer initializer = new DefaultInitializer(window, frame);
GLFWKeyCallbackI exitOnEscCallback = (w1, key, code, action, mods) -> running = !(key == GLFW_KEY_ESCAPE && action != GLFW_RELEASE);
GLFWKeyCallbackI toggleFullscreenCallback = (w1, key, code, action, mods) -> toggleFullscreen = (key == GLFW_KEY_F && action == GLFW_RELEASE && (mods & GLFW_MOD_CONTROL) != 0);
GLFWWindowCloseCallbackI glfwWindowCloseCallbackI = w -> running = false;
// if we want to create some callbacks for system events you should create and put them to
// keeper
//
// Wrong:
// glfwSetKeyCallback(window, exitOnEscCallback);
// glfwSetWindowCloseCallback(window, glfwWindowCloseCallbackI);
//
// Right:
initializer.getCallbackKeeper().getChainKeyCallback().add(exitOnEscCallback);
initializer.getCallbackKeeper().getChainKeyCallback().add(toggleFullscreenCallback);
initializer.getCallbackKeeper().getChainWindowCloseCallback().add(glfwWindowCloseCallbackI);
// Initialization finished, so we can start render loop.
running = true;
// Everything can be done in one thread as well as in separated threads.
// Here is one-thread example.
// before render loop we need to initialize renderer
Renderer renderer = initializer.getRenderer();
Animator animator = AnimatorProvider.getAnimator();
renderer.initialize();
long time = System.currentTimeMillis();
int updCntr = 0;
context = initializer.getContext();
// context.setDebugEnabled(true);
while (running) {
// Before rendering we need to update context with window size and window framebuffer size
// {
// int[] windowWidth = {0}, windowHeight = {0};
// GLFW.glfwGetWindowSize(window, windowWidth, windowHeight);
// int[] frameBufferWidth = {0}, frameBufferHeight = {0};
// GLFW.glfwGetFramebufferSize(window, frameBufferWidth, frameBufferHeight);
// int[] xpos = {0}, ypos = {0};
// GLFW.glfwGetWindowPos(window, xpos, ypos);
// double[] mx = {0}, my = {0};
// GLFW.glfwGetCursorPos(window, mx, my);
//
// context.update(windowWidth[0], windowHeight[0],
// frameBufferWidth[0], frameBufferHeight[0],
// xpos[0], ypos[0],
// mx[0], my[0]
// );
// }
// Also we can do it in one line
context.updateGlfwWindow();
Vector2i windowSize = context.getFramebufferSize();
glClearColor(1, 1, 1, 1);
// Set viewport size
glViewport(0, 0, windowSize.x, windowSize.y);
// Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// We need to relayout components.
if (gui.getGenerateEventsByLayoutManager().isChecked()) {
LayoutManager.getInstance().layout(frame, context);
} else {
LayoutManager.getInstance().layout(frame);
}
// render frame
renderer.render(frame, context);
// poll events to callbacks
glfwPollEvents();
glfwSwapBuffers(window);
animator.runAnimations();
// Now we need to handle events. Firstly we need to handle system events.
// And we need to know to which frame they should be passed.
initializer.getSystemEventProcessor().processEvents(frame, context);
// When system events are translated to GUI events we need to handle them.
// This event processor calls listeners added to ui components
initializer.getGuiEventProcessor().processEvents();
// check toggle fullscreen flag and execute.
if (toggleFullscreen) {
if (fullscreen) {
glfwSetWindowMonitor(window, NULL, 100, 100, WIDTH, HEIGHT, GLFW_DONT_CARE);
} else {
GLFWVidMode glfwVidMode = glfwGetVideoMode(monitors[0]);
glfwSetWindowMonitor(window, monitors[0], 0, 0, glfwVidMode.width(), glfwVidMode.height(), glfwVidMode.refreshRate());
}
fullscreen = !fullscreen;
toggleFullscreen = false;
}
update();
updCntr++;
if (System.currentTimeMillis() >= time + 1000) {
time += 1000;
glfwSetWindowTitle(window, "LEGUI Example. Updates per second: " + updCntr);
updCntr = 0;
}
}
// And when rendering is ended we need to destroy renderer
renderer.destroy();
glfwDestroyWindow(window);
glfwTerminate();
}
use of com.spinyowl.legui.component.Component in project legui by SpinyOwl.
the class Example method update.
private static void update() {
if (context != null) {
Component mouseTargetGui = context.getMouseTargetGui();
gui.getMouseTargetLabel().getTextState().setText("-> " + (mouseTargetGui == null ? null : mouseTargetGui.getClass().getSimpleName()));
Component focusedGui = context.getFocusedGui();
gui.getFocusedGuiLabel().getTextState().setText("-> " + (focusedGui == null ? null : focusedGui.getClass().getSimpleName()));
}
}
use of com.spinyowl.legui.component.Component in project legui by SpinyOwl.
the class MultipleWindowsMultipleThreadsExample method generateOnFly.
private static List<Component> generateOnFly() {
List<Component> list = new ArrayList<>();
Label label = new Label(20, 60, 200, 20);
label.getTextState().setText("Generated on fly label");
label.getStyle().setTextColor(ColorConstants.red());
RadioButtonGroup group = new RadioButtonGroup();
RadioButton radioButtonFirst = new RadioButton("First", 20, 90, 200, 20);
RadioButton radioButtonSecond = new RadioButton("Second", 20, 110, 200, 20);
radioButtonFirst.setRadioButtonGroup(group);
radioButtonSecond.setRadioButtonGroup(group);
list.add(label);
list.add(radioButtonFirst);
list.add(radioButtonSecond);
return list;
}
use of com.spinyowl.legui.component.Component in project legui by SpinyOwl.
the class SingleClassExample method generateOnFly.
private static List<Component> generateOnFly() {
List<Component> list = new ArrayList<>();
Widget widget = new Widget(10, 50, 380, 240);
widget.getContainer().getStyle().setDisplay(FLEX);
widget.setDraggable(false);
TabbedPanel tabbedPanel = new TabbedPanel();
tabbedPanel.getStyle().setPosition(PositionType.RELATIVE);
tabbedPanel.getStyle().getFlexStyle().setFlexGrow(1);
tabbedPanel.getStyle().getFlexStyle().setFlexShrink(1);
tabbedPanel.getStyle().setMargin(10F);
tabbedPanel.getStyle().setBorder(new SimpleLineBorder(ColorConstants.black(), 1F));
widget.getContainer().add(tabbedPanel);
Tab tab1 = new Tab("Planes", new Label("Show all planes available"));
Tab tab2 = new Tab("Cars", new Label("Show all cars available"));
Tab tab3 = new Tab("Boats", new Label("Show all boats available"));
tabbedPanel.addTab(tab1);
tabbedPanel.addTab(tab2);
tabbedPanel.addTab(tab3);
AtomicInteger tabIdx = new AtomicInteger();
Button addTabButton = new Button("Add tab", 180, 10, 70, 30);
addTabButton.getListenerMap().addListener(MouseClickEvent.class, event -> {
if (MouseClickAction.CLICK.equals(event.getAction())) {
String tabName = "Tab #" + tabIdx.incrementAndGet();
Component tabComponent = new Panel();
tabComponent.getStyle().getBackground().setColor(ColorUtil.randomColor());
tabComponent.getStyle().setPadding(10F, 20F);
tabbedPanel.addTab(new Tab(tabName, tabComponent));
}
});
Button removeTabButton = new Button("Remove tab", 260, 10, 70, 30);
removeTabButton.getListenerMap().addListener(MouseClickEvent.class, event -> {
if (MouseClickAction.CLICK.equals(event.getAction()) && tabbedPanel.tabCount() > 0) {
tabbedPanel.removeTab(tabbedPanel.getCurrentTab());
}
});
Button changeStripPosition = new Button("Switch", 340, 10, 50, 30);
changeStripPosition.getListenerMap().addListener(MouseClickEvent.class, event -> {
if (MouseClickAction.CLICK.equals(event.getAction())) {
TabStripPosition current = tabbedPanel.getTabStripPosition();
if (TOP == current) {
tabbedPanel.setTabStripPosition(LEFT);
} else if (LEFT == current) {
tabbedPanel.setTabStripPosition(BOTTOM);
} else if (BOTTOM == current) {
tabbedPanel.setTabStripPosition(RIGHT);
} else {
tabbedPanel.setTabStripPosition(TOP);
}
}
});
widget.getTitle().getListenerMap().addListener(KeyEvent.class, event -> {
if (event.getAction() == GLFW_RELEASE) {
if (event.getKey() == GLFW_KEY_1) {
tabbedPanel.setTabWidth(30);
} else if (event.getKey() == GLFW_KEY_2) {
tabbedPanel.setTabHeight(120);
} else if (event.getKey() == GLFW_KEY_3) {
tabbedPanel.setTabStripPosition(LEFT);
} else if (event.getKey() == GLFW_KEY_4) {
tabbedPanel.setTabWidth(120);
} else if (event.getKey() == GLFW_KEY_5) {
tabbedPanel.setTabHeight(30);
} else if (event.getKey() == GLFW_KEY_6) {
tabbedPanel.setTabStripPosition(TOP);
}
}
});
list.add(addTabButton);
list.add(removeTabButton);
list.add(changeStripPosition);
list.add(widget);
return list;
}
use of com.spinyowl.legui.component.Component in project legui by SpinyOwl.
the class WidgetTreeExample method checkAndCollapse.
private void checkAndCollapse(Widget root, Widget widget) {
Component parent = widget.getParent();
if (parent != null) {
// collapse sibling widgets
for (Component sibling : parent.getChildComponents()) {
if (sibling instanceof Widget && sibling != widget) {
Widget siblingWidget = (Widget) sibling;
collapseChildWidgets(siblingWidget);
siblingWidget.setMinimized(true);
}
}
Component pp = parent.getParent();
if (pp instanceof Widget) {
Widget parentWidget = (Widget) pp;
if (parentWidget != root) {
checkAndCollapse(root, parentWidget);
}
}
}
}
Aggregations