diff --git a/DisplayMagicianShared/AMD/AMDProfileItem.cs b/DisplayMagicianShared/AMD/AMDProfileItem.cs index caa4b67..868e0ca 100644 --- a/DisplayMagicianShared/AMD/AMDProfileItem.cs +++ b/DisplayMagicianShared/AMD/AMDProfileItem.cs @@ -12,7 +12,7 @@ using System.Drawing.Imaging; namespace DisplayMagicianShared.AMD { - public class AMDProfileItem : ProfileItem, IComparable + public class AMDProfileItem : ProfileItem, IEquatable, IComparable { private static List _allSavedProfiles = new List(); private ProfileIcon _profileIcon; @@ -363,12 +363,16 @@ namespace DisplayMagicianShared.AMD return _screens; } + public int CompareTo(object obj) + { + if (!(obj is AMDProfileItem)) throw new ArgumentException("Object to CompareTo is not a AMDProfileItem"); ; + + AMDProfileItem otherProfile = (AMDProfileItem)obj; + return this.Name.CompareTo(otherProfile.Name); + } // The public override for the Object.Equals - public override bool Equals(object obj) - { - return this.Equals(obj as AMDProfileItem); - } + public override bool Equals(object obj) => this.Equals(obj as AMDProfileItem); // Profiles are equal if their Viewports are equal public bool Equals(AMDProfileItem other) @@ -406,9 +410,26 @@ namespace DisplayMagicianShared.AMD { // Calculate the hash code for the product. return (AMDDisplayConfig, WindowsDisplayConfig, ProfileDisplayIdentifiers).GetHashCode(); - } + public static bool operator ==(AMDProfileItem lhs, AMDProfileItem rhs) + { + if (lhs is null) + { + if (rhs is null) + { + return true; + } + + // Only the left side is null. + return false; + } + // Equals handles case of null on right side. + return lhs.Equals(rhs); + } + + public static bool operator !=(AMDProfileItem lhs, AMDProfileItem rhs) => !(lhs == rhs); + } } \ No newline at end of file diff --git a/DisplayMagicianShared/NVIDIA/NVIDIAProfileItem.cs b/DisplayMagicianShared/NVIDIA/NVIDIAProfileItem.cs index ea3182b..cb533b0 100644 --- a/DisplayMagicianShared/NVIDIA/NVIDIAProfileItem.cs +++ b/DisplayMagicianShared/NVIDIA/NVIDIAProfileItem.cs @@ -14,7 +14,7 @@ using DisplayMagicianShared.Windows; namespace DisplayMagicianShared.NVIDIA { - public class NVIDIAProfileItem : ProfileItem, IComparable + public class NVIDIAProfileItem : ProfileItem, IEquatable, IComparable { private static List _allSavedProfiles = new List(); private ProfileIcon _profileIcon; @@ -140,12 +140,16 @@ namespace DisplayMagicianShared.NVIDIA // Copy all our profile data over to the other profile profile.Name = Name; - //profile.Paths = Paths; + profile.WindowsDisplayConfig = WindowsDisplayConfig; + profile.NVIDIADisplayConfig = NVIDIADisplayConfig; profile.ProfileIcon = ProfileIcon; profile.SavedProfileIconCacheFilename = SavedProfileIconCacheFilename; profile.ProfileBitmap = ProfileBitmap; profile.ProfileTightestBitmap = ProfileTightestBitmap; profile.ProfileDisplayIdentifiers = ProfileDisplayIdentifiers; + profile.WallpaperMode = WallpaperMode; + profile.WallpaperBitmapFilename = WallpaperBitmapFilename; + profile.WallpaperStyle = WallpaperStyle; return true; } @@ -544,12 +548,16 @@ namespace DisplayMagicianShared.NVIDIA return _screens; } + public int CompareTo(object obj) + { + if (!(obj is NVIDIAProfileItem)) throw new ArgumentException("Object to CompareTo is not a NVIDIAProfileItem"); ; + + NVIDIAProfileItem otherProfile = (NVIDIAProfileItem)obj; + return this.Name.CompareTo(otherProfile.Name); + } // The public override for the Object.Equals - public override bool Equals(object obj) - { - return this.Equals(obj as NVIDIAProfileItem); - } + public override bool Equals(object obj) => this.Equals(obj as NVIDIAProfileItem); // Profiles are equal if their Viewports are equal public bool Equals(NVIDIAProfileItem other) @@ -592,6 +600,23 @@ namespace DisplayMagicianShared.NVIDIA } + public static bool operator ==(NVIDIAProfileItem lhs, NVIDIAProfileItem rhs) + { + if (lhs is null) + { + if (rhs is null) + { + return true; + } + + // Only the left side is null. + return false; + } + // Equals handles case of null on right side. + return lhs.Equals(rhs); + } + + public static bool operator !=(NVIDIAProfileItem lhs, NVIDIAProfileItem rhs) => !(lhs == rhs); } } \ No newline at end of file diff --git a/DisplayMagicianShared/ProfileItem.cs b/DisplayMagicianShared/ProfileItem.cs index 5c3bcb2..92a40f2 100644 --- a/DisplayMagicianShared/ProfileItem.cs +++ b/DisplayMagicianShared/ProfileItem.cs @@ -50,7 +50,7 @@ namespace DisplayMagicianShared public int Row; } - public class ProfileItem : IComparable + public class ProfileItem : IEquatable, IComparable { private static List _allSavedProfiles = new List(); private ProfileIcon _profileIcon; @@ -385,35 +385,6 @@ namespace DisplayMagicianShared return false; } - public override int GetHashCode() - { - - // Get hash code for the ProfileDisplayIdentifiers field if it is not null. - int hashIds = ProfileDisplayIdentifiers == null ? 0 : ProfileDisplayIdentifiers.GetHashCode(); - - // Get Paths too - //int hashPaths = Paths == null ? 0 : Paths.GetHashCode(); - int hashPaths = 0; - - // Calculate the hash code for the product. - return (hashIds, hashPaths).GetHashCode(); - - } - - - public override string ToString() - { - return (Name ?? Language.UN_TITLED_PROFILE); - } - - public int CompareTo(object obj) - { - if (!(obj is ProfileItem)) throw new ArgumentException("Object to CompareTo is not a Shortcut"); ; - - ProfileItem otherProfile = (ProfileItem)obj; - return this.Name.CompareTo(otherProfile.Name); - } - // ReSharper disable once FunctionComplexityOverflow // ReSharper disable once CyclomaticComplexity @@ -530,7 +501,75 @@ namespace DisplayMagicianShared { return new List(); } + + /*public int CompareTo(ProfileItem other) + { + return this.Name.CompareTo(other.Name); + }*/ + + public int CompareTo(object obj) + { + if (!(obj is ProfileItem)) throw new ArgumentException("Object to CompareTo is not a Shortcut"); ; + + ProfileItem otherProfile = (ProfileItem)obj; + return this.Name.CompareTo(otherProfile.Name); + } + + // The public override for the Object.Equals + public override bool Equals(object obj) => this.Equals(obj as ProfileItem); + + // Profiles are equal if their Viewports are equal + public bool Equals(ProfileItem other) + { + + // If parameter is null, return false. + if (other is null) + return false; + + // Optimization for a common success case. + if (Object.ReferenceEquals(this, other)) + return true; + + // If run-time types are not exactly the same, return false. + if (this.GetType() != other.GetType()) + return false; + + if (!this.ProfileDisplayIdentifiers.SequenceEqual(other.ProfileDisplayIdentifiers)) + { + return false; + } + + // Otherwise if all the tests work, then we're good! + return true; + } + + // If Equals() returns true for this object compared to another + // then GetHashCode() must return the same value for these objects. + public override int GetHashCode() + { + // Calculate the hash code for the product. + return (ProfileDisplayIdentifiers).GetHashCode(); + + } + + public static bool operator ==(ProfileItem lhs, ProfileItem rhs) + { + if (lhs is null) + { + if (rhs is null) + { + return true; + } + + // Only the left side is null. + return false; + } + // Equals handles case of null on right side. + return lhs.Equals(rhs); + } + + public static bool operator !=(ProfileItem lhs, ProfileItem rhs) => !(lhs == rhs); } +} -} \ No newline at end of file diff --git a/DisplayMagicianShared/Windows/WinProfileItem.cs b/DisplayMagicianShared/Windows/WinProfileItem.cs index c80a1de..eb2c0e8 100644 --- a/DisplayMagicianShared/Windows/WinProfileItem.cs +++ b/DisplayMagicianShared/Windows/WinProfileItem.cs @@ -11,7 +11,7 @@ using System.Drawing.Imaging; namespace DisplayMagicianShared.Windows { - public class WinProfileItem : ProfileItem, IComparable + public class WinProfileItem : ProfileItem, IEquatable, IComparable { private static List _allSavedProfiles = new List(); private ProfileIcon _profileIcon; @@ -102,15 +102,13 @@ namespace DisplayMagicianShared.Windows public override bool IsValid() { - if ( + if (WinLibrary.GetLibrary().IsValidConfig(_windowsDisplayConfig) && ProfileIcon is ProfileIcon && System.IO.File.Exists(SavedProfileIconCacheFilename) && ProfileBitmap is Bitmap && ProfileTightestBitmap is Bitmap && ProfileDisplayIdentifiers.Count > 0) - { - return true; - } + return true; else return false; } @@ -133,7 +131,9 @@ namespace DisplayMagicianShared.Windows profile.ProfileBitmap = ProfileBitmap; profile.ProfileTightestBitmap = ProfileTightestBitmap; profile.ProfileDisplayIdentifiers = ProfileDisplayIdentifiers; - profile.Screens = Screens; + profile.WallpaperMode = WallpaperMode; + profile.WallpaperBitmapFilename = WallpaperBitmapFilename; + profile.WallpaperStyle = WallpaperStyle; return true; } @@ -223,6 +223,10 @@ namespace DisplayMagicianShared.Windows public override List GetScreenPositions() { + // Set up some colours + Color primaryScreenColor = Color.FromArgb(0, 174, 241); // represents Primary screen blue + Color normalScreenColor = Color.FromArgb(155, 155, 155); // represents normal screen colour (gray) + // Now we create the screens structure from the AMD profile information _screens = new List(); @@ -233,7 +237,7 @@ namespace DisplayMagicianShared.Windows // Return an empty screen if we have no Display Config Paths to use! return _screens; } - + foreach (var path in _windowsDisplayConfig.DisplayConfigPaths) { // For each path we go through and get the relevant info we need. @@ -242,13 +246,18 @@ namespace DisplayMagicianShared.Windows // Set some basics about the screen ScreenPosition screen = new ScreenPosition(); screen.Library = "WINDOWS"; + screen.IsSpanned = false; + screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen + UInt32 sourceId = path.SourceInfo.Id; UInt32 targetId = path.TargetInfo.Id; + + // Go through the screens as Windows knows them, and then enhance the info with Mosaic data if it applies foreach (DISPLAYCONFIG_MODE_INFO displayMode in _windowsDisplayConfig.DisplayConfigModes) { // Find the matching Display Config Source Mode - if (displayMode.InfoType != DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == targetId) + if (displayMode.InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == sourceId) { screen.Name = targetId.ToString(); //screen.DisplayConnector = displayMode.DisplayConnector; @@ -261,7 +270,9 @@ namespace DisplayMagicianShared.Windows if (screen.ScreenX == 0 && screen.ScreenY == 0) { screen.IsPrimary = true; + screen.Colour = primaryScreenColor; } + break; } } @@ -289,28 +300,28 @@ namespace DisplayMagicianShared.Windows screen.HDRSupported = false; screen.HDREnabled = false; } - + break; } } - // No spanning in a windows ccd system - screen.IsSpanned = false; - screen.Colour = Color.FromArgb(195, 195, 195); // represents normal screen colour - - _screens.Add(screen); } } - + return _screens; } + public int CompareTo(object obj) + { + if (!(obj is WinProfileItem)) throw new ArgumentException("Object to CompareTo is not a WinProfileItem"); ; + + WinProfileItem otherProfile = (WinProfileItem)obj; + return this.Name.CompareTo(otherProfile.Name); + } + // The public override for the Object.Equals - public override bool Equals(object obj) - { - return this.Equals(obj as WinProfileItem); - } + public override bool Equals(object obj) => this.Equals(obj as WinProfileItem); // Profiles are equal if their Viewports are equal public bool Equals(WinProfileItem other) @@ -349,6 +360,23 @@ namespace DisplayMagicianShared.Windows } + public static bool operator ==(WinProfileItem lhs, WinProfileItem rhs) + { + if (lhs is null) + { + if (rhs is null) + { + return true; + } + + // Only the left side is null. + return false; + } + // Equals handles case of null on right side. + return lhs.Equals(rhs); + } + + public static bool operator !=(WinProfileItem lhs, WinProfileItem rhs) => !(lhs == rhs); } } \ No newline at end of file