diff options
Diffstat (limited to 'Ryujinx.Profiler/UI/ProfileButton.cs')
| -rw-r--r-- | Ryujinx.Profiler/UI/ProfileButton.cs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Ryujinx.Profiler/UI/ProfileButton.cs b/Ryujinx.Profiler/UI/ProfileButton.cs new file mode 100644 index 00000000..7e2ae728 --- /dev/null +++ b/Ryujinx.Profiler/UI/ProfileButton.cs @@ -0,0 +1,110 @@ +using System; +using OpenTK; +using OpenTK.Graphics.OpenGL; +using Ryujinx.Profiler.UI.SharpFontHelpers; + +namespace Ryujinx.Profiler.UI +{ + public class ProfileButton + { + // Store font service + private FontService _fontService; + + // Layout information + private int _left, _right; + private int _bottom, _top; + private int _height; + private int _padding; + + // Label information + private int _labelX, _labelY; + private string _label; + + // Misc + private Action _clicked; + private bool _visible; + + public ProfileButton(FontService fontService, Action clicked) + : this(fontService, clicked, 0, 0, 0, 0, 0) + { + _visible = false; + } + + public ProfileButton(FontService fontService, Action clicked, int x, int y, int padding, int height, int width) + : this(fontService, "", clicked, x, y, padding, height, width) + { + _visible = false; + } + + public ProfileButton(FontService fontService, string label, Action clicked, int x, int y, int padding, int height, int width = -1) + { + _fontService = fontService; + _clicked = clicked; + + UpdateSize(label, x, y, padding, height, width); + } + + public int UpdateSize(string label, int x, int y, int padding, int height, int width = -1) + { + _visible = true; + _label = label; + + if (width == -1) + { + // Dummy draw to measure size + width = (int)_fontService.DrawText(label, 0, 0, height, false); + } + + UpdateSize(x, y, padding, width, height); + + return _right - _left; + } + + public void UpdateSize(int x, int y, int padding, int width, int height) + { + _height = height; + _left = x; + _bottom = y; + _labelX = x + padding / 2; + _labelY = y + padding / 2; + _top = y + height + padding; + _right = x + width + padding; + } + + public void Draw() + { + if (!_visible) + { + return; + } + + // Draw backing rectangle + GL.Begin(PrimitiveType.Triangles); + GL.Color3(Color.Black); + GL.Vertex2(_left, _bottom); + GL.Vertex2(_left, _top); + GL.Vertex2(_right, _top); + + GL.Vertex2(_right, _top); + GL.Vertex2(_right, _bottom); + GL.Vertex2(_left, _bottom); + GL.End(); + + // Use font service to draw label + _fontService.DrawText(_label, _labelX, _labelY, _height); + } + + public bool ProcessClick(int x, int y) + { + // If button contains x, y + if (x > _left && x < _right && + y > _bottom && y < _top) + { + _clicked(); + return true; + } + + return false; + } + } +} |
