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

org.flixel.ui.FlxTabGroup Maven / Gradle / Ivy

The newest version!
package org.flixel.ui;

import org.flixel.FlxG;
import org.flixel.FlxGroup;
import org.flixel.FlxObject;
import org.flixel.FlxSprite;
import org.flixel.ui.event.IFlxTab;

/**
 * A group that holds s. It automatically resize the tabs to fit in the
 * given width. The tabs can also be set vertically.
 * 
 * @author Ka Wing Chin
 */
public class FlxTabGroup extends FlxUIGroup
{
	private final String ImgDivider = "org/flixel/data/pack:tab_divider";
	private final String ImgDividerVertical = "org/flixel/data/pack:tab_divider_vertical";

	/**
	 * The divider skin.
	 */
	private FlxUISkin _dividerSkin;
	/**
	 * A group that holds the tabs.
	 */
	private FlxGroup _tabs;
	/**
	 * A group that holds the dividers.
	 */
	private FlxGroup _dividers;
	/**
	 * A group that holds the contents.
	 */
	private FlxGroup _content;
	/**
	 * Tracks the current tab.
	 */
	private int _current = 0;
	/**
	 * The width of the tab group.
	 */
	public int width;
	/**
	 * The height of the tab group.
	 */
	public int height;
	/**
	 * The tab width when placed vertically.
	 */
	public int tabWidth;
	/**
	 * Callback when the tab got changed.
	 */
	public IFlxTab onChange;

	/**
	 * Create a new FlxTabGroup object.
	 * 
	 * @param X The x-position.
	 * @param Y The y-position.
	 * @param Width The width of the tab group when placed horizontally. Default
	 *        0, the width of the screen in game pixels will be used.
	 * @param Height The height of the tab group when placed vertically. Default
	 *        0, the height of the screen in game pixels will be used.
	 * @param TabWidth The width of the tab when placed vertically. Default 0,
	 *        is 70 px.
	 */
	public FlxTabGroup(float X, float Y, int Width, int Height, int TabWidth)
	{
		super(X, Y, "");
		x = X;
		y = Y;
		width = (Width == 0) ? FlxG.width : Width;
		height = (Height == 0) ? FlxG.height : Height;
		tabWidth = (TabWidth == 0) ? 70 : TabWidth;
		label.setSize(12);
		add(_content = new FlxGroup());
		add(_tabs = new FlxGroup());
		add(_dividers = new FlxGroup());

		align = ALIGN_HORIZONTAL;
		setDefault(0);
	}

	/**
	 * Create a new FlxTabGroup object.
	 * 
	 * @param X The x-position.
	 * @param Y The y-position.
	 * @param Width The width of the tab group when placed horizontally. Default
	 *        0, the width of the screen in game pixels will be used.
	 * @param Height The height of the tab group when placed vertically. Default
	 *        0, the height of the screen in game pixels will be used.
	 */
	public FlxTabGroup(float X, float Y, int Width, int Height)
	{
		this(X, Y, Width, Height, 0);
	}

	/**
	 * Create a new FlxTabGroup object.
	 * 
	 * @param X The x-position.
	 * @param Y The y-position.
	 * @param Width The width of the tab group when placed horizontally. Default
	 *        0, the width of the screen in game pixels will be used.
	 */
	public FlxTabGroup(float X, float Y, int Width)
	{
		this(X, Y, 0, 0, 0);
	}

	/**
	 * Create a new FlxTabGroup object.
	 * 
	 * @param X The x-position.
	 * @param Y The y-position.
	 */
	public FlxTabGroup(float X, float Y)
	{
		this(X, Y, 0, 0, 0);
	}

	/**
	 * Create a new FlxTabGroup object.
	 * 
	 * @param X The x-position.
	 */
	public FlxTabGroup(float X)
	{
		this(X, 0, 0, 0, 0);
	}

	/**
	 * Create a new FlxTabGroup object.
	 */
	public FlxTabGroup()
	{
		this(0, 0, 0, 0, 0);
	}

	@Override
	public void destroy()
	{
		super.destroy();
		if(_dividerSkin != null)
			_dividerSkin.destroy();
		_dividerSkin = null;
		_tabs = null;
		_dividers = null;
		_content = null;
		onChange = null;
	}

	/**
	 * Add tab to the group.
	 * 
	 * @param tab
	 */
	public void addTab(FlxTab tab)
	{
		_tabs.add(tab);
		tab._group = this;
		FlxGroup group = new FlxGroup();
		_content.add(group);
		add(group);

		if(_dividerSkin != null && _tabs.length > 1)
		{
			_dividers.add(new FlxSprite(0, 0).loadGraphic(_dividerSkin.image, false, false, _dividerSkin.width, _dividerSkin.height));
		}

		resetTabs();
		if(_current == 0)
			setDefault(_current);
	}

	/**
	 * Remove a tab by index.
	 * 
	 * @param Index
	 */
	public void removeTab(int Index)
	{
		if(Index > _tabs.length - 1)
			return;

		_tabs.remove(_tabs.members.get(Index), true);
		_content.members.removeIndex(Index);
		if(Index == _current)
			setDefault(0);
		resetTabs();
	}

	/**
	 * Resets the layout of the tabs.
	 */
	private void resetTabs()
	{
		FlxSprite divider;
		FlxUIComponent tab;
		int length = _tabs.length;
		int tWidth = (align == ALIGN_HORIZONTAL) ? this.width / length : tabWidth;
		for(int i = 0; i < length; i++)
		{
			tab = (FlxUIComponent) _tabs.members.get(i);
			tab.width = tWidth;
			tab.scale.x = tWidth;
			tab.x = x;
			tab.y = y;
			if(align == ALIGN_HORIZONTAL)
				tab.x += i * tWidth;
			else if(align == ALIGN_VERTICAL)
				tab.y += i * tab.height;
			tab.label.width = tWidth;
			tab.label.setAlignment(tab.skin.labelAlign);

			if(_dividerSkin != null && i < _tabs.length - 1)
			{
				if(align == ALIGN_HORIZONTAL)
				{
					divider = (FlxSprite) _dividers.members.get(i);
					divider.x = tab.x + tab.width;
					divider.y = tab.y;
				}
				else
				{
					divider = (FlxSprite) _dividers.members.get(i);
					divider.x = tab.x;
					divider.y = tab.y + tab.height;
				}
			}
		}
	}

	/**
	 * Load a skin for the divider.
	 * 
	 * @param Skin The skin for the divider.
	 * @param Width The width of the skin.
	 * @param Height The height of the skin.
	 */
	public void loadDividerSkin(String Skin, int Width, int Height)
	{
		if(_dividerSkin == null)
			_dividerSkin = new FlxUISkin();
		_dividerSkin.setImage(Skin, Width, Height);
		if(_dividers.length < _tabs.length)
		{
			for(int i = 0; i < _tabs.length - 1; i++)
			{
				_dividers.add(new FlxSprite(0, 0).loadGraphic(Skin, false, false, Width, Height));
			}
			resetTabs();
		}
	}

	/**
	 * Load a skin for the divider.
	 * 
	 * @param Skin The skin for the divider.
	 */
	public void loadDividerSkin(FlxUISkin Skin)
	{
		loadDividerSkin(Skin.image, Skin.width, Skin.height);
	}

	/**
	 * Load the default skin for the divider.
	 */
	public void loadDividerSkin()
	{
		if(align == ALIGN_HORIZONTAL)
			loadDividerSkin(ImgDivider, 1, 48);
		else
			loadDividerSkin(ImgDividerVertical, 70, 1);
	}

	/**
	 * Add content at given index.
	 * 
	 * @param Index The index where the object needs to be stored.
	 * @param Object The object that needs to be added.
	 */
	public void addContent(int Index, FlxObject Object)
	{
		if(Index > _tabs.length - 1)
			return;
		if(_current != Index)
			Object.visible = false;
		((FlxGroup) _content.members.get(Index)).add(Object);
	}

	/**
	 * This method will be called when tab got changed.
	 * 
	 * @param tab The tab that will be set active.
	 */
	protected void onChange(FlxTab tab)
	{
		// Break if it's already selected.
		if(_current == _tabs.members.indexOf(tab, true))
		{
			tab.setActive(true);
			return;
		}

		FlxTab object;
		FlxGroup group;
		for(int i = 0; i < _tabs.members.size; i++)
		{
			object = (FlxTab) _tabs.members.get(i);
			object.setActive(false);

			group = (FlxGroup) _content.members.get(i);
			for(int ii = 0; ii < group.length; ii++)
				group.members.get(ii).visible = false;
		}
		tab.setActive(true);
		_current = _tabs.members.indexOf(tab, true);

		group = (FlxGroup) _content.members.get(_current);
		for(int i = 0; i < group.length; i++)
			group.members.get(i).visible = true;

		if(onChange != null)
			onChange.callback();
	}

	/**
	 * Set the default tab at given index.
	 * 
	 * @param Index The index of the tab that needs to be set default.
	 */
	public void setDefault(int Index)
	{
		if(Index > _tabs.length - 1)
			return;

		int i = 0;
		while(i < _tabs.length)
		{
			((FlxUIComponent) _tabs.members.get(i)).setActive(false);
			((FlxGroup) _content.members.get(i)).setAll("visible", false);
			++i;
		}
		((FlxUIComponent) _tabs.members.get(Index)).setActive(true);
		((FlxGroup) _content.members.get(Index)).setAll("visible", true);
		_current = Index;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy