diff --git a/Assets/ButtonTriggerViewTransition.cs b/Assets/ButtonTriggerViewTransition.cs new file mode 100644 index 0000000..564e8aa --- /dev/null +++ b/Assets/ButtonTriggerViewTransition.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Lean.Gui; +using Raindrop; +using Raindrop.ServiceLocator; +using Raindrop.Services; +using UnityEngine; + +public class ButtonTriggerViewTransition : MonoBehaviour +{ + public CanvasType canvasTypeToPush; + public bool popCurrent; + private void Start() + { + this.GetComponent().OnClick.AddListener(OnClick); + } + + private void OnClick() + { + if (popCurrent) + { + ServiceLocator.Instance.Get().canvasManager.PopAndPush(canvasTypeToPush); + } else + { + ServiceLocator.Instance.Get().canvasManager.Push(canvasTypeToPush); + } + } +} diff --git a/Assets/ButtonTriggerViewTransition.cs.meta b/Assets/ButtonTriggerViewTransition.cs.meta new file mode 100644 index 0000000..4b08099 --- /dev/null +++ b/Assets/ButtonTriggerViewTransition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2c84a856e3e4e442822ff4c7870a1c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Raindrop/ChatManager.cs b/Assets/Raindrop/ChatManager.cs deleted file mode 100644 index a73c215..0000000 --- a/Assets/Raindrop/ChatManager.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -// Radegast Metaverse Client -// Copyright (c) 2009-2014, Radegast Development Team -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of the application "Radegast", nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// $Id$ -// - -using System; -using OpenMetaverse; -using System.Collections.Generic; -using Raindrop.Services; - -namespace Raindrop -{ - //holds the chats in memory. functions as the model layer. - // equivalent to a chat window with all the tabs and chats the user is chatting in. - public class ChatManager - { - public ChatTextManager localChatManager { get; private set; } - - RaindropInstance instance; - GridClient client { get { return instance.Client; } } - - //this is the main chat. - private string mainChatStringReference; - - - - public ChatManager(RaindropInstance instance, ITextPrinter textPrinter) - { - this.instance = instance; - TextPrinter = textPrinter; - - UnityEngine.Debug.Log("chatmanager being constructed"); - //start local chat if connected to localsim - instance.Client.Network.SimConnected += Network_SimConnected; - instance.Client.Network.Disconnected += Network_Disconnected; - - //make the chat manager. (seems like we destroy it on disconnection.) - localChatManager = new ChatTextManager(instance, TextPrinter); - - //subscribe to localchat received event - // localChatManager.ChatLineAdded += LocalChatManager_ChatLineAdded; - } - - public ITextPrinter TextPrinter { get; set; } - - public void Dispose() - { - localChatManager = null; - } - - private void Network_Disconnected(object sender, OpenMetaverse.DisconnectedEventArgs e) - { - Logger.Log("Network_Disconnected", Helpers.LogLevel.Info); - - //wind down chatmanager - localChatManager.Dispose(); - localChatManager = null; - } - - private void Network_SimConnected(object sender, OpenMetaverse.SimConnectedEventArgs e) - { - //create local chat. - Logger.Log("Simulator Connected", Helpers.LogLevel.Info); - - if (localChatManager == null) - localChatManager = new ChatTextManager(instance, TextPrinter); - Logger.Log("creating local chat in memory.", Helpers.LogLevel.Info); - - printToMainChat("Simulator Connected"); - } - - public void printToMainChat(string message) - { - //print success msg. - ChatBufferItem line = new ChatBufferItem( - DateTime.Now, - string.Empty, - UUID.Zero, - message, - ChatBufferTextStyle.Normal - ); - UnityMainThreadDispatcher.Instance().Enqueue(() => - { - //process printing in main thread. - localChatManager.ProcessBufferItem(line, true); - }); - } - } -} \ No newline at end of file diff --git a/Assets/Raindrop/ChatPresenterManager.cs b/Assets/Raindrop/ChatPresenterManager.cs new file mode 100644 index 0000000..872fb92 --- /dev/null +++ b/Assets/Raindrop/ChatPresenterManager.cs @@ -0,0 +1,109 @@ + + +using System; +using OpenMetaverse; +using System.Collections.Generic; +using Raindrop.Services; +using UnityEngine; +using Logger = OpenMetaverse.Logger; + +namespace Raindrop +{ + //holds the chats in memory. functions as the model layer. + // equivalent to a chat window with all the tabs and chats the user is chatting in. + public class ChatPresenterManager + { + public LocalChatTextManager LocalLocalChat { get; private set; } + public List IMChats { get; private set; } + + RaindropInstance instance; + + public ChatPresenterManager(RaindropInstance instance, ITextPrinter textPrinter) + { + UnityEngine.Debug.Log("chatmanager being constructed"); + + if (instance == null) + Debug.LogError("instance is not avaailbe in chat prensetermgr"); + if (textPrinter == null) + Debug.LogError("textPrinter is not avaailbe in chat prensetermgr"); + this.instance = instance; + TextPrinter = textPrinter; + + RegisterClientEvents(instance); + + //make the chat manager. (seems like we destroy it on disconnection.) + LocalLocalChat = new LocalChatTextManager(instance, TextPrinter); + IMChats = new List(); + } + + private void RegisterClientEvents(RaindropInstance instance) + { + instance.Client.Network.SimConnected += Network_SimConnected; + instance.Client.Network.Disconnected += Network_Disconnected; + LocalLocalChat.ChatLineAdded += LocalChatManager_ChatLineAdded; + } + + public ITextPrinter TextPrinter { get; set; } + + public void Dispose() + { + LocalLocalChat = null; + IMChats = new List(); + } + + private void Network_Disconnected(object sender, OpenMetaverse.DisconnectedEventArgs e) + { + Logger.Log("Network_Disconnected", Helpers.LogLevel.Info); + + //wind down chatmanager + LocalLocalChat.Dispose(); + LocalLocalChat = null; + } + + private void LocalChatManager_ChatLineAdded(object sender, ChatLineAddedArgs chatLineAddedArgs) + { + Logger.Log("new message in local chat!", Helpers.LogLevel.Info); + + if (LocalLocalChat == null) + LocalLocalChat = new LocalChatTextManager(instance, TextPrinter); + Logger.Log("creating local chat in memory.", Helpers.LogLevel.Info); + + printToMainChat("todo"); + } + + private void Network_SimConnected(object sender, OpenMetaverse.SimConnectedEventArgs e) + { + //create local chat. + Logger.Log("Simulator Connected", Helpers.LogLevel.Info); + + if (LocalLocalChat == null) + LocalLocalChat = new LocalChatTextManager(instance, TextPrinter); + Logger.Log("creating local chat in memory.", Helpers.LogLevel.Info); + + printToMainChat("Simulator Connected"); + + //we experiment to start a IM with nuki. + UUID agentID; //todo. + // ah ok, so it seems use (A xor B) = C , where A is us and B is target, because this represents a link between us. + // we send C to let the lindens know its between A and B. abit strange TBH. + IMChats.Add(new IMTextManager(instance, null,IMTextManagerType.Agent, instance.Client.Self.AgentID ^ agentID, "cutie nuki")); + } + + public void printToMainChat(string message) + { + //print success msg. + ChatBufferItem line = new ChatBufferItem( + DateTime.Now, + string.Empty, + UUID.Zero, + message, + ChatBufferTextStyle.Normal + ); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + //process printing in main thread. + LocalLocalChat.ProcessBufferItem(line, true); + }); + } + } +} \ No newline at end of file diff --git a/Assets/Raindrop/ChatManager.cs.meta b/Assets/Raindrop/ChatPresenterManager.cs.meta similarity index 100% rename from Assets/Raindrop/ChatManager.cs.meta rename to Assets/Raindrop/ChatPresenterManager.cs.meta diff --git a/Assets/Raindrop/Core/ChatTextManager.cs b/Assets/Raindrop/Core/LocalChatTextManager.cs similarity index 74% rename from Assets/Raindrop/Core/ChatTextManager.cs rename to Assets/Raindrop/Core/LocalChatTextManager.cs index 875f3f1..a7f817e 100644 --- a/Assets/Raindrop/Core/ChatTextManager.cs +++ b/Assets/Raindrop/Core/LocalChatTextManager.cs @@ -1,27 +1,6 @@ -/** - * Radegast Metaverse Client - * Copyright(c) 2009-2014, Radegast Development Team - * Copyright(c) 2016-2020, Sjofn, LLC - * All rights reserved. - * - * Radegast is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program.If not, see. - */ - using System; using System.Collections.Generic; using System.Linq; -//using System.Drawing; using System.Text; using Raindrop.Netcom; using OpenMetaverse; @@ -36,14 +15,12 @@ using Raindrop.Core; namespace Raindrop { - //if you pass a refernce to the text box, this class will print to it. - - //class that functions as model. holds data on the local chat. - public class ChatTextManager : IDisposable + //This class orchestrates the printing into a text box. + //it has a text buffer to hold data (optional). + public class LocalChatTextManager : IDisposable { private Regex chatRegex = new Regex(@"^/(\d+)\s*(.*)", RegexOptions.Compiled); private int chatPointer; - public event EventHandler ChatLineAdded; private RaindropInstance instance; @@ -55,25 +32,27 @@ namespace Raindrop { return textBuffer; } - + public ITextPrinter TextPrinter { get; set; } + private bool showTimestamps; //public static Dictionary fontSettings = new Dictionary(); - public ChatTextManager(RaindropInstance instance, ITextPrinter textPrinter) + public LocalChatTextManager(RaindropInstance instance, ITextPrinter textPrinter) { TextPrinter = textPrinter; textBuffer = new List(); // a pipe into the string. - this.instance = instance; InitializeConfig(); - this.localChat = localChat; // Callbacks netcom.ChatReceived += new EventHandler(netcom_ChatReceived); netcom.ChatSent += new EventHandler(netcom_ChatSent); netcom.AlertMessageReceived += new EventHandler(netcom_AlertMessageReceived); + client.Self.TeleportProgress += new EventHandler(Self_TeleportProgress); + + PrintStartupMessage(); } public void Dispose() @@ -81,41 +60,18 @@ namespace Raindrop netcom.ChatReceived -= new EventHandler(netcom_ChatReceived); netcom.ChatSent -= new EventHandler(netcom_ChatSent); netcom.AlertMessageReceived -= new EventHandler(netcom_AlertMessageReceived); + client.Self.TeleportProgress -= new EventHandler(Self_TeleportProgress); } private void InitializeConfig() { Settings s = instance.GlobalSettings; - - //var serializer = new JavaScriptSerializer(); - + if (s["chat_timestamps"].Type == OSDType.Unknown) { s["chat_timestamps"] = OSD.FromBoolean(true); } - //if (s["chat_fonts"].Type == OSDType.Unknown) - //{ - // try - // { - // s["chat_fonts"] = JsonConvert.SerializeObject(Settings.DefaultFontSettings); - // } - // catch (Exception ex) - // { - // //System.Windows.Forms.MessageBox.Show("Failed to save default font settings: " + ex.Message); - // Debug.LogError("Failed to save default font settings: " + ex.Message); - // instance.MainCanvas.modals.showSimpleModalBoxWithActionBtn("Failed to save default font settings: ", ex.Message, "OK"); - // } - //} - - //try - //{ - // fontSettings = serializer.Deserialize>(s["chat_fonts"]); - //} - //catch (Exception ex) - //{ - // System.Windows.Forms.MessageBox.Show("Failed to read chat font settings: " + ex.Message); - //} - + showTimestamps = s["chat_timestamps"].AsBoolean(); s.OnSettingChanged += new Settings.SettingChangedCallback(s_OnSettingChanged); @@ -128,19 +84,15 @@ namespace Raindrop showTimestamps = e.Value.AsBoolean(); ReprintAllText(); } - //else if(e.Key == "chat_fonts") - //{ - // try - // { - // var serializer = new JavaScriptSerializer(); - // fontSettings = serializer.Deserialize>(e.Value); - // } - // catch (Exception ex) - // { - // System.Windows.Forms.MessageBox.Show("Failed to read new font settings: " + ex.Message); - // } - // ReprintAllText(); - //} + + } + + void Self_TeleportProgress(object sender, TeleportEventArgs e) + { + if (e.Status == TeleportStatus.Progress || e.Status == TeleportStatus.Finished) + { + TextPrinter.PrintTextLine("teleport..."); + } } private void netcom_ChatSent(object sender, ChatSentEventArgs e) @@ -174,20 +126,18 @@ namespace Raindrop ChatBufferTextStyle.StartupTitle); ChatBufferItem ready = new ChatBufferItem( - DateTime.Now, "", UUID.Zero, "Ready.", ChatBufferTextStyle.StatusBlue); + DateTime.Now, "", UUID.Zero, "Local chat Ready.", ChatBufferTextStyle.StatusBlue); ProcessBufferItem(title, true); ProcessBufferItem(ready, true); } private Object SyncChat = new Object(); - private string localChat; - - // put the buffer item into the chat string. + // append the buffer item into the chat. + // optionally, append buffer item into buffer list. public void ProcessBufferItem(ChatBufferItem item, bool addToBuffer) { - // tell the world that a chat line is added. ChatLineAdded?.Invoke(this, new ChatLineAddedArgs(item)); lock (SyncChat) @@ -201,14 +151,10 @@ namespace Raindrop } } - public ITextPrinter TextPrinter { get; set; } //process sending-out of local chat internal void ProcessChatInput(string input, ChatType type) { - - //TextPrinter.ClearText(); - string msg; msg = input.Length >= 1000 ? input.Substring(0, 1000) : input; //msg = msg.Replace(ChatInputBox.NewlineMarker, Environment.NewLine); @@ -227,28 +173,14 @@ namespace Raindrop msg = m.Groups[2].Value; } - //if (instance.CommandsManager.IsValidCommand(msg)) - //{ - // instance.CommandsManager.ExecuteCommand(msg); - //} - //else - //{ - #region RLV - - #endregion - var processedMessage = GestureManager.Instance.PreProcessChatMessage(msg).Trim(); if (!string.IsNullOrEmpty(processedMessage)) { netcom.ChatOut(processedMessage, type, ch); } - //} - } - - - + //Used only for non-public chat private void ProcessOutgoingChat(ChatSentEventArgs e) { @@ -302,16 +234,6 @@ namespace Raindrop || (me.Type == MuteType.ByName && me.Name == e.FromName) // Object muted by name )) return; -// if (instance.RLV.Enabled && e.Message.StartsWith("@")) -// { -// instance.RLV.TryProcessCMD(e); -//#if !DEBUG -// if (!instance.RLV.EnabledDebugCommands) { -// return; -// } -//#endif -// } - ChatBufferItem item = new ChatBufferItem {ID = e.SourceID, RawMessage = e}; StringBuilder sb = new StringBuilder(); @@ -404,9 +326,10 @@ namespace Raindrop sb = null; } + //reprint all the text in the printer. public void ReprintAllText() { - //TextPrinter.ClearText(); + TextPrinter.ClearText(); foreach (ChatBufferItem item in textBuffer) { @@ -418,8 +341,6 @@ namespace Raindrop { textBuffer.Clear(); } - - //public ITextPrinter TextPrinter { get; set; } } public class ChatLineAddedArgs : EventArgs diff --git a/Assets/Raindrop/Core/ChatTextManager.cs.meta b/Assets/Raindrop/Core/LocalChatTextManager.cs.meta similarity index 100% rename from Assets/Raindrop/Core/ChatTextManager.cs.meta rename to Assets/Raindrop/Core/LocalChatTextManager.cs.meta diff --git a/Assets/Raindrop/UI/CanvasHelpers/CanvasManager.cs b/Assets/Raindrop/UI/CanvasHelpers/CanvasManager.cs index d8cf0cd..3c86e5e 100644 --- a/Assets/Raindrop/UI/CanvasHelpers/CanvasManager.cs +++ b/Assets/Raindrop/UI/CanvasHelpers/CanvasManager.cs @@ -1,6 +1,5 @@ using Raindrop; using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using Raindrop.ServiceLocator; @@ -44,30 +43,27 @@ public class CanvasManager : MonoBehaviour public void resetToInitialScreen() { - if (! getEulaAcceptance()) + if (! GetEulaAcceptance()) { canvasControllerList.ForEach(x => x.gameObject.SetActive(false)); - pushCanvas(CanvasType.Eula); + Push(CanvasType.Eula); } else { canvasControllerList.ForEach(x => x.gameObject.SetActive(false)); - pushCanvas(main); + Push(main); } } - private bool getEulaAcceptance() + private bool GetEulaAcceptance() { if (ServiceLocator.Instance.Get().GlobalSettings["EulaAccepted"]) { - Debug.Log("User has already accepted the EULA"); return true; } else { - Debug.Log("User has NOT accepted the EULA"); return false; - } } @@ -95,25 +91,21 @@ public class CanvasManager : MonoBehaviour return CanvasType.UNKNOWN; } - public void pushCanvas(string _type) - { - pushCanvasWithOrWithoutPop(_type, false); - } - //isPopCurrentActiveCanvas true will pop the current top canvas and then push the new desired one. - public void pushCanvasWithOrWithoutPop(string _type, bool isPopCurrentActiveCanvas) + //pop current, then push the desired canvas. + public void PopAndPush(CanvasType type) { - CanvasType theCanvasType = getCanvasTypeFromString(_type); - if (theCanvasType ==CanvasType.UNKNOWN) - { - Debug.LogError("unable to get the canvas of identifer: "+ _type); - } - - if (isPopCurrentActiveCanvas) - { - popCanvas(); - } - pushCanvas(theCanvasType); + PopCanvas(); + Push(type); + + // CanvasType theCanvasType = getCanvasTypeFromString(_type); + // if (theCanvasType ==CanvasType.UNKNOWN) + // { + // Debug.LogError("unable to get the canvas of identifer: "+ _type); + // } + // + // popCanvas(); + // pushCanvas(theCanvasType); } // pop the current login screen, and push the game view. This is for viewing chats offline. @@ -124,43 +116,38 @@ public class CanvasManager : MonoBehaviour { activeCanvasStack.Pop(); } - pushCanvasWithOrWithoutPop("Game", false); + PopAndPush(CanvasType.Game); } - - - public void pushCanvas(CanvasType _type) + + public void Push(CanvasType type) { + //deactivate present canvas if (activeCanvasStack.Count() != 0) { var lastActiveCanvas = activeCanvasStack.Peek(); - //i think the old canvas will essentially be 'frozen in time' lastActiveCanvas.gameObject.SetActive(false); } - CanvasIdentifier desiredCanvas = canvasControllerList.Find(x => x.canvasType == _type); + //find the new canvas to push. + CanvasIdentifier desiredCanvas = canvasControllerList.Find(x => x.canvasType == type); if (desiredCanvas != null) { desiredCanvas.gameObject.SetActive(true); activeCanvasStack.Push (desiredCanvas); } - else { Debug.LogWarning("The desired canvas was not found!"); } + else { Debug.LogWarning("The desired canvas was not found!" + desiredCanvas.ToString()); } } - public void popCanvas() + public void PopCanvas() { - if (activeCanvasStack.Count() == 0) + var topCanvas = activeCanvasStack.Peek(); + if (! topCanvas) { Debug.LogWarning("tried to pop empty canvas stack."); return; } - var lastActiveCanvas = activeCanvasStack.Peek(); - if (lastActiveCanvas != null) - { - lastActiveCanvas.gameObject.SetActive(false); //this lince causes error, as the function was called from the login thread! - activeCanvasStack.Pop(); - } - - + topCanvas.gameObject.SetActive(false); //this lince causes error, as the function was called from the login thread! + activeCanvasStack.Pop(); } } diff --git a/Assets/Raindrop/UI/chat/ChatPresenter.cs b/Assets/Raindrop/UI/chat/ChatPresenter.cs index 05ba8c3..610228a 100644 --- a/Assets/Raindrop/UI/chat/ChatPresenter.cs +++ b/Assets/Raindrop/UI/chat/ChatPresenter.cs @@ -14,17 +14,31 @@ using TMPro; using System.Text.RegularExpressions; using Raindrop.Core; using Raindrop.Services; +using UnityEngine.Serialization; using Quaternion = UnityEngine.Quaternion; using Vector3 = UnityEngine.Vector3; -//view(unitytext) -- presenter(this) -- controller(this?) -- model (raindropinstance singleton) +//view(unitytext) -- presenter(this) -- controller(this?) -- model (raindropinstance singleton) +//5_jan_2022 : view(unity UI) --has a component--> chatpresenter(this, monobehavior) +// -> unityPresenterManager(not monobehavior) +// -> chattextmaanager(seems to handle all the local chat printing and events.) +// -> chattextprinter(monobehavior. depedency injected all the way down from root.) namespace Raindrop.Presenters { //this class is attached to the chatview gameobject. //it launches the manager that takes care of incoming and outgoing chats. public class ChatPresenter : MonoBehaviour { + /* +---------------------------+ + * | Local ^ | [user1] Yo! | + * | IM 1 | | [user2] oh hey | + * | IM 2 | | ... | + * | | |____________ ____| + * | v | reply... |SEND| + * +-------------------------+ + */ + //left pane: scrollable list of chats. //right pane: the contents of the selected chat in the left pane.+ // input bar of the text to send to said chat. @@ -33,16 +47,9 @@ namespace Raindrop.Presenters private RaindropNetcom netcom { get { return instance.Netcom; } } private GridClient client => instance.Client; - bool Active => instance.Client.Network.Connected; - private ChatManager chatManager; - - public readonly Dictionary agentSimHandle = new Dictionary(); - private static readonly string LOCALCHATTITLE = "Local Chat"; - - public int selectedChatIdx = -1; //-1 means public chat - + private ChatPresenterManager _chatPresenterManager; #region references to UI elements [Tooltip("button to close the chat view")] @@ -51,36 +58,25 @@ namespace Raindrop.Presenters public Button SendButton; [Tooltip("list of chats. buttons.")] - public GameObject ChatButtonContainer; + public GameObject ChatsListRoot; public List ChatButtons; - //public GameObject SelectedButton; - [Tooltip("user types here.")] + [Tooltip("user input field")] public TMP_InputField ChatInputField; - [Tooltip("show the current chat the user is viewing")] + [Tooltip("contents of currently-selected chat")] public TMP_Text ChatBox; - //the printer that is printing into the big chat box. + [Tooltip("chatbox's printer component")] public TMPTextFieldPrinter localChatPrinter; #endregion #region internal representations - - - private List chatTitles= new List - { - LOCALCHATTITLE - }; - private string msgtext; + private string inputString; public GameObject buttonPrefab; - - #endregion - - // Use this for initialization void Start() { CloseButton.onClick.AsObservable().Subscribe(_ => OnCloseBtnClick()); //when clicked, runs this method. @@ -88,189 +84,58 @@ namespace Raindrop.Presenters ChatInputField.onValueChanged.AsObservable().Subscribe(_ => OnInputChanged(_)); //change username property. RegisterClientEvents(client); - - //check if printer is attached to textbox. else attach it. - localChatPrinter = ChatBox.gameObject.GetComponent(); - if (!localChatPrinter) - { - localChatPrinter = ChatBox.gameObject.AddComponent(); - //OpenMetaverse.Logger.Log("failed to make the tmp_printer component to the tmp textbox.", Helpers.LogLevel.Error); - } - chatManager = new ChatManager(instance, localChatPrinter); - - // chatManager.localChatManager.ChatLineAdded += LocalChatManager_ChatLineAdded; - - //startChat(true); + _chatPresenterManager = new ChatPresenterManager(instance, localChatPrinter); + + AddChatTabToListOfChats("localChat"); } - // private void LocalChatManager_ChatLineAdded(object sender, ChatLineAddedArgs e) - // { - // //new message in local chat! print it. - // ChatBufferItem item = e.Item; - // runPrinterOnItem(tmp_printer, item); - // } - - //id relative to the list. -1 means local. 0 means others. - public void setShowingChat(int id) + //append another chat to the chat-list. + public void AddChatTabToListOfChats(string name) { - if (id == -1) - { - //print everything in text buffer list. - List x = chatManager.localChatManager.getChatBuffer(); - // runPrinterOnList(tmp_printer, x, 0,20); //print the selected range into the UI - } - - } - // - // public void runPrinterOnItem(TMPTextFieldPrinter TextPrinter, ChatBufferItem item) - // { - // //ChatBufferItem item = x[i]; - // - // if (/*showTimestamps*/ true) - // { - // //if(fontSettings.ContainsKey("Timestamp")) - // //{ - // // var fontSetting = fontSettings["Timestamp"]; - // // TextPrinter.ForeColor = fontSetting.ForeColor; - // // TextPrinter.BackColor = fontSetting.BackColor; - // // TextPrinter.Font = fontSetting.Font; - // // TextPrinter.PrintText(item.Timestamp.ToString("[HH:mm] ")); - // //} - // //else - // //{ - // //TextPrinter.ForeColor = SystemColors.GrayText; - // //TextPrinter.BackColor = Color.Transparent; - // //TextPrinter.Font = Settings.FontSetting.DefaultFont; - // TextPrinter.PrintText(item.Timestamp.ToString("[HH:mm] ")); - // //} - // } - // - // //if(fontSettings.ContainsKey("Name")) - // //{ - // // var fontSetting = fontSettings["Name"]; - // // TextPrinter.ForeColor = fontSetting.ForeColor; - // // TextPrinter.BackColor = fontSetting.BackColor; - // // TextPrinter.Font = fontSetting.Font; - // //} - // //else - // //{ - // //TextPrinter.ForeColor = SystemColors.WindowText; - // //TextPrinter.BackColor = Color.Transparent; - // //TextPrinter.Font = Settings.FontSetting.DefaultFont; - // //} - // - // if (item.Style == ChatBufferTextStyle.Normal && item.ID != UUID.Zero && instance.GlobalSettings["av_name_link"]) - // { - // TextPrinter.InsertLink(item.From, $"secondlife:///app/agent/{item.ID}/about"); - // } - // else - // { - // TextPrinter.PrintText(item.From); - // } - // - // //if(fontSettings.ContainsKey(item.Style.ToString())) - // //{ - // // var fontSetting = fontSettings[item.Style.ToString()]; - // // TextPrinter.ForeColor = fontSetting.ForeColor; - // // TextPrinter.BackColor = fontSetting.BackColor; - // // TextPrinter.Font = fontSetting.Font; - // //} - // //else - // //{ - // // TextPrinter.ForeColor = SystemColors.WindowText; - // // TextPrinter.BackColor = Color.Transparent; - // // TextPrinter.Font = Settings.FontSetting.DefaultFont; - // //} - // - // TextPrinter.PrintTextLine(item.Text); - // } - // - // //you can run the printer when a new text comes in. - // //or you can run it when the user opens a new chat and you gotta update the chat text. - // public void runPrinterOnList(TMPTextFieldPrinter TextPrinter, List x, int rangeNew, int rangeOld) - // { - // for (int i = rangeNew; i < rangeOld; i++) - // { - // runPrinterOnItem(TextPrinter, x[i]); - // } - // } - - //adds another chat to the left side - public void startChat(bool isSimChat) - { - if (isSimChat) - { - //add button and set transforms - var chatButton = Instantiate(buttonPrefab, new Vector3(0, 0, 0), Quaternion.identity); - ChatButtons.Add(chatButton); - //SelectedButton = chatButton; - chatButton.transform.SetParent(ChatButtonContainer.transform); - - //setup internal lcoalchat manager. - - //ChatManager = new ChatTextManager(instance, tmp_printer); //you gotta pass the printer, not the gameobject. - - } else - { - //var chatButton = Instantiate(buttonPrefab, new Vector3(0, 0, 0), Quaternion.identity); - - //ChatButtons.Add(chatButton); - //SelectedButton = chatButton; - //chatButton.transform.SetParent(ChatButtonContainer.transform); - - ////IM = new ChatTextManager(instance, tmp_printer); //you gotta pass the printer, not the gameobject. - - - } - + //add button and set transforms + var chatButton = Instantiate(buttonPrefab, new Vector3(0, 0, 0), Quaternion.identity); + ChatButtons.Add(chatButton); + chatButton.transform.SetParent(ChatsListRoot.transform); } private void OnDestroy() { - - UnregisterClientEvents(client); - chatManager.Dispose(); - chatManager = null; + _chatPresenterManager.Dispose(); + _chatPresenterManager = null; } private void OnInputChanged(string _) { - msgtext = _; + inputString = _; return; } private void OnSendBtnClick() { //public chat - ProcessChatInput(msgtext, ChatType.Normal); - Debug.Log("Sending chat to local"); - - chatManager.printToMainChat("sending message (test)"); - + ProcessChatInput(inputString, ChatType.Normal); + Debug.Log("Sending localchat to server"); } private void OnCloseBtnClick() { var uimanager = ServiceLocator.ServiceLocator.Instance.Get(); - uimanager.canvasManager.popCanvas(); - + uimanager.canvasManager.PopCanvas(); } private void RegisterClientEvents(GridClient client) { //client.Grid.CoarseLocationUpdate += new EventHandler(Grid_CoarseLocationUpdate); - client.Self.TeleportProgress += new EventHandler(Self_TeleportProgress); - client.Network.SimDisconnected += new EventHandler(Network_SimDisconnected); + } private void UnregisterClientEvents(GridClient client) { //client.Grid.CoarseLocationUpdate -= new EventHandler(Grid_CoarseLocationUpdate); - client.Self.TeleportProgress -= new EventHandler(Self_TeleportProgress); - client.Network.SimDisconnected -= new EventHandler(Network_SimDisconnected); + } //adds a tab for this particular IM session @@ -283,54 +148,8 @@ namespace Raindrop.Presenters //return imTab; } - - void Self_TeleportProgress(object sender, TeleportEventArgs e) - { - if (e.Status == TeleportStatus.Progress || e.Status == TeleportStatus.Finished) - { - //ResetAvatarList(); - } - } - private void Network_SimDisconnected(object sender, SimDisconnectedEventArgs e) - { - try - { - - //if (InvokeRequired) - //{ - // if (!instance.MonoRuntime || IsHandleCreated) - // BeginInvoke(new MethodInvoker(() => Network_SimDisconnected(sender, e))); - // return; - //} - lock (agentSimHandle) - { - var h = e.Simulator.Handle; - List remove = new List(); - foreach (var uh in agentSimHandle) - { - if (uh.Value == h) - { - remove.Add(uh.Key); - } - } - if (remove.Count == 0) return; - - } - } - catch (Exception ex) - { - Debug.LogError("Failed to update radar: " + ex); - } - } - - - - - - - - //process the content of the inputfield to send to the simulator as local chat + //send message into local chat public void ProcessChatInput(string input, ChatType type) { if (string.IsNullOrEmpty(input)) return; @@ -338,7 +157,7 @@ namespace Raindrop.Presenters //call the ProcessChatInput in the respective manager class. if (/*chatList.getSelected() == "local chat"*/ true) { - chatManager.localChatManager.ProcessChatInput(input, type); + _chatPresenterManager.LocalLocalChat.ProcessChatInput(input, type); } //else @@ -348,10 +167,7 @@ namespace Raindrop.Presenters // chatHistory.Add(cbxInput.Text); // chatPointer = chatHistory.Count; //} - - - ClearChatInput(); - + netcom.ChatOut(inputString, ChatType.Normal, 0); } diff --git a/Assets/Raindrop/UI/screens/GamePresenter.cs b/Assets/Raindrop/UI/screens/GamePresenter.cs index 29bfc4f..d82e5f2 100644 --- a/Assets/Raindrop/UI/screens/GamePresenter.cs +++ b/Assets/Raindrop/UI/screens/GamePresenter.cs @@ -163,13 +163,13 @@ namespace Raindrop.Presenters public void OnChatBtnClick() { - uimanager.canvasManager.pushCanvas(CanvasType.Chat); + uimanager.canvasManager.Push(CanvasType.Chat); } public void OnMapBtnClick() { - uimanager.canvasManager.pushCanvas(CanvasType.Map); + uimanager.canvasManager.Push(CanvasType.Map); } diff --git a/Assets/Raindrop/UI/screens/LoginPresenter.cs b/Assets/Raindrop/UI/screens/LoginPresenter.cs index 48b844f..8333491 100644 --- a/Assets/Raindrop/UI/screens/LoginPresenter.cs +++ b/Assets/Raindrop/UI/screens/LoginPresenter.cs @@ -185,7 +185,7 @@ namespace Raindrop.Presenters instance.Client.Groups.RequestCurrentGroups(); uimanager.modalManager.showModalNotification("Logging in process...","Logged in !"); - uimanager.canvasManager.pushCanvasWithOrWithoutPop("Game", true); //refactor needed: better way to schedule push and pop as we are facing some issues here. + uimanager.canvasManager.PopAndPush(CanvasType.Game); //instance.UI.canvasManager.popCanvas(); LoginButton.interactable = true; break; diff --git a/Assets/Raindrop/UI/unity/TMPTextFieldPrinter.cs b/Assets/Raindrop/UI/unity/TMPTextFieldPrinter.cs index 36f0aad..da6dd6a 100644 --- a/Assets/Raindrop/UI/unity/TMPTextFieldPrinter.cs +++ b/Assets/Raindrop/UI/unity/TMPTextFieldPrinter.cs @@ -94,14 +94,13 @@ namespace Raindrop } #region ITextPrinter Members - public void PrintText(string text) { rtb.text = rtb.text + text; //else //{ - FindURLs(text); + // FindURLs(text); //} } diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index 9854453..615f2da 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -688,6 +688,25 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 13 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &89864945 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 361051093761253963, guid: b48e30ed103c4324a9e537dd82576993, type: 3} + m_PrefabInstance: {fileID: 1369961384} + m_PrefabAsset: {fileID: 0} +--- !u!114 &89864946 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 89864945} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2c84a856e3e4e442822ff4c7870a1c3, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasTypeToPush: 1 + popCurrent: 1 --- !u!1 &94005489 GameObject: m_ObjectHideFlags: 0 @@ -763,6 +782,25 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 94005489} m_CullTransparentMesh: 1 +--- !u!1 &100122705 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 361051094640251306, guid: b48e30ed103c4324a9e537dd82576993, type: 3} + m_PrefabInstance: {fileID: 1369961384} + m_PrefabAsset: {fileID: 0} +--- !u!114 &100122706 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 100122705} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2c84a856e3e4e442822ff4c7870a1c3, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasTypeToPush: 5 + popCurrent: 0 --- !u!1 &125379937 GameObject: m_ObjectHideFlags: 0 @@ -3140,7 +3178,8 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] + m_Children: + - {fileID: 829731402} m_Father: {fileID: 0} m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -3151,7 +3190,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 609529405} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fa47482bed1a47e29216fc5416bb73ba, type: 3} m_Name: @@ -4710,6 +4749,50 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 16 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &829731401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 829731402} + - component: {fileID: 829731403} + m_Layer: 7 + m_Name: 3DSceneSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &829731402 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829731401} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 609529406} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &829731403 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829731401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fa47482bed1a47e29216fc5416bb73ba, type: 3} + m_Name: + m_EditorClassIdentifier: + ObjectPrefab: {fileID: 3767279658298423867, guid: bbf350bf4403f494eb2f02fa73a70779, type: 3} --- !u!1 &831097301 GameObject: m_ObjectHideFlags: 0 @@ -7143,9 +7226,13 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 338201708} m_Modifications: + - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} + propertyPath: onClick.m_PersistentCalls.m_Calls.Array.size + value: 0 + objectReference: {fileID: 0} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode - value: 1 + value: 5 objectReference: {fileID: 0} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target @@ -7157,7 +7244,7 @@ PrefabInstance: objectReference: {fileID: 338201709} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: popCanvas + value: pushCanvas objectReference: {fileID: 0} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[1].m_MethodName @@ -7183,6 +7270,10 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: -94.3267 objectReference: {fileID: 0} + - target: {fileID: 361051094640251304, guid: b48e30ed103c4324a9e537dd82576993, type: 3} + propertyPath: onClick.m_PersistentCalls.m_Calls.Array.size + value: 0 + objectReference: {fileID: 0} - target: {fileID: 361051094640251304, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target value: @@ -8441,7 +8532,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7869931064171861450, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_AnchoredPosition.y - value: -0.00012868317 + value: -0.000041463845 objectReference: {fileID: 0} - target: {fileID: 7869931064171861451, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_ChildControlWidth @@ -8525,7 +8616,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7869931064370213011, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_SizeDelta.x - value: 796.31476 + value: 1412.3885 objectReference: {fileID: 0} - target: {fileID: 7869931064370213011, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_SizeDelta.y @@ -8533,7 +8624,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7869931064370213011, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_AnchoredPosition.x - value: 408.15738 + value: 716.1943 objectReference: {fileID: 0} - target: {fileID: 7869931064370213011, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_AnchoredPosition.y @@ -8750,7 +8841,7 @@ PrefabInstance: - target: {fileID: 7869931065211819622, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: localChatPrinter value: - objectReference: {fileID: 1984392858} + objectReference: {fileID: 1984392860} - target: {fileID: 7869931065226065626, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} propertyPath: m_AnchorMax.y value: 0 @@ -10355,7 +10446,7 @@ GameObject: m_CorrespondingSourceObject: {fileID: 7869931064370213010, guid: 6d2618c0195b58c43b26e914c74c68ea, type: 3} m_PrefabInstance: {fileID: 1679152091} m_PrefabAsset: {fileID: 0} ---- !u!114 &1984392858 +--- !u!114 &1984392860 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Scenes/UI/UIscene.unity b/Assets/Scenes/UI/UIscene.unity index 5f10af8..5965836 100644 --- a/Assets/Scenes/UI/UIscene.unity +++ b/Assets/Scenes/UI/UIscene.unity @@ -1981,8 +1981,7 @@ PrefabInstance: objectReference: {fileID: 904771132} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: popCanvas - objectReference: {fileID: 0} + value:PopCanvas objectReference: {fileID: 0} - target: {fileID: 361051093761253961, guid: b48e30ed103c4324a9e537dd82576993, type: 3} propertyPath: onClick.m_PersistentCalls.m_Calls.Array.data[1].m_MethodName value: pushCanvas diff --git a/Assets/Scenes/UI/UIsceneBackup.unity b/Assets/Scenes/UI/UIsceneBackup.unity index 981c7c9..bdcbd7f 100644 --- a/Assets/Scenes/UI/UIsceneBackup.unity +++ b/Assets/Scenes/UI/UIsceneBackup.unity @@ -8534,7 +8534,7 @@ MonoBehaviour: m_Calls: - m_Target: {fileID: 904771132} m_TargetAssemblyTypeName: CanvasManager, RaindropUnity - m_MethodName: popCanvas + m_MethodName: PopCanvas m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0}