diff --git a/GameOfLife/GameOfLife.csproj b/GameOfLife/GameOfLife.csproj
index 7b05c62..c1f01fb 100644
--- a/GameOfLife/GameOfLife.csproj
+++ b/GameOfLife/GameOfLife.csproj
@@ -2,8 +2,17 @@
WinExe
- netcoreapp3.1
+ net5.0-windows
true
+ GameOfLife.Program
+
+ x64
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GameOfLife/MainForm.Designer.cs b/GameOfLife/MainForm.Designer.cs
index 0aab3aa..c8b5237 100644
--- a/GameOfLife/MainForm.Designer.cs
+++ b/GameOfLife/MainForm.Designer.cs
@@ -44,7 +44,6 @@ namespace GameOfLife
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Load += new System.EventHandler(this.MainForm_Load);
- this.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint);
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.MainForm_KeyPress);
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseClick);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseMove);
diff --git a/GameOfLife/MainForm.cs b/GameOfLife/MainForm.cs
index 97528bd..82d2a11 100644
--- a/GameOfLife/MainForm.cs
+++ b/GameOfLife/MainForm.cs
@@ -1,16 +1,18 @@
-using System;
-using System.Collections.Generic;
+using Microsoft.Win32;
+using System;
using System.Drawing;
+using System.Runtime.InteropServices;
using System.Windows.Forms;
+using unvell.D2DLib;
+using unvell.D2DLib.WinForm;
namespace GameOfLife
{
- public partial class MainForm : Form
+ public partial class MainForm : D2DForm
{
private Point mouseLocation;
private bool[,] newCells;
- private bool[,] toggleCells;
private bool[,] oldCells;
private Random random;
@@ -19,28 +21,125 @@ namespace GameOfLife
private int magicCells = 0;
- private double density = 0.35;
+ private double density = 0.5;
- private int interval = 500;
+ private int interval = 100;
+
+ // TODO color
+ //private int color;
- public MainForm(Rectangle bounds)
+ private D2DRect boundsRect;
+
+ private D2DRect cellRect;
+
+ private int maxX;
+
+ private int maxY;
+
+ private int firstX;
+ private int lastX;
+ private int firstY;
+ private int lastY;
+
+ private bool previewMode;
+
+ [DllImport("user32.dll")]
+ static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
+
+ [DllImport("user32.dll")]
+ static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
+
+ [DllImport("user32.dll", SetLastError = true)]
+ static extern int GetWindowLong(IntPtr hWnd, int nIndex);
+
+ [DllImport("user32.dll")]
+ static extern bool GetClientRect(IntPtr hWnd, out Rectangle lpRect);
+
+
+ private void LoadSettings()
{
- InitializeComponent();
- random = new Random();
+ RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\TheoryOfNekomata\\WindowsScreensavers\\GameOfLife");
+ var retrievedGridSize = 3;
+ var retrievedSpores = 0;
+ int retrievedDensity = 50;
+ var retrievedInterval = 250;
+ var gridSizes = new int[] { 1, 2, 4, 8 };
+
+ if (key != null)
+ {
+ retrievedGridSize = (int)key.GetValue("GridSizeIndex", 3);
+ retrievedSpores = (int)key.GetValue("Spores", 0);
+ retrievedDensity = (int)key.GetValue("DensityPercentage", 50);
+ retrievedInterval = (int)key.GetValue("IntervalMs", 250);
+ }
+
+ gridSize = gridSizes[retrievedGridSize];
+ magicCells = retrievedSpores;
+ density = ((double)retrievedDensity) / 100.0;
+ interval = retrievedInterval;
+ }
+
+ private void SetBounds(Rectangle bounds) {
Bounds = bounds;
- newCells = new bool[bounds.Width / gridSize, bounds.Height / gridSize];
- toggleCells = new bool[bounds.Width / gridSize, bounds.Height / gridSize];
- oldCells = new bool[bounds.Width / gridSize, bounds.Height / gridSize];
+ boundsRect = new D2DRect(Bounds.Left, Bounds.Top, Bounds.Width, Bounds.Height);
+ }
+
+ private void RandomizeCells() {
+ random = new Random();
+
+ maxX = Bounds.Width / gridSize;
+ maxY = Bounds.Height / gridSize;
+
+ newCells = new bool[maxX, maxY];
+ oldCells = new bool[maxX, maxY];
+
+ firstX = oldCells.GetLowerBound(0);
+ lastX = oldCells.GetUpperBound(0);
+ firstY = oldCells.GetLowerBound(1);
+ lastY = oldCells.GetUpperBound(1);
- for (var x = 0; x < newCells.GetLength(0); x++) {
- for (var y = 0; y < newCells.GetLength(1); y++) {
+ for (var x = 0; x < maxX; x++)
+ {
+ for (var y = 0; y < maxY; y++)
+ {
newCells[x, y] = random.NextDouble() <= density;
oldCells[x, y] = false;
- toggleCells[x, y] = true;
}
}
}
+ public MainForm(Rectangle bounds)
+ {
+ LoadSettings();
+ InitializeComponent();
+ SetBounds(bounds);
+ RandomizeCells();
+ }
+
+ public MainForm(IntPtr PreviewWndHandle)
+ {
+ LoadSettings();
+ gridSize = 1;
+ magicCells = 0;
+ density = 0.5;
+ InitializeComponent();
+ // Set the preview window as the parent of this window
+ SetParent(this.Handle, PreviewWndHandle);
+
+ // Make this a child window so it will close when the parent dialog closes
+ // GWL_STYLE = -16, WS_CHILD = 0x40000000
+ SetWindowLong(this.Handle, -16, new IntPtr(GetWindowLong(this.Handle, -16) | 0x40000000));
+
+ // Place our window inside the parent
+ Rectangle ParentRect;
+ GetClientRect(PreviewWndHandle, out ParentRect);
+ Size = ParentRect.Size;
+ Location = new Point(0, 0);
+ RandomizeCells();
+ previewMode = true;
+ }
+
+
private void MainForm_Load(object sender, EventArgs e)
{
Cursor.Hide();
@@ -53,64 +152,74 @@ namespace GameOfLife
private void MainForm_MouseMove(object sender, MouseEventArgs e)
{
- if (!mouseLocation.IsEmpty)
+ if (!previewMode)
{
- // Terminate if mouse is moved a significant distance
- if (Math.Abs(mouseLocation.X - e.X) > 5 ||
- Math.Abs(mouseLocation.Y - e.Y) > 5)
- Application.Exit();
- }
-
- // Update current mouse location
- mouseLocation = e.Location;
+ if (!mouseLocation.IsEmpty)
+ {
+ // Terminate if mouse is moved a significant distance
+ if (Math.Abs(mouseLocation.X - e.X) > 5 ||
+ Math.Abs(mouseLocation.Y - e.Y) > 5)
+ Application.Exit();
+ }
+ // Update current mouse location
+ mouseLocation = e.Location;
+ }
}
private void MainForm_MouseClick(object sender, MouseEventArgs e)
{
- Application.Exit();
+
+ if (!previewMode)
+ {
+ Application.Exit();
+ }
}
private void MainForm_KeyPress(object sender, KeyPressEventArgs e)
{
- Application.Exit();
+
+ if (!previewMode)
+ {
+ Application.Exit();
+ }
}
- private int GetAliveNeighbors(bool[,] cells, int x, int y) {
- int prevX = x == cells.GetLowerBound(0) ? cells.GetUpperBound(0) : x - 1;
- int nextX = x == cells.GetUpperBound(0) ? cells.GetLowerBound(0) : x + 1;
- int prevY = y == cells.GetLowerBound(1) ? cells.GetUpperBound(1) : y - 1;
- int nextY = y == cells.GetUpperBound(1) ? cells.GetLowerBound(1) : y + 1;
+ private int GetAliveNeighbors(int x, int y) {
+ int prevX = x == firstX ? lastX : x - 1;
+ int nextX = x == lastX ? firstX : x + 1;
+ int prevY = y == firstY ? lastY : y - 1;
+ int nextY = y == lastY ? firstY : y + 1;
int aliveNeighbors = 0;
- if (cells[prevX, prevY]) {
+ if (oldCells[prevX, prevY]) {
aliveNeighbors += 1;
}
- if (cells[x, prevY])
+ if (oldCells[x, prevY])
{
aliveNeighbors += 1;
}
- if (cells[nextX, prevY])
+ if (oldCells[nextX, prevY])
{
aliveNeighbors += 1;
}
- if (cells[prevX, y])
+ if (oldCells[prevX, y])
{
aliveNeighbors += 1;
}
- if (cells[nextX, y])
+ if (oldCells[nextX, y])
{
aliveNeighbors += 1;
}
- if (cells[prevX, nextY])
+ if (oldCells[prevX, nextY])
{
aliveNeighbors += 1;
}
- if (cells[x, nextY])
+ if (oldCells[x, nextY])
{
aliveNeighbors += 1;
}
- if (cells[nextX, nextY])
+ if (oldCells[nextX, nextY])
{
aliveNeighbors += 1;
}
@@ -130,7 +239,7 @@ namespace GameOfLife
{
for (var y = 0; y < newCells.GetLength(1); y++)
{
- int neighbors = GetAliveNeighbors(oldCells, x, y);
+ int neighbors = GetAliveNeighbors(x, y);
bool shouldLive = false;
if (oldCells[x, y] && neighbors == 2)
{
@@ -140,7 +249,6 @@ namespace GameOfLife
}
newCells[x, y] = shouldLive;
- toggleCells[x, y] = oldCells[x, y] == newCells[x, y];
}
}
@@ -149,41 +257,25 @@ namespace GameOfLife
int magicY = random.Next(0, newCells.GetUpperBound(1));
newCells[magicX, magicY] = true;
- toggleCells[magicX, magicY] = oldCells[magicX, magicY] == newCells[magicX, magicY];
}
-
- Redraw(CreateGraphics());
+ Refresh();
}
- private void Redraw(Graphics graphics) {
- List liveCells = new List();
- List deadCells = new List();
+ protected override void OnRender(D2DGraphics graphics)
+ {
+ graphics.FillRectangle(boundsRect, D2DColor.White);
for (var x = 0; x < newCells.GetLength(0); x++)
{
for (var y = 0; y < newCells.GetLength(1); y++)
{
- if (newCells[x, y])
+ if (!newCells[x, y])
{
- liveCells.Add(new Rectangle(x * gridSize, y * gridSize, gridSize, gridSize));
+ cellRect = new D2DRect(x * gridSize, y * gridSize, gridSize, gridSize);
+ graphics.FillRectangle(cellRect, D2DColor.Black);
}
- else {
- deadCells.Add(new Rectangle(x * gridSize, y * gridSize, gridSize, gridSize));
- }
- //else if (!newCells[x, y]) {
- // graphics.FillRectangle(Brushes.Black, x * gridSize, y * gridSize, gridSize, gridSize);
- //}
}
}
-
- graphics.FillRectangle(Brushes.Black, Bounds);
- //graphics.FillRectangles(Brushes.Black, deadCells.ToArray());
- graphics.FillRectangles(Brushes.White, liveCells.ToArray());
- }
-
- private void MainForm_Paint(object sender, PaintEventArgs e)
- {
- Redraw(e.Graphics);
}
}
}
diff --git a/GameOfLife/Program.cs b/GameOfLife/Program.cs
index ed16915..5512d95 100644
--- a/GameOfLife/Program.cs
+++ b/GameOfLife/Program.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace GameOfLife
@@ -35,11 +32,19 @@ namespace GameOfLife
if (firstArgument == "/c") // Configuration mode
{
- // TODO
+ Application.Run(new SettingsForm());
}
else if (firstArgument == "/p") // Preview mode
{
- // TODO
+ if (secondArgument == null)
+ {
+ MessageBox.Show("Sorry, but the expected window handle was not provided.",
+ "ScreenSaver", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ return;
+ }
+
+ IntPtr previewWndHandle = new IntPtr(long.Parse(secondArgument));
+ Application.Run(new MainForm(previewWndHandle));
}
else if (firstArgument == "/s") // Full-screen mode
{
@@ -55,7 +60,7 @@ namespace GameOfLife
}
else // No arguments - treat like /c
{
- // TODO
+ Application.Run(new SettingsForm());
}
}
diff --git a/GameOfLife/SettingsForm.Designer.cs b/GameOfLife/SettingsForm.Designer.cs
new file mode 100644
index 0000000..160e714
--- /dev/null
+++ b/GameOfLife/SettingsForm.Designer.cs
@@ -0,0 +1,344 @@
+
+namespace GameOfLife
+{
+ partial class SettingsForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.ctrlGridSize = new System.Windows.Forms.ComboBox();
+ this.ctrlSpores = new System.Windows.Forms.NumericUpDown();
+ this.ctrlInterval = new System.Windows.Forms.TrackBar();
+ this.ctrlDensity = new System.Windows.Forms.TrackBar();
+ this.lblSpores = new System.Windows.Forms.Label();
+ this.lblGridSize = new System.Windows.Forms.Label();
+ this.grpGridSize = new System.Windows.Forms.GroupBox();
+ this.grpSpores = new System.Windows.Forms.GroupBox();
+ this.grpDensity = new System.Windows.Forms.GroupBox();
+ this.lblDensityValue = new System.Windows.Forms.Label();
+ this.lblDensity = new System.Windows.Forms.Label();
+ this.grpInterval = new System.Windows.Forms.GroupBox();
+ this.lblIntervalValue = new System.Windows.Forms.Label();
+ this.lblInterval = new System.Windows.Forms.Label();
+ this.panelMain = new System.Windows.Forms.TableLayoutPanel();
+ this.panelActions = new System.Windows.Forms.FlowLayoutPanel();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlSpores)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlInterval)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlDensity)).BeginInit();
+ this.grpGridSize.SuspendLayout();
+ this.grpSpores.SuspendLayout();
+ this.grpDensity.SuspendLayout();
+ this.grpInterval.SuspendLayout();
+ this.panelMain.SuspendLayout();
+ this.panelActions.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // ctrlGridSize
+ //
+ this.ctrlGridSize.Dock = System.Windows.Forms.DockStyle.Top;
+ this.ctrlGridSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.ctrlGridSize.FormattingEnabled = true;
+ this.ctrlGridSize.Items.AddRange(new object[] {
+ "1",
+ "2",
+ "4",
+ "8"});
+ this.ctrlGridSize.Location = new System.Drawing.Point(8, 70);
+ this.ctrlGridSize.Name = "ctrlGridSize";
+ this.ctrlGridSize.Size = new System.Drawing.Size(177, 23);
+ this.ctrlGridSize.TabIndex = 1;
+ //
+ // ctrlSpores
+ //
+ this.ctrlSpores.Dock = System.Windows.Forms.DockStyle.Top;
+ this.ctrlSpores.Location = new System.Drawing.Point(8, 70);
+ this.ctrlSpores.Name = "ctrlSpores";
+ this.ctrlSpores.Size = new System.Drawing.Size(178, 23);
+ this.ctrlSpores.TabIndex = 2;
+ //
+ // ctrlInterval
+ //
+ this.ctrlInterval.Dock = System.Windows.Forms.DockStyle.Top;
+ this.ctrlInterval.Location = new System.Drawing.Point(8, 70);
+ this.ctrlInterval.Maximum = 3000;
+ this.ctrlInterval.Minimum = 50;
+ this.ctrlInterval.Name = "ctrlInterval";
+ this.ctrlInterval.Size = new System.Drawing.Size(177, 45);
+ this.ctrlInterval.TabIndex = 3;
+ this.ctrlInterval.TickFrequency = 250;
+ this.ctrlInterval.Value = 250;
+ this.ctrlInterval.Scroll += new System.EventHandler(this.ctrlInterval_Scroll);
+ //
+ // ctrlDensity
+ //
+ this.ctrlDensity.Dock = System.Windows.Forms.DockStyle.Top;
+ this.ctrlDensity.Location = new System.Drawing.Point(8, 70);
+ this.ctrlDensity.Maximum = 100;
+ this.ctrlDensity.Name = "ctrlDensity";
+ this.ctrlDensity.Size = new System.Drawing.Size(178, 45);
+ this.ctrlDensity.TabIndex = 4;
+ this.ctrlDensity.TickFrequency = 10;
+ this.ctrlDensity.Value = 50;
+ this.ctrlDensity.Scroll += new System.EventHandler(this.ctrlDensity_Scroll);
+ //
+ // lblSpores
+ //
+ this.lblSpores.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblSpores.Location = new System.Drawing.Point(8, 24);
+ this.lblSpores.Name = "lblSpores";
+ this.lblSpores.Padding = new System.Windows.Forms.Padding(0, 8, 0, 8);
+ this.lblSpores.Size = new System.Drawing.Size(178, 46);
+ this.lblSpores.TabIndex = 5;
+ this.lblSpores.Text = "This sets the count of live cells randomly spawning in the grid.";
+ //
+ // lblGridSize
+ //
+ this.lblGridSize.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblGridSize.Location = new System.Drawing.Point(8, 24);
+ this.lblGridSize.Name = "lblGridSize";
+ this.lblGridSize.Padding = new System.Windows.Forms.Padding(0, 8, 0, 8);
+ this.lblGridSize.Size = new System.Drawing.Size(177, 46);
+ this.lblGridSize.TabIndex = 6;
+ this.lblGridSize.Text = "This is the size of each cell in pixels.";
+ //
+ // grpGridSize
+ //
+ this.grpGridSize.AutoSize = true;
+ this.grpGridSize.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.grpGridSize.Controls.Add(this.ctrlGridSize);
+ this.grpGridSize.Controls.Add(this.lblGridSize);
+ this.grpGridSize.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.grpGridSize.Location = new System.Drawing.Point(8, 8);
+ this.grpGridSize.Margin = new System.Windows.Forms.Padding(8);
+ this.grpGridSize.Name = "grpGridSize";
+ this.grpGridSize.Padding = new System.Windows.Forms.Padding(8);
+ this.grpGridSize.Size = new System.Drawing.Size(193, 146);
+ this.grpGridSize.TabIndex = 7;
+ this.grpGridSize.TabStop = false;
+ this.grpGridSize.Text = "Grid Size";
+ //
+ // grpSpores
+ //
+ this.grpSpores.AutoSize = true;
+ this.grpSpores.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.grpSpores.Controls.Add(this.ctrlSpores);
+ this.grpSpores.Controls.Add(this.lblSpores);
+ this.grpSpores.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.grpSpores.Location = new System.Drawing.Point(217, 170);
+ this.grpSpores.Margin = new System.Windows.Forms.Padding(8);
+ this.grpSpores.Name = "grpSpores";
+ this.grpSpores.Padding = new System.Windows.Forms.Padding(8);
+ this.grpSpores.Size = new System.Drawing.Size(194, 147);
+ this.grpSpores.TabIndex = 8;
+ this.grpSpores.TabStop = false;
+ this.grpSpores.Text = "Spores";
+ //
+ // grpDensity
+ //
+ this.grpDensity.AutoSize = true;
+ this.grpDensity.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.grpDensity.Controls.Add(this.lblDensityValue);
+ this.grpDensity.Controls.Add(this.ctrlDensity);
+ this.grpDensity.Controls.Add(this.lblDensity);
+ this.grpDensity.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.grpDensity.Location = new System.Drawing.Point(217, 8);
+ this.grpDensity.Margin = new System.Windows.Forms.Padding(8);
+ this.grpDensity.Name = "grpDensity";
+ this.grpDensity.Padding = new System.Windows.Forms.Padding(8);
+ this.grpDensity.Size = new System.Drawing.Size(194, 146);
+ this.grpDensity.TabIndex = 9;
+ this.grpDensity.TabStop = false;
+ this.grpDensity.Text = "Density";
+ //
+ // lblDensityValue
+ //
+ this.lblDensityValue.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblDensityValue.Location = new System.Drawing.Point(8, 115);
+ this.lblDensityValue.Name = "lblDensityValue";
+ this.lblDensityValue.Size = new System.Drawing.Size(178, 30);
+ this.lblDensityValue.TabIndex = 6;
+ this.lblDensityValue.Text = "Current Value: 50%";
+ this.lblDensityValue.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
+ // lblDensity
+ //
+ this.lblDensity.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblDensity.Location = new System.Drawing.Point(8, 24);
+ this.lblDensity.Name = "lblDensity";
+ this.lblDensity.Padding = new System.Windows.Forms.Padding(0, 8, 0, 8);
+ this.lblDensity.Size = new System.Drawing.Size(178, 46);
+ this.lblDensity.TabIndex = 5;
+ this.lblDensity.Text = "This controls the starting density of live cells throughout the grid.";
+ //
+ // grpInterval
+ //
+ this.grpInterval.AutoSize = true;
+ this.grpInterval.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.grpInterval.Controls.Add(this.lblIntervalValue);
+ this.grpInterval.Controls.Add(this.ctrlInterval);
+ this.grpInterval.Controls.Add(this.lblInterval);
+ this.grpInterval.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.grpInterval.Location = new System.Drawing.Point(8, 170);
+ this.grpInterval.Margin = new System.Windows.Forms.Padding(8);
+ this.grpInterval.Name = "grpInterval";
+ this.grpInterval.Padding = new System.Windows.Forms.Padding(8);
+ this.grpInterval.Size = new System.Drawing.Size(193, 147);
+ this.grpInterval.TabIndex = 10;
+ this.grpInterval.TabStop = false;
+ this.grpInterval.Text = "Interval";
+ //
+ // lblIntervalValue
+ //
+ this.lblIntervalValue.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblIntervalValue.Location = new System.Drawing.Point(8, 115);
+ this.lblIntervalValue.Name = "lblIntervalValue";
+ this.lblIntervalValue.Size = new System.Drawing.Size(177, 30);
+ this.lblIntervalValue.TabIndex = 5;
+ this.lblIntervalValue.Text = "Current Value: 250ms";
+ this.lblIntervalValue.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
+ // lblInterval
+ //
+ this.lblInterval.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lblInterval.Location = new System.Drawing.Point(8, 24);
+ this.lblInterval.Name = "lblInterval";
+ this.lblInterval.Padding = new System.Windows.Forms.Padding(0, 8, 0, 8);
+ this.lblInterval.Size = new System.Drawing.Size(177, 46);
+ this.lblInterval.TabIndex = 4;
+ this.lblInterval.Text = "This specifies how often the screen updates.";
+ //
+ // panelMain
+ //
+ this.panelMain.AutoSize = true;
+ this.panelMain.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.panelMain.ColumnCount = 2;
+ this.panelMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.panelMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.panelMain.Controls.Add(this.grpDensity, 1, 0);
+ this.panelMain.Controls.Add(this.grpSpores, 1, 1);
+ this.panelMain.Controls.Add(this.grpInterval, 0, 1);
+ this.panelMain.Controls.Add(this.grpGridSize, 0, 0);
+ this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panelMain.Location = new System.Drawing.Point(0, 0);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.RowCount = 2;
+ this.panelMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.panelMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.panelMain.Size = new System.Drawing.Size(419, 325);
+ this.panelMain.TabIndex = 11;
+ //
+ // panelActions
+ //
+ this.panelActions.AutoSize = true;
+ this.panelActions.BackColor = System.Drawing.SystemColors.Window;
+ this.panelActions.Controls.Add(this.btnOK);
+ this.panelActions.Controls.Add(this.btnCancel);
+ this.panelActions.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelActions.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
+ this.panelActions.Location = new System.Drawing.Point(0, 325);
+ this.panelActions.Margin = new System.Windows.Forms.Padding(0);
+ this.panelActions.Name = "panelActions";
+ this.panelActions.Size = new System.Drawing.Size(419, 39);
+ this.panelActions.TabIndex = 12;
+ //
+ // btnOK
+ //
+ this.btnOK.Location = new System.Drawing.Point(340, 8);
+ this.btnOK.Margin = new System.Windows.Forms.Padding(4, 8, 4, 8);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(75, 23);
+ this.btnOK.TabIndex = 0;
+ this.btnOK.Text = "O&K";
+ this.btnOK.UseVisualStyleBackColor = true;
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(257, 8);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 8, 4, 8);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 1;
+ this.btnCancel.Text = "C&ancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // SettingsForm
+ //
+ this.AcceptButton = this.btnOK;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(419, 364);
+ this.Controls.Add(this.panelMain);
+ this.Controls.Add(this.panelActions);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "SettingsForm";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Game of Life Settings";
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlSpores)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlInterval)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ctrlDensity)).EndInit();
+ this.grpGridSize.ResumeLayout(false);
+ this.grpSpores.ResumeLayout(false);
+ this.grpDensity.ResumeLayout(false);
+ this.grpDensity.PerformLayout();
+ this.grpInterval.ResumeLayout(false);
+ this.grpInterval.PerformLayout();
+ this.panelMain.ResumeLayout(false);
+ this.panelMain.PerformLayout();
+ this.panelActions.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.ComboBox ctrlGridSize;
+ private System.Windows.Forms.NumericUpDown ctrlSpores;
+ private System.Windows.Forms.TrackBar ctrlInterval;
+ private System.Windows.Forms.TrackBar ctrlDensity;
+ private System.Windows.Forms.Label lblSpores;
+ private System.Windows.Forms.Label lblGridSize;
+ private System.Windows.Forms.GroupBox grpGridSize;
+ private System.Windows.Forms.GroupBox grpSpores;
+ private System.Windows.Forms.GroupBox grpDensity;
+ private System.Windows.Forms.Label lblDensity;
+ private System.Windows.Forms.GroupBox grpInterval;
+ private System.Windows.Forms.Label lblInterval;
+ private System.Windows.Forms.TableLayoutPanel panelMain;
+ private System.Windows.Forms.Label lblDensityValue;
+ private System.Windows.Forms.Label lblIntervalValue;
+ private System.Windows.Forms.FlowLayoutPanel panelActions;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+ }
+}
\ No newline at end of file
diff --git a/GameOfLife/SettingsForm.cs b/GameOfLife/SettingsForm.cs
new file mode 100644
index 0000000..80ebb2d
--- /dev/null
+++ b/GameOfLife/SettingsForm.cs
@@ -0,0 +1,72 @@
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace GameOfLife
+{
+ public partial class SettingsForm : Form
+ {
+ private void LoadSettings() {
+ RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\TheoryOfNekomata\\WindowsScreensavers\\GameOfLife");
+ object retrievedGridSize = 3;
+ object retrievedSpores = 0;
+ object retrievedDensity = 50;
+ object retrievedInterval = 250;
+
+ if (key != null)
+ {
+ retrievedGridSize = key.GetValue("GridSizeIndex", 3);
+ retrievedSpores = key.GetValue("Spores", 0);
+ retrievedDensity = key.GetValue("DensityPercentage", 50);
+ retrievedInterval = key.GetValue("IntervalMs", 250);
+ }
+
+ ctrlGridSize.SelectedIndex = (int) retrievedGridSize;
+ ctrlSpores.Value = decimal.Parse(retrievedSpores.ToString());
+ ctrlDensity.Value = (int)retrievedDensity;
+ lblDensityValue.Text = string.Format("Current Value: {0}%", ctrlDensity.Value);
+ ctrlInterval.Value = (int)retrievedInterval;
+ lblIntervalValue.Text = string.Format("Current Value: {0}ms", ctrlInterval.Value);
+ }
+
+ private void SaveSettings() {
+ RegistryKey key = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TheoryOfNekomata\\WindowsScreensavers\\GameOfLife");
+ key.SetValue("GridSizeIndex", ctrlGridSize.SelectedIndex);
+ key.SetValue("Spores", int.Parse(ctrlSpores.Value.ToString()));
+ key.SetValue("DensityPercentage", ctrlDensity.Value);
+ key.SetValue("IntervalMs", ctrlInterval.Value);
+ }
+
+ public SettingsForm()
+ {
+ InitializeComponent();
+ LoadSettings();
+ }
+
+ private void ctrlDensity_Scroll(object sender, EventArgs e)
+ {
+ lblDensityValue.Text = string.Format("Current Value: {0}%", (sender as TrackBar).Value);
+ }
+
+ private void ctrlInterval_Scroll(object sender, EventArgs e)
+ {
+ lblIntervalValue.Text = string.Format("Current Value: {0}ms", (sender as TrackBar).Value);
+ }
+
+ private void btnOK_Click(object sender, EventArgs e)
+ {
+ SaveSettings();
+ Close();
+ }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+ }
+}
diff --git a/GameOfLife/SettingsForm.resx b/GameOfLife/SettingsForm.resx
new file mode 100644
index 0000000..b5ae26c
--- /dev/null
+++ b/GameOfLife/SettingsForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file