You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
434 lines
12 KiB
434 lines
12 KiB
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; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Previouse page index. |
|
/// 获得上次活动页面索引 |
|
/// </summary> |
|
public int previsousIndex |
|
{ |
|
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; |
|
} |
|
} |
|
}
|
|
|