Guest User

Untitled

a guest
May 15th, 2018
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.26 KB | None | 0 0
  1. // In order to use this, you need to a) have PagedRect installed within the project, and b) make sure PAGEDRECT_PRESENT is defined
  2. // You can do this by
  3. // a) defining it here: #define PAGEDRECT_PRESENT (not reccommended as it will be overwritten if you update XmlLayout)
  4. // b) defining it in your "Player Settings" -> "Scripting Define Symbols"
  5. // c) Adding a file called "smcs.rsp" to your PROJECT_DIR/Assets/ folder, and putting the following text in it "-define: PAGEDRECT_PRESENT" (you will need to restart Visual Studio after doing so)
  6. #if PAGEDRECT_PRESENT
  7. using UnityEngine;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using UnityEngine.UI;
  11. using UI.Pagination;
  12. using System;
  13. using System.Linq;
  14. using System.Reflection;
  15.  
  16. namespace UI.Xml.Tags
  17. {
  18.     public class PagedRect_HorizontalTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/HorizontalPagination"; } } }
  19.     public class PagedRect_Horizontal_ScrollRectTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/HorizontalPagination - ScrollRect"; } } }
  20.  
  21.     public class PagedRect_VerticalTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/VerticalPagination"; } } }
  22.     public class PagedRect_Vertical_ScrollRectTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/VerticalPagination - ScrollRect"; } } }
  23.  
  24.     public class PagedRect_SliderTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/Slider"; } } }
  25.     public class PagedRect_Slider_ScrollRectTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/Slider - ScrollRect"; } } }
  26.  
  27.     public class PagedRect_PagePreviews_HorizontalTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/Page Previews - Horizontal"; } } }
  28.     public class PagedRect_PagePreviews_VerticalTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/Page Previews - Vertical"; } } }
  29.  
  30.     public class PagedRect_Tabs_Horizontal_ScrollRectTagHandler : PagedRectTagHandler { public override string prefabPath { get { return "Prefabs/Tabs - Horizontal - ScrollRect"; } } }
  31.  
  32.     public class PagedRectTagHandler : ElementTagHandler
  33.     {
  34.         public override MonoBehaviour primaryComponent
  35.         {
  36.             get
  37.             {
  38.                 return currentInstanceTransform.GetComponent<PagedRect>();
  39.             }
  40.         }
  41.  
  42.         PagedRect pagedRect
  43.         {
  44.             get
  45.             {
  46.                 return (PagedRect)primaryComponent;
  47.             }
  48.         }
  49.  
  50.         private List<Page> pagesToRemove = new List<Page>();
  51.  
  52.         public override string prefabPath
  53.         {
  54.             get
  55.             {
  56.                 return "Prefabs/HorizontalPagination - ScrollRect";
  57.             }
  58.         }
  59.  
  60.         public override void ApplyAttributes(AttributeDictionary attributes)
  61.         {
  62.             base.ApplyAttributes(attributes);
  63.  
  64.             if (attributes.ContainsKey("showPagination"))
  65.             {
  66.                 if (!attributes.GetValue<bool>("showPagination"))
  67.                 {                    
  68.                     var viewportRectTransform = (RectTransform)currentInstanceTransform.GetComponentInChildren<Viewport>().transform;
  69.                     viewportRectTransform.offsetMax = Vector2.zero;
  70.                     viewportRectTransform.offsetMin = Vector2.zero;
  71.  
  72.                     pagedRect.Pagination.gameObject.SetActive(false);
  73.                 }                
  74.             }            
  75.         }
  76.  
  77.         public override RectTransform transformToAddChildrenTo
  78.         {
  79.             get
  80.             {
  81.                 return ((PagedRect)primaryComponent).Viewport.transform as RectTransform;
  82.             }
  83.         }
  84.  
  85.         public override bool isCustomElement
  86.         {
  87.             get
  88.             {
  89.                 return true;
  90.             }
  91.         }
  92.  
  93.         public override string elementChildType
  94.         {
  95.             get
  96.             {
  97.                 return "pagedRect";
  98.             }
  99.         }
  100.  
  101.         public override void ParseChildElements(System.Xml.XmlNode xmlNode)
  102.         {
  103.             // We're using PagedRect's built-in prefabs (so as to always use the up-to-date versions)
  104.             // But, the built-in prefabs have a few pages already set, so we need to clear them
  105.             // We won't be doing any actual parsing here, but this is a convenient place to clear the existing pages before adding new ones
  106.  
  107.             //pagedRect.RemoveAllPages(true);
  108.             // calling RemoveAllPages() here was sometimes causing the editor to crash,
  109.             // so now instead we're storing a list of pages to remove, and instead removing them in Close()
  110.             pagesToRemove = pagedRect.Pages.ToList();            
  111.         }
  112.  
  113.         public override void Open(AttributeDictionary attributes)
  114.         {
  115.             base.Open(attributes);
  116.  
  117.             _previousPagedRectTagHandler = CurrentPagedRectTagHandler;
  118.             CurrentPagedRectTagHandler = this;            
  119.         }
  120.  
  121.         public override void Close()
  122.         {
  123.             base.Close();
  124.            
  125.             // now remove the template pages
  126.             foreach (var page in pagesToRemove)
  127.             {
  128.                 pagedRect.RemovePage(page, true);
  129.             }
  130.  
  131.             // Once we've finished adding pages, update the PagedRect's pagination          
  132.             var _pagedRect = pagedRect;
  133.             _pagedRect.gameObject.SetActive(false);
  134.             XmlLayoutTimer.AtEndOfFrame(() =>
  135.                 {
  136.                     _pagedRect.gameObject.SetActive(true);
  137.                     _pagedRect.UpdatePages(true, true);
  138.                 }, _pagedRect, true);  
  139.            
  140.             CurrentPagedRectTagHandler = _previousPagedRectTagHandler;
  141.         }        
  142.  
  143.         public override Dictionary<string, string> attributes
  144.         {
  145.             get
  146.             {
  147.                 var keycodeString = System.String.Join(",", System.Enum.GetNames(typeof(KeyCode)));
  148.  
  149.                 return new Dictionary<string, string>()
  150.                 {
  151.                     {"defaultPage", "xs:int"},
  152.                     {"autoDiscoverPages", "xs:boolean"},
  153.                     {"showPagination", "xs:boolean"},
  154.                     {"showFirstAndLastButtons", "xs:boolean"},
  155.                     {"showPreviousAndNextButtons", "xs:boolean"},
  156.                     {"maximumNumberOfButtonsToShow", "xs:int"},
  157.                     {"showButtonTemplatesInEditor", "xs:boolean"},
  158.                     {"showPageButtons", "xs:boolean"},
  159.                     {"showNumbersOnButtons", "xs:boolean"},
  160.                     {"showPageTitlesOnButtons", "xs:boolean"},
  161.                     {"animationType", "SlideHorizontal,SlideVertical,Fade"},
  162.                     {"animationSpeed", "xs:float"},
  163.                     {"automaticallyMoveToNextPage", "xs:boolean"},
  164.                     {"delayBetweenPages", "xs:float"},
  165.                     {"loopEndlessly", "xs:boolean"},
  166.                     {"useKeyboardInput", "xs:boolean"},
  167.                     {"previousPageKey", keycodeString},                      
  168.                     {"nextPageKey", keycodeString},                          
  169.                     {"firstPageKey", keycodeString},                          
  170.                     {"lastPageKey", keycodeString},                          
  171.                     {"useSwipeInput", "xs:boolean"},                        // Note: not relevant to ScrollRect-based PagedRects
  172.                     {"swipeDeltaThreshold", "xs:float"},
  173.                     {"useScrollWheelInput", "xs:boolean"},
  174.                     {"onlyUseScrollWheelInputWhenMouseIsOver", "xs:boolean"},
  175.                     {"highlightWhenMouseIsOver", "xs:boolean"},
  176.                     {"normalColor", "xmlLayout:color"},
  177.                     {"highlightColor", "xmlLayout:color"},
  178.                     {"editorSelectedPage", "xs:int"},
  179.                     {"color", "xmlLayout:color"},
  180.                     {"showPagePreviews", "xs:boolean"},
  181.                     {"pagePreviewScale", "xs:float"},
  182.                     {"enablePagePreviewOverlays", "xs:boolean"},
  183.                     {"pagePreviewOverlayImage", "xs:string"},
  184.                     {"pagePreviewOverlayNormalColor", "xmlLayout:color"},
  185.                     {"pagePreviewOverlayHoverColor", "xmlLayout:color"},                    
  186.                     {"lockOneToOneScaleRatio", "xs:boolean"},
  187.                     {"spaceBetweenPages", "xs:float"},
  188.                     {"pagePreviewOverlayScaleOverride", "xs:float"},
  189.                     {"loopSeamlessly", "xs:boolean"},
  190.                     {"showScrollbar", "xs:boolean"},
  191.                     {"pageChangedEvent", "xmlLayout:function"}
  192.                 };
  193.             }
  194.         }
  195.  
  196.         protected override List<string> eventAttributeNames
  197.         {
  198.             get
  199.             {
  200.                 var eventNames = base.eventAttributeNames;
  201.                 eventNames.Add("pagechangedevent");
  202.                
  203.                 return eventNames;
  204.             }
  205.         }
  206.  
  207.         protected override void HandleEventAttribute(string eventName, string eventValue)
  208.         {            
  209.             if (eventName.Equals("pageChangedEvent", StringComparison.OrdinalIgnoreCase))
  210.             {                
  211.                 var eventData = eventValue.Trim(new Char[] { ')', ';' })
  212.                                       .Split(',', '(');
  213.  
  214.  
  215.                 var methodName = eventData[0];
  216.  
  217.                 var layout = currentXmlLayoutInstance;
  218.                 var controller = layout.XmlLayoutController;
  219.                 var controllerType = controller.GetType();
  220.  
  221.                 var method = controllerType.GetMethod(methodName, BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
  222.  
  223.                 if (method == null)
  224.                 {
  225.                     Debug.LogError("[XmlLayout][XmlLayoutController] No method named '" + methodName + "' has been defined in this XmlLayoutController!");
  226.                     return;
  227.                 }
  228.  
  229.                 var methodParameters = method.GetParameters();
  230.                
  231.                 pagedRect.PageChangedEvent.RemoveAllListeners();
  232.                 pagedRect.PageChangedEvent.AddListener((a, b) =>
  233.                 {                                        
  234.                     if (methodParameters.Count() == 0)
  235.                     {
  236.                         method.Invoke(controller, null);
  237.                     }
  238.                     else if (methodParameters.Count() == 1)
  239.                     {
  240.                         method.Invoke(controller, new object[] { a });
  241.                     }
  242.                     else
  243.                     {
  244.                         method.Invoke(controller, new object[] { a, b });
  245.                     }
  246.                 });
  247.  
  248.             }
  249.             else
  250.             {
  251.                 base.HandleEventAttribute(eventName, eventValue);
  252.             }
  253.         }
  254.  
  255.         private static PagedRectTagHandler _previousPagedRectTagHandler { get; set; }
  256.         public static PagedRectTagHandler CurrentPagedRectTagHandler { get; private set; }
  257.     }
  258. }
  259. #endif
Advertisement
Add Comment
Please, Sign In to add comment