diff --git a/GraphicsManager/Enums/Rendertype.cs b/GraphicsManager/Enums/Rendertype.cs
index 98333bc..0dd1d82 100755
--- a/GraphicsManager/Enums/Rendertype.cs
+++ b/GraphicsManager/Enums/Rendertype.cs
@@ -1,5 +1,6 @@
namespace GraphicsManager.Enums;
+[Flags]
public enum Rendertype
{
Limit = 0b_0001,
diff --git a/GraphicsManager/GraphicsManager.csproj b/GraphicsManager/GraphicsManager.csproj
index 2fcac57..09ded1c 100644
--- a/GraphicsManager/GraphicsManager.csproj
+++ b/GraphicsManager/GraphicsManager.csproj
@@ -10,7 +10,7 @@
False
https://git.jacobtech.com/JacobTech.com/GraphicsManager
git
- 1.0.0-alpha99999991
+ 1.0.0-alpha99999999996
diff --git a/GraphicsManager/Objects/Core/Font.cs b/GraphicsManager/Objects/Core/Font.cs
index b2880db..6a38c40 100755
--- a/GraphicsManager/Objects/Core/Font.cs
+++ b/GraphicsManager/Objects/Core/Font.cs
@@ -86,6 +86,8 @@ public class Font
return fontclass;
}
+ public static Font MakeFontFromSystem(uint PixelHeight = 20) => new Font() { PixelHeight = PixelHeight};
+
public static Font MakeFontFromFile(string Font)
{
_ = Font ?? throw new ArgumentNullException(nameof(Font));
diff --git a/GraphicsManager/Objects/FlowLayout.cs b/GraphicsManager/Objects/FlowLayout.cs
index 4a64dc9..b0b762d 100644
--- a/GraphicsManager/Objects/FlowLayout.cs
+++ b/GraphicsManager/Objects/FlowLayout.cs
@@ -23,6 +23,8 @@ public class FlowLayout : IRenderObject, IParent
t.Start();
Controls.ControlAdded += ControlsOnControlAdded;
Controls.ControlRemoved += ControlsOnControlRemoved;
+ _bounds.MouseEnter += BoundsOnMouseEnter;
+ _bounds.MouseLeave += BoundsOnMouseLeave;
}
public void ReportSizeUpdate(IRenderObject Control)
@@ -45,31 +47,25 @@ public class FlowLayout : IRenderObject, IParent
}
}
- lasty = Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y;
isrole = false;
}
private Task ControlsOnControlRemoved()
{
- Console.WriteLine("reset");
- lasty = 0;
- Controls[0].Location = new(0, 0);
- lasty += Controls[0].Size.Y;
+ if (Controls.Length < 1) return Task.CompletedTask;
+ if (Controls[0].Location.Y > 0) Controls[0].Location = new(0, 0);
for (int i = 1; i < Controls.Length; i++)
{
- lasty += Controls[i].Size.Y;
Controls[i].Location = new(0, Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y);
}
return Task.CompletedTask;
}
- private int lasty = 0;
private Task ControlsOnControlAdded(IRenderObject arg)
{
if (Controls.Length > 0) arg.Location = new(0, Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y);
else arg.Location = new(0, 0);
- lasty += arg.Size.Y;
arg.Size = new(Size.X, arg.Size.Y);
arg.Anchor = ObjectAnchor.Left | ObjectAnchor.Right | ObjectAnchor.Top;
return Task.CompletedTask;
@@ -80,26 +76,24 @@ public class FlowLayout : IRenderObject, IParent
if (Clicked is not null) _ = Clicked.Invoke(arg);
return Task.CompletedTask;
}
+ private Task BoundsOnMouseLeave(IRenderObject arg)
+ {
+ inside = false;
+ if (MouseLeave is not null) _ = MouseLeave.Invoke(this);
+ return Task.CompletedTask;
+ }
+
+ private bool inside = false;
+ private Task BoundsOnMouseEnter(IRenderObject arg)
+ {
+ inside = true;
+ if (MouseEnter is not null) _ = MouseEnter.Invoke(this);
+ return Task.CompletedTask;
+ }
public ControlList Controls { get; } = new();
public ObjectAnchor Anchor { get => _bounds.Anchor; set => _bounds.Anchor = value; }
- public Color4 BackgroundColor
- {
- get
- {
- Uniform? u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _bounds.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _bounds.Uniforms.Uniform4.Add(u4);
- }
- }
+ public Color4 BackgroundColor { get => _bounds.BackgroundColor; set => _bounds.BackgroundColor = value; }
public bool Visible { get => _bounds.Visible; set => _bounds.Visible = value; }
public Vector2i Size
{
@@ -174,6 +168,7 @@ public class FlowLayout : IRenderObject, IParent
{
try
{
+ if (!inside) return;
isrole = true;
dis = obj;
if (scrols.Any())
@@ -182,7 +177,7 @@ public class FlowLayout : IRenderObject, IParent
{
scrols.Dequeue().Invoke();
}
- Parent!.TryDraw();
+
}
}
catch (Exception e)
@@ -203,17 +198,20 @@ public class FlowLayout : IRenderObject, IParent
{
if (Controls.Length < 1) return;
bool down = dis.OffsetY < 0;//scrole wheel dir
+ bool moved = false;
if (down && ((Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y) > Size.Y)) //can go down
{
+ moved = true;
for (int i = 0; i < Controls.Length; i++)
{
Controls[i].Location = new((int)(Controls[i].Location.X),
- (int)(Controls[i].Location.Y - (dis.OffsetY * HScrollPixels)));
+ (int)(Controls[i].Location.Y + (dis.OffsetY * HScrollPixels)));
}
}
if (!down && (Controls[0].Location.Y < 0)) // can go up
{
- float newy = Controls[0].Location.Y - (dis.OffsetY * HScrollPixels);
+ moved = true;
+ float newy = Controls[0].Location.Y + (dis.OffsetY * HScrollPixels);
if (newy > 0) newy = 0;
Controls[0].Location = new(0, (int)newy);
for (int i = 1; i < Controls.Length; i++)
@@ -223,7 +221,10 @@ public class FlowLayout : IRenderObject, IParent
}
}
- lasty = Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y;
+ if (moved)
+ {
+ Parent!.TryDraw();
+ }
}));
}
diff --git a/GraphicsManager/Objects/Label.cs b/GraphicsManager/Objects/Label.cs
index 59d7f64..422d6e7 100755
--- a/GraphicsManager/Objects/Label.cs
+++ b/GraphicsManager/Objects/Label.cs
@@ -4,6 +4,8 @@ using GraphicsManager.Objects.Core;
using GraphicsManager.Structs;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;
+using OpenTK.Windowing.Common;
+using OpenTK.Windowing.GraphicsLibraryFramework;
using SharpFont;
using Encoding = SharpFont.Encoding;
@@ -19,7 +21,18 @@ public class Label : IRenderObject
public Vector2 LocationAsFloat { get { return laf; } }
public Vector2 SizeAsFloat { get { return saf; } }
+ private char? pc = null;
+ public char? PasswordChar
+ {
+ get => pc;
+ set
+ {
+ pc = value;
+ if (Parent is not null) Parent.TryDraw();
+ }
+ }
private bool _Visible = true;
+
public bool Visible
{
get => _Visible;
@@ -40,11 +53,17 @@ public class Label : IRenderObject
get => text;
set
{
+ if (value is null) value = string.Empty;
text = value;
if (!_characters.ContainsKey(Font)) _characters.Add(Font, new Dictionary());
float addy = Font.PixelHeight * Scale, addx = 0F, char_x = 0F, hhh = 0F;
- foreach (char character in value)
+ for (int i = 0; i < value.Length; i++)
{
+ char character;
+ if (PasswordChar is null)
+ character = value[i];
+ else
+ character = PasswordChar.Value;
if (!_characters[Font].ContainsKey(character))
{
var f = Texture.TextureForChar(Font, character, Font.Faces.ToArray());
@@ -61,7 +80,7 @@ public class Label : IRenderObject
char_x += (_characters[Font][character].Advance >> 6) * Scale;
if (xrel + w > addx) addx = xrel + w;
}
-
+
Size = new((int)addx, (int)addy);
if (Loaded)
{
@@ -73,7 +92,7 @@ public class Label : IRenderObject
public Shader Shader { get; set; } = DefaultTextShader;
public Font Font { get; set; } = DefaultFont;
public float Scale { get; set; } = 1.0f;
- public Vector4 Color { get; set; } = new Vector4(1, 1, 1, 1);
+ public Color4 Color { get; set; } = new Color4(255, 255, 255, 255);
public Vector2i Distance { get; private set; }
private Vector2i loc_ = new();
private Vector2i locc_ = new();
@@ -87,6 +106,7 @@ public class Label : IRenderObject
{
loc_ = value;
if (Window is null || Parent is null) return;
+ Console.WriteLine(value.X);
locc_ = new((int)Window.FloatToInt(Parent.IntToFloat(value.X)), (int)Window.FloatToInt(Parent.IntToFloat(value.Y + (int)Font.PixelHeight, true), true));
if (Window.CanControleUpdate && Loaded) Parent!.TryDraw();
}
@@ -122,38 +142,42 @@ public class Label : IRenderObject
GL.ActiveTexture(TextureUnit.Texture0);
float hhh = 0f;
- foreach (char c in Text)
+ for (int i = 0; i < Text.Length; i++)
{
- if (!_characters[Font].ContainsKey(c)) break;
- Character ch = _characters[Font][c];
- int maxx = 0;
- int maxy = (int)Font.PixelHeight;
- if (c == '\n')
- {
- hhh += Font.PixelHeight;
- char_x = 0f;
- maxy += (int)Font.PixelHeight;
- }
+ char c;
+ if (PasswordChar is null)
+ c = Text[i];
else
- {
- float w = ch.Size.X * Scale;
- float h = ch.Size.Y * Scale;
- float xrel = char_x + ch.Bearing.X * Scale;
- float yrel = (ch.Size.Y - ch.Bearing.Y) * Scale;
- yrel += hhh;
- char_x += (ch.Advance >> 6) * Scale;
- if (xrel + w > maxx) maxx = (int)(xrel + w);
- Matrix4 scaleM = Matrix4.CreateScale(new Vector3(w, h, 1.0f));
- Matrix4 transRelM = Matrix4.CreateTranslation(new Vector3(xrel, yrel, 0.0f));
+ c = PasswordChar.Value;
+ if (!_characters[Font].ContainsKey(c)) break;
+ Character ch = _characters[Font][c];
+ int maxx = 0;
+ int maxy = (int)Font.PixelHeight;
+ if (c == '\n')
+ {
+ hhh += Font.PixelHeight;
+ char_x = 0f;
+ maxy += (int)Font.PixelHeight;
+ }
+ else
+ {
+ float w = ch.Size.X * Scale;
+ float h = ch.Size.Y * Scale;
+ float xrel = char_x + ch.Bearing.X * Scale;
+ float yrel = (ch.Size.Y - ch.Bearing.Y) * Scale;
+ yrel += hhh;
+ char_x += (ch.Advance >> 6) * Scale;
+ if (xrel + w > maxx) maxx = (int)(xrel + w);
+ Matrix4 scaleM = Matrix4.CreateScale(new Vector3(w, h, 1.0f));
+ Matrix4 transRelM = Matrix4.CreateTranslation(new Vector3(xrel, yrel, 0.0f));
- Matrix4 modelM = scaleM * transRelM * rotateM * transOriginM;
- GL.UniformMatrix4(0, false, ref modelM);
+ Matrix4 modelM = scaleM * transRelM * rotateM * transOriginM;
+ GL.UniformMatrix4(0, false, ref modelM);
- ch.Texture.Use();
-
- GL.DrawArrays(PrimitiveType.Triangles, 0, 6);
- }
+ ch.Texture.Use();
+ GL.DrawArrays(PrimitiveType.Triangles, 0, 6);
+ }
}
GL.Disable(EnableCap.Blend);
@@ -167,6 +191,8 @@ public class Label : IRenderObject
if (!_characters.ContainsKey(Font)) _characters.Add(Font, new Dictionary());
Parent = window;
Window = win;
+ Window.MouseMove += WindowOnMouseMove;
+ Window.MouseDown += WindowOnMouseDown;
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 4);
float[] vquad =
@@ -196,9 +222,33 @@ public class Label : IRenderObject
Loaded = true;
Text = Text;
Location = Location;
- Distance = new(window.Size.X - Size.X - Location.X, window.Size.Y - Size.Y - Location.Y);
+ Distance = new(Parent.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
}
+
+ private void WindowOnMouseDown(MouseButtonEventArgs obj)
+ {
+ if (mouseinside && obj.Button == MouseButton.Button1 && Clicked is not null) _ = Clicked.Invoke(this);
+ }
+
+ private bool mouseinside = false;
+ private void WindowOnMouseMove(MouseMoveEventArgs obj)
+ {
+ if (Parent?.IntToFloat(Location.X) <= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Size.X + Location.X) >= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Location.Y + Size.Y, true) <= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true) &&
+ Parent?.IntToFloat(Location.Y, true) >= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true))
+ {
+ if (MouseEnter is not null && !mouseinside) _ = MouseEnter.Invoke(this);
+ mouseinside = true;
+ }
+ else
+ {
+ if (MouseLeave is not null && mouseinside) _ = MouseLeave.Invoke(this);
+ mouseinside = false;
+ }
+ }
+
public event Func? Clicked;
public event Func? WindowLoaded;
public event Func? MouseEnter;
diff --git a/GraphicsManager/Objects/Rectangle.cs b/GraphicsManager/Objects/Rectangle.cs
index 2fffa5f..88f6a64 100755
--- a/GraphicsManager/Objects/Rectangle.cs
+++ b/GraphicsManager/Objects/Rectangle.cs
@@ -3,6 +3,7 @@ using GraphicsManager.Interfaces;
using GraphicsManager.Objects.Core;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;
+using OpenTK.Windowing.Common;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace GraphicsManager.Objects;
@@ -32,9 +33,8 @@ public class Rectangle : ITextureObject
}
}
- public Uniforms Uniforms { get; } = new() { Uniform4 = new() { new() { Location = 0, Value = new(0,0,0,1) } } };
+ public Color4 BackgroundColor { get; set; } = new(0, 0, 0, 255);
- //public bool Visible { get; set; } = true;
private bool _Visible = true;
public bool Visible
{
@@ -52,22 +52,7 @@ public class Rectangle : ITextureObject
{
if (Texture is not null) Texture.Use();
Shader.Use();
- for (int i = 0; i < Uniforms.Uniform4.Count; i++)
- {
- GL.Uniform4(Uniforms.Uniform4[i].Location, Uniforms.Uniform4[i].Value);
- }
- for (int i = 0; i < Uniforms.Uniform3.Count; i++)
- {
- GL.Uniform3(Uniforms.Uniform3[i].Location, Uniforms.Uniform3[i].Value);
- }
- for (int i = 0; i < Uniforms.Uniform2.Count; i++)
- {
- GL.Uniform2(Uniforms.Uniform2[i].Location, Uniforms.Uniform2[i].Value);
- }
- for (int i = 0; i < Uniforms.Uniform1.Count; i++)
- {
- GL.Uniform1(Uniforms.Uniform1[i].Location, Uniforms.Uniform1[i].Value);
- }
+ GL.Uniform4(0, BackgroundColor);
if (Texture is not null)
{
GL.Enable(EnableCap.Blend);
@@ -119,24 +104,36 @@ public class Rectangle : ITextureObject
GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint);
Loaded = true;
Window.MouseDown += Window_MouseDown;
+ Window.MouseMove += WindowOnMouseMove;
Location = Location;
Distance = new(Parent.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
}
+ private bool mouseinside = false;
+ private void WindowOnMouseMove(MouseMoveEventArgs e)
+ {
+ if (Parent?.IntToFloat(Location.X) <= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Size.X + Location.X) >= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Location.Y + Size.Y, true) <= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true) &&
+ Parent?.IntToFloat(Location.Y, true) >= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true))
+ {
+ if (MouseEnter is not null && !mouseinside) _ = MouseEnter.Invoke(this);
+ mouseinside = true;
+ }
+ else
+ {
+ if (MouseLeave is not null && mouseinside) _ = MouseLeave.Invoke(this);
+ mouseinside = false;
+ }
+ }
+
public IParent? Parent { get; private set; }
public Window? Window { get; private set; }
private void Window_MouseDown(OpenTK.Windowing.Common.MouseButtonEventArgs e)
{
- if (e.Button == MouseButton.Button1 &&
- Parent?.IntToFloat(Location.X) <= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Size.X + Location.X) >= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Location.Y + Size.Y, true) <= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true) &&
- Parent?.IntToFloat(Location.Y, true) >= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true))
- {
- if (Clicked is not null) Clicked.Invoke(this);
- }
+ if (mouseinside && e.Button == MouseButton.Button1 && Clicked is not null) _ = Clicked.Invoke(this);
}
~Rectangle()
@@ -167,7 +164,7 @@ public class Rectangle : ITextureObject
{
if (Loaded)
{
- Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
+ //Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
int add = 3;
if (Texture is not null) add = 5;
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
diff --git a/GraphicsManager/Objects/RoundedButton.cs b/GraphicsManager/Objects/RoundedButton.cs
index 35e8a29..cf300c9 100755
--- a/GraphicsManager/Objects/RoundedButton.cs
+++ b/GraphicsManager/Objects/RoundedButton.cs
@@ -16,6 +16,20 @@ public class RoundedButton : IRenderObject
_bounds = new RoundedRectangle();
_inside = new RoundedRectangle();
_label = new Label();
+ _bounds.MouseEnter += BoundsOnMouseEnter;
+ _bounds.MouseLeave += BoundsOnMouseLeave;
+ }
+
+ private Task BoundsOnMouseLeave(IRenderObject arg)
+ {
+ if (MouseLeave is not null) _ = MouseLeave.Invoke(this);
+ return Task.CompletedTask;
+ }
+
+ private Task BoundsOnMouseEnter(IRenderObject arg)
+ {
+ if (MouseEnter is not null) _ = MouseEnter.Invoke(this);
+ return Task.CompletedTask;
}
public event Func? WindowLoaded;
@@ -56,41 +70,8 @@ public class RoundedButton : IRenderObject
public Vector2i Distance { get => _bounds.Distance; }
public IParent? Parent { get; private set; } = null;
public Window? Window { get; private set; } = null;
-
- public Color4 InsideColor
- {
- get
- {
- Uniform? u4 = _inside.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _inside.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _inside.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _inside.Uniforms.Uniform4.Add(u4);
- }
- }
- public Color4 BorderColor
- {
- get
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _bounds.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _bounds.Uniforms.Uniform4.Add(u4);
- }
- }
+ public Color4 InsideColor { get => _inside.BackgroundColor; set => _inside.BackgroundColor = value; }
+ public Color4 BorderColor { get => _bounds.BackgroundColor; set => _bounds.BackgroundColor = value; }
public bool Visible
{
get => _bounds.Visible;
diff --git a/GraphicsManager/Objects/RoundedRectangle.cs b/GraphicsManager/Objects/RoundedRectangle.cs
index e5998ad..2b592bc 100755
--- a/GraphicsManager/Objects/RoundedRectangle.cs
+++ b/GraphicsManager/Objects/RoundedRectangle.cs
@@ -5,6 +5,7 @@ using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;
using OpenTK.Windowing.GraphicsLibraryFramework;
using System.Runtime.Intrinsics.X86;
+using OpenTK.Windowing.Common;
namespace GraphicsManager.Objects;
@@ -25,7 +26,7 @@ public class RoundedRectangle : IRenderObject
public event Func? MouseLeave;
public object? Tag { get; set; } = null;
- public Uniforms Uniforms { get; set; } = new() { Uniform4 = new() { new() { Location = 0, Value = new(0,0,0,1) } } };
+ public Color4 BackgroundColor { get; set; } = new(0, 0, 0, 255);
public int Radius
{
get
@@ -110,18 +111,7 @@ public class RoundedRectangle : IRenderObject
GL.Hint(HintTarget.PolygonSmoothHint, HintMode.Nicest);
GL.Hint(HintTarget.PointSmoothHint, HintMode.Nicest);
Shader.Use();
- for (int i = 0; i < Uniforms.Uniform4.Count; i++)
- {
- GL.Uniform4(Uniforms.Uniform4[i].Location, Uniforms.Uniform4[i].Value);
- }
- for (int i = 0; i < Uniforms.Uniform3.Count; i++)
- {
- GL.Uniform3(Uniforms.Uniform3[i].Location, Uniforms.Uniform3[i].Value);
- }
- for (int i = 0; i < Uniforms.Uniform2.Count; i++)
- {
- GL.Uniform2(Uniforms.Uniform2[i].Location, Uniforms.Uniform2[i].Value);
- }
+ GL.Uniform4(0, BackgroundColor);
GL.BindVertexArray(ArrayObject);
GL.DrawElements(PrimitiveType.Triangles, Indexs.Length, DrawElementsType.UnsignedInt, 0);
@@ -159,24 +149,36 @@ public class RoundedRectangle : IRenderObject
GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint);
Loaded = true;
Window.MouseDown += Window_MouseDown;
+ Window.MouseMove += WindowOnMouseMove;
Location = Location;
Distance = new(Parent.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
}
+ private bool mouseinside = false;
+ private void WindowOnMouseMove(MouseMoveEventArgs obj)
+ {
+ if (Parent?.IntToFloat(Location.X) <= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Size.X + Location.X) >= Window?.IntToFloat((float)Parent?.MousePosition.X!) &&
+ Parent?.IntToFloat(Location.Y + Size.Y, true) <= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true) &&
+ Parent?.IntToFloat(Location.Y, true) >= Window?.IntToFloat((float)Parent?.MousePosition.Y!, true))
+ {
+ if (MouseEnter is not null && !mouseinside) _ = MouseEnter.Invoke(this);
+ mouseinside = true;
+ }
+ else
+ {
+ if (MouseLeave is not null && mouseinside) _ = MouseLeave.Invoke(this);
+ mouseinside = false;
+ }
+ }
+
public IParent? Parent { get; private set; }
public Window? Window { get; private set; }
private void Window_MouseDown(OpenTK.Windowing.Common.MouseButtonEventArgs e)
{
- if (e.Button == MouseButton.Button1 &&
- Parent?.IntToFloat(Location.X) <= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Size.X + Location.X) >= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Location.Y + Size.Y, true) <= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true) &&
- Parent?.IntToFloat(Location.Y, true) >= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true))
- {
- if (Clicked is not null) Clicked.Invoke(this);
- }
+ if (mouseinside && e.Button == MouseButton.Button1 && Clicked is not null) _ = Clicked.Invoke(this);
}
~RoundedRectangle()
@@ -205,7 +207,7 @@ public class RoundedRectangle : IRenderObject
{
if (Loaded)
{
- Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
+ //Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
int add = 3;
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BindVertexArray(ArrayObject);
diff --git a/GraphicsManager/Objects/Textbox.cs b/GraphicsManager/Objects/Textbox.cs
index 3983f3e..8336054 100755
--- a/GraphicsManager/Objects/Textbox.cs
+++ b/GraphicsManager/Objects/Textbox.cs
@@ -16,6 +16,8 @@ public class Textbox : IRenderObject
_bounds = new RoundedRectangle();
_inside = new RoundedRectangle();
_label = new Label();
+ _bounds.MouseEnter += BoundsOnMouseEnter;
+ _bounds.MouseLeave += BoundsOnMouseLeave;
}
public event Func? WindowLoaded;
@@ -28,6 +30,7 @@ public class Textbox : IRenderObject
public ObjectAnchor Anchor { get => _bounds.Anchor; set { _bounds.Anchor = value; _inside.Anchor = value; _label.Anchor = value; } }
public Font Font { get => _label.Font; set => _label.Font = value; }
public string Text { get => _label.Text; set => _label.Text = value; }
+ public char? PasswordChar { get => _label.PasswordChar; set => _label.PasswordChar = value; }
public bool Loaded { get; private set; } = false;
public Vector2i Size
{
@@ -55,47 +58,26 @@ public class Textbox : IRenderObject
public Vector2i Distance { get => _bounds.Distance; }
public IParent? Parent { get; private set; } = null;
public Window? Window { get; private set; } = null;
-
- public Color4 InsideColor
- {
- get
- {
- Uniform? u4 = _inside.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _inside.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _inside.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _inside.Uniforms.Uniform4.Add(u4);
- }
- }
- public Color4 BorderColor
- {
- get
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _bounds.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _bounds.Uniforms.Uniform4.Add(u4);
- }
- }
+ public Color4 InsideColor { get => _inside.BackgroundColor; set => _inside.BackgroundColor = value; }
+ public Color4 BorderColor { get => _bounds.BackgroundColor; set => _bounds.BackgroundColor = value; }
+
public bool Visible
{
get => _bounds.Visible;
set => _bounds.Visible = value;
}
public event Func? Clicked;
+ private Task BoundsOnMouseLeave(IRenderObject arg)
+ {
+ if (MouseLeave is not null) _ = MouseLeave.Invoke(this);
+ return Task.CompletedTask;
+ }
+
+ private Task BoundsOnMouseEnter(IRenderObject arg)
+ {
+ if (MouseEnter is not null) _ = MouseEnter.Invoke(this);
+ return Task.CompletedTask;
+ }
public void Clean()
{
@@ -135,6 +117,7 @@ public class Textbox : IRenderObject
}
private bool use = false;
+ public event Func? KeyPress;
private void Window_KeyDown(OpenTK.Windowing.Common.KeyboardKeyEventArgs obj)
{
if (!use) return;
@@ -144,15 +127,17 @@ public class Textbox : IRenderObject
if (!(Text.Length > 0)) return;
Text = Text.Remove(Text.Length - 1, 1);
}
+
+ if (KeyPress is not null) _ = KeyPress.Invoke(obj);
}
private void Window_MouseDown(OpenTK.Windowing.Common.MouseButtonEventArgs e)
{
if (e.Button == MouseButton.Button1 &&
- Parent?.IntToFloat(Location.X) <= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Size.X + Location.X) >= Parent?.IntToFloat((int)Parent?.MousePosition.X!) &&
- Parent?.IntToFloat(Location.Y + Size.Y, true) <= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true) &&
- Parent?.IntToFloat(Location.Y, true) >= Parent?.IntToFloat((int)Parent?.MousePosition.Y!, true))
+ Parent?.IntToFloat(Location.X) <= Window?.IntToFloat((int)Window?.MousePosition.X!) &&
+ Parent?.IntToFloat(Size.X + Location.X) >= Window?.IntToFloat((int)Window?.MousePosition.X!) &&
+ Parent?.IntToFloat(Location.Y + Size.Y, true) <= Window?.IntToFloat((int)Window?.MousePosition.Y!, true) &&
+ Parent?.IntToFloat(Location.Y, true) >= Window?.IntToFloat((int)Window?.MousePosition.Y!, true))
{
use = true;
if (Clicked is not null) Clicked.Invoke(this);
diff --git a/GraphicsManager/Objects/UserControl.cs b/GraphicsManager/Objects/UserControl.cs
index 1f940ed..97ade95 100755
--- a/GraphicsManager/Objects/UserControl.cs
+++ b/GraphicsManager/Objects/UserControl.cs
@@ -14,6 +14,8 @@ public class UserControl : IRenderObject, IParent
{
_bounds = new Rectangle();
_bounds.Clicked += _bounds_Clicked;
+ _bounds.MouseEnter += BoundsOnMouseEnter;
+ _bounds.MouseLeave += BoundsOnMouseLeave;
}
public void TryDraw()
@@ -29,23 +31,9 @@ public class UserControl : IRenderObject, IParent
public ControlList Controls { get; } = new();
public ObjectAnchor Anchor { get => _bounds.Anchor; set => _bounds.Anchor = value; }
- public Color4 BackgroundColor
- {
- get
- {
- Uniform? u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is null) u4 = new() { Location = 0, Value = new(1, 1, 0, 1) };
- return new Color4(u4.Value.X, u4.Value.X, u4.Value.X, u4.Value.X);
- }
- set
- {
- Uniform u4 = _bounds.Uniforms.Uniform4.Where(u => u.Location == 0).First();
- if (u4 is not null) _bounds.Uniforms.Uniform4.Remove(u4);
- if (u4 is null) u4 = new() { Location = 0 };
- u4.Value = new(value.R, value.G, value.B, value.A);
- _bounds.Uniforms.Uniform4.Add(u4);
- }
- }
+
+ public Color4 BackgroundColor { get => _bounds.BackgroundColor; set => _bounds.BackgroundColor = value; }
+
public bool Visible { get => _bounds.Visible; set => _bounds.Visible = value; }
private bool res = false;
public Vector2i Size
@@ -142,6 +130,17 @@ public class UserControl : IRenderObject, IParent
}
_bounds.Clean();
}
+ private Task BoundsOnMouseLeave(IRenderObject arg)
+ {
+ if (MouseLeave is not null) _ = MouseLeave.Invoke(this);
+ return Task.CompletedTask;
+ }
+
+ private Task BoundsOnMouseEnter(IRenderObject arg)
+ {
+ if (MouseEnter is not null) _ = MouseEnter.Invoke(this);
+ return Task.CompletedTask;
+ }
public void ParentResize(ResizeEventArgs e)
{
diff --git a/GraphicsManager/Window.cs b/GraphicsManager/Window.cs
index 792040f..5dd5b75 100755
--- a/GraphicsManager/Window.cs
+++ b/GraphicsManager/Window.cs
@@ -65,7 +65,7 @@ public class Window : NativeWindow , IParent
public float IntToFloat(float p, bool Invert = false)
{
- float Size = (Invert ? this.Size.Y : this.Size.X);
+ double Size = (Invert ? this.Size.Y : this.Size.X);
double half = Math.Round((double)Size / (double)2, 1);
double Per = Math.Round((double)1 / half, 15);
if (p == half) return 0.0f;
@@ -83,7 +83,7 @@ public class Window : NativeWindow , IParent
public float FloatToInt(float p, bool Invert = false)
{
- float Size = (Invert ? this.Size.Y : this.Size.X);
+ double Size = (Invert ? this.Size.Y : this.Size.X);
double half = Math.Round((double)Size / (double)2, 15);
if (p == 0) return (int)half;
if (Invert)
@@ -177,6 +177,7 @@ public class Window : NativeWindow , IParent
public void StartRender()
{
Context.MakeCurrent();
+ initthread = Thread.CurrentThread.ManagedThreadId;
ProcessEvents();
DrawFrame();
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
@@ -185,6 +186,10 @@ public class Window : NativeWindow , IParent
ProcessEvents();
bool u = (Rendertype & Rendertype.ControlUpdates) == Rendertype.ControlUpdates;
if (!u) DrawFrame();
+ if (invokes.Any())
+ {
+ for (int i = 0; i < invokes.Count; i++) invokes.Dequeue().Invoke();
+ }
Thread.Sleep(8);
}
}
@@ -194,6 +199,23 @@ public class Window : NativeWindow , IParent
{
if (!res) DrawFrame();
}
+
+ private int initthread = 0;
+
+ public bool InvokeRequired
+ {
+ get
+ {
+ return initthread != Thread.CurrentThread.ManagedThreadId;
+ }
+ }
+
+ private Queue invokes = new();
+
+ public void Invoke(Action A)
+ {
+ invokes.Enqueue(A);
+ }
public void DrawFrame()
{