PR#2 Update SGameConsole

This commit is contained in:
Chris 2020-02-04 11:37:18 -05:00
parent cc56b39209
commit 5b146632cf
1 changed files with 89 additions and 52 deletions

View File

@ -1,9 +1,6 @@
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using StardewModdingAPI.Framework;
using StardewModdingAPI.Internal.ConsoleWriting;
using StardewValley;
@ -11,68 +8,53 @@ using StardewValley.Menus;
namespace StardewModdingAPI
{
class SGameConsole : IClickableMenu
public class SGameConsole : IClickableMenu
{
public static SGameConsole Instance;
public bool isVisible;
private readonly LinkedList<KeyValuePair<ConsoleLogLevel, string>> consoleMessageQueue = new LinkedList<KeyValuePair<ConsoleLogLevel, string>>();
private readonly TextBox textBox;
private readonly MobileScrollbox scrollbox;
private Rectangle textBoxBounds;
private MobileScrollbox scrollbox;
private ClickableTextureComponent commandButton;
private SpriteFont smallFont;
private TextBoxEvent textBoxEvent;
private Vector2 size;
private bool scrolling = false;
private int scrollLastFakeY = 0;
private int scrollLastY = 0;
private int MaxScrollBoxHeight => (int)(Game1.graphics.PreferredBackBufferHeight * 20 / Game1.NativeZoomLevel);
private int MaxTextAreaWidth => (int)((Game1.graphics.PreferredBackBufferWidth - 32) / Game1.NativeZoomLevel);
internal SGameConsole()
{
Instance = this;
this.isVisible = true;
this.textBox = new TextBox(null, null, Game1.dialogueFont, Game1.textColor)
{
X = 0,
Y = 100,
Width = IClickableMenu.viewport.Width,
Height = IClickableMenu.viewport.Height
};
this.scrollbox = new MobileScrollbox(0, 0, 1280, 320, this.consoleMessageQueue.Count, new Rectangle(0, 0, 1280, 320));
this.textBoxBounds = new Rectangle(this.textBox.X, this.textBox.Y, this.textBox.Width, this.textBox.Height);
this.scrollbox.Bounds = this.textBoxBounds;
this.textBoxEvent = new TextBoxEvent(this.textBoxEnter);
}
internal void InitializeContent(LocalizedContentManager content)
{
this.scrollbox = new MobileScrollbox(0, 0, this.MaxTextAreaWidth, (int)(Game1.graphics.PreferredBackBufferHeight / Game1.NativeZoomLevel), this.MaxScrollBoxHeight,
new Rectangle(0, 0, (int)(Game1.graphics.PreferredBackBufferWidth / Game1.NativeZoomLevel), (int)(Game1.graphics.PreferredBackBufferHeight / Game1.NativeZoomLevel)));
this.smallFont = content.Load<SpriteFont>(@"Fonts\SmallFont");
this.size = this.smallFont.MeasureString("aA");
}
public void Show()
{
if (this.upperRightCloseButton == null)
this.initializeUpperRightCloseButton();
if (this.commandButton == null)
this.commandButton = new ClickableTextureComponent(new Rectangle(16, 0, 64, 64), Game1.mobileSpriteSheet, new Rectangle(0, 44, 16, 16), 4f, false);
Game1.activeClickableMenu = this;
this.isVisible = true;
}
public override void receiveLeftClick(int x, int y, bool playSound = true)
{
if (this.textBoxBounds.Contains(x, y))
{
this.scrollbox.receiveLeftClick(x, y);
this.scrolling = this.scrollbox.panelScrolling;
this.textBox.Selected = true;
this.textBox.OnEnterPressed += this.textBoxEvent;
this.textBox.Update();
Game1.keyboardDispatcher.Subscriber = this.textBox;
this.textBoxEnter(this.textBox);
}
if (this.upperRightCloseButton.bounds.Contains(x, y))
{
@ -80,31 +62,61 @@ namespace StardewModdingAPI
Game1.activeClickableMenu = null;
Game1.playSound("bigDeSelect");
}
else if (this.commandButton.bounds.Contains(x, y))
{
Game1.activeClickableMenu = new NamingMenu(this.textBoxEnter, "Command", "")
{
randomButton = new ClickableTextureComponent(new Rectangle(-100, -100, 0, 0), Game1.mobileSpriteSheet, new Rectangle(87, 22, 20, 20), 4f, false)
};
this.isVisible = false;
Game1.playSound("bigDeSelect");
}
else
{
this.scrollLastFakeY = y;
this.scrollLastY = y;
this.scrolling = true;
this.scrollbox.receiveLeftClick(x, y);
}
}
public void textBoxEnter(TextBox text)
public void textBoxEnter(string text)
{
this.textBox.OnEnterPressed -= this.textBoxEvent;
string command = text.Text.Trim();
string command = text.Trim();
if (command.Length > 0)
{
if (command.EndsWith(";"))
{
command = command.TrimEnd(';');
SGame.instance.CommandQueue.Enqueue(command);
this.exitThisMenu();
return;
}
SGame.instance.CommandQueue.Enqueue(command);
}
this.isVisible = true;
Game1.activeClickableMenu = this;
}
public override void leftClickHeld(int x, int y)
{
if (this.scrolling)
{
int tmp = y;
y = this.scrollLastFakeY + this.scrollLastY - y;
this.scrollLastY = tmp;
this.scrollLastFakeY = y;
this.scrollbox.leftClickHeld(x, y);
this.scrollbox.setYOffsetForScroll(9999);
}
}
public override void releaseLeftClick(int x, int y)
{
this.scrolling = false;
this.scrollbox.releaseLeftClick(x, y);
}
public void WriteLine(string consoleMessage, ConsoleLogLevel level)
internal void WriteLine(string consoleMessage, ConsoleLogLevel level)
{
lock (this.consoleMessageQueue)
{
@ -121,18 +133,42 @@ namespace StardewModdingAPI
this.scrollbox.update(time);
}
private string _parseText(string text)
{
string line = string.Empty;
string returnString = string.Empty;
string[] strings = text.Split("\n");
foreach (string t in strings)
{
string[] wordArray = t.Split(' ');
foreach (string word in wordArray)
{
if (this.smallFont.MeasureString(line + word).X > this.MaxTextAreaWidth)
{
returnString = returnString + line + '\n';
line = string.Empty;
}
line = line + word + ' ';
}
returnString = returnString + line + '\n';
line = string.Empty;
}
returnString.TrimEnd('\n');
return returnString;
}
public override void draw(SpriteBatch b)
{
float y = Game1.game1.screen.Height - this.size.Y;
this.scrollbox.setUpForScrollBoxDrawing(b);
lock (this.consoleMessageQueue)
{
float offset = 0;
foreach (var log in this.consoleMessageQueue)
{
string text = log.Value;
if (text.Contains("\n"))
{
text = text.Replace("\n", "");
}
string text = this._parseText(log.Value);
Vector2 size = this.smallFont.MeasureString(text);
float y = Game1.game1.screen.Height - size.Y - offset - this.scrollbox.getYOffsetForScroll();
offset += size.Y;
switch (log.Key)
{
case ConsoleLogLevel.Critical:
@ -156,17 +192,18 @@ namespace StardewModdingAPI
break;
}
this.size = this.smallFont.MeasureString(text);
if (y < 0)
if (offset > this.MaxScrollBoxHeight)
{
break;
}
y -= this.size.Y;
}
}
this.scrollbox.finishScrollBoxDrawing(b);
if (Context.IsWorldReady)
{
this.upperRightCloseButton.draw(b);
this.commandButton.draw(b);
}
}
}
}