/******************************************************************************* * Copyright 2014 Rafael Garcia Moreno. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.bladecoder.engineeditor.ui.panels; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Container; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.SelectBox; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.ui.TextField.TextFieldListener; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.FocusListener; import com.badlogic.gdx.utils.SnapshotArray; import com.bladecoder.engineeditor.common.EditorLogger; public class PropertyTable extends Container<Table> { private static final String[] BOOLEAN_VALUES = { "", "true", "false" }; Skin skin; Table table; public enum Types { INTEGER, BOOLEAN, FLOAT, STRING, OPTIONS } public PropertyTable(Skin skin) { // super(skin); table = new Table(skin); this.skin = skin; top().left(); table.top().left(); table.add(new Label("Name", skin)); table.add(new Label("Value", skin)); table.setFillParent(true); fill(); prefHeight(1000); setActor(table); } public void addProperty(String name, String value, Types type) { table.row(); table.add(new Label(name, skin)).expandX().left(); if (type == Types.BOOLEAN) { SelectBox<String> sb = new SelectBox<String>(skin); sb.setItems(BOOLEAN_VALUES); if (value != null) sb.setSelected(value); sb.setName(name); table.add(sb).expandX().left(); sb.addListener(new ChangeListener() { @SuppressWarnings("unchecked") @Override public void changed(ChangeEvent event, Actor actor) { updateModel(actor.getName(), ((SelectBox<String>) actor).getSelected()); } }); } else { TextField tf = new TextField(value == null ? "" : value, skin); tf.setName(name); table.add(tf).expandX().left(); if (type == Types.INTEGER) tf.setTextFieldFilter(new TextField.TextFieldFilter.DigitsOnlyFilter()); tf.setTextFieldListener(new TextFieldListener() { @Override public void keyTyped(TextField actor, char c) { if (c == 13) { // ENTER KEY updateModel(actor.getName(), ((TextField) actor).getText()); EditorLogger.debug("Updating property: " + actor.getName()); } } }); tf.addListener(new FocusListener() { @Override public void keyboardFocusChanged(FocusEvent event, Actor actor, boolean focused) { if (!focused) { updateModel(actor.getName(), ((TextField) actor).getText()); EditorLogger.debug("Updating property: " + actor.getName()); } } }); } } @SuppressWarnings("unchecked") public void setProperty(String name, String value) { SnapshotArray<Actor> actors = table.getChildren(); for (Actor a : actors) { if (name.equals(a.getName())) { if (a instanceof SelectBox<?>) { ((SelectBox<String>) a).setSelected(value == null ? "" : value); } else { ((TextField) a).setText(value == null ? "" : value); } return; } } } public void addProperty(String name, int value) { addProperty(name, Integer.toString(value), Types.INTEGER); } public void addProperty(String name, float value) { addProperty(name, Float.toString(value), Types.FLOAT); } public void addProperty(String name, String value) { addProperty(name, value, Types.STRING); } public void addProperty(String name, boolean value) { addProperty(name, Boolean.toString(value), Types.BOOLEAN); } public void addProperty(String name, String selected, String[] value) { table.row(); table.add(new Label(name, skin)).expandX().left(); SelectBox<String> sb = new SelectBox<String>(skin); sb.setItems(value); if (selected != null) sb.setSelected(selected); sb.setName(name); table.add(sb).expandX().left(); sb.addListener(new ChangeListener() { @SuppressWarnings("unchecked") @Override public void changed(ChangeEvent event, Actor actor) { updateModel(actor.getName(), ((SelectBox<String>) actor).getSelected()); } }); } protected void updateModel(String property, String value) { } protected void clearProps() { table.clear(); } }