IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
LayoutSystem.cs
1 using System;
2 using UnityEngine;
3 using System.Collections.Generic;
4 
5 namespace UI
6 {
7  public enum Screen {
8  left,
9  right,
10  center
11  }
12  public enum AlignmentH {
13  left,
14  right,
15  center,
16  stretch
17  }
18  public enum AlignmentV {
19  top,
20  bottom,
21  center,
22  stretch
23  }
24 
25  public class LayoutPosition
26  {
27  public Screen screen;
28  public AlignmentH alignHorizontal;
29  public AlignmentV alignVertical;
30  public LayoutPosition()
31  {
32  screen = Screen.center;
33  alignHorizontal = AlignmentH.stretch;
34  alignVertical = AlignmentV.stretch;
35  }
36  }
37 
38 
39  public class LayoutSystem
40  {
41 
42  // Maximal dimensions of UI:
43  public Rect sizeOfUIScene { private set; get; }
44 
45  public Vector3 activeScale = new Vector3 (1.05f, 1.05f, 1.05f);
46  public Vector3 inactiveScale = new Vector3 (1f, 1f, 1f);
47 
48  Rect leftScreen;
49  Rect centerScreen;
50  Rect rightScreen;
51 
52  public Screen activeScreen { private set; get; }
53 
54  private List<Widget> widgets = new List<Widget>();
55 
56  public int statusBarHeight = 60;
57 
58  public LayoutSystem()
59  {
60  activeScreen = Screen.center;
61  }
62 
63  public void updateDimensions()
64  {
65  Vector2 max = new Vector2 (1f * UI.Core.instance.aspectRatio, 1f) / UI.Core.instance.UIScale;
66  Vector2 min = -max;
67  //min = min + new Vector2 (0, statusBarHeight); // leave space for status bar
68  sizeOfUIScene = new Rect (min, max - min);
69  //Debug.Log ("Full Screen Size: " + sizeOfUIScene);
70 
71  leftScreen = Platform.instance.getScreenDimensions ( Screen.left );
72  rightScreen = Platform.instance.getScreenDimensions ( Screen.right );
73  centerScreen = Platform.instance.getScreenDimensions ( Screen.center );
74  }
75 
76  /*public Vector2 getStartupPosForWidget( GameObject widget )
77  {
78  Vector2 relPos = new Vector2 (0, -1);
79  Vector2 absPos = rel2Abs (relPos);
80  return clampToScreenSize( absPos, widget );
81  }
82 
83  public Vector2 rel2Abs( Vector2 relPos )
84  {
85  return new Vector2( relPos.x*UI., relPos.y) / UIScale;
86  //UICamera.targetTexture
87  }
88 
89  public Vector2 clampToScreenSize( Vector2 pos, GameObject widget )
90  {
91  Transform tf = widget.GetComponentInChildren<Canvas> ().transform;
92  Vector2 widgetMax = tf.GetComponent<RectTransform> ().rect.size * 0.5f;
93  Vector2 widgetMin = -widgetMax;
94  Vector2 clamped = new Vector2 (
95  Mathf.Clamp (pos.x, min.x - widgetMin.x, max.x - widgetMax.x),
96  Mathf.Clamp (pos.y, min.y - widgetMin.y, max.y - widgetMax.y)
97  );
98  return clamped;
99  }*/
100 
101  public void addWidget( Widget newWidget )
102  {
103  if (!widgets.Contains (newWidget)) {
104  widgets.Add (newWidget);
105  }
106  setWidgetPosition (newWidget, newWidget.layoutPosition);
107  }
108  public void removeWidget( Widget widget )
109  {
110  if (widgets.Contains (widget)) {
111  widgets.Remove (widget);
112  }
113  }
114 
115  public void setWidgetPosition( Widget widget, LayoutPosition newPosition )
116  {
117  if (!widgets.Contains (widget)) {
118  return;
119  }
120  RectTransform widgetRect = widget.GetComponent<RectTransform> ();
121 
122  Rect parentRect;
123  if (newPosition.screen == Screen.left)
124  parentRect = leftScreen;
125  else if (newPosition.screen == Screen.right)
126  parentRect = rightScreen;
127  else
128  parentRect = centerScreen;
129 
130  Vector2 newPos = new Vector2();
131  Vector2 newSize = new Vector2 ();
132  if (newPosition.alignHorizontal == AlignmentH.stretch) {
133  newPos.x = parentRect.center.x;
134  newSize.x = parentRect.width;
135  } else if (newPosition.alignHorizontal == AlignmentH.left) {
136  newPos.x = parentRect.min.x + widgetRect.rect.width * 0.5f;
137  newSize.x = widgetRect.rect.width;
138  } else if (newPosition.alignHorizontal == AlignmentH.right) {
139  newPos.x = parentRect.max.x - widgetRect.rect.width * 0.5f;
140  newSize.x = widgetRect.rect.width;
141  } else {
142  newPos.x = parentRect.center.x;
143  newSize.x = widgetRect.rect.width;
144  }
145  if (newPosition.alignVertical == AlignmentV.stretch) {
146  newPos.y = parentRect.center.y;
147  newSize.y = parentRect.height;
148  } else if (newPosition.alignVertical == AlignmentV.bottom) {
149  newPos.y = parentRect.min.y + widgetRect.rect.height * 0.5f;
150  newSize.y = widgetRect.rect.height;
151  } else if (newPosition.alignVertical == AlignmentV.top) {
152  newPos.y = parentRect.max.y - widgetRect.rect.height * 0.5f;
153  newSize.y = widgetRect.rect.height;
154  } else {
155  newPos.y = parentRect.center.y;
156  newSize.y = widgetRect.rect.height;
157  }
158 
159  //widgetRect.rect = new Rect (newPos, newSize);
160  widgetRect.anchoredPosition = newPos;
161  widgetRect.sizeDelta = newSize;
162 
163  // Handle highlighting if the widget was placed onto the active screen:
164  if (newPosition.screen == activeScreen) {
165  widget.highlight ();
166  } else {
167  widget.unHighlight ();
168  }
169  }
170 
171 
173  public void setLookAtPosition( Vector2 pos )
174  {
175  Vector2 pixelPos = sizeOfUIScene.min + new Vector2 (pos.x * sizeOfUIScene.width, pos.y * sizeOfUIScene.height);
176 
177  bool isInLeftScreen = false;
178  bool isInCenterScreen = false;
179  bool isInRightScreen = false;
180 
181  // Check into which screens the targeted point falls:
182  if (pixelPos.x >= leftScreen.min.x && pixelPos.x <= leftScreen.max.x) {
183  isInLeftScreen = true;
184  }
185  if (pixelPos.x >= centerScreen.min.x && pixelPos.x <= centerScreen.max.x) {
186  isInCenterScreen = true;
187  }
188  if (pixelPos.x >= rightScreen.min.x && pixelPos.x <= rightScreen.max.x) {
189  isInRightScreen = true;
190  }
191 
192  // If the point only falls into one single screen, activate that screen:
193  if (isInLeftScreen && ! isInCenterScreen && ! isInRightScreen) {
194  setActiveScreen ( Screen.left );
195  } else if (isInCenterScreen && ! isInLeftScreen && ! isInRightScreen) {
196  setActiveScreen (Screen.center);
197  } else if (isInRightScreen && ! isInLeftScreen && ! isInCenterScreen) {
198  setActiveScreen( Screen.right );
199  }
200  }
201 
202  public void setActiveScreen( Screen s )
203  {
204  activeScreen = s;
205  foreach( Widget w in widgets )
206  {
207  if (w.layoutScreen == s) {
208  w.highlight ();
209  } else {
210  w.unHighlight ();
211  }
212  }
213  }
214 
215  public Rect getStatusBarPosition()
216  {
217  Rect rect = new Rect (
218  0f,
219  -(sizeOfUIScene.height - statusBarHeight)*0.5f,
220  sizeOfUIScene.width,
221  statusBarHeight - 4f);
222  return rect;
223  }
224 
225  public void closeAllWidgets()
226  {
227  while (true) {
228  if (widgets.Count == 0)
229  break;
230 
231  // Disabling the widget's gameobject will call Widget.OnDisable, which removes
232  // the widget from the "widgets" list as well.
233  widgets [0].gameObject.SetActive (false);
234  }
235  }
236  }
237 }
void setLookAtPosition(Vector2 pos)