123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- 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;
- }
- }
- }
|