public bool MoveCharactersToGroup(IList <string> characterIds, CharacterGroup destGroup, bool warnUserAboutProximity = false)
        {
            CharacterGroup sourceGroup = GetSourceGroupForMove(characterIds, destGroup);

            if (sourceGroup == null)
            {
                return(false);
            }

            if (destGroup != null && warnUserAboutProximity && destGroup.CharacterIds.Count > 0)
            {
                var proximity = new Proximity(m_project.IncludedBooks, m_project.DramatizationPreferences);

                var testGroup       = new CharacterIdHashSet(destGroup.CharacterIds);
                var resultsBefore   = proximity.CalculateMinimumProximity(testGroup);
                int proximityBefore = resultsBefore.NumberOfBlocks;

                testGroup.AddRange(characterIds);
                var resultsAfter   = proximity.CalculateMinimumProximity(testGroup);
                int proximityAfter = resultsAfter.NumberOfBlocks;

                if (proximityBefore > proximityAfter && proximityAfter <= Proximity.kDefaultMinimumProximity)
                {
                    var firstReference  = resultsAfter.FirstReference;
                    var secondReference = resultsAfter.SecondReference;

                    var dlgMessageFormat1 = (firstReference == secondReference) ?
                                            LocalizationManager.GetString("DialogBoxes.VoiceActorAssignmentDlg.MoveCharacterDialog.Message.Part1",
                                                                          "This move will result in a group with a minimum proximity of {0} blocks between [{1}] and [{2}] in {3}.") :
                                            LocalizationManager.GetString("DialogBoxes.VoiceActorAssignmentDlg.MoveCharacterDialog.Message.Part1",
                                                                          "This move will result in a group with a minimum proximity of {0} blocks between [{1}] in {3} and [{2}] in {4}.");
                    dlgMessageFormat1 = string.Format(dlgMessageFormat1,
                                                      resultsAfter.NumberOfBlocks,
                                                      CharacterVerseData.GetCharacterNameForUi(resultsAfter.FirstCharacterId),
                                                      CharacterVerseData.GetCharacterNameForUi(resultsAfter.SecondCharacterId),
                                                      firstReference, secondReference);
                    var dlgMessageFormat2 =
                        LocalizationManager.GetString("DialogBoxes.VoiceActorAssignmentDlg.MoveCharacterDialog.Message.Part2",
                                                      "Do you want to continue with this move?");

                    var dlgMessage = string.Format(dlgMessageFormat1 + Environment.NewLine + Environment.NewLine + dlgMessageFormat2);
                    var dlgTitle   = LocalizationManager.GetString("DialogBoxes.VoiceActorAssignmentDlg.MoveCharacterDialog.Title",
                                                                   "Confirm");

                    if (MessageBox.Show(dlgMessage, dlgTitle, MessageBoxButtons.YesNo) != DialogResult.Yes)
                    {
                        return(false);
                    }
                }
            }

            m_undoStack.Push(new MoveCharactersToGroupUndoAction(m_project, sourceGroup, destGroup, characterIds));

            Save();

            return(true);
        }
Example #2
0
        public void CalculateMinimumProximity_TreatStandardNonScriptureCharactersAsDistinct_ExtraBiblicalResultsInZeroProximityWithChapterNumber()
        {
            var project = TestProject.CreateTestProject(TestProject.TestBook.MRK);

            project.UseDefaultForUnresolvedMultipleChoiceCharacters();

            project.DramatizationPreferences.BookTitleAndChapterDramatization = ExtraBiblicalMaterialSpeakerOption.MaleActor;
            project.DramatizationPreferences.SectionHeadDramatization         = ExtraBiblicalMaterialSpeakerOption.ActorOfEitherGender;
            project.DramatizationPreferences.BookIntroductionsDramatization   = ExtraBiblicalMaterialSpeakerOption.FemaleActor;

            var proximity = new Proximity(project.IncludedBooks, project.DramatizationPreferences);

            var characterIds = new HashSet <string>
            {
                CharacterVerseData.GetStandardCharacterId("MRK", CharacterVerseData.StandardCharacter.BookOrChapter),
                CharacterVerseData.GetStandardCharacterId("MRK", CharacterVerseData.StandardCharacter.ExtraBiblical),
                CharacterVerseData.GetStandardCharacterId("MRK", CharacterVerseData.StandardCharacter.Intro)
            };


            MinimumProximity minProximity = proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(0, minProximity.NumberOfBlocks);
            Assert.AreEqual(CharacterVerseData.GetStandardCharacterId("MRK", CharacterVerseData.StandardCharacter.BookOrChapter), minProximity.FirstCharacterId);
            Assert.AreEqual(CharacterVerseData.GetStandardCharacterId("MRK", CharacterVerseData.StandardCharacter.ExtraBiblical), minProximity.SecondCharacterId);
            Assert.AreEqual("MRK 1:0", minProximity.FirstReference);
            Assert.AreEqual("MRK 1:0", minProximity.SecondReference);
        }
Example #3
0
        public void CalculateMinimumProximity_NarrationByAuthor_NonStrictAdherenceToNarratorPrefs_AllStandardCharactersAndBookAuthorResultsInMaxProximity()
        {
            var project = TestProject.CreateTestProject(TestProject.TestBook.GAL);

            project.UseDefaultForUnresolvedMultipleChoiceCharacters();
            var idPaul = BiblicalAuthors.GetAuthorOfBook("GAL").Name;

            foreach (var block in project.IncludedBooks[0].GetBlocksForVerse(2, 15))
            {
                block.CharacterId = idPaul;
            }

            project.CharacterGroupGenerationPreferences.NarratorsOption = NarratorsOption.NarrationByAuthor;
            // The following can be anything but omitted, but by making them all different, we prove that
            // non-strict adherence to the the narrator prefs is really happening.
            project.DramatizationPreferences.BookTitleAndChapterDramatization = ExtraBiblicalMaterialSpeakerOption.ActorOfEitherGender;
            project.DramatizationPreferences.BookIntroductionsDramatization   = ExtraBiblicalMaterialSpeakerOption.FemaleActor;
            project.DramatizationPreferences.SectionHeadDramatization         = ExtraBiblicalMaterialSpeakerOption.MaleActor;

            var proximity = new Proximity(project, false);

            var characterIds = new HashSet <string>
            {
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.Narrator),
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.ExtraBiblical),
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.Intro),                 // Not actually used in GAL test data
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.BookOrChapter),
                idPaul
            };

            MinimumProximity minProximity = proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(Int32.MaxValue, minProximity.NumberOfBlocks);
        }
Example #4
0
        public void CalculateMinimumProximity_NonStrictAdherenceToNarratorPrefs_AllStandardCharactersAndBookAuthorResultsInMaxProximity()
        {
            var project = TestProject.CreateTestProject(TestProject.TestBook.JOS);             // Using Joshua because the test data for Joshua has into material

            project.UseDefaultForUnresolvedMultipleChoiceCharacters();

            project.CharacterGroupGenerationPreferences.NarratorsOption = NarratorsOption.SingleNarrator;
            // By making theses all different, we force the CharacterGroupGenerator (which we aren't calling here) to put each
            // type of standard character in a different group, but with "not strict" proximity, we still consider it legit to
            // manually put them in the same group.
            project.DramatizationPreferences.BookTitleAndChapterDramatization = ExtraBiblicalMaterialSpeakerOption.ActorOfEitherGender;
            project.DramatizationPreferences.BookIntroductionsDramatization   = ExtraBiblicalMaterialSpeakerOption.FemaleActor;
            project.DramatizationPreferences.SectionHeadDramatization         = ExtraBiblicalMaterialSpeakerOption.MaleActor;

            var proximity = new Proximity(project, false);

            var characterIds = new HashSet <string>
            {
                CharacterVerseData.GetStandardCharacterId("JOS", CharacterVerseData.StandardCharacter.Narrator),
                CharacterVerseData.GetStandardCharacterId("JOS", CharacterVerseData.StandardCharacter.ExtraBiblical),
                CharacterVerseData.GetStandardCharacterId("JOS", CharacterVerseData.StandardCharacter.Intro),
                CharacterVerseData.GetStandardCharacterId("JOS", CharacterVerseData.StandardCharacter.BookOrChapter),
            };

            MinimumProximity minProximity = proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(Int32.MaxValue, minProximity.NumberOfBlocks);
        }
Example #5
0
        public void CalculateMinimumProximity_NarrationByAuthor_CharacterSpeakingInBookHeNarratesResultsInMaxProximity()
        {
            var project = TestProject.CreateTestProject(TestProject.TestBook.GAL);

            project.UseDefaultForUnresolvedMultipleChoiceCharacters();
            var idPaul = BiblicalAuthors.GetAuthorOfBook("GAL").Name;

            foreach (var block in project.IncludedBooks[0].GetBlocksForVerse(2, 15))
            {
                block.CharacterId = idPaul;
            }

            project.CharacterGroupGenerationPreferences.NarratorsOption       = NarratorsOption.NarrationByAuthor;
            project.DramatizationPreferences.BookTitleAndChapterDramatization = ExtraBiblicalMaterialSpeakerOption.Narrator;
            project.CharacterGroupGenerationPreferences.NumberOfMaleNarrators = 1;

            var proximity = new Proximity(project);

            var characterIds = new HashSet <string>
            {
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.Narrator),
                CharacterVerseData.GetStandardCharacterId("GAL", CharacterVerseData.StandardCharacter.BookOrChapter),
                idPaul
            };

            MinimumProximity minProximity = proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(Int32.MaxValue, minProximity.NumberOfBlocks);
        }
Example #6
0
        public void CalculateMinimumProximity_OneCharacterGroupJesus_ReturnsMaxInt()
        {
            HashSet <string> characterIds = new HashSet <string>();

            characterIds.Add("Jesus");

            MinimumProximity minProximity = m_proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(Int32.MaxValue, minProximity.NumberOfBlocks);
            Assert.AreEqual("Jesus", minProximity.FirstCharacterId);
            Assert.AreEqual("Jesus", minProximity.SecondCharacterId);
            Assert.AreEqual("MRK 1:17", minProximity.FirstReference);
            Assert.AreEqual("MRK 1:17", minProximity.SecondReference);
        }
        public VoiceActorAssignmentViewModel(Project project)
        {
            m_project = project;

            CharacterGroupAttribute <CharacterGender> .GetUiStringForValue = GetUiStringForCharacterGender;
            CharacterGroupAttribute <CharacterAge> .GetUiStringForValue    = GetUiStringForCharacterAge;

#if DEBUG
            var p = new Proximity(m_project.IncludedBooks, m_project.DramatizationPreferences);
            foreach (var group in CharacterGroups.OrderBy(g => g.GroupIdForUiDisplay))
            {
                Debug.WriteLine(group.GroupIdForUiDisplay + ": " + p.CalculateMinimumProximity(group.CharacterIds));
            }
#endif
        }
Example #8
0
        public VoiceActorAssignmentViewModel(Project project, Dictionary <string, int> keyStrokesByCharacterId = null)
        {
            m_project = project;

            m_keyStrokesByCharacterId = keyStrokesByCharacterId ?? m_project.GetKeyStrokesByCharacterId();

            CharacterGroupAttribute <CharacterGender> .GetUiStringForValue = GetUiStringForCharacterGender;
            CharacterGroupAttribute <CharacterAge> .GetUiStringForValue    = GetUiStringForCharacterAge;
            m_project.CharacterGroupList.PopulateEstimatedHours(m_keyStrokesByCharacterId);

#if DEBUG
            var p = new Proximity(m_project);
            foreach (var group in CharacterGroups.OrderBy(g => g.GroupNumber))
            {
                Debug.WriteLine(group.GroupNumber + ": " + p.CalculateMinimumProximity(group.CharacterIds));
            }
#endif
        }
Example #9
0
        public void CalculateMinimumProximity_OneCharacterGroupJesus_ReturnsMaxInt()
        {
            HashSet <string> characterIds = new HashSet <string>();

            characterIds.Add("Jesus");

            MinimumProximity minProximity = m_proximity.CalculateMinimumProximity(characterIds);

            Assert.AreEqual(Int32.MaxValue, minProximity.NumberOfBlocks);
            Assert.AreEqual("Jesus", minProximity.FirstBlock.CharacterIdInScript);
            Assert.AreEqual("Jesus", minProximity.SecondBlock.CharacterIdInScript);
            Assert.AreEqual("MRK", minProximity.FirstBook.BookId);
            Assert.AreEqual("MRK", minProximity.SecondBook.BookId);
            Assert.AreEqual(1, minProximity.FirstBlock.ChapterNumber);
            Assert.AreEqual(1, minProximity.SecondBlock.ChapterNumber);
            Assert.AreEqual(17, minProximity.FirstBlock.InitialStartVerseNumber);
            Assert.AreEqual(17, minProximity.SecondBlock.InitialStartVerseNumber);
        }
        public VoiceActorAssignmentViewModel(Project project)
        {
            m_project        = project;
            ProjectProximity = new Proximity(m_project, false);

            CharacterGroupAttribute <CharacterGender> .GetUiStringForValue = GetUiStringForCharacterGender;
            CharacterGroupAttribute <CharacterAge> .GetUiStringForValue    = GetUiStringForCharacterAge;

            LogAndOutputToDebugConsole("Group".PadRight(7) + ": " + MinimumProximity.ReportHeader + Environment.NewLine +
                                       "-".PadRight(100, '-'));
            foreach (var group in CharacterGroups.OrderBy(g => g.GroupIdForUiDisplay))
            {
                LogAndOutputToDebugConsole(group.GroupIdForUiDisplay.PadRight(7) + ": " + ProjectProximity.CalculateMinimumProximity(group.CharacterIds));
            }
        }