diff --git a/src/Arma3BE.Client.Infrastructure/Extensions/GridHelper.cs b/src/Arma3BE.Client.Infrastructure/Extensions/GridHelper.cs index a375ff7..0c68d6a 100644 --- a/src/Arma3BE.Client.Infrastructure/Extensions/GridHelper.cs +++ b/src/Arma3BE.Client.Infrastructure/Extensions/GridHelper.cs @@ -1,9 +1,15 @@ using Arma3BEClient.Common.Attributes; +using Arma3BEClient.Common.Logging; +using Arma3BEClient.Libs.Tools; using System; using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; +using System.Xml.Serialization; using Xceed.Wpf.DataGrid; namespace Arma3BE.Client.Infrastructure.Extensions @@ -42,9 +48,10 @@ public static ContextMenu Generate(this DataGridControl dgcGridControl) where Clipboard.SetText(val.ToString()); } } - catch (Exception) + catch (Exception ex) { - // ignored + var log = LogFactory.Create(typeof(GridHelper)); + log.Error(ex); } } }; @@ -88,5 +95,60 @@ public static IEnumerable GenerateColumns() } return list; } + + + + public static IEnumerable GetColumns(string key) + { + try + { + var store = new SettingsStoreSource().GetSettingsStore(); + var data = store.Load(key); + if (string.IsNullOrEmpty(data)) return null; + var ser = new XmlSerializer(typeof(ColumnInfo[])); + using (var sr = new StringReader(data)) + return ser.Deserialize(sr) as ColumnInfo[]; + + } + catch (Exception e) + { + var log = LogFactory.Create(typeof(GridHelper)); + log.Error(e); + return null; + } + } + + public static void SaveColumns(string key, IEnumerable infos) + { + try + { + var array = infos.ToArray(); + var store = new SettingsStoreSource().GetSettingsStore(); + var ser = new XmlSerializer(typeof(ColumnInfo[])); + + var sb = new StringBuilder(); + + using (var sw = new StringWriter(sb)) + { + ser.Serialize(sw, array); + } + + store.Save(key, sb.ToString()); + + } + catch (Exception e) + { + var log = LogFactory.Create(typeof(GridHelper)); + log.Error(e); + } + } + } + + public class ColumnInfo + { + public string OriginalName { get; set; } + public int Order { get; set; } + public double Width { get; set; } + public bool Visible { get; set; } } } \ No newline at end of file diff --git a/src/Arma3BE.Client.Libs/Arma3BE.Client.Libs.csproj b/src/Arma3BE.Client.Libs/Arma3BE.Client.Libs.csproj index bf019ec..43c77a2 100644 --- a/src/Arma3BE.Client.Libs/Arma3BE.Client.Libs.csproj +++ b/src/Arma3BE.Client.Libs/Arma3BE.Client.Libs.csproj @@ -54,6 +54,10 @@ 201609111835579_Added_SteamId.cs + + + 201612040948573_Added_custom_settings.cs + @@ -127,6 +131,9 @@ 201609111835579_Added_SteamId.cs + + 201612040948573_Added_custom_settings.cs + diff --git a/src/Arma3BE.Client.Libs/Context/Arma3BEClientContext.cs b/src/Arma3BE.Client.Libs/Context/Arma3BEClientContext.cs index 0700770..91dfafa 100644 --- a/src/Arma3BE.Client.Libs/Context/Arma3BEClientContext.cs +++ b/src/Arma3BE.Client.Libs/Context/Arma3BEClientContext.cs @@ -33,6 +33,7 @@ public Arma3BeClientContext() : base(new ConnectionFactory().Create(), true) public DbSet Player { get; set; } public DbSet ServerInfo { get; set; } public DbSet Settings { get; set; } + public DbSet CustomSettings { get; set; } public DbSet Bans { get; set; } public DbSet Admins { get; set; } public DbSet PlayerHistory { get; set; } diff --git a/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.Designer.cs b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.Designer.cs new file mode 100644 index 0000000..a36fc53 --- /dev/null +++ b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Arma3BEClient.Libs.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] + public sealed partial class Added_custom_settings : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(Added_custom_settings)); + + string IMigrationMetadata.Id + { + get { return "201612040948573_Added_custom_settings"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.cs b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.cs new file mode 100644 index 0000000..4a5ec01 --- /dev/null +++ b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.cs @@ -0,0 +1,25 @@ +namespace Arma3BEClient.Libs.Migrations +{ + using System.Data.Entity.Migrations; + + public partial class Added_custom_settings : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.CustomSettings", + c => new + { + Id = c.String(nullable: false, maxLength: 400), + Value = c.String(), + }) + .PrimaryKey(t => t.Id); + + } + + public override void Down() + { + DropTable("dbo.CustomSettings"); + } + } +} diff --git a/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.resx b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.resx new file mode 100644 index 0000000..d751cac --- /dev/null +++ b/src/Arma3BE.Client.Libs/Migrations/201612040948573_Added_custom_settings.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Arma3BE.Client.Libs/ModelCompact/Settings.cs b/src/Arma3BE.Client.Libs/ModelCompact/Settings.cs index f86ec5f..ff5b4f2 100644 --- a/src/Arma3BE.Client.Libs/ModelCompact/Settings.cs +++ b/src/Arma3BE.Client.Libs/ModelCompact/Settings.cs @@ -1,4 +1,6 @@ -namespace Arma3BEClient.Libs.ModelCompact +using System.ComponentModel.DataAnnotations; + +namespace Arma3BEClient.Libs.ModelCompact { public class Settings { @@ -6,4 +8,11 @@ public class Settings public int Id { get; set; } public string Value { get; set; } } + + public class CustomSettings + { + [Key] + public string Id { get; set; } + public string Value { get; set; } + } } \ No newline at end of file diff --git a/src/Arma3BE.Client.Libs/Tools/ISettingsStore.cs b/src/Arma3BE.Client.Libs/Tools/ISettingsStore.cs index 5466daf..49d0093 100644 --- a/src/Arma3BE.Client.Libs/Tools/ISettingsStore.cs +++ b/src/Arma3BE.Client.Libs/Tools/ISettingsStore.cs @@ -10,6 +10,10 @@ public interface ISettingsStore : ICloneable TimeZoneInfo TimeZoneInfo { get; set; } void Save(); + + + void Save(string key, string value); + string Load(string key); } public interface ISettingsStoreSource diff --git a/src/Arma3BE.Client.Libs/Tools/Settings.cs b/src/Arma3BE.Client.Libs/Tools/Settings.cs index 395c83b..b3646f8 100644 --- a/src/Arma3BE.Client.Libs/Tools/Settings.cs +++ b/src/Arma3BE.Client.Libs/Tools/Settings.cs @@ -22,6 +22,24 @@ internal class SettingsStore : ISettingsStore private static SettingsStore _instance; public static SettingsStore Instance => _instance ?? (_instance = Load()); + + public void Save(string key, string value) + { + using (var context = new Arma3BeClientContext()) + { + context.CustomSettings.AddOrUpdate(new CustomSettings() { Id = key, Value = value }); + context.SaveChanges(); + } + } + + public string Load(string key) + { + using (var context = new Arma3BeClientContext()) + { + return context.CustomSettings.FirstOrDefault(x => x.Id == key)?.Value; + } + } + public void Save() { using (var context = new Arma3BeClientContext())