예제 #1
0
        private void MenuEditAddTeam_Click(object sender, EventArgs e)
        {
            log.Debug("EditorForm::MenuEditAddTeam_Click() {");

            if (scoreboard == null)
            {
                log.Debug("EditorForm::MenuEditAddTeam_Click() } // scoreboard == null");
                return;
            }

            AddTeamForm addTeamForm = new AddTeamForm();

            addTeamForm.StartPosition = FormStartPosition.CenterParent;
            DialogResult result = addTeamForm.ShowDialog(this);

            if (result != DialogResult.OK)
            {
                log.Debug("EditorForm::MenuEditAddTeam_Click() } // cancelled");
                return;
            }

            try
            {
                scoreboard.AddTeam(addTeamForm.TeamName);
                hasUnsavedChanges = true;
            }
            catch (ArgumentException ex)
            {
                log.Error("Failed add team.", ex);
                MessageBox.Show("Failed to add team: " + ex.Message, "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);

                log.Debug("EditorForm::MenuEditAddTeam_Click() }");
                return;
            }

            UpdateScores();
            UpdateControls();

            log.Debug("EditorForm::MenuEditAddTeam_Click() }");
        }
예제 #2
0
        public static Scoreboard LoadFromFile(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentException("Failed to load scoreboard from file: Argument 'stream' is null.");
            }

            ScoreboardFile file;

            using (StreamReader reader = new StreamReader(stream))
            {
                file = JsonConvert.DeserializeObject <ScoreboardFile>(reader.ReadToEnd());
            }

            if (file.ExpectedNumberOfTeams < file.Teams.Length || file.Teams.Length != file.Scores.GetLength(0))
            {
                throw new ArgumentException("Failed to load scoreboard from file: Invalid number of teams.");
            }
            if (file.ExpectedNumberOfCategories < file.Categories.Length || file.Categories.Length != file.Scores.GetLength(1))
            {
                throw new ArgumentException("Failed to load scoreboard from file: Invalid number of categories.");
            }

            Scoreboard scoreboard = new Scoreboard(file.ExpectedNumberOfTeams, file.ExpectedNumberOfCategories);

            for (int i = 0; i < file.Teams.Length; ++i)
            {
                scoreboard.AddTeam(file.Teams[i]);
            }
            decimal[] scores = new decimal[file.Teams.Length];
            for (int i = 0; i < file.Categories.Length; ++i)
            {
                for (int j = file.Teams.Length - 1; j >= 0; --j)
                {
                    scores[j] = file.Scores[j, i];
                }
                scoreboard.AddCategory(file.Categories[i], scores);
            }

            return(scoreboard);
        }
예제 #3
0
        public static Scoreboard LoadFromFile(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentException("Failed to load scoreboard from file: Argument 'stream' is null.");
            }

            using (TextReader reader = new StreamReader(stream))
            {
                string buffer = reader.ReadToEnd();

                string[][] rows = CsvParser.Parse(buffer, true, out string[] header);

                string[] dimens = header[0].Split('\\');

                if (!int.TryParse(dimens[0], out int expectedNumberOfCategories))
                {
                    throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of categories in cell (0,0).");
                }
                if (!int.TryParse(dimens[1], out int expectedNumberOfTeams))
                {
                    throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of teams in cell (0,0).");
                }
                // first column contains category names
                if (header.Length > expectedNumberOfTeams + 1)
                {
                    throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of columns in header.");
                }
                // header (row containing team names) is separate
                if (rows.Length > expectedNumberOfCategories)
                {
                    throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of rows.");
                }
                for (int i = rows.Length - 1; i >= 0; --i)
                {
                    if (rows[i].Length != header.Length)
                    {
                        throw new ArgumentException("Failed to load scoreboard fom file: Invalid number columns in row " + (i + 1) + ".");
                    }
                }

                Scoreboard scoreboard = new Scoreboard(expectedNumberOfTeams, expectedNumberOfCategories);

                for (int i = 1; i < header.Length; ++i)
                {
                    scoreboard.AddTeam(header[i]);
                }
                decimal[] scores = new decimal[header.Length - 1];
                for (int i = 0; i < rows.Length; ++i)
                {
                    for (int j = header.Length - 2; j >= 0; --j)
                    {
                        if (!decimal.TryParse(rows[i][j + 1], NumberStyles.AllowDecimalPoint,
                                              CultureInfo.InvariantCulture, out scores[j]))
                        {
                            throw new ArgumentException("Failed to load scoreboard fom file: Invalid score for team '" + header[j + 1]
                                                        + "' at category '" + rows[i][0] + "'.");
                        }
                    }
                    scoreboard.AddCategory(rows[i][0], scores);
                }

                return(scoreboard);
            }
        }
예제 #4
0
        private void MenuFileNewFromTemplate_Click(object sender, EventArgs e)
        {
            log.Debug("EditorForm::MenuFileNewFromTemplate_Click() {");

            if (hasUnsavedChanges)
            {
                try
                {
                    DialogResult result = MessageBox.Show("There are unsaved changes. Save?", "Information",
                                                          MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);

                    switch (result)
                    {
                    case DialogResult.Yes:
                        if (!SaveToFile())
                        {
                            log.Debug("EditorForm::MenuFileNewFromTemplate_Click() } // cancelled (save existing)");
                            return;
                        }
                        break;

                    case DialogResult.No:
                        break;

                    default:
                    case DialogResult.Cancel:
                        log.Debug("EditorForm::MenuFileNewFromTemplate_Click() } // cancelled (save existing)");
                        return;
                    }
                }
                catch (Exception ex)
                {
                    log.Error("Failed to import template: Failed to save existing scoreboard.", ex);
                    MessageBox.Show("Failed to import template: Failed to save existing scoreboard: " + ex.Message, "Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);

                    log.Debug("EditorForm::MenuFileNewFromTemplate_Click() }");
                    return;
                }
            }

            try
            {
                using (OpenFileDialog openFileDialog = new OpenFileDialog())
                {
                    openFileDialog.InitialDirectory = string.IsNullOrEmpty(fileName) ? Environment.SpecialFolder.MyDocuments.ToString() : fileName;
                    openFileDialog.Filter           = "CSV files (*.csv)|*.csv|JSON files (*.json)|*.json";
                    openFileDialog.FilterIndex      = 1;
                    openFileDialog.RestoreDirectory = true;

                    Scoreboard template;

                    if (openFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        fileName = openFileDialog.FileName;
                        switch (Path.GetExtension(fileName))
                        {
                        case ".csv":
                            template = CsvHandler.LoadFromFile(openFileDialog.OpenFile());
                            break;

                        case ".json":
                            template = JsonHandler.LoadFromFile(openFileDialog.OpenFile());
                            break;

                        default:
                            throw new ArgumentException("Unknown file format: '" + Path.GetExtension(fileName) + "'.");
                        }
                        hasUnsavedChanges = false;

                        scoreboard = new Scoreboard(template.ExpectedNumberOfTeams, template.ExpectedNumberOfCategories);
                        foreach (string team in template.Teams)
                        {
                            scoreboard.AddTeam(team);
                        }
                        NumericInputAnimationLength.Value = GetSuggestedAnimationLength();
                        UpdateScores();
                        UpdateControls();
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("Failed to import template.", ex);
                MessageBox.Show("Failed to import template: " + ex.Message, "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            log.Debug("EditorForm::MenuFileNewFromTemplate_Click() }");
        }