441 lines
12 KiB
C#
441 lines
12 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using FairyGUI.Utils;
|
|||
|
using System;
|
|||
|
|
|||
|
namespace FairyGUI
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Controller class.
|
|||
|
/// 控制器类。控制器的创建和设计需通过编辑器完成,不建议使用代码创建。
|
|||
|
/// 最常用的方法是通过selectedIndex获得或改变控制器的活动页面。如果要获得控制器页面改变的通知,使用onChanged事件。
|
|||
|
/// </summary>
|
|||
|
public class Controller : EventDispatcher
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Name of the controller
|
|||
|
/// 控制器名称。
|
|||
|
/// </summary>
|
|||
|
public string name;
|
|||
|
|
|||
|
internal GComponent parent;
|
|||
|
internal bool autoRadioGroupDepth;
|
|||
|
internal bool changing;
|
|||
|
|
|||
|
int _selectedIndex;
|
|||
|
int _previousIndex;
|
|||
|
List<string> _pageIds;
|
|||
|
List<string> _pageNames;
|
|||
|
List<ControllerAction> _actions;
|
|||
|
|
|||
|
EventListener _onChanged;
|
|||
|
|
|||
|
static uint _nextPageId;
|
|||
|
|
|||
|
public Controller()
|
|||
|
{
|
|||
|
_pageIds = new List<string>();
|
|||
|
_pageNames = new List<string>();
|
|||
|
_selectedIndex = -1;
|
|||
|
_previousIndex = -1;
|
|||
|
}
|
|||
|
|
|||
|
public void Dispose()
|
|||
|
{
|
|||
|
RemoveEventListeners();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// When controller page changed.
|
|||
|
/// 当控制器活动页面改变时,此事件被触发。
|
|||
|
/// </summary>
|
|||
|
public EventListener onChanged
|
|||
|
{
|
|||
|
get { return _onChanged ?? (_onChanged = new EventListener(this, "onChanged")); }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Current page index.
|
|||
|
/// 获得或设置当前活动页面索引。
|
|||
|
/// </summary>
|
|||
|
public int selectedIndex
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _selectedIndex;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (_selectedIndex != value)
|
|||
|
{
|
|||
|
if (value > _pageIds.Count - 1)
|
|||
|
throw new IndexOutOfRangeException("" + value);
|
|||
|
|
|||
|
changing = true;
|
|||
|
|
|||
|
_previousIndex = _selectedIndex;
|
|||
|
_selectedIndex = value;
|
|||
|
parent.ApplyController(this);
|
|||
|
|
|||
|
DispatchEvent("onChanged", null);
|
|||
|
|
|||
|
changing = false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Set current page index, no onChanged event.
|
|||
|
/// 通过索引设置当前活动页面,和selectedIndex的区别在于,这个方法不会触发onChanged事件。
|
|||
|
/// </summary>
|
|||
|
/// <param name="value">Page index</param>
|
|||
|
public void SetSelectedIndex(int value)
|
|||
|
{
|
|||
|
if (_selectedIndex != value)
|
|||
|
{
|
|||
|
if (value > _pageIds.Count - 1)
|
|||
|
throw new IndexOutOfRangeException("" + value);
|
|||
|
|
|||
|
changing = true;
|
|||
|
_previousIndex = _selectedIndex;
|
|||
|
_selectedIndex = value;
|
|||
|
parent.ApplyController(this);
|
|||
|
changing = false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Set current page by name, no onChanged event.
|
|||
|
/// 通过页面名称设置当前活动页面,和selectedPage的区别在于,这个方法不会触发onChanged事件。
|
|||
|
/// </summary>
|
|||
|
/// <param name="value">Page name</param>
|
|||
|
public void SetSelectedPage(string value)
|
|||
|
{
|
|||
|
int i = _pageNames.IndexOf(value);
|
|||
|
if (i == -1)
|
|||
|
i = 0;
|
|||
|
this.SetSelectedIndex(i);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Current page name.
|
|||
|
/// 获得当前活动页面名称
|
|||
|
/// </summary>
|
|||
|
public string selectedPage
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_selectedIndex == -1)
|
|||
|
return null;
|
|||
|
else
|
|||
|
return _pageNames[_selectedIndex];
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
int i = _pageNames.IndexOf(value);
|
|||
|
if (i == -1)
|
|||
|
i = 0;
|
|||
|
this.selectedIndex = i;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[Obsolete("Use previousIndex")]
|
|||
|
public int previsousIndex
|
|||
|
{
|
|||
|
get { return _previousIndex; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Previouse page index.
|
|||
|
/// 获得上次活动页面索引
|
|||
|
/// </summary>
|
|||
|
public int previousIndex
|
|||
|
{
|
|||
|
get { return _previousIndex; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Previous page name.
|
|||
|
/// 获得上次活动页面名称。
|
|||
|
/// </summary>
|
|||
|
public string previousPage
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_previousIndex == -1)
|
|||
|
return null;
|
|||
|
else
|
|||
|
return _pageNames[_previousIndex];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Page count of this controller.
|
|||
|
/// 获得页面数量。
|
|||
|
/// </summary>
|
|||
|
public int pageCount
|
|||
|
{
|
|||
|
get { return _pageIds.Count; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Get page name by an index.
|
|||
|
/// 通过页面索引获得页面名称。
|
|||
|
/// </summary>
|
|||
|
/// <param name="index">Page index</param>
|
|||
|
/// <returns>Page Name</returns>
|
|||
|
public string GetPageName(int index)
|
|||
|
{
|
|||
|
return _pageNames[index];
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Get page id by an index.
|
|||
|
/// 通过页面索引获得页面id。
|
|||
|
/// </summary>
|
|||
|
/// <param name="index">Page index</param>
|
|||
|
/// <returns>Page Id</returns>
|
|||
|
public string GetPageId(int index)
|
|||
|
{
|
|||
|
return _pageIds[index];
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Get page id by name
|
|||
|
/// </summary>
|
|||
|
/// <param name="aName"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public string GetPageIdByName(string aName)
|
|||
|
{
|
|||
|
int i = _pageNames.IndexOf(aName);
|
|||
|
if (i != -1)
|
|||
|
return _pageIds[i];
|
|||
|
else
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Add a new page to this controller.
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Page name</param>
|
|||
|
public void AddPage(string name)
|
|||
|
{
|
|||
|
if (name == null)
|
|||
|
name = string.Empty;
|
|||
|
|
|||
|
AddPageAt(name, _pageIds.Count);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Add a new page to this controller at a certain index.
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Page name</param>
|
|||
|
/// <param name="index">Insert position</param>
|
|||
|
public void AddPageAt(string name, int index)
|
|||
|
{
|
|||
|
string nid = "_" + (_nextPageId++);
|
|||
|
if (index == _pageIds.Count)
|
|||
|
{
|
|||
|
_pageIds.Add(nid);
|
|||
|
_pageNames.Add(name);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_pageIds.Insert(index, nid);
|
|||
|
_pageNames.Insert(index, name);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Remove a page.
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Page name</param>
|
|||
|
public void RemovePage(string name)
|
|||
|
{
|
|||
|
int i = _pageNames.IndexOf(name);
|
|||
|
if (i != -1)
|
|||
|
{
|
|||
|
_pageIds.RemoveAt(i);
|
|||
|
_pageNames.RemoveAt(i);
|
|||
|
if (_selectedIndex >= _pageIds.Count)
|
|||
|
this.selectedIndex = _selectedIndex - 1;
|
|||
|
else
|
|||
|
parent.ApplyController(this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Removes a page at a certain index.
|
|||
|
/// </summary>
|
|||
|
/// <param name="index"></param>
|
|||
|
public void RemovePageAt(int index)
|
|||
|
{
|
|||
|
_pageIds.RemoveAt(index);
|
|||
|
_pageNames.RemoveAt(index);
|
|||
|
if (_selectedIndex >= _pageIds.Count)
|
|||
|
this.selectedIndex = _selectedIndex - 1;
|
|||
|
else
|
|||
|
parent.ApplyController(this);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Remove all pages.
|
|||
|
/// </summary>
|
|||
|
public void ClearPages()
|
|||
|
{
|
|||
|
_pageIds.Clear();
|
|||
|
_pageNames.Clear();
|
|||
|
if (_selectedIndex != -1)
|
|||
|
this.selectedIndex = -1;
|
|||
|
else
|
|||
|
parent.ApplyController(this);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Check if the controller has a page.
|
|||
|
/// </summary>
|
|||
|
/// <param name="aName">Page name.</param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool HasPage(string aName)
|
|||
|
{
|
|||
|
return _pageNames.IndexOf(aName) != -1;
|
|||
|
}
|
|||
|
|
|||
|
internal int GetPageIndexById(string aId)
|
|||
|
{
|
|||
|
return _pageIds.IndexOf(aId);
|
|||
|
}
|
|||
|
|
|||
|
internal string GetPageNameById(string aId)
|
|||
|
{
|
|||
|
int i = _pageIds.IndexOf(aId);
|
|||
|
if (i != -1)
|
|||
|
return _pageNames[i];
|
|||
|
else
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
internal string selectedPageId
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_selectedIndex == -1)
|
|||
|
return string.Empty;
|
|||
|
else
|
|||
|
return _pageIds[_selectedIndex];
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
int i = _pageIds.IndexOf(value);
|
|||
|
if (i != -1)
|
|||
|
this.selectedIndex = i;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
internal string oppositePageId
|
|||
|
{
|
|||
|
set
|
|||
|
{
|
|||
|
int i = _pageIds.IndexOf(value);
|
|||
|
if (i > 0)
|
|||
|
this.selectedIndex = 0;
|
|||
|
else if (_pageIds.Count > 1)
|
|||
|
this.selectedIndex = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
internal string previousPageId
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_previousIndex == -1)
|
|||
|
return null;
|
|||
|
else
|
|||
|
return _pageIds[_previousIndex];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void RunActions()
|
|||
|
{
|
|||
|
if (_actions != null)
|
|||
|
{
|
|||
|
int cnt = _actions.Count;
|
|||
|
for (int i = 0; i < cnt; i++)
|
|||
|
{
|
|||
|
_actions[i].Run(this, previousPageId, selectedPageId);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Setup(ByteBuffer buffer)
|
|||
|
{
|
|||
|
int beginPos = buffer.position;
|
|||
|
buffer.Seek(beginPos, 0);
|
|||
|
|
|||
|
name = buffer.ReadS();
|
|||
|
autoRadioGroupDepth = buffer.ReadBool();
|
|||
|
|
|||
|
buffer.Seek(beginPos, 1);
|
|||
|
|
|||
|
int cnt = buffer.ReadShort();
|
|||
|
_pageIds.Capacity = cnt;
|
|||
|
_pageNames.Capacity = cnt;
|
|||
|
for (int i = 0; i < cnt; i++)
|
|||
|
{
|
|||
|
_pageIds.Add(buffer.ReadS());
|
|||
|
_pageNames.Add(buffer.ReadS());
|
|||
|
}
|
|||
|
|
|||
|
int homePageIndex = 0;
|
|||
|
if (buffer.version >= 2)
|
|||
|
{
|
|||
|
int homePageType = buffer.ReadByte();
|
|||
|
switch (homePageType)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
homePageIndex = buffer.ReadShort();
|
|||
|
break;
|
|||
|
|
|||
|
case 2:
|
|||
|
homePageIndex = _pageNames.IndexOf(UIPackage.branch);
|
|||
|
if (homePageIndex == -1)
|
|||
|
homePageIndex = 0;
|
|||
|
break;
|
|||
|
|
|||
|
case 3:
|
|||
|
homePageIndex = _pageNames.IndexOf(UIPackage.GetVar(buffer.ReadS()));
|
|||
|
if (homePageIndex == -1)
|
|||
|
homePageIndex = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
buffer.Seek(beginPos, 2);
|
|||
|
|
|||
|
cnt = buffer.ReadShort();
|
|||
|
if (cnt > 0)
|
|||
|
{
|
|||
|
if (_actions == null)
|
|||
|
_actions = new List<ControllerAction>(cnt);
|
|||
|
|
|||
|
for (int i = 0; i < cnt; i++)
|
|||
|
{
|
|||
|
int nextPos = buffer.ReadUshort();
|
|||
|
nextPos += buffer.position;
|
|||
|
|
|||
|
ControllerAction action = ControllerAction.CreateAction((ControllerAction.ActionType)buffer.ReadByte());
|
|||
|
action.Setup(buffer);
|
|||
|
_actions.Add(action);
|
|||
|
|
|||
|
buffer.position = nextPos;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (parent != null && _pageIds.Count > 0)
|
|||
|
_selectedIndex = homePageIndex;
|
|||
|
else
|
|||
|
_selectedIndex = -1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|