PR#2 Update SGameConsole
This commit is contained in:
parent
cc56b39209
commit
5b146632cf
|
@ -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();
|
||||
|
||||
SGame.instance.CommandQueue.Enqueue(command);
|
||||
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:
|
||||
|
@ -155,18 +191,19 @@ namespace StardewModdingAPI
|
|||
b.DrawString(this.smallFont, text, new Vector2(16, y), Color.LightGray);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue