All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kotcrab.vis.ui.building.utilities.CellWidget Maven / Gradle / Ivy

There is a newer version: 1.5.3
Show newest version
/*
 * Copyright 2014-2017 See AUTHORS file.
 *
 * 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.kotcrab.vis.ui.building.utilities;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Cell;
import com.badlogic.gdx.scenes.scene2d.ui.Table;

/**
 * Wraps a Scene2D widget, allowing to store cell data for delayed Table creation. Note that some filling data
 * (like expanding on X axis or alignment) might be overridden by some TableBuilders (like the
 * CenteredTableBuilder, which tries to keep all widgets centered by setting expansion and alignment of some
 * cells).
 * @author MJ
 */
public class CellWidget {
	private final static int IGNORED_SIZE = 0;
	/** Contains nulled actor. */
	public final static CellWidget EMPTY = empty();

	private final Widget widget;
	private final Padding padding;
	private final boolean expandX, expandY, fillX, fillY, useSpacing;
	private final Alignment alignment;
	private final int width, height, minWidth, minHeight;

	// Cast is safe - builder will have the same type as the cell widget.
	@SuppressWarnings("unchecked")
	private CellWidget (final CellWidgetBuilder cellWidgetBuilder) {
		widget = (Widget) cellWidgetBuilder.widget;
		padding = cellWidgetBuilder.padding;
		expandX = cellWidgetBuilder.expandX;
		expandY = cellWidgetBuilder.expandY;
		fillX = cellWidgetBuilder.fillX;
		fillY = cellWidgetBuilder.fillY;
		useSpacing = cellWidgetBuilder.useSpacing;
		alignment = cellWidgetBuilder.alignment;
		width = cellWidgetBuilder.width;
		height = cellWidgetBuilder.height;
		minWidth = cellWidgetBuilder.minWidth;
		minHeight = cellWidgetBuilder.minHeight;
	}

	/**
	 * @param widget will be wrapped with CellWidget.
	 * @return a new CellWidgetBuilder, allowing to specify the cell's settings.
	 */
	public static  CellWidgetBuilder of (final Widget widget) {
		return new CellWidgetBuilder(widget);
	}

	/**
	 * @param widget will be used to set initial data of builder, allowing to "modify" a prepared CellWidget.
	 * @return a new CellWidgetBuilder, allowing to respecify the cell's settings.
	 */
	public static  CellWidgetBuilder using (final CellWidget widget) {
		return new CellWidgetBuilder(widget);
	}

	/**
	 * @param widget will be immediately wrapped into a CellWidget with no specific settings.
	 * @return wrapped widget.
	 */
	public static  CellWidget wrap (final Widget widget) {
		return of(widget).wrap();
	}

	/**
	 * @param widgets will be converted to CellWidgets without any specific settings.
	 * @return wrapped widgets.
	 */
	public static CellWidget[] wrap (final Actor... widgets) {
		final CellWidget[] wrappedWidgets = new CellWidget[widgets.length];
		for (int index = 0; index < widgets.length; index++) {
			wrappedWidgets[index] = CellWidget.of(widgets[index]).wrap();
		}
		return wrappedWidgets;
	}

	/** @return a new empty, non-null CellWidget with no actor. */
	public static CellWidget empty () {
		return builder().wrap();
	}

	/** @return an empty builder with no widget that can be used as data container. */
	public static CellWidgetBuilder builder () {
		return of(null);
	}

	/** @return widget wrapped with the CellWidget object. */
	public Widget getWidget () {
		return widget;
	}

	/**
	 * @param table will contain a cell with the object's widget with specified cell settings.
	 * @return a reference to the built cell.
	 */
	public Cell buildCell (final Table table) {
		return buildCell(table, null);
	}

	/**
	 * @param table will contain a cell with the object's widget with specified cell settings.
	 * @param defaultWidgetPadding will be applied to the cell if padding was not specified. Can be null.
	 * @return a reference to the built cell.
	 */
	public Cell buildCell (final Table table, final Padding defaultWidgetPadding) {
		final Cell cell = table.add(widget);

		applyPadding(cell, defaultWidgetPadding);
		applySizeData(cell);
		applyFillingData(cell);

		return cell;
	}

	private void applyPadding (final Cell cell, final Padding defaultWidgetPadding) {
		final Padding appliedPadding = Nullables.getOrElse(padding, defaultWidgetPadding);
		if (appliedPadding != null) {
			if (useSpacing) {
				appliedPadding.applySpacing(cell);
			} else {
				appliedPadding.applyPadding(cell);
			}
		}
	}

	private void applySizeData (final Cell cell) {
		if (width > IGNORED_SIZE) {
			cell.width(width);
		}
		if (height > IGNORED_SIZE) {
			cell.height(height);
		}
		if (minWidth > IGNORED_SIZE) {
			cell.minWidth(minWidth);
		}
		if (minHeight > IGNORED_SIZE) {
			cell.minHeight(minHeight);
		}
	}

	private void applyFillingData (final Cell cell) {
		if (alignment != null) {
			alignment.apply(cell);
		}
		cell.expand(expandX, expandY);
		cell.fill(fillX, fillY);
	}

	/**
	 * Allows to set the CellWidget's data. All setter methods return this for chaining.
	 * @author MJ
	 */
	public static class CellWidgetBuilder {
		private Actor widget;
		private Padding padding;
		private boolean expandX, expandY, fillX, fillY, useSpacing;
		private Alignment alignment;
		private int width = IGNORED_SIZE, height = IGNORED_SIZE, minWidth = IGNORED_SIZE,
				minHeight = IGNORED_SIZE;

		private CellWidgetBuilder (final Actor widget) {
			this.widget = widget;
		}

		private CellWidgetBuilder (final CellWidget widget) {
			this.widget = widget.widget;
			padding = widget.padding;
			expandX = widget.expandX;
			expandY = widget.expandY;
			fillX = widget.fillX;
			fillY = widget.fillY;
			useSpacing = widget.useSpacing;
			alignment = widget.alignment;
			width = widget.width;
			height = widget.height;
			minWidth = widget.minWidth;
			minHeight = widget.minHeight;
		}

		/** @return widget passed to factory method wrapped with CellWidget with the applied data. */
		public CellWidget wrap () {
			return new CellWidget(this);
		}

		/** @param widget will replace the original widget wrapped by the builder. */
		public CellWidgetBuilder widget (final Widget widget) {
			this.widget = widget;
			return this;
		}

		/** @param padding can be also applied as spacing after calling useSpacing(). */
		public CellWidgetBuilder padding (final Padding padding) {
			this.padding = padding;
			return this;
		}

		/**
		 * Forces the given padding object to work as spacing data. Spacing will be applied to the cell
		 * instead of padding.
		 */
		public CellWidgetBuilder useSpacing () {
			useSpacing = true;
			return this;
		}

		/** Widget will expand on X axis. */
		public CellWidgetBuilder expandX () {
			expandX = true;
			return this;
		}

		/** Widget will expand on Y axis. */
		public CellWidgetBuilder expandY () {
			expandY = true;
			return this;
		}

		/** Widget will fill X axis. Often used with expansion or fixed width setting. */
		public CellWidgetBuilder fillX () {
			fillX = true;
			return this;
		}

		/** Widget will fill Y axis. Often used with expansion or fixed width setting. */
		public CellWidgetBuilder fillY () {
			fillY = true;
			return this;
		}

		/**
		 * @param alignment will be used to align the widget in the cell area it has. May need expansion to
		 * take any effect.
		 */
		public CellWidgetBuilder align (final Alignment alignment) {
			this.alignment = alignment;
			return this;
		}

		/** @param width set as min, preffered and max width. Has to be higher than 0 or it will be ignored. */
		public CellWidgetBuilder width (final int width) {
			this.width = width;
			return this;
		}

		/** @param height set as min, preffered and max height. Has to be higher than 0 or it will be ignored. */
		public CellWidgetBuilder height (final int height) {
			this.height = height;
			return this;
		}

		/**
		 * @param minWidth forces the minimum width of the widget. Note that it overrides width() setting for
		 * the min width. Has to be higher than 0 or it will be ignored.
		 */
		public CellWidgetBuilder minWidth (final int minWidth) {
			this.minWidth = minWidth;
			return this;
		}

		/**
		 * @param minHeight forces the minimum height of the widget. Note that it overrides height() setting
		 * for the min height. Has to be higher than 0 or it will be ignored.
		 */
		public CellWidgetBuilder minHeight (final int minHeight) {
			this.minHeight = minHeight;
			return this;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy