SHARE
TWEET

Untitled

Agrair May 25th, 2019 57 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using Microsoft.Xna.Framework;
  2. using Microsoft.Xna.Framework.Graphics;
  3. using Microsoft.Xna.Framework.Input;
  4. using ReLogic.Graphics;
  5. using System;
  6. using System.Collections.Generic;
  7. using Terraria;
  8. using Terraria.GameContent.UI.Elements;
  9. using Terraria.GameInput;
  10. using Terraria.UI;
  11.  
  12. namespace TerrariaUITutorial.UI
  13. {
  14.     internal class EditableUITextBox : DragableUIPanel
  15.     {
  16.         private bool focused;
  17.         private int cursor;
  18.         private string text;
  19.         private UIScrollbar _scrollbar;
  20.         private float height;
  21.         private bool heightNeedsRecalculating;
  22.         private List<Tuple<string, float>> drawtexts = new List<Tuple<string, float>>();
  23.         private Vector2 cursorPos;
  24.  
  25.         public EditableUITextBox(string text)
  26.         {
  27.             this.text = text;
  28.             if (_scrollbar != null)
  29.             {
  30.                 _scrollbar.ViewPosition = 0;
  31.                 heightNeedsRecalculating = true;
  32.             }
  33.         }
  34.  
  35.         public override void Click(UIMouseEvent evt)
  36.         {
  37.             Focus();
  38.             base.Click(evt);
  39.         }
  40.  
  41.         private void Unfocus()
  42.         {
  43.             if (focused)
  44.             {
  45.                 focused = false;
  46.                 Main.blockInput = false;
  47.             }
  48.         }
  49.  
  50.         private void Focus()
  51.         {
  52.             if (!focused)
  53.             {
  54.                 Main.clrInput();
  55.                 focused = true;
  56.                 Main.blockInput = true;
  57.             }
  58.         }
  59.  
  60.         public override void OnActivate()
  61.         {
  62.             base.OnActivate();
  63.             heightNeedsRecalculating = true;
  64.         }
  65.  
  66.         public void SetText(string text)
  67.         {
  68.             this.text = text;
  69.             if (_scrollbar != null)
  70.             {
  71.                 _scrollbar.ViewPosition = 0;
  72.                 heightNeedsRecalculating = true;
  73.             }
  74.         }
  75.  
  76.         void Write(string text)
  77.         {
  78.             SetText(this.text.Insert(cursor, text));
  79.             cursor += text.Length;
  80.             cursor = Math.Min(this.text.Length, cursor);
  81.             Recalculate();
  82.         }
  83.  
  84.         void CursorLeft()
  85.         {
  86.             if (cursor == 0) return;
  87.             cursor--;
  88.         }
  89.  
  90.         void CursorRight()
  91.         {
  92.             if (cursor < text.Length) cursor++;
  93.         }
  94.  
  95.         bool JustPressed(Keys key)
  96.         {
  97.             return Main.inputText.IsKeyDown(key) && !Main.oldInputText.IsKeyDown(key);
  98.         }
  99.  
  100.         public override void Update(GameTime gameTime)
  101.         {
  102.             if (!ContainsPoint(new Vector2(Main.mouseX, Main.mouseY))
  103.                 && Main.mouseLeft)
  104.             {
  105.                 Unfocus();
  106.             }
  107.             base.Update(gameTime);
  108.         }
  109.  
  110.         protected override void DrawSelf(SpriteBatch spriteBatch)
  111.         {
  112.             base.DrawSelf(spriteBatch);
  113.             if (focused)
  114.             {
  115.                 PlayerInput.WritingText = true;
  116.                 Main.instance.HandleIME();
  117.                 // assuming chat isn't open
  118.                 Write(Main.GetInputText(text));
  119.  
  120.                 if (JustPressed(Keys.Left)) CursorLeft();
  121.                 else if (JustPressed(Keys.Right)) CursorRight();
  122.             }
  123.             var space = GetInnerDimensions();
  124.             var position = 0f;
  125.             if (_scrollbar != null)
  126.             {
  127.                 position = -_scrollbar.GetValue();
  128.             }
  129.             string temp = "";
  130.             for (int i = 0; i < drawtexts.Count; i++)
  131.             {
  132.                 var drawtext = drawtexts[i];
  133.                 if (position + drawtext.Item2 > space.Height)
  134.                     break;
  135.                 if (position >= 0)
  136.                 {
  137.                     Utils.DrawBorderString(spriteBatch, drawtext.Item1,
  138.                         new Vector2(space.X, space.Y + position), Color.White, 1f);
  139.                     temp += drawtext.Item1;
  140.                 }
  141.                 position += drawtext.Item2;
  142.             }
  143.             if (focused)
  144.             {
  145.                 // Utils.DrawBorderString(spriteBatch, "|", cursorPos, Color.White, 1, 0f, 0f, -1);
  146.             }
  147.             Recalculate();
  148.         }
  149.  
  150.         public override void RecalculateChildren()
  151.         {
  152.             base.RecalculateChildren();
  153.             if (!heightNeedsRecalculating)
  154.             {
  155.                 return;
  156.             }
  157.             CalculatedStyle space = GetInnerDimensions();
  158.             if (space.Width <= 0 || space.Height <= 0)
  159.             {
  160.                 return;
  161.             }
  162.             float position = 0f;
  163.             float textHeight = Main.fontMouseText.MeasureString("A").Y;
  164.             string[] array = text.Split('\n');
  165.             for (int i = 0; i < array.Length; i++)
  166.             {
  167.                 string line = array[i];
  168.                 string drawString = line;
  169.                 do
  170.                 {
  171.                     string remainder = "";
  172.                     while (Main.fontMouseText.MeasureString(drawString).X > space.Width)
  173.                     {
  174.                         remainder = drawString[drawString.Length - 1] + remainder;
  175.                         drawString = drawString.Substring(0, drawString.Length - 1);
  176.                     }
  177.                     if (remainder.Length > 0)
  178.                     {
  179.                         int index = drawString.LastIndexOf(' ');
  180.                         if (index >= 0)
  181.                         {
  182.                             remainder = drawString.Substring(index + 1) + remainder;
  183.                             drawString = drawString.Substring(0, index);
  184.                         }
  185.                     }
  186.                     drawtexts.Add(new Tuple<string, float>(drawString, textHeight));
  187.                     position += textHeight;
  188.                     drawString = remainder;
  189.                 }
  190.                 while (drawString.Length > 0);
  191.             }
  192.             height = position;
  193.             heightNeedsRecalculating = false;
  194.         }
  195.  
  196.         public override void Recalculate()
  197.         {
  198.             base.Recalculate();
  199.             UpdateScrollbar();
  200.         }
  201.  
  202.         public override void ScrollWheel(UIScrollWheelEvent evt)
  203.         {
  204.             base.ScrollWheel(evt);
  205.             if (_scrollbar != null)
  206.             {
  207.                 _scrollbar.ViewPosition -= evt.ScrollWheelValue;
  208.             }
  209.         }
  210.  
  211.         public void SetScrollbar(UIScrollbar scrollbar)
  212.         {
  213.             _scrollbar = scrollbar;
  214.             UpdateScrollbar();
  215.             heightNeedsRecalculating = true;
  216.         }
  217.  
  218.         private void UpdateScrollbar()
  219.         {
  220.             _scrollbar?.SetView(GetInnerDimensions().Height, height);
  221.         }
  222.     }
  223. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top