- Bump SAM.Picker to .NET4.

- Improvements to downloading of game list and game icons. See #3.
- Improvements to performance of the game list. See #3.
This commit is contained in:
gibbed
2017-11-24 08:58:54 -06:00
parent 66213562f1
commit 94a92ed4b7
8 changed files with 221 additions and 121 deletions

View File

@@ -20,7 +20,6 @@
* distribution.
*/
using System;
using System.Globalization;
using System.Windows.Forms;
@@ -28,7 +27,7 @@ namespace SAM.Picker
{
internal class GameInfo
{
public long Id;
public uint Id;
public string Type;
public ListViewItem Item;
@@ -52,7 +51,7 @@ namespace SAM.Picker
public string Logo;
public GameInfo(Int64 id, string type)
public GameInfo(uint id, string type)
{
this.Id = id;
this.Type = type;

View File

@@ -32,7 +32,7 @@
System.Windows.Forms.ToolStripSeparator _ToolStripSeparator1;
System.Windows.Forms.ToolStripSeparator _ToolStripSeparator2;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GamePicker));
this._GameLogoImageList = new System.Windows.Forms.ImageList(this.components);
this._LogoImageList = new System.Windows.Forms.ImageList(this.components);
this._CallbackTimer = new System.Windows.Forms.Timer(this.components);
this._PickerToolStrip = new System.Windows.Forms.ToolStrip();
this._RefreshGamesButton = new System.Windows.Forms.ToolStripButton();
@@ -47,6 +47,8 @@
this._PickerStatusStrip = new System.Windows.Forms.StatusStrip();
this._PickerStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this._DownloadStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this._LogoWorker = new System.ComponentModel.BackgroundWorker();
this._ListWorker = new System.ComponentModel.BackgroundWorker();
_ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
_ToolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this._PickerToolStrip.SuspendLayout();
@@ -63,11 +65,11 @@
_ToolStripSeparator2.Name = "_ToolStripSeparator2";
_ToolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// _GameLogoImageList
// _LogoImageList
//
this._GameLogoImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this._GameLogoImageList.ImageSize = new System.Drawing.Size(184, 69);
this._GameLogoImageList.TransparentColor = System.Drawing.Color.Transparent;
this._LogoImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this._LogoImageList.ImageSize = new System.Drawing.Size(184, 69);
this._LogoImageList.TransparentColor = System.Drawing.Color.Transparent;
//
// _CallbackTimer
//
@@ -165,17 +167,19 @@
this._GameListView.BackColor = System.Drawing.Color.Black;
this._GameListView.Dock = System.Windows.Forms.DockStyle.Fill;
this._GameListView.ForeColor = System.Drawing.Color.White;
this._GameListView.LargeImageList = this._GameLogoImageList;
this._GameListView.LargeImageList = this._LogoImageList;
this._GameListView.Location = new System.Drawing.Point(0, 25);
this._GameListView.MultiSelect = false;
this._GameListView.Name = "_GameListView";
this._GameListView.Size = new System.Drawing.Size(742, 245);
this._GameListView.SmallImageList = this._GameLogoImageList;
this._GameListView.SmallImageList = this._LogoImageList;
this._GameListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
this._GameListView.TabIndex = 0;
this._GameListView.TileSize = new System.Drawing.Size(184, 69);
this._GameListView.UseCompatibleStateImageBehavior = false;
this._GameListView.VirtualMode = true;
this._GameListView.ItemActivate += new System.EventHandler(this.OnSelectGame);
this._GameListView.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.OnGameListViewRetrieveVirtualItem);
//
// _PickerStatusStrip
//
@@ -203,6 +207,18 @@
this._DownloadStatusLabel.Text = "Download status";
this._DownloadStatusLabel.Visible = false;
//
// _LogoWorker
//
this._LogoWorker.WorkerSupportsCancellation = true;
this._LogoWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.DoDownloadLogo);
this._LogoWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.OnDownloadLogo);
//
// _ListWorker
//
this._ListWorker.WorkerSupportsCancellation = true;
this._ListWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.DoDownloadList);
this._ListWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.OnDownloadList);
//
// GamePicker
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -226,7 +242,7 @@
#endregion
private DoubleBufferedListView _GameListView;
private System.Windows.Forms.ImageList _GameLogoImageList;
private System.Windows.Forms.ImageList _LogoImageList;
private System.Windows.Forms.Timer _CallbackTimer;
private System.Windows.Forms.ToolStrip _PickerToolStrip;
private System.Windows.Forms.ToolStripButton _RefreshGamesButton;
@@ -240,6 +256,8 @@
private System.Windows.Forms.StatusStrip _PickerStatusStrip;
private System.Windows.Forms.ToolStripStatusLabel _DownloadStatusLabel;
private System.Windows.Forms.ToolStripStatusLabel _PickerStatusLabel;
private System.ComponentModel.BackgroundWorker _LogoWorker;
private System.ComponentModel.BackgroundWorker _ListWorker;
}
}

View File

@@ -21,6 +21,7 @@
*/
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
@@ -39,16 +40,16 @@ namespace SAM.Picker
{
private readonly API.Client _SteamClient;
private readonly WebClient _GameListDownloader = new WebClient();
private readonly WebClient _LogoDownloader = new WebClient();
private List<GameInfo> _Games = new List<GameInfo>();
private readonly List<GameInfo> _Games;
private readonly List<GameInfo> _FilteredGames;
public List<GameInfo> Games
{
get { return _Games; }
}
private readonly List<GameInfo> _LogoQueue = new List<GameInfo>();
private readonly List<string> _LogosAttempted;
private readonly ConcurrentQueue<GameInfo> _LogoQueue;
// ReSharper disable PrivateFieldCanBeConvertedToLocalVariable
private readonly API.Callbacks.AppDataChanged _AppDataChangedCallback;
@@ -56,14 +57,20 @@ namespace SAM.Picker
public GamePicker(API.Client client)
{
this._Games = new List<GameInfo>();
this._FilteredGames = new List<GameInfo>();
this._LogosAttempted = new List<string>();
this._LogoQueue = new ConcurrentQueue<GameInfo>();
this.InitializeComponent();
this._GameLogoImageList.Images.Add(
"Blank",
new Bitmap(this._GameLogoImageList.ImageSize.Width, this._GameLogoImageList.ImageSize.Height));
var blank = new Bitmap(this._LogoImageList.ImageSize.Width, this._LogoImageList.ImageSize.Height);
using (var g = Graphics.FromImage(blank))
{
g.Clear(Color.DimGray);
}
this._GameListDownloader.DownloadDataCompleted += this.OnGameListDownload;
this._LogoDownloader.DownloadDataCompleted += this.OnLogoDownload;
this._LogoImageList.Images.Add("Blank", blank);
this._SteamClient = client;
@@ -81,39 +88,48 @@ namespace SAM.Picker
{
if (info.Id == param.Id)
{
info.Name = this._SteamClient.SteamApps001.GetAppData((uint)info.Id, "name");
info.Name = this._SteamClient.SteamApps001.GetAppData(info.Id, "name");
this.AddGameToLogoQueue(info);
this._GameListView.Sort();
this._GameListView.Update();
break;
}
}
}
}
private void OnGameListDownload(object sender, DownloadDataCompletedEventArgs e)
private void DoDownloadList(object sender, DoWorkEventArgs e)
{
var pairs = new List<KeyValuePair<uint, string>>();
byte[] bytes;
using (var downloader = new WebClient())
{
bytes = downloader.DownloadData(new Uri(string.Format("http://gib.me/sam/games.xml")));
}
using (var stream = new MemoryStream(bytes, false))
{
var document = new XPathDocument(stream);
var navigator = document.CreateNavigator();
var nodes = navigator.Select("/games/game");
while (nodes.MoveNext())
{
string type = nodes.Current.GetAttribute("type", "");
if (type == string.Empty)
{
type = "normal";
}
pairs.Add(new KeyValuePair<uint, string>((uint)nodes.Current.ValueAsLong, type));
}
}
e.Result = pairs;
}
private void OnDownloadList(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null && e.Cancelled == false)
{
using (var stream = new MemoryStream())
var pairs = (List<KeyValuePair<uint, string>>)e.Result;
foreach (var kv in pairs)
{
stream.Write(e.Result, 0, e.Result.Length);
stream.Seek(0, SeekOrigin.Begin);
var document = new XPathDocument(stream);
var navigator = document.CreateNavigator();
var nodes = navigator.Select("/games/game");
while (nodes.MoveNext())
{
string type = nodes.Current.GetAttribute("type", "");
if (type == string.Empty)
{
type = "normal";
}
this.AddGame(nodes.Current.ValueAsLong, type);
}
this.AddGame(kv.Key, kv.Value);
}
}
else
@@ -129,38 +145,31 @@ namespace SAM.Picker
private void RefreshGames()
{
this._GameListView.BeginUpdate();
this._GameListView.Items.Clear();
foreach (GameInfo info in this._Games)
this._FilteredGames.Clear();
foreach (var info in this._Games.OrderBy(gi => gi.Name))
{
if (info.Type == "normal" &&
_FilterGamesMenuItem.Checked == false)
if (info.Type == "normal" && _FilterGamesMenuItem.Checked == false)
{
continue;
}
if (info.Type == "demo" &&
this._FilterDemosMenuItem.Checked == false)
if (info.Type == "demo" && this._FilterDemosMenuItem.Checked == false)
{
continue;
}
if (info.Type == "mod" &&
this._FilterModsMenuItem.Checked == false)
if (info.Type == "mod" && this._FilterModsMenuItem.Checked == false)
{
continue;
}
if (info.Type == "junk" &&
this._FilterJunkMenuItem.Checked == false)
if (info.Type == "junk" && this._FilterJunkMenuItem.Checked == false)
{
continue;
}
this._GameListView.Items.Add(info.Item);
this._FilteredGames.Add(info);
}
this._GameListView.BeginUpdate();
this._GameListView.VirtualListSize = this._FilteredGames.Count;
this._GameListView.RedrawItems(0, this._FilteredGames.Count - 1, true);
this._GameListView.EndUpdate();
this._PickerStatusLabel.Text = string.Format(
"Displaying {0} games. Total {1} games.",
@@ -168,34 +177,53 @@ namespace SAM.Picker
this._Games.Count);
}
private void OnLogoDownload(object sender, DownloadDataCompletedEventArgs e)
private void OnGameListViewRetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (e.Error == null && e.Cancelled == false)
{
var info = e.UserState as GameInfo;
if (info != null)
{
Image logo;
try
{
using (var stream = new MemoryStream())
{
stream.Write(e.Result, 0, e.Result.Length);
logo = new Bitmap(stream);
}
}
catch
{
logo = null;
}
e.Item = this._FilteredGames[e.ItemIndex].Item;
}
if (logo != null)
private void DoDownloadLogo(object sender, DoWorkEventArgs e)
{
var info = (GameInfo)e.Argument;
var logoPath = string.Format(
"http://media.steamcommunity.com/steamcommunity/public/images/apps/{0}/{1}.jpg",
info.Id,
info.Logo);
using (var downloader = new WebClient())
{
var data = downloader.DownloadData(new Uri(logoPath));
try
{
using (var stream = new MemoryStream(data, false))
{
info.ImageIndex = this._GameLogoImageList.Images.Count;
this._GameLogoImageList.Images.Add(info.Logo, logo);
this._GameListView.Update();
var bitmap = new Bitmap(stream);
e.Result = new LogoInfo(info.Id, bitmap);
}
}
catch (Exception)
{
e.Result = new LogoInfo(info.Id, null);
}
}
}
private void OnDownloadLogo(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null || e.Cancelled == true)
{
return;
}
var logoInfo = (LogoInfo)e.Result;
var gameInfo = this._Games.FirstOrDefault(gi => gi.Id == logoInfo.Id);
if (gameInfo != null && logoInfo.Bitmap != null)
{
this._GameListView.BeginUpdate();
var imageIndex = this._LogoImageList.Images.Count;
this._LogoImageList.Images.Add(gameInfo.Logo, logoInfo.Bitmap);
gameInfo.ImageIndex = imageIndex;
this._GameListView.EndUpdate();
}
this.DownloadNextLogo();
@@ -203,14 +231,15 @@ namespace SAM.Picker
private void DownloadNextLogo()
{
if (this._LogoQueue.Count == 0)
if (this._LogoWorker.IsBusy == true)
{
this._DownloadStatusLabel.Visible = false;
return;
}
if (this._LogoDownloader.IsBusy)
GameInfo info;
if (this._LogoQueue.TryDequeue(out info) == false)
{
this._DownloadStatusLabel.Visible = false;
return;
}
@@ -219,19 +248,12 @@ namespace SAM.Picker
this._LogoQueue.Count);
this._DownloadStatusLabel.Visible = true;
GameInfo info = this._LogoQueue[0];
this._LogoQueue.RemoveAt(0);
var logoPath = string.Format(
"http://media.steamcommunity.com/steamcommunity/public/images/apps/{0}/{1}.jpg",
info.Id,
info.Logo);
this._LogoDownloader.DownloadDataAsync(new Uri(logoPath), info);
this._LogoWorker.RunWorkerAsync(info);
}
private void AddGameToLogoQueue(GameInfo info)
{
string logo = this._SteamClient.SteamApps001.GetAppData((uint)info.Id, "logo");
string logo = this._SteamClient.SteamApps001.GetAppData(info.Id, "logo");
if (logo == null)
{
@@ -240,24 +262,25 @@ namespace SAM.Picker
info.Logo = logo;
int imageIndex = this._GameLogoImageList.Images.IndexOfKey(logo);
int imageIndex = this._LogoImageList.Images.IndexOfKey(logo);
if (imageIndex >= 0)
{
info.ImageIndex = imageIndex;
}
else
else if (this._LogosAttempted.Contains(logo) == false)
{
this._LogoQueue.Add(info);
this._LogosAttempted.Add(logo);
this._LogoQueue.Enqueue(info);
this.DownloadNextLogo();
}
}
private bool OwnsGame(long id)
private bool OwnsGame(uint id)
{
return this._SteamClient.SteamApps003.IsSubscribedApp(id);
}
private void AddGame(long id, string type)
private void AddGame(uint id, string type)
{
if (this._Games.Any(i => i.Id == id) == true)
{
@@ -270,7 +293,7 @@ namespace SAM.Picker
}
var info = new GameInfo(id, type);
info.Name = this._SteamClient.SteamApps001.GetAppData((uint)info.Id, "name");
info.Name = this._SteamClient.SteamApps001.GetAppData(info.Id, "name");
this._Games.Add(info);
this.AddGameToLogoQueue(info);
@@ -278,10 +301,9 @@ namespace SAM.Picker
private void AddGames()
{
this._GameListView.Items.Clear();
this._Games = new List<GameInfo>();
this._GameListDownloader.DownloadDataAsync(new Uri(string.Format("http://gib.me/sam/games.xml")));
this._Games.Clear();
this._RefreshGamesButton.Enabled = false;
this._ListWorker.RunWorkerAsync();
}
private void AddDefaultGames()
@@ -332,9 +354,9 @@ namespace SAM.Picker
private void OnAddGame(object sender, EventArgs e)
{
long id;
uint id;
if (long.TryParse(this._AddGameTextBox.Text, out id) == false)
if (uint.TryParse(this._AddGameTextBox.Text, out id) == false)
{
MessageBox.Show(
this,
@@ -352,8 +374,7 @@ namespace SAM.Picker
}
this._AddGameTextBox.Text = "";
this._GameListView.Items.Clear();
this._Games = new List<GameInfo>();
this._Games.Clear();
this.AddGame(id, "normal");
this._FilterGamesMenuItem.Checked = true;
this.RefreshGames();

View File

@@ -112,30 +112,36 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="_ToolStripSeparator1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="_ToolStripSeparator1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="_ToolStripSeparator2.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="_ToolStripSeparator2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="_GameLogoImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="_LogoImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>542, 17</value>
</metadata>
<metadata name="_CallbackTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>678, 17</value>
</metadata>
<metadata name="_PickerToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="_CallbackTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>233, 17</value>
<metadata name="_PickerStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>155, 17</value>
</metadata>
<metadata name="_PickerToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>359, 17</value>
<metadata name="_LogoWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>418, 17</value>
</metadata>
<metadata name="_PickerStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>464, 17</value>
<metadata name="_ListWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>303, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAEACABoBQAANgAAACAgAAABAAgAqAgAAJ4FAAAwMAAAAQAYAKgcAABGDgAAKAAAABAA

38
SAM.Picker/LogoInfo.cs Normal file
View File

@@ -0,0 +1,38 @@
/* Copyright (c) 2017 Rick (rick 'at' gibbed 'dot' us)
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would
* be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
using System.Drawing;
namespace SAM.Picker
{
internal class LogoInfo
{
public readonly uint Id;
public readonly Bitmap Bitmap;
public LogoInfo(uint id, Bitmap bitmap)
{
this.Id = id;
this.Bitmap = bitmap;
}
}
}

View File

@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.1
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -60,6 +60,9 @@ namespace SAM.Picker.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Download {
get {
object obj = ResourceManager.GetObject("Download", resourceCulture);
@@ -67,6 +70,9 @@ namespace SAM.Picker.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Filter {
get {
object obj = ResourceManager.GetObject("Filter", resourceCulture);
@@ -74,6 +80,9 @@ namespace SAM.Picker.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Refresh {
get {
object obj = ResourceManager.GetObject("Refresh", resourceCulture);
@@ -81,6 +90,9 @@ namespace SAM.Picker.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Search {
get {
object obj = ResourceManager.GetObject("Search", resourceCulture);

View File

@@ -10,7 +10,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SAM.Picker</RootNamespace>
<AssemblyName>SAM.Picker</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ApplicationIcon>SAM.ico</ApplicationIcon>
<FileUpgradeFlags>
@@ -32,6 +32,7 @@
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -83,6 +84,7 @@
<Compile Include="GamePicker.Designer.cs">
<DependentUpon>GamePicker.cs</DependentUpon>
</Compile>
<Compile Include="LogoInfo.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="GamePicker.resx">
@@ -107,6 +109,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Resources\arrow-circle-double.png" />
<None Include="Resources\magnifier.png" />
<None Include="Resources\television-test.png" />

3
SAM.Picker/app.config Normal file
View File

@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>