Ejemplo n.º 1
0
        private void RefreshSize(Message message, MessagePanel messagePanelForStyle)
        {
            if (message == null || message.MessageContent == null)
            {
                return;
            }
            if (disappearMessages.IndexOf(message, 0) != -1)
            {
                return;
            }

            RectTransform messageContentRect = message.MessageContent.GetComponent <RectTransform>();

            //we need to add a layoutelement the size of the panel
            LayoutElement messageContentLayout = message.MessageContent.GetComponent <LayoutElement>();

            if (messageContentLayout == null)
            {
                messageContentLayout = message.MessageContent.AddComponent <LayoutElement>();
            }
            messageContentLayout.preferredWidth  = messageContentRect.rect.width;
            messageContentLayout.preferredHeight = messageContentRect.rect.height;

            //force real size height on the innerback (because of scale)
            if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled)
            {
                messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredWidth  = message.MessageContent.GetComponent <RectTransform>().rect.width *messagePanelForStyle.InnerBack.localScale.x;
                messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredHeight = message.MessageContent.GetComponent <RectTransform>().rect.height *messagePanelForStyle.InnerBack.localScale.y;
            }
        }
Ejemplo n.º 2
0
        private void DestroyMessage(Message message)
        {
            // Debug.Log("DESTROYING MESSAGE " + message.StyleName);

            if (!message.DontDestroyContentOnDismiss)
            {
                Destroy(message.MessagePanel);
                Destroy(message.MessagePanel.gameObject);
            }
            else
            {
                if (message.MessageContent)
                {
                    message.MessageContent.transform.SetParent(null, false);


                    //NEW CODE TO FIX RESIZING////////////////////////////////
                    MessagePanel messagePanelForStyle = message.MessagePanel;
                    //set back correct size
                    if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled)
                    {
                        message.MessageContent.GetComponent <RectTransform>().sizeDelta = new Vector2(message.MessageContent.GetComponent <LayoutElement>().preferredWidth, message.MessageContent.GetComponent <LayoutElement>().preferredHeight);
                    }
                    //////////////////////////////////////////////////////////
                }
                // DOVirtual.DelayedCall(1f, () => Destroy(message.MessagePanel.gameObject));
                Destroy(message.MessagePanel.gameObject);
            }


            OnMessageDestroyed.Invoke(message, null);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Animate the ticker
        /// </summary>
        /// <param name="ticker"></param>
        private void AnimateTicker(Message ticker, MessagePanel messagePanel)
        {
            RectTransform tickerRect = ticker.MessagePanel.GetComponent <RectTransform>();

            ticker.MessagePanel.MessageStyle.StartPos = tickerRect.anchoredPosition;
            ticker.MessagePanel.MessageStyle.EndPos   = tickerRect.anchoredPosition;

            //get all same style ticker by group
            List <Message> allTickerSameStyle = currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == messagePanel.MessageStyle.GroupName).ToList();

            //get all order under to add ;)
            Vector2 addSize = new Vector2(0, 0);

            for (int i = 0; i < ticker.Order; i++)
            {
                Message checkTicker = allTickerSameStyle.Where(p => p.Order == i).LastOrDefault();

                addSize.x += checkTicker.MessagePanel.GetComponent <RectTransform>().sizeDelta.x;
                addSize.y += checkTicker.MessagePanel.GetComponent <RectTransform>().sizeDelta.y + checkTicker.MessagePanel.MessageStyle.PaddingHeightBetweenTicker;
            }



            //adding to the endpos the width of each other

            if (ticker.MessagePanel.MessageStyle.MessageAlign == MessageLayout.Vertical)
            {
                ticker.MessagePanel.MessageStyle.EndPos.y   -= addSize.y;
                ticker.MessagePanel.MessageStyle.StartPos.y -= addSize.y;
            }
            else
            {
                ticker.MessagePanel.MessageStyle.EndPos.x += addSize.x;
            }


            //x start
            switch (ticker.MessagePanel.MessageStyle.StartHorizontal)
            {
            case MessageHoriziontalLayout.Left:

                // ticker.MessagePanel.MessageStyle.StartPos.x = -ticker.MessagePanel.GetComponent<RectTransform>().sizeDelta.x;


                break;

            case MessageHoriziontalLayout.Center:

                ticker.MessagePanel.MessageStyle.StartPos.y = ticker.MessagePanel.MessageStyle.EndPos.y + ticker.MessagePanel.AddToStartPosition.y;


                break;

            case MessageHoriziontalLayout.Right:

                ticker.MessagePanel.MessageStyle.StartPos.x = ticker.MessagePanel.GetComponent <RectTransform>().sizeDelta.x + ticker.MessagePanel.AddToStartPosition.x;
                ticker.MessagePanel.MessageStyle.StartPos.y = ticker.MessagePanel.MessageStyle.EndPos.y + ticker.MessagePanel.AddToStartPosition.y;
                break;
            }

            //set start position
            tickerRect.anchoredPosition = ticker.MessagePanel.MessageStyle.StartPos;

            //do the motion, and oncomplete we wait
            tickerRect.DOAnchorPos(ticker.MessagePanel.MessageStyle.EndPos, ticker.MessagePanel.TransitionTime).OnComplete(() => WaitMessage(ticker)).SetId(ticker.TweenId);
        }
Ejemplo n.º 4
0
        private void SetContentInMessage(Message message, MessagePanel messagePanelForStyle)
        {
            if (message.MessageContent)
            {
                RectTransform messageContentRect = message.MessageContent.GetComponent <RectTransform>();

                //we need to add a layoutelement the size of the panel
                LayoutElement messageContentLayout = message.MessageContent.GetComponent <LayoutElement>();
                if (messageContentLayout == null)
                {
                    messageContentLayout = message.MessageContent.AddComponent <LayoutElement>();
                }
                messageContentLayout.preferredWidth  = messageContentRect.rect.width;
                messageContentLayout.preferredHeight = messageContentRect.rect.height;

                //resize to fit
                if (message.MessageContentResizeToFit)
                {
                    Vector2 messageSize = new Vector2(message.MessageContent.GetComponent <RectTransform>().rect.width, message.MessageContent.GetComponent <RectTransform>().rect.height);
                    Vector2 contentSize = new Vector2(messagePanelForStyle.InnerBack.rect.width, messagePanelForStyle.InnerBack.rect.height);

                    RectTransform test = messagePanelForStyle.InnerBack;

                    //correct scale factor
                    float goodScale = Math.Min(contentSize.x / messageSize.x, contentSize.y / messageSize.y);

                    message.MessageContent.GetComponent <RectTransform>().localScale = new Vector3(goodScale, goodScale, 1);
                }
                else
                {
                    message.MessageContent.GetComponent <RectTransform>().localScale = new Vector3(1, 1, 1);
                }



                //set parent
                message.MessageContent.transform.SetParent(messagePanelForStyle.InnerBack.transform, false);
                //activate it
                message.MessageContent.SetActive(true);


                //force real size height on the innerback (because of scale)
                if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled)
                {
                    messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredWidth  = message.MessageContent.GetComponent <RectTransform>().rect.width *messagePanelForStyle.InnerBack.localScale.x;
                    messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredHeight = message.MessageContent.GetComponent <RectTransform>().rect.height *messagePanelForStyle.InnerBack.localScale.y;
                }



                //stupid refresh
                List <LayoutGroup> keepList = new List <LayoutGroup>();
                //maybe force a refresh ?
                List <LayoutGroup> allLayout = messagePanelForStyle.InnerBack.transform.parent.GetComponentsInChildren <LayoutGroup>().ToList();
                foreach (LayoutGroup layout in allLayout)
                {
                    if (layout.enabled)
                    {
                        layout.enabled = false;
                        keepList.Add(layout);
                    }
                }

                //refresh layout ?
                messagePanelForStyle.InnerBack.transform.parent.gameObject.SetActive(false);
                messagePanelForStyle.InnerBack.transform.parent.gameObject.SetActive(true);
                messagePanelForStyle.InnerBack.transform.parent.GetComponentsInChildren <LayoutGroup>().ToList().ForEach(p => { if (p.enabled)
                                                                                                                                {
                                                                                                                                    p.enabled = false; p.enabled = true;
                                                                                                                                }
                                                                                                                                ; });

                keepList.ForEach(p => p.enabled = true);


                //weird test
                //message.MessagePanel.GetComponentsInChildren<LayoutGroup>().ToList().ForEach(p => { if (p.enabled) { p.enabled = false; p.enabled = true; }; });

                //resize after a certain time because unity is stupid
                DOVirtual.DelayedCall(0.01f, () => RefreshSize(message, messagePanelForStyle));
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Show message without passing by the queue
        /// </summary>
        public void ShowMessage(Message message)
        {
            //get the default Panel prefabs
            MessagePanel defaultPanelForStyle = Styles.Where(p => p.MessageStyle.StyleName == message.StyleName).Single();


            //check if max message, we return
            if (currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == defaultPanelForStyle.MessageStyle.GroupName).Count() >= defaultPanelForStyle.MessageStyle.MaxPanel && !message.ImmediateDispatch)
            {
                return;
            }

            //put in currentMessage
            waitingMessages.Remove(message);
            currentMessages.Add(message);

            if (!defaultPanelForStyle)
            {
                Debug.Log("Impossible to find style of the message in MessageManager");
                return;
            }

            //if mesage got  panel, we kill everything on it (for tooltips)
            if (message.MessagePanel)
            {
                if (message.MessagePanel.GetComponent <RectTransform>() != null)
                {
                    message.MessagePanel.GetComponent <RectTransform>().DOKill(true);
                }
            }

            //if message with same contnet is currently getting destroyed (esc fast) we need to kill it faster)
            Message disaparingMessageWithSameContent = disappearMessages.Where(p => p.MessageContent != null && p.MessageContent == message.MessageContent).LastOrDefault();

            if (disaparingMessageWithSameContent != null)
            {
                disaparingMessageWithSameContent.MessagePanel.GetComponent <CanvasGroup>().DOKill(true);
            }


            //create panel gameobject
            GameObject   messageGameObject    = (GameObject)Instantiate(defaultPanelForStyle.gameObject);
            MessagePanel messagePanelForStyle = messageGameObject.GetComponent <MessagePanel>();

            message.MessagePanel = messagePanelForStyle;

            messageGameObject.SetActive(true);


            //kill tween on complete
            MessagecameraTween.Kill(false);
            MessagecameraTween = null;

            //maybe different animaiton ?

            //animate alpha
            //if no canvas group, add it
            CanvasGroup canvasGroup = messagePanelForStyle.GetComponent <CanvasGroup>();

            if (canvasGroup == null)
            {
                canvasGroup = messagePanelForStyle.gameObject.AddComponent <CanvasGroup>();
            }
            canvasGroup.interactable = true;
            canvasGroup.alpha        = 0f;

            canvasGroup.DOKill();
            canvasGroup.DOFade(1f, messagePanelForStyle.TransitionTime).SetUpdate(true);

            //keep when it appeared
            message.AppearTime = DateTime.Now;



            //get next available order for style
            List <Message> allMessageSameType = currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == message.MessagePanel.MessageStyle.GroupName).ToList();

            //get first available order
            int messageOrder = 0;

            while (allMessageSameType.Where(p => p.Order == messageOrder).Count() != 0)
            {
                messageOrder++;
            }
            message.Order = messageOrder;

            //get layer
            MessageLayer useLayer = AllLayers.Where(p => p.Name == message.LayerName).SingleOrDefault();

            //adding it to correct parent
            //set popup on the canvas of MessageManager
            if (defaultPanelForStyle.MessageStyle.ParentCanvas != null)
            {
                if (defaultPanelForStyle.MessageStyle.ParentRectTransform != null)
                {
                    messageGameObject.transform.SetParent(defaultPanelForStyle.MessageStyle.ParentRectTransform, false);
                }
                else
                {
                    messageGameObject.transform.SetParent(defaultPanelForStyle.MessageStyle.ParentCanvas.transform, false);
                }
            }
            else
            {
                messageGameObject.transform.SetParent(useLayer.Layer.transform, false);
            }


            //test
            if (useLayer != null)
            {
                //PROBLEM WITH THAT
                if (useLayer.OverwriteCanvas)
                {
                    messagePanelForStyle.gameObject.AddComponent <GraphicRaycaster>();

                    if (messagePanelForStyle.gameObject.GetComponent <Canvas>() == null)
                    {
                        messagePanelForStyle.gameObject.AddComponent <Canvas>();
                    }


                    Canvas newCanvas = messagePanelForStyle.gameObject.GetComponent <Canvas>();
                    newCanvas.overrideSorting          = true;
                    newCanvas.additionalShaderChannels = AdditionalCanvasShaderChannels.Normal | AdditionalCanvasShaderChannels.Tangent | AdditionalCanvasShaderChannels.TexCoord1;
                    newCanvas.sortingLayerName         = useLayer.OverwriteCanvasSortingLayer;

                    newCanvas.sortingOrder = 1;
                }
            }

            //testing out better fill
            //set information
            if (messagePanelForStyle.Title != null)
            {
                if (message.Description != null && message.Title.StartsWith("%") && message.Title.EndsWith("%"))
                {
                    message.Title = ResourceManager.GetValue(message.Title.Substring(1, message.Title.Length - 2));
                    message.Title = message.Title.Replace(@"\n", Environment.NewLine);
                }

                if (message.Title == "")
                {
                    messagePanelForStyle.Title.gameObject.SetActive(false);
                }
                else
                {
                    messagePanelForStyle.Title.gameObject.SetActive(true);
                    messagePanelForStyle.Title.text = message.Title;
                }
            }

            //description
            if (messagePanelForStyle.Description != null)
            {
                if (message.Description != null && message.Description.StartsWith("%") && message.Description.EndsWith("%"))
                {
                    message.Description = ResourceManager.GetValue(message.Description.Substring(1, message.Description.Length - 2));
                    message.Description = message.Description.Replace(@"\n", Environment.NewLine);
                }

                if (message.Description == null || message.Description == "")
                {
                    messagePanelForStyle.Description.gameObject.SetActive(false);
                }
                else
                {
                    messagePanelForStyle.Description.gameObject.SetActive(true);
                    messagePanelForStyle.Description.text = message.Description;
                }
            }


            //add all button////////////////////////////
            if (message.AllButtons.Count > 0)
            {
                for (int i = 0; i < message.AllButtons.Count; i++)
                {
                    Button myButton;

                    if (message.AllButtonsPrefabs.Count > i && message.AllButtonsPrefabs[i] != null)
                    {
                        myButton = message.AllButtonsPrefabs[i].GetComponent <Button>();
                        message.AllButtonsPrefabs[i].SetActive(true);
                        myButton.transform.SetParent(messagePanelForStyle.Button.transform.parent, false);

                        //if hide original button if it s the first button
                        if (i == 0)
                        {
                            messagePanelForStyle.Button.gameObject.SetActive(false);
                        }
                    }
                    else if (i == 0)
                    {
                        myButton = messagePanelForStyle.Button;
                    }
                    else
                    {
                        myButton = (Button)Instantiate(messagePanelForStyle.Button, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
                        myButton.transform.SetParent(messagePanelForStyle.Button.transform.parent, false);
                    }

                    //set text on button
                    myButton.GetComponentInChildren <TextMeshProUGUI>().text = message.AllButtons[i].ToUpper();

                    //set
                    myButton.onClick.AddListener(() => MessageButtonClicked(message, myButton.GetComponentInChildren <TextMeshProUGUI>().text));

                    message.AllButtonsObject.Add(myButton);
                }
            }
            else
            {
                if (messagePanelForStyle.Button)
                {
                    messagePanelForStyle.Button.transform.parent.gameObject.SetActive(false);
                }
                //Destroy(messagePanelForStyle.Button.transform.parent.gameObject);
            }
            //////////////////////////////////////////////



            switch (defaultPanelForStyle.MessageStyle.Type)
            {
            case MessageType.Popup:

                //show back
                DOTween.Kill(useLayer.Back, true);
                useLayer.Back.gameObject.SetActive(true);
                useLayer.Back.DOFade(useLayer.BackAlpha, messagePanelForStyle.TransitionTime).SetUpdate(true);

                //resize innerBack if no button
                if (message.AllButtons.Count == 0)
                {
                    //TODO : check if needed
                    //messagePanelForStyle.InnerBack.offsetMin = new Vector2(messagePanelForStyle.InnerBack.offsetMin.x, messagePanelForStyle.InnerBack.offsetMin.x);
                }

                //check if there is a inner message object
                SetContentInMessage(message, messagePanelForStyle);



                //problem with textureatlas here
                if (messagePanelForStyle.Icon && message.Icon)
                {
                    messagePanelForStyle.Icon.sprite = message.Icon;
                }
                else
                {
                    if (messagePanelForStyle.Icon)
                    {
                        GameObject.Destroy(messagePanelForStyle.Icon);
                    }

                    //hide image if no icon
                    messagePanelForStyle.HideIfNoIcon.ToList().ForEach(p => p.enabled = false);
                }

                if (message.IconGameObject != null)
                {
                    //message.IconGameObject = GameObject.Instantiate(message.IconGameObject);
                    message.IconGameObject.transform.SetParent(messagePanelForStyle.Icon.transform.parent, false);
                    //message.IconGameObject.transform.SetParent(messagePanelForStyle.Icon.transform.parent);
                }



                BlurCamera(true);

                //add close behaviour if there is a close button (auto-close)
                if (messagePanelForStyle.CloseButton && message.ShowClose)
                {
                    messagePanelForStyle.CloseButton.onClick.AddListener(() => MessageButtonClicked(message, ""));
                }
                else if (messagePanelForStyle.CloseButton && !message.ShowClose)
                {
                    messagePanelForStyle.CloseButton.gameObject.SetActive(false);
                }

                //invoke open of the message
                OnMessageOpen.Invoke(message, null);

                //pause
                IsPaused = true;

                //we stop ticker
                StopTicker();

                break;



            case MessageType.Ticker:


                //problem with textureatlas here
                if (messagePanelForStyle.Icon && message.Icon)
                {
                    messagePanelForStyle.Icon.sprite = message.Icon;
                }
                else
                {
                    //maybe remove icon auto??
                    messagePanelForStyle.Icon.DOFade(0, 0).SetUpdate(true);
                }

                //animate it
                // DOVirtual.DelayedCall(0.1f, () => AnimateTicker(message));
                AnimateTicker(message, messagePanelForStyle);

                //invoke
                OnTickerOpen.Invoke(messagePanelForStyle, message);

                //invoke onOpen too
                message.MessagePanel.OnOpen.Invoke(message.MessagePanel, message);

                break;


            case MessageType.Tooltip:

                Debug.Log("APPEAR TOOLTIP " + message.StyleName);

                //be sure to kill everything on the tooltip
                message.MessagePanel.GetComponent <RectTransform>().DOKill();

                //show the tooltip at correct position

                //((MessageTooltip)message).MessagePanel.gameObject.SetActive(false);

                SetContentInMessage(message, messagePanelForStyle);

                ((MessageTooltip)message).Place(MessageCamera);

                // DOVirtual.DelayedCall(0.25f, () => ((MessageTooltip)message).Place(MessageCamera));


                break;
            }


            message.MessageAppear.Invoke(message, string.Empty);



            CheckCamera();
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Add message style manually
 /// </summary>
 /// <param name="style"></param>
 public void AddStyles(MessagePanel style)
 {
     Styles.Add(style);
 }