diff --git a/DisplayMagician/Program.cs b/DisplayMagician/Program.cs index 782d499..e6d0e2d 100644 --- a/DisplayMagician/Program.cs +++ b/DisplayMagician/Program.cs @@ -505,6 +505,8 @@ namespace DisplayMagician { { logger.Debug($"Program/ApplyProfile: Starting"); + profile.RefreshPossbility(); + // We need to check if the profile is valid if (!profile.IsPossible) { @@ -514,7 +516,7 @@ namespace DisplayMagician { // We need to check if the profile is the same one that we're on - if (profile.IsActive) + if (profile.UUID == ProfileRepository.GetActiveProfile().UUID) { logger.Debug($"Program/ApplyProfile: The supplied profile {profile.Name} is currently in use, so we don't need to apply it."); return false; @@ -655,6 +657,8 @@ namespace DisplayMagician { } } + ProfileRepository.UpdateActiveProfile(); + return true; } diff --git a/DisplayMagician/ShortcutItem.cs b/DisplayMagician/ShortcutItem.cs index a3dba3e..316c18a 100644 --- a/DisplayMagician/ShortcutItem.cs +++ b/DisplayMagician/ShortcutItem.cs @@ -1963,6 +1963,7 @@ namespace DisplayMagician // And that we have enough to try and action within the shortcut // (in other words check everything in the shortcut is still valid) + Errors.Clear(); ShortcutValidity worstError = ShortcutValidity.Valid; // Does the profile we want to Use still exist? @@ -1977,7 +1978,7 @@ namespace DisplayMagician worstError = ShortcutValidity.Error; } // Is the profile still valid right now? i.e. are all the screens available? - if (ProfileToUse != null && !ProfileToUse.IsPossible) + if (ProfileToUse != null && !ProfileToUse.IsValid()) { ShortcutError error = new ShortcutError(); error.Name = "InvalidProfile"; diff --git a/DisplayMagician/ShortcutRepository.cs b/DisplayMagician/ShortcutRepository.cs index 4295723..7e61779 100644 --- a/DisplayMagician/ShortcutRepository.cs +++ b/DisplayMagician/ShortcutRepository.cs @@ -606,20 +606,22 @@ namespace DisplayMagician } // record the old audio device - bool needToChangeAudio = false; + bool needToChangeAudioDevice = false; CoreAudioDevice rollbackAudioDevice = _audioController.DefaultPlaybackDevice; double rollbackAudioVolume = 50; if (rollbackAudioDevice != null) + { rollbackAudioVolume = _audioController.DefaultPlaybackDevice.Volume; - if (!rollbackAudioDevice.FullName.Equals(shortcutToUse.AudioDevice)) - { - logger.Debug($"ShortcutRepository/RunShortcut: We need to change to the {shortcutToUse.AudioDevice} audio device."); - needToChangeAudio = true; - } - else - { - logger.Debug($"ShortcutRepository/RunShortcut: We're already using the {shortcutToUse.AudioDevice} audio device so no need to change audio devices."); - } + if (!rollbackAudioDevice.FullName.Equals(shortcutToUse.AudioDevice)) + { + logger.Debug($"ShortcutRepository/RunShortcut: We need to change to the {shortcutToUse.AudioDevice} audio device."); + needToChangeAudioDevice = true; + } + else + { + logger.Debug($"ShortcutRepository/RunShortcut: We're already using the {shortcutToUse.AudioDevice} audio device so no need to change audio devices."); + } + } // Change Audio Device (if one specified) if (shortcutToUse.ChangeAudioDevice) @@ -654,16 +656,19 @@ namespace DisplayMagician CoreAudioDevice rollbackCaptureDevice = _audioController.DefaultCaptureDevice; double rollbackCaptureVolume = 50; if (rollbackCaptureDevice != null) + { rollbackCaptureVolume = _audioController.DefaultCaptureDevice.Volume; - if (!rollbackCaptureDevice.FullName.Equals(shortcutToUse.CaptureDevice)) - { - logger.Debug($"ShortcutRepository/RunShortcut: We need to change to the {shortcutToUse.CaptureDevice} capture (microphone) device."); - needToChangeCaptureDevice = true; - } - else - { - logger.Debug($"ShortcutRepository/RunShortcut: We're already using the {shortcutToUse.CaptureDevice} capture (microphone) device so no need to change capture devices."); + if (!rollbackCaptureDevice.FullName.Equals(shortcutToUse.CaptureDevice)) + { + logger.Debug($"ShortcutRepository/RunShortcut: We need to change to the {shortcutToUse.CaptureDevice} capture (microphone) device."); + needToChangeCaptureDevice = true; + } + else + { + logger.Debug($"ShortcutRepository/RunShortcut: We're already using the {shortcutToUse.CaptureDevice} capture (microphone) device so no need to change capture devices."); + } } + // Change capture Device (if one specified) if (shortcutToUse.ChangeCaptureDevice) { @@ -1325,7 +1330,7 @@ namespace DisplayMagician } // Change Audio Device back (if one specified) - if (needToChangeAudio) + if (needToChangeAudioDevice) { logger.Debug($"ShortcutRepository/RunShortcut: Reverting default audio back to {rollbackAudioDevice.Name} audio device"); // use the Audio Device @@ -1347,7 +1352,7 @@ namespace DisplayMagician // Change Capture Device back (if one specified) if (needToChangeCaptureDevice) { - logger.Debug($"ShortcutRepository/RunShortcut: Reverting default capture (microphone) device back to {rollbackAudioDevice.Name} capture device"); + logger.Debug($"ShortcutRepository/RunShortcut: Reverting default capture (microphone) device back to {rollbackCaptureDevice.Name} capture device"); // use the Audio Device rollbackCaptureDevice.SetAsDefault(); diff --git a/DisplayMagician/UIForms/MainForm.cs b/DisplayMagician/UIForms/MainForm.cs index 5b59368..bc3912e 100644 --- a/DisplayMagician/UIForms/MainForm.cs +++ b/DisplayMagician/UIForms/MainForm.cs @@ -213,7 +213,12 @@ namespace DisplayMagician.UIForms // Add the current slist of profiles into the NotifyIcon context menu foreach (ProfileItem profile in ProfileRepository.AllProfiles) { - profileToolStripMenuItem.DropDownItems.Add(profile.Name,profile.ProfileBitmap, runProfileToolStripMenuItem_Click); + ToolStripMenuItem profileMenuItem = new ToolStripMenuItem(profile.Name, profile.ProfileBitmap, runProfileToolStripMenuItem_Click); + if (profile.IsActive || !profile.IsPossible) + profileMenuItem.Enabled = false; + else + profileMenuItem.Enabled = true; + profileToolStripMenuItem.DropDownItems.Add(profileMenuItem); } // Clear all the shortcuts @@ -229,7 +234,12 @@ namespace DisplayMagician.UIForms // Add the current list of profiles into the NotifyIcon context menu foreach (ShortcutItem shortcut in ShortcutRepository.AllShortcuts) { - shortcutToolStripMenuItem.DropDownItems.Add(shortcut.Name,shortcut.ShortcutBitmap, runShortcutToolStripMenuItem_Click); + ToolStripMenuItem shortcutMenuItem = new ToolStripMenuItem(shortcut.Name, shortcut.ShortcutBitmap, runShortcutToolStripMenuItem_Click); + if (shortcut.IsValid == ShortcutValidity.Warning || shortcut.IsValid == ShortcutValidity.Error) + shortcutMenuItem.Enabled = false; + else + shortcutMenuItem.Enabled = true; + shortcutToolStripMenuItem.DropDownItems.Add(shortcutMenuItem); } } diff --git a/DisplayMagicianShared/ProfileItem.cs b/DisplayMagicianShared/ProfileItem.cs index 5d023ed..918040f 100644 --- a/DisplayMagicianShared/ProfileItem.cs +++ b/DisplayMagicianShared/ProfileItem.cs @@ -433,7 +433,28 @@ namespace DisplayMagicianShared return shortcutFileName != null && System.IO.File.Exists(shortcutFileName); } + public void RefreshPossbility() + { + // Check each display in this profile and make sure it's currently available + int validDisplayCount = 0; + foreach (string profileDisplayIdentifier in ProfileDisplayIdentifiers) + { + // If this profile has a display that isn't currently available then we need to say it's a no! + if (ProfileRepository.ConnectedDisplayIdentifiers.Contains(profileDisplayIdentifier)) + validDisplayCount++; + } + if (validDisplayCount == ProfileDisplayIdentifiers.Count) + { + SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The profile {Name} is possible!"); + _isPossible = true; + } + else + { + SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The profile {Name} is NOT possible!"); + _isPossible = false; + } + } } // Custom Equality comparer for the Profile class diff --git a/DisplayMagicianShared/ProfileRepository.cs b/DisplayMagicianShared/ProfileRepository.cs index 2097c4f..a26d36a 100644 --- a/DisplayMagicianShared/ProfileRepository.cs +++ b/DisplayMagicianShared/ProfileRepository.cs @@ -25,6 +25,7 @@ namespace DisplayMagicianShared private static bool _profilesLoaded = false; public static Version _version = new Version(1, 0, 0); private static ProfileItem _currentProfile; + private static List _connectedDisplayIdentifiers = new List(); // Other constants that are useful public static string AppDataPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DisplayMagician"); @@ -135,8 +136,27 @@ namespace DisplayMagicianShared } } + + public static List ConnectedDisplayIdentifiers + { + get + { + if (_connectedDisplayIdentifiers.Count == 0) + // Load the Profiles from storage if they need to be + _connectedDisplayIdentifiers = GenerateAllAvailableDisplayIdentifiers(); + + + return _connectedDisplayIdentifiers; + } + set + { + _connectedDisplayIdentifiers = value; + } + } + + #endregion - + #region Class Methods public static bool AddProfile(ProfileItem profile) { @@ -611,6 +631,9 @@ namespace DisplayMagicianShared UpdateActiveProfile(); } _profilesLoaded = true; + + IsPossibleRefresh(); + return true; } @@ -700,39 +723,15 @@ namespace DisplayMagicianShared { // We need to refresh the cached answer // Get the list of connected devices - List connectedDisplayIdentifiers = GenerateAllAvailableDisplayIdentifiers(); + ConnectedDisplayIdentifiers = GenerateAllAvailableDisplayIdentifiers(); + + if (_profilesLoaded && _allProfiles.Count > 0) { - _profileWarningLookup.Clear(); - foreach (ProfileItem loadedProfile in AllProfiles) - { - - // Check each display in this profile and make sure it's currently available - int validDisplayCount = 0; - foreach (string profileDisplayIdentifier in loadedProfile.ProfileDisplayIdentifiers) - { - // If this profile has a display that isn't currently available then we need to say it's a no! - if (connectedDisplayIdentifiers.Contains(profileDisplayIdentifier)) - validDisplayCount++; - } - if (validDisplayCount == loadedProfile.ProfileDisplayIdentifiers.Count) - { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The profile {loadedProfile.Name} is possible!"); - loadedProfile.IsPossible = true; - _profileWarningLookup[loadedProfile.Name] = false; - } - - else - { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The profile {loadedProfile.Name} is NOT possible!"); - loadedProfile.IsPossible = false; - _profileWarningLookup[loadedProfile.Name] = true; - } - - } + loadedProfile.RefreshPossbility(); } }