Got my code back
This commit is contained in:
parent
4a958ae060
commit
6e7467b56e
@ -50,9 +50,18 @@ public class ContextMenu : Window
|
||||
|
||||
}
|
||||
|
||||
public void HideContext(Window Parent)
|
||||
protected override void OnFocusedChanged(FocusedChangedEventArgs e)
|
||||
{
|
||||
if (Parent.ActiveMenu != this) return;
|
||||
base.OnFocusedChanged(e);
|
||||
if (!e.IsFocused && w is not null) HideContext(w,true);
|
||||
}
|
||||
|
||||
private Window? w = null;
|
||||
|
||||
public void HideContext(Window Parent, bool force = false)
|
||||
{
|
||||
if (Parent.ActiveMenu == this && !false) return;
|
||||
w = null;
|
||||
Parent.ActiveMenu = null;
|
||||
Context.MakeCurrent();
|
||||
IsVisible = false;
|
||||
@ -60,9 +69,11 @@ public class ContextMenu : Window
|
||||
|
||||
public void ShowContext(Window Parent)
|
||||
{
|
||||
w = Parent;
|
||||
if (Parent.ActiveMenu == this)
|
||||
{
|
||||
Location = new((int)Parent.Location.X + (int)Parent.MousePosition.X, (int)Parent.Location.Y + (int)Parent.MousePosition.Y);
|
||||
IsVisible = true;
|
||||
Focus();
|
||||
return;
|
||||
}
|
||||
@ -74,6 +85,7 @@ public class ContextMenu : Window
|
||||
Context.MakeCurrent();
|
||||
Location = new((int)Parent.Location.X + (int)Parent.MousePosition.X, (int)Parent.Location.Y + (int)Parent.MousePosition.Y);
|
||||
IsVisible = true;
|
||||
Focus();
|
||||
GL.Viewport(0, 0, this.Size.X, this.Size.Y);
|
||||
DrawFrame();
|
||||
}
|
||||
|
23
GraphicsManager/Globals/EXT.cs
Normal file
23
GraphicsManager/Globals/EXT.cs
Normal file
@ -0,0 +1,23 @@
|
||||
namespace GraphicsManager.Globals;
|
||||
|
||||
public static class EXT
|
||||
{
|
||||
public static T[] RemoveAt<T>(this T[] source, int index)
|
||||
{
|
||||
if (source.Length == 1) return Array.Empty<T>();
|
||||
T[] dest = new T[source.Length - 1];
|
||||
if( index > 0 )
|
||||
Array.Copy(source, 0, dest, 0, index);
|
||||
|
||||
if( index < source.Length - 1 )
|
||||
Array.Copy(source, index + 1, dest, index, source.Length - index - 1);
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
public static T[] Add<T>(this T[] source, T Object)
|
||||
{
|
||||
T[] dest = new T[source.Length + 1];
|
||||
return source.Concat(new T[1] { Object }).ToArray();
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
<IncludeSymbols>False</IncludeSymbols>
|
||||
<RepositoryUrl>https://git.jacobtech.com/JacobTech.com/GraphicsManager</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<Version>1.0.1-beta01</Version>
|
||||
<Version>1.0.4-alpha09</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -5,12 +5,17 @@ namespace GraphicsManager.Objects.Core;
|
||||
public class ControlList
|
||||
{
|
||||
private List<IRenderObject> _internal = new();
|
||||
private bool Clearing = false;
|
||||
|
||||
public IRenderObject this[int Index] => _internal[Index];
|
||||
public IRenderObject this[uint Index] => _internal[(int)Index];
|
||||
|
||||
public IEnumerable<IRenderObject> Where(Func<IRenderObject, bool> func) => _internal.Where(func);
|
||||
|
||||
public bool Contains(IRenderObject Control) => _internal.Contains(Control);
|
||||
|
||||
public int IndexOf(IRenderObject Control) => _internal.IndexOf(Control);
|
||||
|
||||
public int Length => _internal.Count;
|
||||
|
||||
internal event Func<IRenderObject, Task>? ControlAdded;
|
||||
@ -20,7 +25,9 @@ public class ControlList
|
||||
{
|
||||
_internal.Remove(item);
|
||||
item.Clean();
|
||||
if (ControlRemoved is not null) _ = ControlRemoved.Invoke();
|
||||
item = null!;
|
||||
GC.Collect();
|
||||
if (ControlRemoved is not null && !Clearing) _ = ControlRemoved.Invoke();
|
||||
}
|
||||
|
||||
public void Add(IRenderObject item)
|
||||
@ -31,11 +38,15 @@ public class ControlList
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
foreach (IRenderObject con in _internal)
|
||||
Clearing = true;
|
||||
for (int i = 0; i< _internal.Count; i++)
|
||||
{
|
||||
con.Clean();
|
||||
_internal[i].Clean();
|
||||
_internal[i] = null!;
|
||||
}
|
||||
_internal.Clear();
|
||||
GC.Collect();
|
||||
Clearing = false;
|
||||
if (ControlRemoved is not null) _ = ControlRemoved.Invoke();
|
||||
}
|
||||
}
|
@ -15,10 +15,11 @@ public class Font
|
||||
internal static List<string>? _SystemPre = null;
|
||||
private static List<Font> AllFonts = new();
|
||||
private static bool Backup = false;
|
||||
|
||||
private static int addsystem = 0;
|
||||
internal void AddSystemFontFace(string path)
|
||||
{
|
||||
Console.WriteLine("Added font: " + path);
|
||||
addsystem++;
|
||||
if (!AllFileFonts.ContainsKey(path)) AllFileFonts.Add(path, new(lib, path, 0));
|
||||
if (!_Faces.Contains(AllFileFonts[path]))
|
||||
{
|
||||
@ -27,6 +28,15 @@ public class Font
|
||||
ft._Faces.Add(AllFileFonts[path]);
|
||||
}
|
||||
}
|
||||
|
||||
if (addsystem == _SystemPre!.Count)
|
||||
{
|
||||
addsystem++;
|
||||
foreach (Font ft in AllFonts)
|
||||
{
|
||||
ft._Faces.Add(AllMemoryFonts.Last().Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Font()
|
||||
@ -68,6 +78,37 @@ public class Font
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
try
|
||||
{
|
||||
string folder = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
|
||||
|
||||
string GetFonts(string dir)
|
||||
{
|
||||
DirectoryInfo di = new(dir);
|
||||
string files = "";
|
||||
foreach (FileInfo file in di.GetFiles())
|
||||
{
|
||||
if (!file.FullName.EndsWith(".otf") && !file.FullName.EndsWith(".ttf")) continue;
|
||||
if (files == "") files = file.FullName;
|
||||
else files += Environment.NewLine + file.FullName;
|
||||
}
|
||||
foreach (DirectoryInfo direc in di.GetDirectories())
|
||||
{
|
||||
files += GetFonts(direc.FullName);
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
_SystemPre = GetFonts(folder).Split(Environment.NewLine).ToList();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void SetEmbeddedFont(string Font, Assembly? Assembly = null)
|
||||
@ -108,20 +149,22 @@ public class Font
|
||||
? Tools.GetResourceBytes(Base + Font)
|
||||
: Tools.GetResourceBytes(Assembly!, $"{Base}{Font}"));
|
||||
byte[] hash = SHA256.HashData(f);
|
||||
if (AllMemoryFonts.ContainsKey(hash)) AllMemoryFonts.Add(hash, new(lib, f, 0));
|
||||
if (!AllMemoryFonts.ContainsKey(hash)) AllMemoryFonts.Add(hash, new(lib, f, 0));
|
||||
fontclass._Faces.Insert(0, AllMemoryFonts[hash]);
|
||||
return fontclass;
|
||||
}
|
||||
|
||||
private static Font? Cache = null;
|
||||
public static Font MakeFontFromSystem(uint PixelHeight = 20)
|
||||
//private static Font? Cache = null;
|
||||
private static List<Font> Caches = new();
|
||||
public static Font MakeFontFromSystem(uint PixelHeight = 12)
|
||||
{
|
||||
if (Cache is null)
|
||||
if (!Caches.Where(s => s.PixelHeight == PixelHeight).Any())
|
||||
{
|
||||
Cache = new() { PixelHeight = PixelHeight };
|
||||
AllFonts.Add(Cache);
|
||||
Font f = new() { PixelHeight = PixelHeight };
|
||||
Caches.Add(f);
|
||||
AllFonts.Add(f);
|
||||
}
|
||||
return Cache;
|
||||
return Caches.Where(s => s.PixelHeight == PixelHeight).First();
|
||||
}
|
||||
public static Font MakeFontFromFile(string Font)
|
||||
{
|
||||
@ -150,7 +193,7 @@ public class Font
|
||||
}
|
||||
|
||||
private bool HasTopFont = false;
|
||||
public uint PixelHeight { get; set; } = 20;
|
||||
public uint PixelHeight { get; set; } = 12;
|
||||
public string Name { get; private set; } = default!;
|
||||
public bool Embeded { get; private set; }
|
||||
public Assembly? Assembly { get; private set; }
|
||||
|
@ -27,7 +27,7 @@ public class Texture
|
||||
public static readonly Dictionary<IGLFWGraphicsContext, Shader> TextureShader = new ();
|
||||
|
||||
public int handel;
|
||||
public Texture(byte[] File)
|
||||
internal Texture(byte[] File)
|
||||
{
|
||||
Image<Rgba32> image = Image.Load<Rgba32>(File);
|
||||
image.Mutate(x => x.Flip(FlipMode.Vertical));
|
||||
@ -60,6 +60,10 @@ public class Texture
|
||||
|
||||
internal static Character GetChar(Font l, char charter)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
int last = 0;
|
||||
for (int i = 0; i < l.Fonts.Count; i++)
|
||||
{
|
||||
@ -68,13 +72,15 @@ public class Texture
|
||||
try
|
||||
{
|
||||
l.Fonts[i].SetPixelSizes(0, l.PixelHeight);
|
||||
l.Fonts[i].SelectCharmap(Encoding.Unicode);
|
||||
last = i;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine($"no");
|
||||
continue;
|
||||
}
|
||||
l.Fonts[i].SelectCharmap(Encoding.Unicode);
|
||||
|
||||
ushort temp = ((ushort)charter);
|
||||
if (l.Fonts[i].GetCharIndex(temp) == 0) continue;
|
||||
l.Fonts[i].LoadChar(temp, LoadFlags.Render, LoadTarget.Normal);
|
||||
@ -94,21 +100,25 @@ public class Texture
|
||||
continue;
|
||||
}
|
||||
}
|
||||
List<string> bad = new();
|
||||
for (int i = 0; i < Font._SystemPre.Count; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Face tmp = new(Font.lib, Font._SystemPre[i], 0);
|
||||
Face tmp;
|
||||
try
|
||||
{
|
||||
tmp = new(Font.lib, Font._SystemPre[i], 0);
|
||||
tmp.SetPixelSizes(0, l.PixelHeight);
|
||||
tmp.SelectCharmap(Encoding.Unicode);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
tmp.Dispose();
|
||||
Console.WriteLine($"Removing bad font1: {Font._SystemPre[i]}");
|
||||
bad.Add(Font._SystemPre[i]);
|
||||
continue;
|
||||
}
|
||||
tmp.SelectCharmap(Encoding.Unicode);
|
||||
|
||||
ushort temp2 = ((ushort)charter);
|
||||
if (tmp.GetCharIndex(temp2) == 0)
|
||||
{
|
||||
@ -118,7 +128,13 @@ public class Texture
|
||||
tmp.LoadChar(temp2, LoadFlags.Render, LoadTarget.Normal);
|
||||
GlyphSlot glyph2 = tmp.Glyph;
|
||||
FTBitmap bitmap2 = glyph2.Bitmap;
|
||||
if (bad.Any()) Console.WriteLine($"Purge 1: {bad.Count}");
|
||||
foreach (string str in bad)
|
||||
{
|
||||
Font._SystemPre.Remove(str);
|
||||
}
|
||||
l.AddSystemFontFace(Font._SystemPre[i]);
|
||||
|
||||
return new()
|
||||
{
|
||||
Size = new Vector2(bitmap2.Width, bitmap2.Rows),
|
||||
@ -128,8 +144,20 @@ public class Texture
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Removing bad font2: {Font._SystemPre[i]}");
|
||||
bad.Add(Font._SystemPre[i]);
|
||||
Console.WriteLine(ex);
|
||||
}
|
||||
if (bad.Any()) Console.WriteLine($"Purge 2: {bad.Count}");
|
||||
foreach (string str in bad)
|
||||
{
|
||||
Font._SystemPre.Remove(str);
|
||||
}
|
||||
}
|
||||
if (bad.Any()) Console.WriteLine($"Purge 3: {bad.Count}");
|
||||
foreach (string str in bad)
|
||||
{
|
||||
Font._SystemPre.Remove(str);
|
||||
}
|
||||
l.Fonts[last].SetPixelSizes(0, l.PixelHeight);
|
||||
|
||||
@ -145,13 +173,24 @@ public class Texture
|
||||
Bearing = new Vector2(glyph22.BitmapLeft, glyph22.BitmapTop),
|
||||
Advance = (int)glyph22.Advance.X.Value,
|
||||
};
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(1);
|
||||
Console.WriteLine(e);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
internal static Texture TextureForChar(IGLFWGraphicsContext con, Font l, char charter)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
Texture? t = null;
|
||||
int last = 0;
|
||||
|
||||
for (int i = 0; i < l.Fonts.Count; i++)
|
||||
{
|
||||
try
|
||||
@ -165,13 +204,12 @@ public class Texture
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine("should never happen");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
|
||||
|
||||
GL.ActiveTexture(TextureUnit.Texture0);
|
||||
l.Fonts[i].SelectCharmap(Encoding.Unicode);
|
||||
ushort temp = ((ushort)charter);
|
||||
if (l.Fonts[i].GetCharIndex(temp) == 0) continue;
|
||||
@ -179,6 +217,8 @@ public class Texture
|
||||
GlyphSlot glyph = l.Fonts[i].Glyph;
|
||||
FTBitmap bitmap = glyph.Bitmap;
|
||||
t = new();
|
||||
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
|
||||
GL.ActiveTexture(TextureUnit.Texture0);
|
||||
t.handel = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, t.handel);
|
||||
GL.TexImage2D(TextureTarget.Texture2D, 0,
|
||||
@ -199,6 +239,7 @@ public class Texture
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("How?");
|
||||
Console.WriteLine(ex);
|
||||
continue;
|
||||
}
|
||||
@ -210,20 +251,20 @@ public class Texture
|
||||
{
|
||||
try
|
||||
{
|
||||
Face tmp = new(Font.lib, Font._SystemPre[i], 0);
|
||||
Face tmp;
|
||||
try
|
||||
{
|
||||
tmp = new(Font.lib, Font._SystemPre[i], 0);
|
||||
tmp.SetPixelSizes(0, l.PixelHeight);
|
||||
tmp.SelectCharmap(Encoding.Unicode);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch
|
||||
{
|
||||
tmp.Dispose();
|
||||
Console.WriteLine("Could happen");
|
||||
continue;
|
||||
}
|
||||
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
|
||||
|
||||
GL.ActiveTexture(TextureUnit.Texture0);
|
||||
tmp.SelectCharmap(Encoding.Unicode);
|
||||
|
||||
ushort temp2 = ((ushort)charter);
|
||||
if (tmp.GetCharIndex(temp2) == 0)
|
||||
{
|
||||
@ -235,6 +276,9 @@ public class Texture
|
||||
FTBitmap bitmap2 = glyph2.Bitmap;
|
||||
l.AddSystemFontFace(Font._SystemPre[i]);
|
||||
t = new();
|
||||
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
|
||||
|
||||
GL.ActiveTexture(TextureUnit.Texture0);
|
||||
t.handel = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, t.handel);
|
||||
GL.TexImage2D(TextureTarget.Texture2D, 0,
|
||||
@ -253,6 +297,7 @@ public class Texture
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("may never happen");
|
||||
Console.WriteLine(ex);
|
||||
}
|
||||
}
|
||||
@ -290,6 +335,13 @@ public class Texture
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(2);
|
||||
Console.WriteLine(e);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadText()
|
||||
|
52
GraphicsManager/Objects/Core/TextureManager.cs
Normal file
52
GraphicsManager/Objects/Core/TextureManager.cs
Normal file
@ -0,0 +1,52 @@
|
||||
using System.Runtime.Intrinsics.Arm;
|
||||
using System.Security.Cryptography;
|
||||
using GraphicsManager.Structs;
|
||||
using OpenTK.Windowing.Desktop;
|
||||
|
||||
namespace GraphicsManager.Objects.Core;
|
||||
|
||||
public class TextureManager
|
||||
{
|
||||
public static readonly Dictionary<IGLFWGraphicsContext, TextureManager> TextureManagers = new();
|
||||
|
||||
public readonly Dictionary<byte[], Texture> TextureHashMap = new();
|
||||
|
||||
public static TextureManager GetTextureManager(IGLFWGraphicsContext context)
|
||||
{
|
||||
if (context is null) throw new ArgumentNullException(nameof(context));
|
||||
if (!TextureManagers.ContainsKey(context))
|
||||
{
|
||||
TextureManager tmp = new(context);
|
||||
TextureManagers.Add(context, tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
return TextureManagers[context];
|
||||
}
|
||||
|
||||
public IGLFWGraphicsContext Context { get; private set; }
|
||||
|
||||
private TextureManager(IGLFWGraphicsContext context)
|
||||
{
|
||||
Context = context;
|
||||
}
|
||||
|
||||
public IReadOnlyList<Texture> Textures { get => TextureHashMap.Values.ToList().AsReadOnly(); }
|
||||
|
||||
public void RemoveTexture(Texture Texture)
|
||||
{
|
||||
foreach(KeyValuePair<byte[], Texture> item in TextureHashMap.Where(kvp => kvp.Value == Texture).ToList())
|
||||
{
|
||||
TextureHashMap.Remove(item.Key);
|
||||
}
|
||||
}
|
||||
|
||||
public Texture AddTexture(byte[] Texture)
|
||||
{
|
||||
byte[] hash = SHA256.HashData(Texture);
|
||||
if (TextureHashMap.ContainsKey(hash)) return TextureHashMap[hash];
|
||||
Context.MakeCurrent();
|
||||
TextureHashMap.Add(hash, new(Texture));
|
||||
return TextureHashMap[hash];
|
||||
}
|
||||
}
|
@ -17,7 +17,7 @@ public class FlowLayout : IRenderObject, IParent
|
||||
{
|
||||
_bounds = new Rectangle();
|
||||
_bounds.Clicked += _bounds_Clicked;
|
||||
t = new(50);
|
||||
t = new(33);
|
||||
t.Enabled = true;
|
||||
t.Elapsed += TOnElapsed;
|
||||
t.Start();
|
||||
@ -27,6 +27,66 @@ public class FlowLayout : IRenderObject, IParent
|
||||
_bounds.MouseLeave += BoundsOnMouseLeave;
|
||||
}
|
||||
|
||||
public void ScrollToControl(IRenderObject Control)
|
||||
{
|
||||
if (Controls.Length < 1 || !Controls.Contains(Control)) throw new Exception("Control does not exist");
|
||||
if (Control.Location.Y >= 0 && (Control.Location.Y + Control.Size.Y) <= Size.Y) return;
|
||||
int index = Controls.IndexOf(Control);
|
||||
bool startbottom = false;
|
||||
if (Controls.Length - 1 - index < index) startbottom = true;
|
||||
int loc = 0;
|
||||
if ((Control.Location.Y + Control.Size.Y) >= Size.Y) loc = Size.Y - Control.Size.Y;
|
||||
int start = loc + Control.Size.Y;
|
||||
BlockDraw = true;
|
||||
if (startbottom)
|
||||
{
|
||||
for (int i = index + 1; i < Controls.Length; i++)
|
||||
{
|
||||
start += Controls[i].Size.Y;
|
||||
}
|
||||
|
||||
for (int i = Controls.Length - 1; i >= 0; i--)
|
||||
{
|
||||
start -= Controls[i].Size.Y;
|
||||
Controls[i].Location = new(Controls[i].Location.X, start);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = index; i >= 0; i--)
|
||||
{
|
||||
start -= Controls[i].Size.Y;
|
||||
}
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
{
|
||||
start += Controls[i].Size.Y;
|
||||
Controls[i].Location = new(Controls[i].Location.X, start);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = Controls.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (Controls[i].Location.Y + Controls[i].Size.Y < 0 || Controls[i].Location.Y > Size.Y)
|
||||
{
|
||||
Controls[i].Visible = false;
|
||||
}
|
||||
}
|
||||
BlockDraw = false;
|
||||
if (Parent is not null) Parent.TryDraw();
|
||||
}
|
||||
|
||||
public void ScrollToTop()
|
||||
{
|
||||
if (Controls.Length < 1) return;
|
||||
ScrollToControl(Controls[0]);
|
||||
}
|
||||
|
||||
public void ScrollToBottom()
|
||||
{
|
||||
if (Controls.Length < 1) return;
|
||||
ScrollToControl(Controls[Controls.Length - 1]);
|
||||
}
|
||||
|
||||
public void ReportSizeUpdate(IRenderObject Control)
|
||||
{
|
||||
if (BlockDraw) return;
|
||||
@ -100,8 +160,17 @@ public class FlowLayout : IRenderObject, IParent
|
||||
{
|
||||
BlockDraw = true;
|
||||
_bounds.Visible = value;
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
Controls[i].Visible = value;
|
||||
if (!value)
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
Controls[i].Visible = value;
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
if (Controls[i].Location.Y > Size.Y || Controls[i].Location.Y + Controls[i].Size.Y < 0)
|
||||
Controls[i].Visible = false;
|
||||
else
|
||||
Controls[i].Visible = true;
|
||||
}
|
||||
if (Parent is not null) Parent.TryDraw();
|
||||
BlockDraw = false;
|
||||
}
|
||||
@ -183,9 +252,9 @@ public class FlowLayout : IRenderObject, IParent
|
||||
}
|
||||
|
||||
public bool BlockDraw { get; set; } = false;
|
||||
private MouseWheelEventArgs dis;
|
||||
Timer t;
|
||||
private Queue<Action> scrols = new();
|
||||
private int dist = 0;
|
||||
public ContextMenu? ContextMenu { get => _bounds.ContextMenu; set => _bounds.ContextMenu = value; }
|
||||
|
||||
public void TryDraw()
|
||||
@ -198,7 +267,7 @@ public class FlowLayout : IRenderObject, IParent
|
||||
{
|
||||
if (!inside) return;
|
||||
BlockDraw = true;
|
||||
dis = obj;
|
||||
dist += (int)obj.OffsetY;
|
||||
if (scrols.Any())
|
||||
{
|
||||
for (int i = 0; i < scrols.Count; i++)
|
||||
@ -224,28 +293,93 @@ public class FlowLayout : IRenderObject, IParent
|
||||
{
|
||||
scrols.Enqueue(new Action(() =>
|
||||
{
|
||||
BlockDraw = true;
|
||||
int current = dist;
|
||||
dist = 0;
|
||||
if (Controls.Length < 1) return;
|
||||
bool down = dis.OffsetY < 0;//scrole wheel dir
|
||||
bool down = current < 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
|
||||
float totoaldist = (current * HScrollPixels);
|
||||
if (down && (!Controls[Controls.Length-1].Visible || (Controls[Controls.Length-1].Visible && Controls[Controls.Length-1].Location.Y + Controls[Controls.Length-1].Size.Y > Size.Y))) //put chat up
|
||||
{
|
||||
moved = true;
|
||||
int found = -1;
|
||||
bool lfound = false;
|
||||
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)));
|
||||
if (found == -1)
|
||||
{
|
||||
if (!Controls[i].Visible) continue;
|
||||
else
|
||||
{
|
||||
if ((Controls[i].Location.Y + Controls[i].Size.Y) + totoaldist < 0)
|
||||
{
|
||||
BlockDraw = true;
|
||||
Controls[i].Visible = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
found = Controls[i].Location.Y + (int)totoaldist;
|
||||
}
|
||||
}
|
||||
|
||||
if (!lfound)
|
||||
{
|
||||
BlockDraw = true;
|
||||
Controls[i].Location = new(0, found);
|
||||
found += Controls[i].Size.Y;
|
||||
|
||||
if (Controls[i].Location.Y <= Size.Y) Controls[i].Visible = true;
|
||||
else
|
||||
{
|
||||
lfound = true;
|
||||
Controls[i].Visible = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
BlockDraw = true;
|
||||
if (Controls[i].Visible) Controls[i].Visible = false;
|
||||
}
|
||||
}
|
||||
if (!down && (Controls[0].Location.Y < 0)) // can go up
|
||||
if (!down && (!Controls[0].Visible || (Controls[0].Visible && Controls[0].Location.Y < 0))) // put chat down
|
||||
{
|
||||
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++)
|
||||
int found = -1;
|
||||
int lfound = -1;
|
||||
for (int i = Controls.Length - 1; i >= 0; i--)
|
||||
{
|
||||
Controls[i].Location = new(0,
|
||||
(int)(Controls[i - 1].Location.Y + Controls[i - 1].Size.Y));
|
||||
if (found == -1)
|
||||
{
|
||||
if (!Controls[i].Visible) continue;
|
||||
else
|
||||
{
|
||||
if (Controls[i].Location.Y + totoaldist > Size.Y)
|
||||
{
|
||||
BlockDraw = true;
|
||||
Controls[i].Visible = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
found = Controls[i].Location.Y + (int)totoaldist + Controls[i].Size.Y;
|
||||
}
|
||||
}
|
||||
|
||||
if (lfound == -1)
|
||||
{
|
||||
BlockDraw = true;
|
||||
found -= Controls[i].Size.Y;
|
||||
Controls[i].Location = new(0, found);
|
||||
|
||||
if (Controls[i].Location.Y + Controls[i].Size.Y >= 0) Controls[i].Visible = true;
|
||||
else
|
||||
{
|
||||
lfound = i;
|
||||
Controls[i].Visible = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
BlockDraw = true;
|
||||
if (Controls[i].Visible) Controls[i].Visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -253,6 +387,7 @@ public class FlowLayout : IRenderObject, IParent
|
||||
{
|
||||
Parent!.TryDraw();
|
||||
}
|
||||
|
||||
}));
|
||||
}
|
||||
|
||||
@ -273,10 +408,13 @@ public class FlowLayout : IRenderObject, IParent
|
||||
|
||||
if (needload.Any())
|
||||
{
|
||||
BlockDraw = true;
|
||||
foreach (IRenderObject Control in needload)
|
||||
{
|
||||
Control.LoadToParent(this, Window!);
|
||||
}
|
||||
|
||||
BlockDraw = false;
|
||||
}
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
{
|
||||
|
@ -41,7 +41,7 @@ public class Label : IRenderObject
|
||||
set
|
||||
{
|
||||
_Visible = value;
|
||||
if (Parent is not null) Parent.TryDraw();
|
||||
if (Parent is not null && Loaded) Parent.TryDraw();
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,6 +59,34 @@ public class Label : IRenderObject
|
||||
}
|
||||
public int VBO { get; private set; }
|
||||
public Vector2 DIR { get; set; } = new Vector2(1f, 0f);
|
||||
|
||||
public Vector2i GetSizeOfChar(int Index)
|
||||
{
|
||||
float addy = Font.PixelHeight * Scale, addx = 0F, char_x = 0F;
|
||||
for (int i = 0; i < Index + 1; i++)
|
||||
{
|
||||
char character;
|
||||
if (PasswordChar is null)
|
||||
character = Text[i];
|
||||
else
|
||||
character = PasswordChar.Value;
|
||||
|
||||
|
||||
if (character == '\n')
|
||||
{
|
||||
char_x = 0f;
|
||||
addy += Font.PixelHeight * Scale;
|
||||
continue;
|
||||
}
|
||||
Character cha = Texture.GetChar(Font, character);
|
||||
float w = cha.Size.X * Scale;
|
||||
float xrel = char_x + cha.Bearing.X * Scale;
|
||||
char_x += (cha.Advance >> 6) * Scale;
|
||||
if ((xrel + w) >= addx) addx = (xrel + w);
|
||||
}
|
||||
|
||||
return new((int)addx, (int)addy);
|
||||
}
|
||||
public string Text
|
||||
{
|
||||
get => text;
|
||||
@ -74,7 +102,7 @@ public class Label : IRenderObject
|
||||
character = value[i];
|
||||
else
|
||||
character = PasswordChar.Value;
|
||||
Character cha = Texture.GetChar(Font, character);
|
||||
|
||||
|
||||
if (character == '\n')
|
||||
{
|
||||
@ -82,6 +110,7 @@ public class Label : IRenderObject
|
||||
addy += Font.PixelHeight * Scale;
|
||||
continue;
|
||||
}
|
||||
Character cha = Texture.GetChar(Font, character);
|
||||
float w = cha.Size.X * Scale;
|
||||
float xrel = char_x + cha.Bearing.X * Scale;
|
||||
char_x += (cha.Advance >> 6) * Scale;
|
||||
@ -119,7 +148,12 @@ public class Label : IRenderObject
|
||||
|
||||
public void Clean()
|
||||
{
|
||||
GL.DeleteBuffer(VBO);
|
||||
Size = new(0, 0);
|
||||
GL.DeleteVertexArray(VAO);
|
||||
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
|
||||
Loaded = false;
|
||||
Visible = false;
|
||||
}
|
||||
|
||||
public void Draw()
|
||||
@ -153,21 +187,23 @@ public class Label : IRenderObject
|
||||
c = Text[i];
|
||||
else
|
||||
c = PasswordChar.Value;
|
||||
if (!_characters[Window!.Context][Font].ContainsKey(c))
|
||||
bool n = (c == '\n');
|
||||
if (!_characters[Window!.Context][Font].ContainsKey(c) && !n)
|
||||
{
|
||||
var f = Texture.TextureForChar(Window!.Context, Font, c);
|
||||
f.LoadText();
|
||||
}
|
||||
if (!_characters[Window!.Context][Font].ContainsKey(c)) continue;
|
||||
Character ch = _characters[Window!.Context][Font][c];
|
||||
|
||||
int maxx = 0;
|
||||
if (c == '\n')
|
||||
if (n)
|
||||
{
|
||||
hhh += Font.PixelHeight;
|
||||
hhh += Font.PixelHeight * Scale;
|
||||
char_x = 0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_characters[Window!.Context][Font].ContainsKey(c)) continue;
|
||||
Character ch = _characters[Window!.Context][Font][c];
|
||||
float w = ch.Size.X * Scale;
|
||||
float h = ch.Size.Y * Scale;
|
||||
float xrel = char_x + ch.Bearing.X * Scale;
|
||||
|
@ -199,7 +199,7 @@ public class RoundedRectangle : IRenderObject
|
||||
{
|
||||
if (mouseinside && e.Button == MouseButton.Button1 && Clicked is not null) _ = Clicked.Invoke(this);
|
||||
if (mouseinside && e.Button == MouseButton.Button2 && ContextMenu is not null) ContextMenu.ShowContext(Window!);
|
||||
if (!mouseinside && ContextMenu is not null) ContextMenu.HideContext(Window!);
|
||||
if (!mouseinside && ContextMenu is not null && Window!.ActiveMenu != ContextMenu) ContextMenu.HideContext(Window!);
|
||||
}
|
||||
|
||||
~RoundedRectangle()
|
||||
|
@ -1,6 +1,8 @@
|
||||
using GraphicsManager.Enums;
|
||||
using System.Timers;
|
||||
using GraphicsManager.Enums;
|
||||
using GraphicsManager.Interfaces;
|
||||
using GraphicsManager.Objects.Core;
|
||||
using OpenTK.Graphics.GL;
|
||||
using OpenTK.Mathematics;
|
||||
using OpenTK.Windowing.Common;
|
||||
using OpenTK.Windowing.GraphicsLibraryFramework;
|
||||
@ -11,16 +13,24 @@ public class Textbox : IRenderObject
|
||||
{
|
||||
private RoundedRectangle _bounds, _inside;
|
||||
private Label _label;
|
||||
private Label _watermark;
|
||||
public ContextMenu? ContextMenu { get => _bounds.ContextMenu; set => _bounds.ContextMenu = value; }
|
||||
public Textbox()
|
||||
{
|
||||
_bounds = new RoundedRectangle();
|
||||
_inside = new RoundedRectangle();
|
||||
_label = new Label();
|
||||
_watermark = new()
|
||||
{
|
||||
Color = new(128, 128, 128, 255)
|
||||
};
|
||||
|
||||
_bounds.MouseEnter += BoundsOnMouseEnter;
|
||||
_bounds.MouseLeave += BoundsOnMouseLeave;
|
||||
}
|
||||
|
||||
private int currentc = 0;
|
||||
|
||||
public event Func<IRenderObject, Task>? WindowLoaded;
|
||||
public event Func<IRenderObject, Task>? MouseEnter;
|
||||
public event Func<IRenderObject, Task>? MouseLeave;
|
||||
@ -30,7 +40,37 @@ public class Textbox : IRenderObject
|
||||
public int Smoothness { get => _bounds.Smoothness; set { _bounds.Smoothness = value; _inside.Smoothness = value; } }
|
||||
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 string Text
|
||||
{
|
||||
get => _label.Text;
|
||||
set
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
if (!_label.Visible) _label.Visible = true;
|
||||
if (_watermark.Visible) _watermark.Visible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_label.Visible) _label.Visible = false;
|
||||
if (!_watermark.Visible) _watermark.Visible = true;
|
||||
}
|
||||
_label.Text = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Font WatermarkFont { get => _watermark!.Font; set => _watermark.Font = value; }
|
||||
public string WatermarkText
|
||||
{
|
||||
get
|
||||
{
|
||||
return _watermark.Text;
|
||||
}
|
||||
set
|
||||
{
|
||||
_watermark.Text = value;
|
||||
}
|
||||
}
|
||||
public char? PasswordChar { get => _label.PasswordChar; set => _label.PasswordChar = value; }
|
||||
public bool Loaded { get; private set; } = false;
|
||||
public Vector2i Size
|
||||
@ -50,7 +90,8 @@ public class Textbox : IRenderObject
|
||||
set
|
||||
{
|
||||
_bounds.Location = value;
|
||||
_label.Location = new(value.X + Border + 5, Location.Y + Border + (((Size.Y - (Radius * 2)) / 2) - (_label.Size.Y / 2)));
|
||||
_label.Location = new(value.X + Border + 5, Location.Y + Border + Border + (((Size.Y - (Radius * 2)) / 2) - (_label.Size.Y / 2)));
|
||||
_watermark.Location = _label.Location;
|
||||
_inside.Location = new(value.X + Border, value.Y + Border);
|
||||
}
|
||||
}
|
||||
@ -61,6 +102,8 @@ public class Textbox : IRenderObject
|
||||
public Window? Window { get; private set; } = null;
|
||||
public Color4 InsideColor { get => _inside.BackgroundColor; set => _inside.BackgroundColor = value; }
|
||||
public Color4 BorderColor { get => _bounds.BackgroundColor; set => _bounds.BackgroundColor = value; }
|
||||
public Color4 TextColor { get => _label.Color; set => _label.Color = value; }
|
||||
public Color4 WatermarkColor { get => _watermark.Color; set => _watermark.Color = value; }
|
||||
|
||||
public bool Visible
|
||||
{
|
||||
@ -69,7 +112,24 @@ public class Textbox : IRenderObject
|
||||
{
|
||||
_bounds.Visible = value;
|
||||
_inside.Visible = value;
|
||||
_label.Visible = value;
|
||||
if (value)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_label.Text))
|
||||
{
|
||||
_label.Visible = true;
|
||||
_watermark.Visible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_label.Visible = false;
|
||||
_watermark.Visible = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_label.Visible = value;
|
||||
_watermark.Visible = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
public event Func<IRenderObject, Task>? Clicked;
|
||||
@ -90,6 +150,7 @@ public class Textbox : IRenderObject
|
||||
_bounds.Clean();
|
||||
_inside.Clean();
|
||||
_label.Clean();
|
||||
_watermark.Clean();
|
||||
}
|
||||
|
||||
public void Draw()
|
||||
@ -97,7 +158,8 @@ public class Textbox : IRenderObject
|
||||
if (!Visible || !Loaded) return;
|
||||
_bounds.Draw();
|
||||
_inside.Draw();
|
||||
_label.Draw();
|
||||
if (!string.IsNullOrEmpty(_label.Text)) _label.Draw();
|
||||
else _watermark.Draw();
|
||||
}
|
||||
|
||||
public void LoadToParent(IParent Parent, Window Window)
|
||||
@ -112,6 +174,7 @@ public class Textbox : IRenderObject
|
||||
_bounds.LoadToParent(Parent, Window);
|
||||
_inside.LoadToParent(Parent, Window);
|
||||
_label.LoadToParent(Parent, Window);
|
||||
_watermark.LoadToParent(Parent, Window);
|
||||
Location = Location;
|
||||
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
|
||||
}
|
||||
|
@ -40,7 +40,9 @@ public class UserControl : IRenderObject, IParent
|
||||
BlockDraw = true;
|
||||
_bounds.Visible = value;
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
{
|
||||
Controls[i].Visible = value;
|
||||
}
|
||||
if (Parent is not null) Parent.TryDraw();
|
||||
BlockDraw = false;
|
||||
}
|
||||
@ -130,10 +132,13 @@ public class UserControl : IRenderObject, IParent
|
||||
|
||||
if (needload.Any())
|
||||
{
|
||||
BlockDraw = true;
|
||||
foreach (IRenderObject Control in needload)
|
||||
{
|
||||
Control.LoadToParent(this, Window!);
|
||||
}
|
||||
|
||||
BlockDraw = false;
|
||||
}
|
||||
for (int i = 0; i < Controls.Length; i++)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@ using OpenTK.Graphics.OpenGL4;
|
||||
using OpenTK.Mathematics;
|
||||
using OpenTK.Windowing.Common;
|
||||
using OpenTK.Windowing.Desktop;
|
||||
using OpenTK.Windowing.GraphicsLibraryFramework;
|
||||
|
||||
namespace GraphicsManager;
|
||||
|
||||
@ -22,13 +23,33 @@ public class Window : NativeWindow , IParent
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
public TextureManager TextureManager { get; private set; }
|
||||
|
||||
internal IRenderObject? focused;
|
||||
public void CenterWindow(int mon)
|
||||
{
|
||||
Box2i clientArea = Monitors.GetMonitors()[mon].ClientArea;
|
||||
int num = (clientArea.Min.X + clientArea.Max.X - Size.X) / 2;
|
||||
int num2 = (clientArea.Min.Y + clientArea.Max.Y - Size.Y) / 2;
|
||||
if (num < clientArea.Min.X)
|
||||
{
|
||||
num = clientArea.Min.X;
|
||||
}
|
||||
|
||||
if (num2 < clientArea.Min.Y)
|
||||
{
|
||||
num2 = clientArea.Min.Y;
|
||||
}
|
||||
|
||||
ClientRectangle = new Box2i(num, num2, num + Size.X, num2 + Size.Y);
|
||||
}
|
||||
|
||||
internal ContextMenu? ActiveMenu { get; set; } = null;
|
||||
public IParent? Parent { get; } = null;
|
||||
public Vector2 LocationAsFloat { get; } = new Vector2(0f, 0f);
|
||||
public Window(NativeWindowSettings nativeWindowSettings) : base(nativeWindowSettings)
|
||||
{
|
||||
TextureManager = TextureManager.GetTextureManager(Context);
|
||||
Context.MakeCurrent();
|
||||
Texture.TextureShader.Add(Context, new("RectangleTexture", true));
|
||||
Objects.Rectangle.DefaultShader.Add(Context, new("Rectangle", true));
|
||||
@ -38,7 +59,7 @@ public class Window : NativeWindow , IParent
|
||||
|
||||
public Window() : base(new NativeWindowSettings())
|
||||
{
|
||||
|
||||
TextureManager = TextureManager.GetTextureManager(Context);
|
||||
}
|
||||
public Vector2i Position { get; } = new Vector2i(0, 0);
|
||||
public Color4 BackgroundColor { get; set; } = new Color4(0, 0, 0, 255);
|
||||
@ -187,14 +208,12 @@ public class Window : NativeWindow , IParent
|
||||
{
|
||||
Context.MakeCurrent();
|
||||
initthread = Thread.CurrentThread.ManagedThreadId;
|
||||
ProcessEvents();
|
||||
GLFW.PollEvents();
|
||||
DrawFrame();
|
||||
if (WindowLoaded is not null) WindowLoaded.Invoke(this);
|
||||
while (Exists && IsVisible && !IsExiting)
|
||||
{
|
||||
ProcessEvents();
|
||||
bool u = (Rendertype & Rendertype.ControlUpdates) == Rendertype.ControlUpdates;
|
||||
if (!u) DrawFrame();
|
||||
GLFW.PollEvents();
|
||||
if (invokes.Any())
|
||||
{
|
||||
for (int i = 0; i < invokes.Count; i++) invokes.Dequeue().Invoke();
|
||||
|
Loading…
Reference in New Issue
Block a user