Badgerati/NotifyMeCI

View on GitHub
NotifyMeCI.GUI/SettingsForm.cs

Summary

Maintainability
A
2 hrs
Test Coverage
/*
Notify Me CI is designed to be an awesome CI desktop notifier.

Copyright (c) 2016, Matthew Kelly (Badgerati)
Company: Cadaeic Studios
License: MIT (see LICENSE for details)
 */

using NotifyMeCI.Engine.Enums;
using NotifyMeCI.Engine.Managers;
using NotifyMeCI.Engine.Objects;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace NotifyMeCI.GUI
{
    public partial class SettingsForm : Form
    {

        #region Fields

        private SettingManager _settings = SettingManager.Instance;

        #endregion

        #region Constructor

        public SettingsForm()
        {
            InitializeComponent();
            SetupBuildStatusTable();
            Initialise();
        }

        private void Initialise()
        {
            MinimizeChkBox.Checked = _settings.Minimize;
            AbortedEqualsFailedChkBox.Checked = _settings.AbortedEqualsFailed;
        }

        #endregion

        #region Events

        private void OkBtn_Click(object sender, EventArgs e)
        {
            try
            {
                SaveBuildStatuses();
                _settings.Save();
                Close();
                DialogResult = DialogResult.OK;
            }
            catch (Exception ex)
            {
                Logger.ShowExceptionMessage("There was a fatal issue saving the settings:", ex, "Error Saving Settings");
                return;
            }
        }

        private void MinimizeChkBox_CheckedChanged(object sender, EventArgs e)
        {
            _settings.Minimize = MinimizeChkBox.Checked;
        }

        private void AbortedEqualsFailedChkBox_CheckedChanged(object sender, EventArgs e)
        {
            _settings.AbortedEqualsFailed = AbortedEqualsFailedChkBox.Checked;
        }

        private void ColourBtn_Click(object sender, EventArgs e)
        {
            var btn = (Button)sender;

            if (ColourPicker.ShowDialog() == DialogResult.OK)
            {
                btn.BackColor = ColourPicker.Color;
            }
        }

        #endregion

        #region Setup

        private void SetupBuildStatusTable()
        {
            // get all status enum values
            var statuses = Enum.GetNames(typeof(BuildStatusType));
            var rows = statuses.Length + 1;

            // setup the table size
            BuildStatusTable.RowCount = rows;
            BuildStatusTable.MaximumSize = new Size(BuildStatusTable.Width, 0);
            BuildStatusTable.AutoSize = true;

            // initialise the table's header
            var font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold);
            BuildStatusTable.Controls.Add(new Label() { Text = "Status Type", Font = font }, 0, 0);
            BuildStatusTable.Controls.Add(new Label() { Text = "Order", Font = font }, 1, 0);
            BuildStatusTable.Controls.Add(new Label() { Text = "Colour", Font = font }, 2, 0);
            BuildStatusTable.Controls.Add(new Label() { Text = "Visible", Font = font }, 3, 0);

            // grab all build statuses that have actually been saved
            var buildStatuses = _settings.BuildStatuses;
            var buildStatus = default(BuildStatus);

            // setup the rest of the table
            for (var i = 1; i <= statuses.Length; i++)
            {
                var statusMapped = BuildStatusTypeHelper.Parse(statuses[i - 1]);
                BuildStatusTable.Controls.Add(new Label() { Text = statuses[i - 1], Margin = new Padding(0, 7, 0, 0) }, 0, i);

                if (buildStatuses.ContainsKey(statusMapped))
                {
                    buildStatus = buildStatuses[statusMapped];
                    BuildStatusTable.Controls.Add(new NumericUpDown() { Minimum = 0, Maximum = 100, Value = buildStatus.OrderPosition }, 1, i);

                    var colourBtn = new Button() { BackColor = Color.FromArgb(buildStatus.ColorA, buildStatus.ColorR, buildStatus.ColorG, buildStatus.ColorB) };
                    colourBtn.Margin = new Padding(0, 1, 0, 0);
                    colourBtn.Click += ColourBtn_Click;
                    BuildStatusTable.Controls.Add(colourBtn, 2, i);

                    BuildStatusTable.Controls.Add(new CheckBox() { Checked = buildStatus.Visible, Text = string.Empty, Margin = new Padding(20, 1, 0, 0) }, 3, i);
                }
                else
                {
                    BuildStatusTable.Controls.Add(new NumericUpDown() { Minimum = 0, Maximum = 100, Value = (i - 1) }, 1, i);

                    var colourBtn = new Button() { BackColor = buildStatuses.MapColor(statusMapped) };
                    colourBtn.Margin = new Padding(0, 1, 0, 0);
                    colourBtn.Click += ColourBtn_Click;
                    BuildStatusTable.Controls.Add(colourBtn, 2, i);

                    BuildStatusTable.Controls.Add(new CheckBox() { Checked = true, Text = string.Empty, Margin = new Padding(20, 1, 0, 0) }, 3, i);
                }
            }
        }

        private void SaveBuildStatuses()
        {
            var statuses = new List<BuildStatus>(BuildStatusTable.RowCount - 1);

            for (var r = 1; r < BuildStatusTable.RowCount; r++)
            {
                var status = new BuildStatus();
                status.BuildStatusType = BuildStatusTypeHelper.Parse(BuildStatusTable.GetControlFromPosition(0, r).Text);
                status.OrderPosition = (int)((NumericUpDown)BuildStatusTable.GetControlFromPosition(1, r)).Value;
                status.Visible = ((CheckBox)BuildStatusTable.GetControlFromPosition(3, r)).Checked;

                var color = BuildStatusTable.GetControlFromPosition(2, r).BackColor;
                status.ColorA = color.A;
                status.ColorR = color.R;
                status.ColorG = color.G;
                status.ColorB = color.B;

                statuses.Add(status);
            }

            foreach (var status in statuses)
            {
                if (_settings.BuildStatuses.ContainsKey(status.BuildStatusType))
                {
                    var currentStatus = _settings.BuildStatuses[status.BuildStatusType];
                    currentStatus.ColorA = status.ColorA;
                    currentStatus.ColorR = status.ColorR;
                    currentStatus.ColorG = status.ColorG;
                    currentStatus.ColorB = status.ColorB;
                    currentStatus.OrderPosition = status.OrderPosition;
                    currentStatus.Visible = status.Visible;
                }
                else
                {
                    _settings.BuildStatuses.Add(status.BuildStatusType, status);
                }
            }
        }

        #endregion

    }
}