From 9536d387454ed00cff67223916503f773bf2e0ff Mon Sep 17 00:00:00 2001
From: Pierre Ferreira
Date: Sat, 4 Feb 2023 11:02:32 +0100
Subject: [PATCH 1/4] =?UTF-8?q?:rocket:=20cr=C3=A9ation=20d'une=20branche?=
=?UTF-8?q?=20perso=20pour=20eviter=20les=20conflits,=20et=20mise=20sur=20?=
=?UTF-8?q?le=20depots=20du=20code=20:=20la=20creation=20de=20champion=20e?=
=?UTF-8?q?n=20base=20de=20donn=C3=A9e=20avec=20nom,=20bio=20et=20icone=20?=
=?UTF-8?q?:zap:?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
EF_LoL/EF_LoL.sln | 25 ++++++
EF_LoL/EF_LoL/ChampionDBContext.cs | 20 +++++
EF_LoL/EF_LoL/ChampionEntity.cs | 83 ++++++++++++++++++
EF_LoL/EF_LoL/EF_LoL.MyDataBase.db | Bin 0 -> 20480 bytes
EF_LoL/EF_LoL/EF_LoL.csproj | 21 +++++
.../20230204093038_MyMigration.Designer.cs | 42 +++++++++
.../Migrations/20230204093038_MyMigration.cs | 34 +++++++
.../ChampionDBContextModelSnapshot.cs | 39 ++++++++
EF_LoL/EF_LoL/MyDataBase.db | 0
EF_LoL/EF_LoL/Program.cs | 28 ++++++
10 files changed, 292 insertions(+)
create mode 100644 EF_LoL/EF_LoL.sln
create mode 100644 EF_LoL/EF_LoL/ChampionDBContext.cs
create mode 100644 EF_LoL/EF_LoL/ChampionEntity.cs
create mode 100644 EF_LoL/EF_LoL/EF_LoL.MyDataBase.db
create mode 100644 EF_LoL/EF_LoL/EF_LoL.csproj
create mode 100644 EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.Designer.cs
create mode 100644 EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.cs
create mode 100644 EF_LoL/EF_LoL/Migrations/ChampionDBContextModelSnapshot.cs
create mode 100644 EF_LoL/EF_LoL/MyDataBase.db
create mode 100644 EF_LoL/EF_LoL/Program.cs
diff --git a/EF_LoL/EF_LoL.sln b/EF_LoL/EF_LoL.sln
new file mode 100644
index 0000000..856e14b
--- /dev/null
+++ b/EF_LoL/EF_LoL.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33213.308
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EF_LoL", "EF_LoL\EF_LoL.csproj", "{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {1EA5AF67-3A7C-4B6B-BE39-837D683F5AB3}
+ EndGlobalSection
+EndGlobal
diff --git a/EF_LoL/EF_LoL/ChampionDBContext.cs b/EF_LoL/EF_LoL/ChampionDBContext.cs
new file mode 100644
index 0000000..8536a46
--- /dev/null
+++ b/EF_LoL/EF_LoL/ChampionDBContext.cs
@@ -0,0 +1,20 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EF_LoL
+{
+ public class ChampionDBContext : DbContext
+ {
+
+ //ChampionEntity champ1 = new ChampionEntity("Bob");
+ //ChampionEntity champ2 = new ChampionEntity("Fanta");
+
+ public DbSet ChampionEntity { get; set; }
+ protected override void OnConfiguring(DbContextOptionsBuilder options)
+ => options.UseSqlite("Data Source= EF_LoL.MyDataBase.db");
+ }
+}
diff --git a/EF_LoL/EF_LoL/ChampionEntity.cs b/EF_LoL/EF_LoL/ChampionEntity.cs
new file mode 100644
index 0000000..276445c
--- /dev/null
+++ b/EF_LoL/EF_LoL/ChampionEntity.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Collections.ObjectModel;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EF_LoL
+{
+ public class ChampionEntity
+ {
+ //dotnet ef database update --context ChampionDBContext --project EF_LoL
+ [Key]
+ public string Name
+ {
+ get => name;
+ private init
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ name = "Unknown";
+ return;
+ }
+ name = value;
+ }
+ }
+ private readonly string name = null!;
+
+ public string Bio
+ {
+ get => bio;
+ set
+ {
+ if (value == null)
+ {
+ bio = "";
+ return;
+ }
+ bio = value;
+ }
+ }
+ private string bio = "";
+
+ public string Icon { get; set; }
+
+ public ChampionEntity(string name, string icon = "", string bio = "")
+ {
+ Name = name;
+ Icon = icon;
+ Bio = bio;
+ }
+
+ // creer tabl avec db context et db set de champion
+ // puis ajout d'un nouveau champion
+ // pour ajouté un attribut : supprimer nos migrations et nos db
+
+ public override bool Equals(object? obj)
+ {
+ if (ReferenceEquals(obj, null)) return false;
+ if (ReferenceEquals(obj, this)) return true;
+ if (GetType() != obj.GetType()) return false;
+ return Equals(obj as ChampionEntity);
+ }
+
+ public override int GetHashCode()
+ => Name.GetHashCode() % 997;
+
+ public bool Equals(ChampionEntity? other)
+ => Name.Equals(other?.Name);
+
+ public override string ToString()
+ {
+ StringBuilder sb = new StringBuilder($"{Name}");
+ if (!string.IsNullOrWhiteSpace(bio))
+ {
+ sb.AppendLine($"\t{bio}");
+ }
+ return sb.ToString();
+ }
+ }
+}
diff --git a/EF_LoL/EF_LoL/EF_LoL.MyDataBase.db b/EF_LoL/EF_LoL/EF_LoL.MyDataBase.db
new file mode 100644
index 0000000000000000000000000000000000000000..2a3e632a6630951fe99233d4eba425f6d85e5d67
GIT binary patch
literal 20480
zcmeI%J#W)M7zgk>pWCJpSF==>kWf#ah=d|HK?+qD+{g&4c_THb8Ia{BhFUZ+IIc>@
z_B-$~_$XbNVSojR4Y4qCu1Fx3EwM)WKl16GyR*;sPhReP^t2Twfp{6kV?Pmfa+@d$
zc_aiOgvqid%RCgBsPl%b=|6c<%1G6_!?j;T<=15EqxOMcZ@n)%8T}A|00bZa0SG_<
z0uX=z1R(IA0+%-1&?^;sWheg0S%p~&>
zXBbT~L%dwsSJ(A!g_3YG3f@iMp2-!e=btChO*?Z#Z+H0t)-I3fhTdqmfNW;ljNTBS7tG%Gs?U`7N}sN9H(9!jn0S3^B|tehs{hYT^way
zf6*v%$-R%ao7
+
+
+ Exe
+ net6.0
+ enable
+ enable
+ $(MSBuildProjectDirectory)
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.Designer.cs b/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.Designer.cs
new file mode 100644
index 0000000..e4053f1
--- /dev/null
+++ b/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.Designer.cs
@@ -0,0 +1,42 @@
+//
+using EF_LoL;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace EFLoL.Migrations
+{
+ [DbContext(typeof(ChampionDBContext))]
+ [Migration("20230204093038_MyMigration")]
+ partial class MyMigration
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
+
+ modelBuilder.Entity("EF_LoL.ChampionEntity", b =>
+ {
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Bio")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Icon")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Name");
+
+ b.ToTable("ChampionEntity");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.cs b/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.cs
new file mode 100644
index 0000000..d92c2cf
--- /dev/null
+++ b/EF_LoL/EF_LoL/Migrations/20230204093038_MyMigration.cs
@@ -0,0 +1,34 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace EFLoL.Migrations
+{
+ ///
+ public partial class MyMigration : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "ChampionEntity",
+ columns: table => new
+ {
+ Name = table.Column(type: "TEXT", nullable: false),
+ Bio = table.Column(type: "TEXT", nullable: false),
+ Icon = table.Column(type: "TEXT", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ChampionEntity", x => x.Name);
+ });
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ChampionEntity");
+ }
+ }
+}
diff --git a/EF_LoL/EF_LoL/Migrations/ChampionDBContextModelSnapshot.cs b/EF_LoL/EF_LoL/Migrations/ChampionDBContextModelSnapshot.cs
new file mode 100644
index 0000000..4f2de8c
--- /dev/null
+++ b/EF_LoL/EF_LoL/Migrations/ChampionDBContextModelSnapshot.cs
@@ -0,0 +1,39 @@
+//
+using EF_LoL;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace EFLoL.Migrations
+{
+ [DbContext(typeof(ChampionDBContext))]
+ partial class ChampionDBContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
+
+ modelBuilder.Entity("EF_LoL.ChampionEntity", b =>
+ {
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Bio")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Icon")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Name");
+
+ b.ToTable("ChampionEntity");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/EF_LoL/EF_LoL/MyDataBase.db b/EF_LoL/EF_LoL/MyDataBase.db
new file mode 100644
index 0000000..e69de29
diff --git a/EF_LoL/EF_LoL/Program.cs b/EF_LoL/EF_LoL/Program.cs
new file mode 100644
index 0000000..1b49a9d
--- /dev/null
+++ b/EF_LoL/EF_LoL/Program.cs
@@ -0,0 +1,28 @@
+// See https://aka.ms/new-console-template for more information
+using EF_LoL;
+
+Console.WriteLine("Hello, World!");
+
+
+ChampionEntity chewie = new ChampionEntity("Chewbacca");
+ChampionEntity yoda = new ChampionEntity ("Yoda");
+ChampionEntity ewok = new ChampionEntity ("Ewok");
+
+using (var context = new ChampionDBContext())
+{
+ // Crée des Champion et les insère dans la base
+ Console.WriteLine("Creates and inserts new Champion");
+ context.ChampionEntity.Add(chewie);
+ context.Add(yoda);
+ context.Add(ewok);
+ context.SaveChanges();
+}
+
+using (var context = new ChampionDBContext())
+{
+ foreach (var n in context.ChampionEntity)
+ {
+ Console.WriteLine($"{n.Name} - {n.Bio} [ {n.Icon} ]");
+ }
+ context.SaveChanges();
+}
From 93a1c42ad205b2dd9fee3720002aad9af0d36a55 Mon Sep 17 00:00:00 2001
From: Pierre Ferreira
Date: Sat, 4 Feb 2023 12:03:28 +0100
Subject: [PATCH 2/4] =?UTF-8?q?:test=5Ftube:=20ajout=20du=20premier=20test?=
=?UTF-8?q?=20et=20des=20charact=C3=A9ristiques(pb=20sur=20cette=20derni?=
=?UTF-8?q?=C3=A8re=20nonobstant..)=20:adhesive=5Fbandage:?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
EF_LoL/EF_LoL.sln | 8 ++++-
EF_LoL/EF_LoL/ChampionDBContext.cs | 17 +++++++++-
EF_LoL/EF_LoL/ChampionEntity.cs | 45 ++++++++++++++++++++++++++-
EF_LoL/EF_LoL/EF_LoL.csproj | 1 +
EF_LoL/EF_LoL/Program.cs | 4 +--
EF_LoL/TestProject/TestProject.csproj | 29 +++++++++++++++++
EF_LoL/TestProject/UnitTest1.cs | 45 +++++++++++++++++++++++++++
EF_LoL/TestProject/Usings.cs | 1 +
8 files changed, 145 insertions(+), 5 deletions(-)
create mode 100644 EF_LoL/TestProject/TestProject.csproj
create mode 100644 EF_LoL/TestProject/UnitTest1.cs
create mode 100644 EF_LoL/TestProject/Usings.cs
diff --git a/EF_LoL/EF_LoL.sln b/EF_LoL/EF_LoL.sln
index 856e14b..98ae8a2 100644
--- a/EF_LoL/EF_LoL.sln
+++ b/EF_LoL/EF_LoL.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33213.308
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EF_LoL", "EF_LoL\EF_LoL.csproj", "{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EF_LoL", "EF_LoL\EF_LoL.csproj", "{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject\TestProject.csproj", "{1A0B75E2-ECCE-47F3-A8FB-79F48F76E9A1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1AF6FE09-1ABF-4C51-8EC6-D2938876AAD2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A0B75E2-ECCE-47F3-A8FB-79F48F76E9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A0B75E2-ECCE-47F3-A8FB-79F48F76E9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A0B75E2-ECCE-47F3-A8FB-79F48F76E9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A0B75E2-ECCE-47F3-A8FB-79F48F76E9A1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/EF_LoL/EF_LoL/ChampionDBContext.cs b/EF_LoL/EF_LoL/ChampionDBContext.cs
index 8536a46..eb85489 100644
--- a/EF_LoL/EF_LoL/ChampionDBContext.cs
+++ b/EF_LoL/EF_LoL/ChampionDBContext.cs
@@ -9,12 +9,27 @@ namespace EF_LoL
{
public class ChampionDBContext : DbContext
{
+ public ChampionDBContext()
+ { }
+
+ public ChampionDBContext(DbContextOptions options)
+ : base(options)
+ { }
//ChampionEntity champ1 = new ChampionEntity("Bob");
//ChampionEntity champ2 = new ChampionEntity("Fanta");
public DbSet ChampionEntity { get; set; }
+
+ //protected override void OnConfiguring(DbContextOptionsBuilder options)
+ // => options.UseSqlite("Data Source= EF_LoL.MyDataBase.db");
+
protected override void OnConfiguring(DbContextOptionsBuilder options)
- => options.UseSqlite("Data Source= EF_LoL.MyDataBase.db");
+ {
+ if (!options.IsConfigured)
+ {
+ options.UseSqlite("Data Source= EF_LoL.MyDataBase.db");
+ }
+ }
}
}
diff --git a/EF_LoL/EF_LoL/ChampionEntity.cs b/EF_LoL/EF_LoL/ChampionEntity.cs
index 276445c..9a764d9 100644
--- a/EF_LoL/EF_LoL/ChampionEntity.cs
+++ b/EF_LoL/EF_LoL/ChampionEntity.cs
@@ -4,6 +4,7 @@ using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
+using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
@@ -45,14 +46,22 @@ namespace EF_LoL
public string Icon { get; set; }
+
+
+
public ChampionEntity(string name, string icon = "", string bio = "")
{
Name = name;
Icon = icon;
Bio = bio;
+ ///Characteristics = new ReadOnlyDictionary(characteristics);
}
- // creer tabl avec db context et db set de champion
+ ///public ReadOnlyDictionary Characteristics { get; private set; }
+ ///private readonly Dictionary characteristics = new Dictionary();
+
+
+ // creer table avec db context et db set de champion
// puis ajout d'un nouveau champion
// pour ajouté un attribut : supprimer nos migrations et nos db
@@ -79,5 +88,39 @@ namespace EF_LoL
}
return sb.ToString();
}
+
+
+
+ ///// Characteristique
+
+ ////public void AddCharacteristics(params Tuple[] someCharacteristics)
+ ////{
+ //// foreach (var c in someCharacteristics)
+ //// {
+ //// characteristics[c.Item1] = c.Item2;
+ //// }
+ ////}
+
+ ////public bool RemoveCharacteristics(string label)
+ //// => characteristics.Remove(label);
+
+ ////public int? this[string label]
+ ////{
+ //// get
+ //// {
+ //// if (!characteristics.TryGetValue(label, out int value)) return null;
+ //// else return value;
+ //// }
+ //// set
+ //// {
+ //// if (!value.HasValue)
+ //// {
+ //// RemoveCharacteristics(label);
+ //// return;
+ //// }
+ //// characteristics[label] = value.Value;
+ //// }
+ ////}
+
}
}
diff --git a/EF_LoL/EF_LoL/EF_LoL.csproj b/EF_LoL/EF_LoL/EF_LoL.csproj
index 500c36b..b1028b0 100644
--- a/EF_LoL/EF_LoL/EF_LoL.csproj
+++ b/EF_LoL/EF_LoL/EF_LoL.csproj
@@ -10,6 +10,7 @@
+
diff --git a/EF_LoL/EF_LoL/Program.cs b/EF_LoL/EF_LoL/Program.cs
index 1b49a9d..cb608c3 100644
--- a/EF_LoL/EF_LoL/Program.cs
+++ b/EF_LoL/EF_LoL/Program.cs
@@ -13,8 +13,8 @@ using (var context = new ChampionDBContext())
// Crée des Champion et les insère dans la base
Console.WriteLine("Creates and inserts new Champion");
context.ChampionEntity.Add(chewie);
- context.Add(yoda);
- context.Add(ewok);
+ context.ChampionEntity.Add(yoda);
+ context.ChampionEntity.Add(ewok);
context.SaveChanges();
}
diff --git a/EF_LoL/TestProject/TestProject.csproj b/EF_LoL/TestProject/TestProject.csproj
new file mode 100644
index 0000000..0c2b451
--- /dev/null
+++ b/EF_LoL/TestProject/TestProject.csproj
@@ -0,0 +1,29 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+ false
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
diff --git a/EF_LoL/TestProject/UnitTest1.cs b/EF_LoL/TestProject/UnitTest1.cs
new file mode 100644
index 0000000..743eb8d
--- /dev/null
+++ b/EF_LoL/TestProject/UnitTest1.cs
@@ -0,0 +1,45 @@
+using EF_LoL;
+using Microsoft.EntityFrameworkCore;
+using System.Linq;
+using Xunit;
+
+
+namespace TestProject
+{
+
+ public class UnitTest1
+ {
+ [Fact]
+ public void Test1()
+ {
+ var options = new DbContextOptionsBuilder()
+ .UseInMemoryDatabase(databaseName: "Add_Test_database")
+ .Options;
+
+ //prepares the database with one instance of the context
+ using (var context = new ChampionDBContext(options))
+ {
+
+ ChampionEntity chewie = new ChampionEntity("Chewbacca");
+ ChampionEntity yoda = new ChampionEntity("Yoda");
+ ChampionEntity ewok = new ChampionEntity("Ewok");
+
+
+ Console.WriteLine("Creates and inserts new Champion for tests");
+ context.ChampionEntity.Add(chewie);
+ context.ChampionEntity.Add(yoda);
+ context.ChampionEntity.Add(ewok);
+ context.SaveChanges();
+ }
+
+ //prepares the database with one instance of the context
+ using (var context = new ChampionDBContext(options))
+ {
+ Assert.Equal(3, context.ChampionEntity.Count());
+ Assert.Equal("Chewbacca", context.ChampionEntity.First().Name);
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/EF_LoL/TestProject/Usings.cs b/EF_LoL/TestProject/Usings.cs
new file mode 100644
index 0000000..8c927eb
--- /dev/null
+++ b/EF_LoL/TestProject/Usings.cs
@@ -0,0 +1 @@
+global using Xunit;
\ No newline at end of file
From d38600ce4bb647a1febee34e21c755e51cfe23bb Mon Sep 17 00:00:00 2001
From: Pierre Ferreira
Date: Sun, 26 Mar 2023 19:52:01 +0200
Subject: [PATCH 3/4] test maui :zap:
---
Sources/ConsoleApplication/Utils.cs | 2 +-
.../HttpClient/HttpClientManager.Champion.cs | 23 +-
Sources/LeagueOfLegends.sln | 14 +-
Sources/LolApp/AddChampionPage.xaml | 142 ++++++
Sources/LolApp/AddChampionPage.xaml.cs | 13 +
Sources/LolApp/AddOrEditSkinPage.xaml | 73 ++++
Sources/LolApp/AddOrEditSkinPage.xaml.cs | 24 ++
Sources/LolApp/AddSkill.xaml | 36 ++
Sources/LolApp/AddSkill.xaml.cs | 13 +
Sources/LolApp/App.xaml | 18 +
Sources/LolApp/App.xaml.cs | 12 +
Sources/LolApp/AppShell.xaml | 21 +
Sources/LolApp/AppShell.xaml.cs | 10 +
Sources/LolApp/ChampionPage.xaml | 185 ++++++++
Sources/LolApp/ChampionPage.xaml.cs | 31 ++
Sources/LolApp/ChampionsPage.xaml | 196 +++++++++
Sources/LolApp/ChampionsPage.xaml.cs | 17 +
.../ContentViews/ChampionClassSelector.xaml | 131 ++++++
.../ChampionClassSelector.xaml.cs | 34 ++
.../LolApp/ContentViews/SearchByStringView.cs | 38 ++
Sources/LolApp/LolApp.csproj | 99 +++++
Sources/LolApp/MainPage.xaml | 37 ++
Sources/LolApp/MainPage.xaml.cs | 11 +
Sources/LolApp/MauiProgram.cs | 39 ++
.../Platforms/Android/AndroidManifest.xml | 7 +
.../LolApp/Platforms/Android/MainActivity.cs | 11 +
.../Platforms/Android/MainApplication.cs | 16 +
.../Android/Resources/values/colors.xml | 7 +
.../Platforms/MacCatalyst/AppDelegate.cs | 10 +
.../LolApp/Platforms/MacCatalyst/Info.plist | 36 ++
.../LolApp/Platforms/MacCatalyst/Program.cs | 16 +
Sources/LolApp/Platforms/Tizen/Main.cs | 17 +
.../LolApp/Platforms/Tizen/tizen-manifest.xml | 15 +
Sources/LolApp/Platforms/Windows/App.xaml | 9 +
Sources/LolApp/Platforms/Windows/App.xaml.cs | 25 ++
.../Platforms/Windows/Package.appxmanifest | 47 ++
Sources/LolApp/Platforms/Windows/app.manifest | 16 +
Sources/LolApp/Platforms/iOS/AppDelegate.cs | 10 +
Sources/LolApp/Platforms/iOS/Info.plist | 38 ++
Sources/LolApp/Platforms/iOS/Program.cs | 16 +
Sources/LolApp/Properties/launchSettings.json | 8 +
Sources/LolApp/Resources/AppIcon/appicon.png | Bin 0 -> 28759 bytes
.../LolApp/Resources/AppIcon/appiconfg.svg | 8 +
.../Base64ToImageSourceConverter.cs | 34 ++
.../ChampionClassToIconConverter.cs | 42 ++
.../Converters/ImageRatioConverter.cs | 28 ++
.../Resources/Converters/PlusOneConverter.cs | 28 ++
.../Fonts/Font Awesome 6 Free-Solid-900.otf | Bin 0 -> 1029020 bytes
.../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107180 bytes
.../Resources/Fonts/OpenSans-Semibold.ttf | Bin 0 -> 111036 bytes
Sources/LolApp/Resources/Images/assassin.svg | 1 +
Sources/LolApp/Resources/Images/fighter.svg | 1 +
Sources/LolApp/Resources/Images/lol.png | Bin 0 -> 1949 bytes
Sources/LolApp/Resources/Images/lollogo.jpg | Bin 0 -> 129536 bytes
Sources/LolApp/Resources/Images/mage.svg | 1 +
Sources/LolApp/Resources/Images/marksman.svg | 1 +
Sources/LolApp/Resources/Images/rp.png | Bin 0 -> 2416 bytes
Sources/LolApp/Resources/Images/support.svg | 1 +
Sources/LolApp/Resources/Images/sword.png | Bin 0 -> 1701 bytes
Sources/LolApp/Resources/Images/tank.svg | 1 +
Sources/LolApp/Resources/Raw/AboutAssets.txt | 17 +
Sources/LolApp/Resources/Splash/splash.png | Bin 0 -> 234027 bytes
Sources/LolApp/Resources/Styles/Colors.xaml | 46 ++
.../Resources/Styles/FontAwesomeGlyphs.xaml | 13 +
Sources/LolApp/Resources/Styles/MyStyles.xaml | 102 +++++
Sources/LolApp/Resources/Styles/Styles.xaml | 406 ++++++++++++++++++
Sources/LolApp/SkinPage.xaml | 46 ++
Sources/LolApp/SkinPage.xaml.cs | 18 +
.../LolApp/ViewModels/AddChampionPageVM.cs | 80 ++++
.../LolApp/ViewModels/AddOrEditSkinPageVM.cs | 64 +++
Sources/LolApp/ViewModels/AddSkillVM.cs | 46 ++
Sources/LolApp/ViewModels/ApplicationVM.cs | 58 +++
Sources/LolApp/ViewModels/ChampionClassVM.cs | 27 ++
Sources/LolApp/ViewModels/ChampionsPageVM.cs | 111 +++++
.../ViewModels/PickIconsAndImagesUtils.cs | 32 ++
Sources/ViewModels/ChampionVM.cs | 101 +++++
Sources/ViewModels/ChampionsMgrVM.cs | 227 ++++++++++
Sources/ViewModels/EditableChampionVM.cs | 73 ++++
Sources/ViewModels/EditableSkinVM.cs | 51 +++
Sources/ViewModels/SkillVM.cs | 32 ++
Sources/ViewModels/SkinVM.cs | 65 +++
Sources/ViewModels/SkinsMgrVM.cs | 135 ++++++
Sources/ViewModels/ViewModels.csproj | 16 +
83 files changed, 3425 insertions(+), 10 deletions(-)
create mode 100644 Sources/LolApp/AddChampionPage.xaml
create mode 100644 Sources/LolApp/AddChampionPage.xaml.cs
create mode 100644 Sources/LolApp/AddOrEditSkinPage.xaml
create mode 100644 Sources/LolApp/AddOrEditSkinPage.xaml.cs
create mode 100644 Sources/LolApp/AddSkill.xaml
create mode 100644 Sources/LolApp/AddSkill.xaml.cs
create mode 100644 Sources/LolApp/App.xaml
create mode 100644 Sources/LolApp/App.xaml.cs
create mode 100644 Sources/LolApp/AppShell.xaml
create mode 100644 Sources/LolApp/AppShell.xaml.cs
create mode 100644 Sources/LolApp/ChampionPage.xaml
create mode 100644 Sources/LolApp/ChampionPage.xaml.cs
create mode 100644 Sources/LolApp/ChampionsPage.xaml
create mode 100644 Sources/LolApp/ChampionsPage.xaml.cs
create mode 100644 Sources/LolApp/ContentViews/ChampionClassSelector.xaml
create mode 100644 Sources/LolApp/ContentViews/ChampionClassSelector.xaml.cs
create mode 100644 Sources/LolApp/ContentViews/SearchByStringView.cs
create mode 100644 Sources/LolApp/LolApp.csproj
create mode 100644 Sources/LolApp/MainPage.xaml
create mode 100644 Sources/LolApp/MainPage.xaml.cs
create mode 100644 Sources/LolApp/MauiProgram.cs
create mode 100644 Sources/LolApp/Platforms/Android/AndroidManifest.xml
create mode 100644 Sources/LolApp/Platforms/Android/MainActivity.cs
create mode 100644 Sources/LolApp/Platforms/Android/MainApplication.cs
create mode 100644 Sources/LolApp/Platforms/Android/Resources/values/colors.xml
create mode 100644 Sources/LolApp/Platforms/MacCatalyst/AppDelegate.cs
create mode 100644 Sources/LolApp/Platforms/MacCatalyst/Info.plist
create mode 100644 Sources/LolApp/Platforms/MacCatalyst/Program.cs
create mode 100644 Sources/LolApp/Platforms/Tizen/Main.cs
create mode 100644 Sources/LolApp/Platforms/Tizen/tizen-manifest.xml
create mode 100644 Sources/LolApp/Platforms/Windows/App.xaml
create mode 100644 Sources/LolApp/Platforms/Windows/App.xaml.cs
create mode 100644 Sources/LolApp/Platforms/Windows/Package.appxmanifest
create mode 100644 Sources/LolApp/Platforms/Windows/app.manifest
create mode 100644 Sources/LolApp/Platforms/iOS/AppDelegate.cs
create mode 100644 Sources/LolApp/Platforms/iOS/Info.plist
create mode 100644 Sources/LolApp/Platforms/iOS/Program.cs
create mode 100644 Sources/LolApp/Properties/launchSettings.json
create mode 100644 Sources/LolApp/Resources/AppIcon/appicon.png
create mode 100644 Sources/LolApp/Resources/AppIcon/appiconfg.svg
create mode 100644 Sources/LolApp/Resources/Converters/Base64ToImageSourceConverter.cs
create mode 100644 Sources/LolApp/Resources/Converters/ChampionClassToIconConverter.cs
create mode 100644 Sources/LolApp/Resources/Converters/ImageRatioConverter.cs
create mode 100644 Sources/LolApp/Resources/Converters/PlusOneConverter.cs
create mode 100644 Sources/LolApp/Resources/Fonts/Font Awesome 6 Free-Solid-900.otf
create mode 100644 Sources/LolApp/Resources/Fonts/OpenSans-Regular.ttf
create mode 100644 Sources/LolApp/Resources/Fonts/OpenSans-Semibold.ttf
create mode 100644 Sources/LolApp/Resources/Images/assassin.svg
create mode 100644 Sources/LolApp/Resources/Images/fighter.svg
create mode 100644 Sources/LolApp/Resources/Images/lol.png
create mode 100644 Sources/LolApp/Resources/Images/lollogo.jpg
create mode 100644 Sources/LolApp/Resources/Images/mage.svg
create mode 100644 Sources/LolApp/Resources/Images/marksman.svg
create mode 100644 Sources/LolApp/Resources/Images/rp.png
create mode 100644 Sources/LolApp/Resources/Images/support.svg
create mode 100644 Sources/LolApp/Resources/Images/sword.png
create mode 100644 Sources/LolApp/Resources/Images/tank.svg
create mode 100644 Sources/LolApp/Resources/Raw/AboutAssets.txt
create mode 100644 Sources/LolApp/Resources/Splash/splash.png
create mode 100644 Sources/LolApp/Resources/Styles/Colors.xaml
create mode 100644 Sources/LolApp/Resources/Styles/FontAwesomeGlyphs.xaml
create mode 100644 Sources/LolApp/Resources/Styles/MyStyles.xaml
create mode 100644 Sources/LolApp/Resources/Styles/Styles.xaml
create mode 100644 Sources/LolApp/SkinPage.xaml
create mode 100644 Sources/LolApp/SkinPage.xaml.cs
create mode 100644 Sources/LolApp/ViewModels/AddChampionPageVM.cs
create mode 100644 Sources/LolApp/ViewModels/AddOrEditSkinPageVM.cs
create mode 100644 Sources/LolApp/ViewModels/AddSkillVM.cs
create mode 100644 Sources/LolApp/ViewModels/ApplicationVM.cs
create mode 100644 Sources/LolApp/ViewModels/ChampionClassVM.cs
create mode 100644 Sources/LolApp/ViewModels/ChampionsPageVM.cs
create mode 100644 Sources/LolApp/ViewModels/PickIconsAndImagesUtils.cs
create mode 100644 Sources/ViewModels/ChampionVM.cs
create mode 100644 Sources/ViewModels/ChampionsMgrVM.cs
create mode 100644 Sources/ViewModels/EditableChampionVM.cs
create mode 100644 Sources/ViewModels/EditableSkinVM.cs
create mode 100644 Sources/ViewModels/SkillVM.cs
create mode 100644 Sources/ViewModels/SkinVM.cs
create mode 100644 Sources/ViewModels/SkinsMgrVM.cs
create mode 100644 Sources/ViewModels/ViewModels.csproj
diff --git a/Sources/ConsoleApplication/Utils.cs b/Sources/ConsoleApplication/Utils.cs
index fb70443..fec49ea 100644
--- a/Sources/ConsoleApplication/Utils.cs
+++ b/Sources/ConsoleApplication/Utils.cs
@@ -36,7 +36,7 @@ namespace ConsoleApplication
switch (choix)
{
case "1":
- //Console.WriteLine("# result : "+ await championsManager.GetNbItems());
+ Console.WriteLine("# result : "+ await championsManager.GetNbItems());
break;
case "2":
var list = await championsManager.GetItems(0, 10);
diff --git a/Sources/HttpClient/HttpClientManager.Champion.cs b/Sources/HttpClient/HttpClientManager.Champion.cs
index fa2eed6..5eed5c0 100644
--- a/Sources/HttpClient/HttpClientManager.Champion.cs
+++ b/Sources/HttpClient/HttpClientManager.Champion.cs
@@ -44,6 +44,7 @@ namespace HttpClient
public async Task DeleteItem(Champion? item)
{
HttpResponseMessage response = await httpc.DeleteAsync("v1/Champions?Name=" + item.Name);
+ _ = response.StatusCode;
return response.IsSuccessStatusCode;
}
@@ -70,28 +71,30 @@ namespace HttpClient
public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
- return httpc.GetFromJsonAsync>("/Champion?name="+substring+"&index=" + index + "&size=" + count);
+ return httpc.GetFromJsonAsync>("v1/Champions?name=" + substring+"&index=" + index + "&size=" + count);
}
- public Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false)
+ public Task GetNbItems()
{
- throw new NotImplementedException();
+ return httpc.GetFromJsonAsync("v1/Champions/count");
}
- public Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
+
+ public Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
throw new NotImplementedException();
}
- public Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
+ public Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
throw new NotImplementedException();
}
- public Task GetNbItems()
+ public Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
throw new NotImplementedException();
}
+
public Task GetNbItemsByCharacteristic(string charName)
{
@@ -123,9 +126,13 @@ namespace HttpClient
throw new NotImplementedException();
}
- public Task UpdateItem(Champion? oldItem, Champion? newItem)
+ public async Task UpdateItem(Champion? oldItem, Champion? newItem)
{
- throw new NotImplementedException();
+ HttpResponseMessage rep = await httpc.PutAsJsonAsync("v1/Champions?name=" + oldItem.Name, newItem.ToDTO());
+
+ if (rep.IsSuccessStatusCode) return newItem;
+ //else
+ return null;
}
}
}
diff --git a/Sources/LeagueOfLegends.sln b/Sources/LeagueOfLegends.sln
index 4ce78a2..dbf8519 100644
--- a/Sources/LeagueOfLegends.sln
+++ b/Sources/LeagueOfLegends.sln
@@ -30,7 +30,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HttpClient", "HttpClient\Ht
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{6570AF99-3E74-4CAA-AEB0-EEFE4F79780F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApplication", "ConsoleApplication\ConsoleApplication.csproj", "{53A195F7-FB7C-44E8-AB82-4D775C7D9477}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApplication", "ConsoleApplication\ConsoleApplication.csproj", "{53A195F7-FB7C-44E8-AB82-4D775C7D9477}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LolApp", "LolApp\LolApp.csproj", "{0C898A04-092A-49AA-BE65-8AE818A2AF50}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ViewModels", "ViewModels\ViewModels.csproj", "{D398A62C-1E70-4B45-8717-440681EEBBFE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -78,6 +82,14 @@ Global
{53A195F7-FB7C-44E8-AB82-4D775C7D9477}.Debug|Any CPU.Build.0 = Debug|Any CPU
{53A195F7-FB7C-44E8-AB82-4D775C7D9477}.Release|Any CPU.ActiveCfg = Release|Any CPU
{53A195F7-FB7C-44E8-AB82-4D775C7D9477}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C898A04-092A-49AA-BE65-8AE818A2AF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C898A04-092A-49AA-BE65-8AE818A2AF50}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C898A04-092A-49AA-BE65-8AE818A2AF50}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C898A04-092A-49AA-BE65-8AE818A2AF50}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D398A62C-1E70-4B45-8717-440681EEBBFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D398A62C-1E70-4B45-8717-440681EEBBFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D398A62C-1E70-4B45-8717-440681EEBBFE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D398A62C-1E70-4B45-8717-440681EEBBFE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Sources/LolApp/AddChampionPage.xaml b/Sources/LolApp/AddChampionPage.xaml
new file mode 100644
index 0000000..7f38acb
--- /dev/null
+++ b/Sources/LolApp/AddChampionPage.xaml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/AddChampionPage.xaml.cs b/Sources/LolApp/AddChampionPage.xaml.cs
new file mode 100644
index 0000000..8388605
--- /dev/null
+++ b/Sources/LolApp/AddChampionPage.xaml.cs
@@ -0,0 +1,13 @@
+using LolApp.ViewModels;
+using ViewModels;
+
+namespace LolApp;
+
+public partial class AddChampionPage : ContentPage
+{
+ public AddChampionPage(ChampionsMgrVM championsMgrVM, ChampionVM champion = null)
+ {
+ InitializeComponent();
+ BindingContext = new AddChampionPageVM(championsMgrVM, champion);
+ }
+}
diff --git a/Sources/LolApp/AddOrEditSkinPage.xaml b/Sources/LolApp/AddOrEditSkinPage.xaml
new file mode 100644
index 0000000..20071b4
--- /dev/null
+++ b/Sources/LolApp/AddOrEditSkinPage.xaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/AddOrEditSkinPage.xaml.cs b/Sources/LolApp/AddOrEditSkinPage.xaml.cs
new file mode 100644
index 0000000..3ce8126
--- /dev/null
+++ b/Sources/LolApp/AddOrEditSkinPage.xaml.cs
@@ -0,0 +1,24 @@
+using LolApp.ViewModels;
+using ViewModels;
+
+namespace LolApp;
+
+public partial class AddOrEditSkinPage : ContentPage
+{
+ AddOrEditSkinPage()
+ {
+ InitializeComponent();
+ }
+
+ public AddOrEditSkinPage(SkinsMgrVM skinsMgrVM, SkinVM skin)
+ :this()
+ {
+ BindingContext = new AddOrEditSkinPageVM(skinsMgrVM, skin);
+ }
+
+ public AddOrEditSkinPage(SkinsMgrVM skinsMgrVM, ChampionVM champion)
+ :this()
+ {
+ BindingContext = new AddOrEditSkinPageVM(skinsMgrVM, champion);
+ }
+}
diff --git a/Sources/LolApp/AddSkill.xaml b/Sources/LolApp/AddSkill.xaml
new file mode 100644
index 0000000..b6f9583
--- /dev/null
+++ b/Sources/LolApp/AddSkill.xaml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/AddSkill.xaml.cs b/Sources/LolApp/AddSkill.xaml.cs
new file mode 100644
index 0000000..31e77f9
--- /dev/null
+++ b/Sources/LolApp/AddSkill.xaml.cs
@@ -0,0 +1,13 @@
+using LolApp.ViewModels;
+using ViewModels;
+
+namespace LolApp;
+
+public partial class AddSkill : ContentPage
+{
+ public AddSkill(EditableChampionVM champion)
+ {
+ InitializeComponent();
+ BindingContext = new AddSkillVM(champion);
+ }
+}
diff --git a/Sources/LolApp/App.xaml b/Sources/LolApp/App.xaml
new file mode 100644
index 0000000..cdae088
--- /dev/null
+++ b/Sources/LolApp/App.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/App.xaml.cs b/Sources/LolApp/App.xaml.cs
new file mode 100644
index 0000000..276b46e
--- /dev/null
+++ b/Sources/LolApp/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace LolApp;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+}
+
diff --git a/Sources/LolApp/AppShell.xaml b/Sources/LolApp/AppShell.xaml
new file mode 100644
index 0000000..a71d8ca
--- /dev/null
+++ b/Sources/LolApp/AppShell.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/AppShell.xaml.cs b/Sources/LolApp/AppShell.xaml.cs
new file mode 100644
index 0000000..bc552b6
--- /dev/null
+++ b/Sources/LolApp/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace LolApp;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
+
diff --git a/Sources/LolApp/ChampionPage.xaml b/Sources/LolApp/ChampionPage.xaml
new file mode 100644
index 0000000..b0d85f5
--- /dev/null
+++ b/Sources/LolApp/ChampionPage.xaml
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/ChampionPage.xaml.cs b/Sources/LolApp/ChampionPage.xaml.cs
new file mode 100644
index 0000000..9092445
--- /dev/null
+++ b/Sources/LolApp/ChampionPage.xaml.cs
@@ -0,0 +1,31 @@
+using CommunityToolkit.Maui.Behaviors;
+using LolApp.ViewModels;
+using ViewModels;
+
+namespace LolApp;
+
+public partial class ChampionPage : ContentPage
+{
+ public ApplicationVM AppVM { get; set; }
+ public ChampionVM Champion { get; }
+
+ public ChampionPage(ChampionVM cvm, ApplicationVM appVM)
+ {
+ AppVM = appVM;
+ BindingContext = Champion = cvm;
+
+ InitializeComponent();
+ }
+
+ void imgClass_PropertyChanged(System.Object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ Image img = sender as Image;
+ if(e.PropertyName == "Source" && img != null && img.Behaviors.Any(b => b is IconTintColorBehavior))
+ {
+ var beh = (img.Behaviors.First(b => b is IconTintColorBehavior) as IconTintColorBehavior);
+ var color = beh.TintColor;
+ img.Behaviors.Remove(beh);
+ img.Behaviors.Add(new IconTintColorBehavior() { TintColor = color});
+ }
+ }
+}
diff --git a/Sources/LolApp/ChampionsPage.xaml b/Sources/LolApp/ChampionsPage.xaml
new file mode 100644
index 0000000..4e8b2c9
--- /dev/null
+++ b/Sources/LolApp/ChampionsPage.xaml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/ChampionsPage.xaml.cs b/Sources/LolApp/ChampionsPage.xaml.cs
new file mode 100644
index 0000000..4493526
--- /dev/null
+++ b/Sources/LolApp/ChampionsPage.xaml.cs
@@ -0,0 +1,17 @@
+using LolApp.ViewModels;
+using ViewModels;
+
+namespace LolApp;
+
+public partial class ChampionsPage : ContentPage
+{
+ public ApplicationVM AppVM { get; }
+ public ChampionsPageVM VM { get; }
+ public ChampionsPage(ApplicationVM appVM)
+ {
+ InitializeComponent();
+ AppVM = appVM;
+ VM = new ChampionsPageVM(AppVM.ChampionsMgrVM);
+ BindingContext = this;
+ }
+}
diff --git a/Sources/LolApp/ContentViews/ChampionClassSelector.xaml b/Sources/LolApp/ContentViews/ChampionClassSelector.xaml
new file mode 100644
index 0000000..6dc66e4
--- /dev/null
+++ b/Sources/LolApp/ContentViews/ChampionClassSelector.xaml
@@ -0,0 +1,131 @@
+
+
+
+
+ Assassin
+ Fighter
+ Mage
+ Marksman
+ Support
+ Tank
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/ContentViews/ChampionClassSelector.xaml.cs b/Sources/LolApp/ContentViews/ChampionClassSelector.xaml.cs
new file mode 100644
index 0000000..74fb508
--- /dev/null
+++ b/Sources/LolApp/ContentViews/ChampionClassSelector.xaml.cs
@@ -0,0 +1,34 @@
+using Model;
+
+namespace LolApp.ContentViews;
+
+public partial class ChampionClassSelector : ContentView
+{
+ public ChampionClassSelector()
+ {
+ InitializeComponent();
+ }
+
+ public static readonly BindableProperty SelectedValueProperty = BindableProperty.Create(nameof(SelectedValue), typeof(ChampionClass), typeof(ChampionClassSelector), ChampionClass.Unknown, BindingMode.TwoWay);
+ public ChampionClass SelectedValue
+ {
+ get => (ChampionClass)GetValue(SelectedValueProperty);
+ set => SetValue(SelectedValueProperty, value);
+ }
+
+ public static readonly BindableProperty CheckedColorProperty = BindableProperty.Create(nameof(CheckedColor), typeof(Color), typeof(ChampionClassSelector), Colors.DarkSalmon);
+
+ public Color CheckedColor
+ {
+ get => (Color)GetValue(CheckedColorProperty);
+ set => SetValue(CheckedColorProperty, value);
+ }
+
+ public static readonly BindableProperty UncheckedColorProperty = BindableProperty.Create(nameof(UncheckedColor), typeof(Color), typeof(ChampionClassSelector), Colors.DarkSalmon);
+
+ public Color UncheckedColor
+ {
+ get => (Color)GetValue(UncheckedColorProperty);
+ set => SetValue(UncheckedColorProperty, value);
+ }
+}
diff --git a/Sources/LolApp/ContentViews/SearchByStringView.cs b/Sources/LolApp/ContentViews/SearchByStringView.cs
new file mode 100644
index 0000000..308ce0d
--- /dev/null
+++ b/Sources/LolApp/ContentViews/SearchByStringView.cs
@@ -0,0 +1,38 @@
+using System.Windows.Input;
+
+namespace LolApp.ContentViews;
+
+public class SearchByStringView : ContentView
+{
+ public static readonly BindableProperty PlaceHolderProperty = BindableProperty.Create(nameof(PlaceHolder), typeof(string), typeof(SearchByStringView), string.Empty);
+
+ public string PlaceHolder
+ {
+ get => (string)GetValue(PlaceHolderProperty);
+ set => SetValue(PlaceHolderProperty, value);
+ }
+
+ public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(SearchByStringView), string.Empty);
+
+ public string Text
+ {
+ get => (string)GetValue(TextProperty);
+ set => SetValue(TextProperty, value);
+ }
+
+ public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(SearchByStringView), null);
+
+ public ICommand Command
+ {
+ get => (ICommand)GetValue(CommandProperty);
+ set => SetValue(CommandProperty, value);
+ }
+
+ public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create(nameof(CommandParameter), typeof(object), typeof(SearchByStringView), null);
+
+ public object CommandParameter
+ {
+ get => GetValue(CommandParameterProperty);
+ set => SetValue(CommandParameterProperty, value);
+ }
+}
diff --git a/Sources/LolApp/LolApp.csproj b/Sources/LolApp/LolApp.csproj
new file mode 100644
index 0000000..e1a06ae
--- /dev/null
+++ b/Sources/LolApp/LolApp.csproj
@@ -0,0 +1,99 @@
+
+
+
+ net7.0-android;net7.0-ios;net7.0-maccatalyst
+ Exe
+ LolApp
+ true
+ true
+ enable
+
+
+ LolApp
+
+
+ fr.uca.iut.lolapp
+ d3cd18a9-c614-4933-bd36-3008e72004d5
+
+
+ 1.0
+ 1
+
+ 14.2
+ 14.0
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+ {0C898A04-092A-49AA-BE65-8AE818A2AF50}
+
+
+
+ false
+ appleIUT_TP2022
+ iPhone Developer: Cedric BOUHOURS (M2E3ZQNZ3K)
+
+
+ false
+ Developer ID Application
+ 3rd Party Mac Developer Installer
+
+
+ false
+
+
+ $(TargetFrameworks);net7.0-windows10.0.22621.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/MainPage.xaml b/Sources/LolApp/MainPage.xaml
new file mode 100644
index 0000000..9db8163
--- /dev/null
+++ b/Sources/LolApp/MainPage.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/MainPage.xaml.cs b/Sources/LolApp/MainPage.xaml.cs
new file mode 100644
index 0000000..0750b67
--- /dev/null
+++ b/Sources/LolApp/MainPage.xaml.cs
@@ -0,0 +1,11 @@
+namespace LolApp;
+
+public partial class MainPage : ContentPage
+{
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+}
+
+
diff --git a/Sources/LolApp/MauiProgram.cs b/Sources/LolApp/MauiProgram.cs
new file mode 100644
index 0000000..dfe7d83
--- /dev/null
+++ b/Sources/LolApp/MauiProgram.cs
@@ -0,0 +1,39 @@
+using CommunityToolkit.Maui;
+using LolApp.ViewModels;
+using Microsoft.Extensions.Logging;
+using Microsoft.Maui.Handlers;
+using Microsoft.Maui.Platform;
+using Model;
+using StubLib;
+using ViewModels;
+
+namespace LolApp;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .UseMauiCommunityToolkit()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ fonts.AddFont("Font Awesome 6 Free-Solid-900.otf", "FASolid");
+ });
+ builder.Services.AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton()
+ .AddSingleton();
+
+#if DEBUG
+ builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+}
+
diff --git a/Sources/LolApp/Platforms/Android/AndroidManifest.xml b/Sources/LolApp/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000..e6c8a36
--- /dev/null
+++ b/Sources/LolApp/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Sources/LolApp/Platforms/Android/MainActivity.cs b/Sources/LolApp/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000..016887c
--- /dev/null
+++ b/Sources/LolApp/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace LolApp;
+
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
+
diff --git a/Sources/LolApp/Platforms/Android/MainApplication.cs b/Sources/LolApp/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000..95e1d92
--- /dev/null
+++ b/Sources/LolApp/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace LolApp;
+
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/Sources/LolApp/Platforms/Android/Resources/values/colors.xml b/Sources/LolApp/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000..c2794f7
--- /dev/null
+++ b/Sources/LolApp/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
+
diff --git a/Sources/LolApp/Platforms/MacCatalyst/AppDelegate.cs b/Sources/LolApp/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000..d5d15a5
--- /dev/null
+++ b/Sources/LolApp/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace LolApp;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/Sources/LolApp/Platforms/MacCatalyst/Info.plist b/Sources/LolApp/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000..ec44095
--- /dev/null
+++ b/Sources/LolApp/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+ NSCameraUsageDescription
+ New Entry
+ NSPhotoLibraryUsageDescription
+ New Entry
+ NSPhotoLibraryAddUsageDescription
+ New Entry
+
+
diff --git a/Sources/LolApp/Platforms/MacCatalyst/Program.cs b/Sources/LolApp/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000..f1b8f29
--- /dev/null
+++ b/Sources/LolApp/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LolApp;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/Sources/LolApp/Platforms/Tizen/Main.cs b/Sources/LolApp/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000..d58b3d9
--- /dev/null
+++ b/Sources/LolApp/Platforms/Tizen/Main.cs
@@ -0,0 +1,17 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace LolApp;
+
+class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
+
diff --git a/Sources/LolApp/Platforms/Tizen/tizen-manifest.xml b/Sources/LolApp/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000..109d29f
--- /dev/null
+++ b/Sources/LolApp/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
diff --git a/Sources/LolApp/Platforms/Windows/App.xaml b/Sources/LolApp/Platforms/Windows/App.xaml
new file mode 100644
index 0000000..23c64b9
--- /dev/null
+++ b/Sources/LolApp/Platforms/Windows/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/Sources/LolApp/Platforms/Windows/App.xaml.cs b/Sources/LolApp/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000..c3b0669
--- /dev/null
+++ b/Sources/LolApp/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace LolApp.WinUI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
+
diff --git a/Sources/LolApp/Platforms/Windows/Package.appxmanifest b/Sources/LolApp/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000..52b7801
--- /dev/null
+++ b/Sources/LolApp/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/LolApp/Platforms/Windows/app.manifest b/Sources/LolApp/Platforms/Windows/app.manifest
new file mode 100644
index 0000000..91a1b32
--- /dev/null
+++ b/Sources/LolApp/Platforms/Windows/app.manifest
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
+
diff --git a/Sources/LolApp/Platforms/iOS/AppDelegate.cs b/Sources/LolApp/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000..d5d15a5
--- /dev/null
+++ b/Sources/LolApp/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace LolApp;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/Sources/LolApp/Platforms/iOS/Info.plist b/Sources/LolApp/Platforms/iOS/Info.plist
new file mode 100644
index 0000000..352a326
--- /dev/null
+++ b/Sources/LolApp/Platforms/iOS/Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+ NSCameraUsageDescription
+ New Entry
+ NSPhotoLibraryUsageDescription
+ Pour accéder aux images...
+ NSPhotoLibraryAddUsageDescription
+ Pour accéder aux images...
+
+
diff --git a/Sources/LolApp/Platforms/iOS/Program.cs b/Sources/LolApp/Platforms/iOS/Program.cs
new file mode 100644
index 0000000..f1b8f29
--- /dev/null
+++ b/Sources/LolApp/Platforms/iOS/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace LolApp;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
+
diff --git a/Sources/LolApp/Properties/launchSettings.json b/Sources/LolApp/Properties/launchSettings.json
new file mode 100644
index 0000000..90f92d9
--- /dev/null
+++ b/Sources/LolApp/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
diff --git a/Sources/LolApp/Resources/AppIcon/appicon.png b/Sources/LolApp/Resources/AppIcon/appicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8263b465459da87a5a7b9327206e4a067b2f7f91
GIT binary patch
literal 28759
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
+
+
diff --git a/Sources/LolApp/Resources/Converters/Base64ToImageSourceConverter.cs b/Sources/LolApp/Resources/Converters/Base64ToImageSourceConverter.cs
new file mode 100644
index 0000000..e258576
--- /dev/null
+++ b/Sources/LolApp/Resources/Converters/Base64ToImageSourceConverter.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+using CommunityToolkit.Maui.Converters;
+
+namespace LolApp.Resources.Converters
+{
+ public class Base64ToImageSourceConverter : ByteArrayToImageSourceConverter, IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ string base64 = value as string;
+ if (string.IsNullOrWhiteSpace(base64)) return null;
+ try
+ {
+ byte[] bytes = System.Convert.FromBase64String(base64);
+ return base.ConvertFrom(bytes, culture);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ ImageSource source = value as ImageSource;
+ if (source == null) return null;
+ byte[] bytes = base.ConvertBackTo(source, culture) as byte[];
+ return System.Convert.ToBase64String(bytes);
+ }
+ }
+}
+
diff --git a/Sources/LolApp/Resources/Converters/ChampionClassToIconConverter.cs b/Sources/LolApp/Resources/Converters/ChampionClassToIconConverter.cs
new file mode 100644
index 0000000..946b9a6
--- /dev/null
+++ b/Sources/LolApp/Resources/Converters/ChampionClassToIconConverter.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Globalization;
+using Model;
+
+namespace LolApp.Resources.Converters
+{
+ public class ChampionClassToIconConverter : IValueConverter
+ {
+ private static Dictionary icons = new()
+ {
+ [ChampionClass.Assassin] = "assassin.png",
+ [ChampionClass.Fighter] = "fighter.png",
+ [ChampionClass.Mage] = "mage.png",
+ [ChampionClass.Marksman] = "marksman.png",
+ [ChampionClass.Support] = "support.png",
+ [ChampionClass.Tank] = "tank.png"
+ };
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ ChampionClass champClass = (ChampionClass)value;
+ if(!icons.TryGetValue(champClass, out string icon))
+ {
+ return "";
+ }
+ return ImageSource.FromFile($"{icon}");
+ }
+ catch
+ {
+ return "";
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
+
diff --git a/Sources/LolApp/Resources/Converters/ImageRatioConverter.cs b/Sources/LolApp/Resources/Converters/ImageRatioConverter.cs
new file mode 100644
index 0000000..a3e0b7e
--- /dev/null
+++ b/Sources/LolApp/Resources/Converters/ImageRatioConverter.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Globalization;
+
+namespace LolApp.Resources.Converters
+{
+ public class ImageRatioConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ double parentWidth = (double)value;
+ double ratio = (double)parameter;
+ return parentWidth*ratio;
+ }
+ catch
+ {
+ return 0.0;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
+
diff --git a/Sources/LolApp/Resources/Converters/PlusOneConverter.cs b/Sources/LolApp/Resources/Converters/PlusOneConverter.cs
new file mode 100644
index 0000000..2d9eaec
--- /dev/null
+++ b/Sources/LolApp/Resources/Converters/PlusOneConverter.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Globalization;
+
+namespace LolApp.Resources.Converters
+{
+ public class PlusOneConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ int i = -1;
+ try
+ {
+ i = (int)value;
+ }
+ catch (InvalidCastException e)
+ {
+ throw new InvalidCastException("PlusOneConverter : the value must be an int");
+ }
+ return i + 1;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
+
diff --git a/Sources/LolApp/Resources/Fonts/Font Awesome 6 Free-Solid-900.otf b/Sources/LolApp/Resources/Fonts/Font Awesome 6 Free-Solid-900.otf
new file mode 100644
index 0000000000000000000000000000000000000000..f1d88fc6f278faa2d823a4cf5c649d4aa82cb1d9
GIT binary patch
literal 1029020
zcmeF(5135#|M>m$Z~o7m*_9-J*09X_Pm+)%38^GWl7tZDUy>vV2}wdik|YU9k|ZHX
zk|arzq{XfzX=ZkIc9XcD@7Fo?>GS!1zxVIDf7f+i*YCdW)N|jDJv%#p&N(yoJ$sIu
zx^%fo3u@yuQ;S{Gwr#A#MU~2F+8gUNyT%{wZn?E})4D%qY4%U!G;L>vn{H{)sCS2>
z_iLJ-rDm9~i;?;?EoN_z=@{
zmYTZO``C5A-W6?8tc48qMeT<_KECZ=5mi+yX
zXSk+y($q)IGBk6d=HWYT(EIawJ9jMBF4iXUy;?x-k;W=>R>PmybMmM*;#IOgNH)zm*=#UY;
zAL{qO(82xc-#v72*M7qv7&vrD?DESmso${SrOg^PX>?hvW?L>4yV|)_Y@~CM=CLOA
zFRkCOR+j<&Vh{D}llMSuFgs0b*wA4Q4(dHTHt=q)<$-=9V!em-jg1&ObkKbRN7Pr>
z<6cdZw!{1Nt9Q%LK?D2#+qE}|sV~Ij3;)wsuNgY*;o$@C889MN^X^))zkmDR9sB!L
z)ss7`4bVpL-!Sa~t-02K|N3h~wIM9&tv#gmW9d+BFk^k~Zc$e}oTUThQZemv{=0;)
zHsrrcwPt*5!me-`J6BDut$R%|?dpHKu9!CR->#)Omu|v!Tq@U7OY6dY>c=v5`+c-L
zZY{=r7|J*T4MW4&!3J>;hx7SBxo1Pr16*ERqBr-yFXIR!QO}OSiza#dy@A!ZEz1PU&c$nKBsNEx5L9Mg9c~YwD
zcecTQ-unNvT&=(V{$ADl+nVLs#VZP_*Np0pTkcTL0QubHl~?0)tK||+i#Fm#Fz9Qf
zRn@9#HMBUJp(b~&4$tR$tjY##>gL)NT6gUZt%r7})>FGn>&1%i!vpBcs_ZWhX`ps5
zD}N9hZ-_kD`(@V|!NwcO#vP?Stc}(l(Z*c(od@P0$|ab?pglk~UeJqCKfi
z
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