restructure

This commit is contained in:
NinjaPug
2025-04-14 12:46:10 -04:00
parent 1cf596b379
commit 21b6ad3d75
22 changed files with 1257 additions and 990 deletions

View File

@@ -0,0 +1,30 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering.Elements
{
/// <summary>
/// Represents a bar graph element in the OLED preview
/// </summary>
public class BarElement : PreviewElement
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int Value { get; set; }
public override void Draw(Graphics g)
{
// Draw outline rectangle
g.DrawRectangle(Pens.White, X, Y, Width, Height);
// Calculate fill width based on value (0-100)
int fillWidth = (int)(Width * (Value / 100.0));
if (fillWidth > 0)
{
// Draw filled portion
g.FillRectangle(Brushes.White, X + 1, Y + 1, fillWidth - 1, Height - 2);
}
}
}
}

View File

@@ -0,0 +1,24 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering.Elements
{
/// <summary>
/// Represents an icon element in the OLED preview
/// </summary>
public class IconElement : PreviewElement
{
public int X { get; set; }
public int Y { get; set; }
public string Name { get; set; }
public override void Draw(Graphics g)
{
// For preview, just draw a placeholder rectangle with icon name
g.DrawRectangle(Pens.Gray, X, Y, 24, 24);
using (Font font = new Font("Arial", 6))
{
g.DrawString(Name, font, Brushes.White, X + 2, Y + 8);
}
}
}
}

View File

@@ -0,0 +1,20 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering.Elements
{
/// <summary>
/// Represents a line element in the OLED preview
/// </summary>
public class LineElement : PreviewElement
{
public int X1 { get; set; }
public int Y1 { get; set; }
public int X2 { get; set; }
public int Y2 { get; set; }
public override void Draw(Graphics g)
{
g.DrawLine(Pens.White, X1, Y1, X2, Y2);
}
}
}

View File

@@ -0,0 +1,30 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering.Elements
{
/// <summary>
/// Represents a rectangle or box element in the OLED preview
/// </summary>
public class RectElement : PreviewElement
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public bool Filled { get; set; }
public override void Draw(Graphics g)
{
if (Filled)
{
// Draw filled box
g.FillRectangle(Brushes.White, X, Y, Width, Height);
}
else
{
// Draw outline rectangle
g.DrawRectangle(Pens.White, X, Y, Width, Height);
}
}
}
}

View File

@@ -0,0 +1,31 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering.Elements
{
/// <summary>
/// Represents a text element in the OLED preview
/// </summary>
public class TextElement : PreviewElement
{
public int X { get; set; }
public int Y { get; set; }
public int Size { get; set; }
public string Text { get; set; }
public override void Draw(Graphics g)
{
// Choose font size based on the size parameter
Font font;
switch (Size)
{
case 1: font = new Font("Consolas", 8); break;
case 2: font = new Font("Consolas", 10); break;
case 3: font = new Font("Consolas", 12); break;
default: font = new Font("Consolas", 8); break;
}
// Draw text with white color
g.DrawString(Text, font, Brushes.White, X, Y - font.Height);
}
}
}

View File

@@ -0,0 +1,15 @@
using System.Drawing;
namespace PCPalConfigurator.Rendering
{
/// <summary>
/// Base class for all OLED preview elements
/// </summary>
public abstract class PreviewElement
{
/// <summary>
/// Draws the element on the provided graphics context
/// </summary>
public abstract void Draw(Graphics g);
}
}

View File

@@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace PCPalConfigurator.Rendering
{
/// <summary>
/// Renders OLED preview elements to a graphics context
/// </summary>
public class OledRenderer
{
private const int OledWidth = 256;
private const int OledHeight = 64;
/// <summary>
/// Renders a list of preview elements to a graphics context
/// </summary>
public void RenderPreview(Graphics g, List<PreviewElement> elements, int panelWidth, int panelHeight)
{
// Create graphics object with smooth rendering
g.SmoothingMode = SmoothingMode.AntiAlias;
// Calculate scale to fit preview in panel while maintaining aspect ratio
float scaleX = (float)panelWidth / OledWidth;
float scaleY = (float)panelHeight / OledHeight;
float scale = Math.Min(scaleX, scaleY);
// Calculate centered position
int displayWidth = (int)(OledWidth * scale);
int displayHeight = (int)(OledHeight * scale);
int offsetX = (panelWidth - displayWidth) / 2;
int offsetY = (panelHeight - displayHeight) / 2;
// Draw display outline
Rectangle displayRect = new Rectangle(offsetX, offsetY, displayWidth, displayHeight);
g.DrawRectangle(Pens.DarkGray, displayRect);
// Set up transformation to scale the preview elements
g.TranslateTransform(offsetX, offsetY);
g.ScaleTransform(scale, scale);
// Draw all elements
foreach (var element in elements)
{
element.Draw(g);
}
// Reset transformation
g.ResetTransform();
// Draw labels and guidelines
g.DrawString($"OLED: {OledWidth}x{OledHeight}", new Font("Arial", 8), Brushes.Gray, 5, 5);
}
/// <summary>
/// Gets the OLED display dimensions
/// </summary>
public static (int Width, int Height) GetDisplayDimensions()
{
return (OledWidth, OledHeight);
}
}
}