AboutThisProgram.cs - Made setting developer icons and names thread safe

This commit is contained in:
miku-666
2023-04-07 17:59:53 +02:00
parent cf7aa3ccbe
commit 476b4755ee
4 changed files with 1181 additions and 1125 deletions

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PckStudio.Classes.Extentions
{
internal static class ControlExtensions
{
private delegate void SetPropertyThreadSafeDelegate<TResult>(
Control @this,
Expression<Func<TResult>> property,
TResult value);
public static void SetPropertyThreadSafe<TResult>(
this Control @this,
Expression<Func<TResult>> property,
TResult value)
{
var propertyInfo = (property.Body as MemberExpression).Member
as PropertyInfo;
if (propertyInfo == null ||
!@this.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
@this.GetType().GetProperty(
propertyInfo.Name,
propertyInfo.PropertyType) == null)
{
throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control.");
}
if (@this.InvokeRequired)
{
@this.Invoke(new SetPropertyThreadSafeDelegate<TResult>(SetPropertyThreadSafe), @this, property, value);
}
else
{
@this.GetType().InvokeMember(
propertyInfo.Name,
BindingFlags.SetProperty,
null,
@this,
new object[] { value });
}
}
}
}

View File

@@ -38,16 +38,20 @@ namespace PckStudio
// TODO: check if avatar has changed and only acquire info once
var devs = await AcquireDeveloperUserInfoAsync("PhoenixARC", "MattN-L", "EternalModz", "NessieHax");
phoenixarcPictureBox.Image = ImageExtentions.ImageFromUrl(devs[0].AvatarUrl);
phoenixarcPictureBox.SetPropertyThreadSafe(() => phoenixarcPictureBox.Image, ImageExtentions.ImageFromUrl(devs[0].AvatarUrl));
phoenixarcPictureBox.SetPropertyThreadSafe(() => phoenixarcPictureBox.Text, devs[0].Name);
phoenixarcGitHubButton.Click += (sender, e) => Process.Start(devs[0].HtmlUrl);
mattNLPictureBox.Image = ImageExtentions.ImageFromUrl(devs[1].AvatarUrl);
mattNLPictureBox.SetPropertyThreadSafe(() => mattNLPictureBox.Image, ImageExtentions.ImageFromUrl(devs[1].AvatarUrl));
mattNLPictureBox.SetPropertyThreadSafe(() => mattNLPictureBox.Text, devs[1].Name);
mattNLGitHubButton.Click += (sender, e) => Process.Start(devs[1].HtmlUrl);
eternalModzPictureBox.Image = ImageExtentions.ImageFromUrl(devs[2].AvatarUrl);
eternalModzPictureBox.SetPropertyThreadSafe(() => eternalModzPictureBox.Image, ImageExtentions.ImageFromUrl(devs[2].AvatarUrl));
eternalModzPictureBox.SetPropertyThreadSafe(() => eternalModzPictureBox.Text, devs[2].Name);
eternalModzGitHubButton.Click += (sender, e) => Process.Start(devs[2].HtmlUrl);
mikuPictureBox.Image = ImageExtentions.ImageFromUrl(devs[3].AvatarUrl);
mikuPictureBox.SetPropertyThreadSafe(() => mikuPictureBox.Image, ImageExtentions.ImageFromUrl(devs[3].AvatarUrl));
mikuPictureBox.SetPropertyThreadSafe(() => mikuLabel.Text, devs[3].Name);
mikuGitHubButton.Click += (sender, e) => Process.Start(devs[3].HtmlUrl);
});
}

File diff suppressed because it is too large Load Diff

View File

@@ -170,6 +170,7 @@
<Compile Include="Classes\API\PCKCenter\PCKCollections.cs" />
<Compile Include="Classes\API\PCKCenter\PCKCollectionsLocal.cs" />
<Compile Include="Classes\API\PCKCenter\SaveLocalJSON.cs" />
<Compile Include="Classes\Extentions\ControlExtensions.cs" />
<Compile Include="Classes\Extentions\EnumerableExtentions.cs" />
<Compile Include="Classes\FileTypes\CSMBFile.cs" />
<Compile Include="Classes\FileTypes\PCKAudioFile.cs" />