diff --git a/Entities/CelConfig.cs b/Entities/CelConfig.cs index 85653dd..931e4f0 100644 --- a/Entities/CelConfig.cs +++ b/Entities/CelConfig.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace fxl.codes.kisekae.Entities { public class CelConfig @@ -10,10 +12,9 @@ namespace fxl.codes.kisekae.Entities public Palette Palette { get; set; } public int PaletteGroup { get; set; } public string Comment { get; set; } - public int X { get; set; } - public int Y { get; set; } public int Transparency { get; set; } public Set Sets { get; set; } public Render Render { get; set; } + public List Positions { get; set; } = new(); } } \ No newline at end of file diff --git a/Entities/CelPosition.cs b/Entities/CelPosition.cs new file mode 100644 index 0000000..cb55295 --- /dev/null +++ b/Entities/CelPosition.cs @@ -0,0 +1,10 @@ +namespace fxl.codes.kisekae.Entities +{ + public class CelPosition + { + public int Id { get; set; } + public int Set { get; set; } + public int X { get; set; } + public int Y { get; set; } + } +} \ No newline at end of file diff --git a/Entities/Configuration.cs b/Entities/Configuration.cs index 1d5c787..78f5563 100644 --- a/Entities/Configuration.cs +++ b/Entities/Configuration.cs @@ -13,6 +13,6 @@ namespace fxl.codes.kisekae.Entities public string Data { get; set; } public int Height { get; set; } public int Width { get; set; } - public int BorderIndex { get; set; } + public string BackgroundColorHex { get; set; } } } \ No newline at end of file diff --git a/Entities/Palette.cs b/Entities/Palette.cs index a261e09..6d6da47 100644 --- a/Entities/Palette.cs +++ b/Entities/Palette.cs @@ -7,7 +7,6 @@ namespace fxl.codes.kisekae.Entities public int Id { get; set; } public Kisekae Kisekae { get; set; } public string FileName { get; set; } - public string Comment { get; set; } public List Colors { get; set; } = new(); public byte[] Data { get; set; } } diff --git a/Entities/Set.cs b/Entities/Set.cs index 33ff944..debdb32 100644 --- a/Entities/Set.cs +++ b/Entities/Set.cs @@ -5,16 +5,16 @@ namespace fxl.codes.kisekae.Entities [Flags] public enum Set { - Unset = -1, - Zero = 2 ^ 0, - One = 2 ^ 1, - Two = 2 ^ 2, - Three = 2 ^ 3, - Four = 2 ^ 4, - Five = 2 ^ 5, - Six = 2 ^ 6, - Seven = 2 ^ 7, - Eight = 2 ^ 8, - Nine = 2 ^ 9 + None = 0, + Zero = 1 << 0, + One = 1 << 1, + Two = 1 << 2, + Three = 1 << 3, + Four = 1 << 4, + Five = 1 << 5, + Six = 1 << 6, + Seven = 1 << 7, + Eight = 1 << 8, + Nine = 1 << 9 } } \ No newline at end of file diff --git a/Migrations/20211120201836_UseBackgroundHex.Designer.cs b/Migrations/20211120201836_UseBackgroundHex.Designer.cs new file mode 100644 index 0000000..ede3a2e --- /dev/null +++ b/Migrations/20211120201836_UseBackgroundHex.Designer.cs @@ -0,0 +1,353 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using fxl.codes.kisekae; + +#nullable disable + +namespace fxl.codes.kisekae.Migrations +{ + [DbContext(typeof(KisekaeContext))] + [Migration("20211120201836_UseBackgroundHex")] + partial class UseBackgroundHex + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Action", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConfigurationId") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ConfigurationId"); + + b.ToTable("Action"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Cel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .HasColumnType("bytea"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("Height") + .HasColumnType("integer"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.Property("OffsetX") + .HasColumnType("integer"); + + b.Property("OffsetY") + .HasColumnType("integer"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Cels"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CelId") + .HasColumnType("integer"); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("ConfigurationId") + .HasColumnType("integer"); + + b.Property("Fix") + .HasColumnType("integer"); + + b.Property("Mark") + .HasColumnType("integer"); + + b.Property("PaletteGroup") + .HasColumnType("integer"); + + b.Property("PaletteId") + .HasColumnType("integer"); + + b.Property("RenderId") + .HasColumnType("integer"); + + b.Property("Sets") + .HasColumnType("integer"); + + b.Property("Transparency") + .HasColumnType("integer"); + + b.Property("X") + .HasColumnType("integer"); + + b.Property("Y") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CelId"); + + b.HasIndex("ConfigurationId"); + + b.HasIndex("PaletteId"); + + b.HasIndex("RenderId"); + + b.ToTable("CelConfigs"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BackgroundColorHex") + .HasColumnType("text"); + + b.Property("Data") + .HasColumnType("text"); + + b.Property("Height") + .HasColumnType("integer"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Configurations"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Kisekae", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CheckSum") + .HasColumnType("text"); + + b.Property("FileName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("KisekaeSets"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("Data") + .HasColumnType("bytea"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Palettes"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.PaletteColor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Group") + .HasColumnType("integer"); + + b.Property("Hex") + .HasColumnType("text"); + + b.Property("PaletteId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PaletteId"); + + b.ToTable("PaletteColors"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Render", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Image") + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.ToTable("Renders"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Action", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Configuration", null) + .WithMany("Actions") + .HasForeignKey("ConfigurationId"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Cel", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Cels") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Cel", "Cel") + .WithMany() + .HasForeignKey("CelId"); + + b.HasOne("fxl.codes.kisekae.Entities.Configuration", "Configuration") + .WithMany("Cels") + .HasForeignKey("ConfigurationId"); + + b.HasOne("fxl.codes.kisekae.Entities.Palette", "Palette") + .WithMany() + .HasForeignKey("PaletteId"); + + b.HasOne("fxl.codes.kisekae.Entities.Render", "Render") + .WithMany() + .HasForeignKey("RenderId"); + + b.Navigation("Cel"); + + b.Navigation("Configuration"); + + b.Navigation("Palette"); + + b.Navigation("Render"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Configurations") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Palettes") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.PaletteColor", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Palette", "Palette") + .WithMany("Colors") + .HasForeignKey("PaletteId"); + + b.Navigation("Palette"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.Navigation("Actions"); + + b.Navigation("Cels"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Kisekae", b => + { + b.Navigation("Cels"); + + b.Navigation("Configurations"); + + b.Navigation("Palettes"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.Navigation("Colors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20211120201836_UseBackgroundHex.cs b/Migrations/20211120201836_UseBackgroundHex.cs new file mode 100644 index 0000000..b1a8a6d --- /dev/null +++ b/Migrations/20211120201836_UseBackgroundHex.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace fxl.codes.kisekae.Migrations +{ + public partial class UseBackgroundHex : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "BorderIndex", + table: "Configurations"); + + migrationBuilder.AddColumn( + name: "BackgroundColorHex", + table: "Configurations", + type: "text", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "BackgroundColorHex", + table: "Configurations"); + + migrationBuilder.AddColumn( + name: "BorderIndex", + table: "Configurations", + type: "integer", + nullable: false, + defaultValue: 0); + } + } +} diff --git a/Migrations/20211121011039_Positions.Designer.cs b/Migrations/20211121011039_Positions.Designer.cs new file mode 100644 index 0000000..4192ef7 --- /dev/null +++ b/Migrations/20211121011039_Positions.Designer.cs @@ -0,0 +1,386 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using fxl.codes.kisekae; + +#nullable disable + +namespace fxl.codes.kisekae.Migrations +{ + [DbContext(typeof(KisekaeContext))] + [Migration("20211121011039_Positions")] + partial class Positions + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Action", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConfigurationId") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ConfigurationId"); + + b.ToTable("Action"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Cel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .HasColumnType("bytea"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("Height") + .HasColumnType("integer"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.Property("OffsetX") + .HasColumnType("integer"); + + b.Property("OffsetY") + .HasColumnType("integer"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Cels"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CelId") + .HasColumnType("integer"); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("ConfigurationId") + .HasColumnType("integer"); + + b.Property("Fix") + .HasColumnType("integer"); + + b.Property("Mark") + .HasColumnType("integer"); + + b.Property("PaletteGroup") + .HasColumnType("integer"); + + b.Property("PaletteId") + .HasColumnType("integer"); + + b.Property("RenderId") + .HasColumnType("integer"); + + b.Property("Sets") + .HasColumnType("integer"); + + b.Property("Transparency") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CelId"); + + b.HasIndex("ConfigurationId"); + + b.HasIndex("PaletteId"); + + b.HasIndex("RenderId"); + + b.ToTable("CelConfigs"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelPosition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CelConfigId") + .HasColumnType("integer"); + + b.Property("Set") + .HasColumnType("integer"); + + b.Property("X") + .HasColumnType("integer"); + + b.Property("Y") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CelConfigId"); + + b.ToTable("CelPosition"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BackgroundColorHex") + .HasColumnType("text"); + + b.Property("Data") + .HasColumnType("text"); + + b.Property("Height") + .HasColumnType("integer"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Configurations"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Kisekae", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CheckSum") + .HasColumnType("text"); + + b.Property("FileName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("KisekaeSets"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("Data") + .HasColumnType("bytea"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("KisekaeId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KisekaeId"); + + b.ToTable("Palettes"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.PaletteColor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Group") + .HasColumnType("integer"); + + b.Property("Hex") + .HasColumnType("text"); + + b.Property("PaletteId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PaletteId"); + + b.ToTable("PaletteColors"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Render", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Image") + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.ToTable("Renders"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Action", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Configuration", null) + .WithMany("Actions") + .HasForeignKey("ConfigurationId"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Cel", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Cels") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Cel", "Cel") + .WithMany() + .HasForeignKey("CelId"); + + b.HasOne("fxl.codes.kisekae.Entities.Configuration", "Configuration") + .WithMany("Cels") + .HasForeignKey("ConfigurationId"); + + b.HasOne("fxl.codes.kisekae.Entities.Palette", "Palette") + .WithMany() + .HasForeignKey("PaletteId"); + + b.HasOne("fxl.codes.kisekae.Entities.Render", "Render") + .WithMany() + .HasForeignKey("RenderId"); + + b.Navigation("Cel"); + + b.Navigation("Configuration"); + + b.Navigation("Palette"); + + b.Navigation("Render"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelPosition", b => + { + b.HasOne("fxl.codes.kisekae.Entities.CelConfig", null) + .WithMany("Positions") + .HasForeignKey("CelConfigId"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Configurations") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") + .WithMany("Palettes") + .HasForeignKey("KisekaeId"); + + b.Navigation("Kisekae"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.PaletteColor", b => + { + b.HasOne("fxl.codes.kisekae.Entities.Palette", "Palette") + .WithMany("Colors") + .HasForeignKey("PaletteId"); + + b.Navigation("Palette"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.Navigation("Positions"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => + { + b.Navigation("Actions"); + + b.Navigation("Cels"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Kisekae", b => + { + b.Navigation("Cels"); + + b.Navigation("Configurations"); + + b.Navigation("Palettes"); + }); + + modelBuilder.Entity("fxl.codes.kisekae.Entities.Palette", b => + { + b.Navigation("Colors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20211121011039_Positions.cs b/Migrations/20211121011039_Positions.cs new file mode 100644 index 0000000..aaed427 --- /dev/null +++ b/Migrations/20211121011039_Positions.cs @@ -0,0 +1,67 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace fxl.codes.kisekae.Migrations +{ + public partial class Positions : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "X", + table: "CelConfigs"); + + migrationBuilder.DropColumn( + name: "Y", + table: "CelConfigs"); + + migrationBuilder.CreateTable( + name: "CelPosition", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Set = table.Column(type: "integer", nullable: false), + X = table.Column(type: "integer", nullable: false), + Y = table.Column(type: "integer", nullable: false), + CelConfigId = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CelPosition", x => x.Id); + table.ForeignKey( + name: "FK_CelPosition_CelConfigs_CelConfigId", + column: x => x.CelConfigId, + principalTable: "CelConfigs", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_CelPosition_CelConfigId", + table: "CelPosition", + column: "CelConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CelPosition"); + + migrationBuilder.AddColumn( + name: "X", + table: "CelConfigs", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "Y", + table: "CelConfigs", + type: "integer", + nullable: false, + defaultValue: 0); + } + } +} diff --git a/Migrations/KisekaeContextModelSnapshot.cs b/Migrations/KisekaeContextModelSnapshot.cs index b4db2cf..51090ae 100644 --- a/Migrations/KisekaeContextModelSnapshot.cs +++ b/Migrations/KisekaeContextModelSnapshot.cs @@ -117,12 +117,6 @@ namespace fxl.codes.kisekae.Migrations b.Property("Transparency") .HasColumnType("integer"); - b.Property("X") - .HasColumnType("integer"); - - b.Property("Y") - .HasColumnType("integer"); - b.HasKey("Id"); b.HasIndex("CelId"); @@ -136,6 +130,33 @@ namespace fxl.codes.kisekae.Migrations b.ToTable("CelConfigs"); }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelPosition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CelConfigId") + .HasColumnType("integer"); + + b.Property("Set") + .HasColumnType("integer"); + + b.Property("X") + .HasColumnType("integer"); + + b.Property("Y") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CelConfigId"); + + b.ToTable("CelPosition"); + }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => { b.Property("Id") @@ -144,8 +165,8 @@ namespace fxl.codes.kisekae.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("BorderIndex") - .HasColumnType("integer"); + b.Property("BackgroundColorHex") + .HasColumnType("text"); b.Property("Data") .HasColumnType("text"); @@ -298,6 +319,13 @@ namespace fxl.codes.kisekae.Migrations b.Navigation("Render"); }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelPosition", b => + { + b.HasOne("fxl.codes.kisekae.Entities.CelConfig", null) + .WithMany("Positions") + .HasForeignKey("CelConfigId"); + }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => { b.HasOne("fxl.codes.kisekae.Entities.Kisekae", "Kisekae") @@ -325,6 +353,11 @@ namespace fxl.codes.kisekae.Migrations b.Navigation("Palette"); }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.CelConfig", b => + { + b.Navigation("Positions"); + }); + modelBuilder.Entity("fxl.codes.kisekae.Entities.Configuration", b => { b.Navigation("Actions"); diff --git a/Models/CelModel.cs b/Models/CelModel.cs index 9066d2a..5eb1158 100644 --- a/Models/CelModel.cs +++ b/Models/CelModel.cs @@ -5,17 +5,29 @@ namespace fxl.codes.kisekae.Models { public class CelModel { - public readonly int Fix; - public readonly string Image; - public readonly int Mark; - public readonly int ZIndex; - - internal CelModel(CelConfig celConfig, Render render, int zIndex) + internal CelModel(CelConfig celConfig, int zIndex) { Mark = celConfig.Mark; Fix = celConfig.Fix; ZIndex = zIndex; - Image = Convert.ToBase64String(render.Image); + Image = Convert.ToBase64String(celConfig.Render.Image); + Height = celConfig.Cel.Height; + Width = celConfig.Cel.Width; + Opacity = (double)(255 - celConfig.Transparency) / 255; + + foreach (var position in celConfig.Positions) InitialPositions[position.Set] = new CoordinateModel(position.X, position.Y); + + Offset = new CoordinateModel(celConfig.Cel.OffsetX, celConfig.Cel.OffsetY); } + + public int Fix { get; set; } + public int Height { get; set; } + public string Image { get; set; } + public int Mark { get; set; } + public double Opacity { get; set; } + public int Width { get; set; } + public int ZIndex { get; set; } + public CoordinateModel[] InitialPositions { get; set; } = new CoordinateModel[10]; + public CoordinateModel Offset { get; set; } } } \ No newline at end of file diff --git a/Models/CoordinateModel.cs b/Models/CoordinateModel.cs new file mode 100644 index 0000000..b1a6765 --- /dev/null +++ b/Models/CoordinateModel.cs @@ -0,0 +1,14 @@ +namespace fxl.codes.kisekae.Models +{ + public class CoordinateModel + { + internal CoordinateModel(int x, int y) + { + X = x; + Y = y; + } + + public int X { get; set; } + public int Y { get; set; } + } +} \ No newline at end of file diff --git a/Models/PlaysetModel.cs b/Models/PlaysetModel.cs index 0cccf2a..9d4c040 100644 --- a/Models/PlaysetModel.cs +++ b/Models/PlaysetModel.cs @@ -1,25 +1,40 @@ -using System.Collections.Generic; +using System; +using System.Linq; using System.Text.Json.Serialization; -using SixLabors.ImageSharp; -using Configuration = fxl.codes.kisekae.Entities.Configuration; +using fxl.codes.kisekae.Entities; namespace fxl.codes.kisekae.Models { public class PlaysetModel { - public readonly int Height; - public readonly string Name; - public readonly int Width; - public readonly CelModel[] Cels; - - [JsonIgnore] public Color BorderColor = Color.Black; + [JsonIgnore] public readonly string BorderColor; internal PlaysetModel(Configuration configuration) { + BorderColor = configuration.BackgroundColorHex; + Name = configuration.Name; Height = configuration.Height; Width = configuration.Width; - Cels = new CelModel[0]; + var totalCels = configuration.Cels.Count; + Cels = configuration.Cels.Select((x, index) => new CelModel(x, (totalCels - index) * 10)).ToArray(); + + var summation = configuration.Cels.Aggregate(Set.None, (current, cel) => current | cel.Sets); + if (summation == Set.None) + { + Array.Fill(Sets, true); + return; + } + + foreach (var value in Enum.GetValues().Where(x => (x & summation) == x && x != Set.None)) + if (value == Set.Zero) Sets[0] = true; + else Sets[(int)Math.Log2((double)value)] = true; } + + public CelModel[] Cels { get; set; } + public int Height { get; set; } + public string Name { get; set; } + public bool[] Sets { get; set; } = new bool[10]; + public int Width { get; set; } } } \ No newline at end of file diff --git a/Scripts/pto.ts b/Scripts/pto.ts index ce709a5..2442e55 100644 --- a/Scripts/pto.ts +++ b/Scripts/pto.ts @@ -3,7 +3,7 @@ export interface Playset { readonly height: number readonly width: number readonly cels: Cel[] - readonly enabledSets: boolean[] + readonly sets: boolean[] } export interface Cel { @@ -11,7 +11,6 @@ export interface Cel { readonly fix: number readonly initialPositions: Coordinate[] readonly offset: Coordinate - readonly sets: boolean[] currentPositions: Coordinate[] currentFix: number diff --git a/Scripts/tracker.ts b/Scripts/tracker.ts index 4b02550..e7b2644 100644 --- a/Scripts/tracker.ts +++ b/Scripts/tracker.ts @@ -52,7 +52,7 @@ export default class Tracker { let element = elements[index] as HTMLDivElement element.style.visibility = "hidden" - if (cel.sets[set]) { + if (cel.initialPositions[set] != null) { element.style.visibility = "visible" let position = Tracker.getCoordinate(cel, set) element.style.left = `${position.x}px` @@ -136,7 +136,7 @@ export default class Tracker { this.setPlayArea(this.set) }) - this.playset.enabledSets.forEach((enabled, index) => { + this.playset.sets.forEach((enabled, index) => { if (enabled) { let button = new Builder("li") .addChildren(new Builder("button") diff --git a/Services/ConfigurationReaderService.cs b/Services/ConfigurationReaderService.cs index debc9bb..7131545 100644 --- a/Services/ConfigurationReaderService.cs +++ b/Services/ConfigurationReaderService.cs @@ -22,9 +22,16 @@ namespace fxl.codes.kisekae.Services _logger = logger; } - public void ReadConfigurationToDto(Configuration dto, IDictionary cels, IDictionary palettes) + public void ReadConfiguration(Configuration dto, + IDictionary backgroundColors, + IDictionary cels, + Dictionary palettes) { + _logger.LogInformation($"Reading {dto.Name}"); var initialPositions = new StringBuilder(); + var backgroundColorIndex = 0; + var paletteOrder = new List(); + var celLines = new List(); foreach (var line in dto.Data.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)) switch (line.ToCharArray()[0]) @@ -38,13 +45,13 @@ namespace fxl.codes.kisekae.Services case '[': var borderValue = line[1..]; if (borderValue.Contains(';')) borderValue = borderValue.Split(';')[0].Trim(); - dto.BorderIndex = int.Parse(borderValue); + backgroundColorIndex = int.Parse(borderValue); break; case '%': - UpdatePalette(line, palettes); + SetPaletteOrder(line, palettes, paletteOrder); break; case '#': - dto.Cels.Add(SetCelConfig(line, dto, cels, palettes.Values.ToArray())); + celLines.Add(line); break; case '$': case ' ': @@ -52,7 +59,9 @@ namespace fxl.codes.kisekae.Services break; } + foreach (var line in celLines) dto.Cels.Add(SetCelConfig(line, dto, cels, paletteOrder)); SetInitialPositions(dto, initialPositions.ToString()); + backgroundColors.Add(dto, backgroundColorIndex); } private static CelConfig SetCelConfig(string line, Configuration configuration, IDictionary cels, IReadOnlyList palettes) @@ -105,7 +114,7 @@ namespace fxl.codes.kisekae.Services var success = int.TryParse(id, out var result); if (!success) continue; - if (cel.Sets == Set.Unset) + if (cel.Sets == Set.None) cel.Sets = (Set)(2 ^ result); else cel.Sets |= (Set)(2 ^ result); @@ -117,31 +126,36 @@ namespace fxl.codes.kisekae.Services return cel; } - private static void UpdatePalette(string line, IDictionary palettes) + private static void SetPaletteOrder(string line, IReadOnlyDictionary palettes, ICollection paletteOrder) { var parts = line.Split(';'); var palette = palettes[parts[0].Trim().ToLowerInvariant().Replace("%", "")]; - if (parts.Length > 1) palette.Comment = parts[1].Trim(); + paletteOrder.Add(palette); } private static void SetInitialPositions(Configuration dto, string positions) { var sets = positions.Split('$', StringSplitOptions.RemoveEmptyEntries); - foreach (var set in sets) + for (var index = 0; index < sets.Length; index++) { + var set = sets[index]; var value = set.Split(' ', StringSplitOptions.RemoveEmptyEntries); var paletteGroup = int.Parse(value[0]); for (var innerIndex = 1; innerIndex < value.Length; innerIndex++) { - if (value[innerIndex] == "*") continue; - var point = value[innerIndex].Split(',', StringSplitOptions.RemoveEmptyEntries); + if (value[innerIndex].Contains('*')) continue; + var point = value[innerIndex].Trim().Split(',', StringSplitOptions.RemoveEmptyEntries); foreach (var cel in dto.Cels.Where(x => x.Mark == innerIndex - 1)) { cel.PaletteGroup = paletteGroup; - cel.X = int.Parse(point[0]); - cel.Y = int.Parse(point[1]); + cel.Positions.Add(new CelPosition + { + Set = index, + X = int.Parse(point[0]), + Y = int.Parse(point[1]) + }); } } } diff --git a/Services/DatabaseService.cs b/Services/DatabaseService.cs index 620d101..7a876ed 100644 --- a/Services/DatabaseService.cs +++ b/Services/DatabaseService.cs @@ -10,6 +10,8 @@ using fxl.codes.kisekae.Entities; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using SixLabors.ImageSharp; +using Configuration = fxl.codes.kisekae.Entities.Configuration; namespace fxl.codes.kisekae.Services { @@ -47,6 +49,8 @@ namespace fxl.codes.kisekae.Services using var context = _contextFactory.CreateDbContext(); return context.Configurations .Include(x => x.Cels).ThenInclude(x => x.Render) + .Include(x => x.Cels).ThenInclude(x => x.Cel) + .Include(x => x.Cels).ThenInclude(x => x.Positions) .Include(x => x.Kisekae).ThenInclude(x => x.Palettes).ThenInclude(x => x.Colors) .AsSplitQuery() .FirstOrDefault(x => x.Id == id); @@ -55,7 +59,7 @@ namespace fxl.codes.kisekae.Services public async void StoreToDatabase(IFormFile file) { var memoryStream = await GetAsMemoryStream(file); - var checksum = Convert.ToBase64String(await SHA256.Create().ComputeHashAsync(memoryStream)); + var checksum = Convert.ToBase64String(SHA256.Create().ComputeHash(memoryStream.GetBuffer())); memoryStream.Position = 0; // Reset for re-read await using var context = await _contextFactory.CreateDbContextAsync(); @@ -76,20 +80,24 @@ namespace fxl.codes.kisekae.Services var filenames = _storage.GetFileNames($"{Path.Combine(directory, "*")}"); await SetInnerFiles(kisekae, directory, filenames); + var backgroundColors = new Dictionary(); foreach (var config in kisekae.Configurations) - _configurationReaderService.ReadConfigurationToDto(config, + _configurationReaderService.ReadConfiguration(config, + backgroundColors, kisekae.Cels.ToDictionary(x => x.FileName.ToLowerInvariant()), kisekae.Palettes.ToDictionary(x => x.FileName.ToLowerInvariant())); SetPaletteColors(kisekae.Palettes); + foreach (var (config, colorIndex) in backgroundColors) + config.BackgroundColorHex = kisekae.Palettes.First()?.Colors[colorIndex].Hex ?? Color.White.ToHex(); foreach (var celConfig in kisekae.Configurations.SelectMany(config => config.Cels)) - { _fileParserService.RenderCel(celConfig); - } await context.AddAsync(kisekae); await context.SaveChangesAsync(); + + //_storage.DeleteDirectory(directory); } private async Task SetInnerFiles(Kisekae kisekae, string directory, IEnumerable filenames) diff --git a/Startup.cs b/Startup.cs index ec26521..81fdda4 100644 --- a/Startup.cs +++ b/Startup.cs @@ -37,7 +37,7 @@ namespace fxl.codes.kisekae if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); - NpgsqlLogManager.Provider = new ConsoleLoggingProvider(NpgsqlLogLevel.Debug); + NpgsqlLogManager.Provider = new ConsoleLoggingProvider(); NpgsqlLogManager.IsParameterLoggingEnabled = true; } else diff --git a/Views/Play/Index.cshtml b/Views/Play/Index.cshtml index a9c09cc..de2037b 100644 --- a/Views/Play/Index.cshtml +++ b/Views/Play/Index.cshtml @@ -22,7 +22,7 @@ { var cel = Model.Cels[index];
} diff --git a/wwwroot/js/main.js b/wwwroot/js/main.js index be826ca..9fd54ac 100644 --- a/wwwroot/js/main.js +++ b/wwwroot/js/main.js @@ -226,7 +226,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _pto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pto */ \"./Scripts/pto.ts\");\n/* harmony import */ var _utility__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utility */ \"./Scripts/utility.ts\");\n\n\nvar cssClass = \"active-set\";\nvar Tracker = (function () {\n function Tracker(playset, menu, playSpace) {\n this.set = 0;\n this.setPalettes = [];\n this.maxFixById = {};\n this.playset = playset;\n this.menu = menu;\n this.playSpace = playSpace;\n this.addEvents();\n this.reset();\n this.setMenu();\n }\n Tracker.adjustPlacement = function (cel, set, movement) {\n var x = cel.currentPositions[set].x + movement.x;\n var y = cel.currentPositions[set].y + movement.y;\n cel.currentPositions[set] = new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(x, y);\n return Tracker.getCoordinate(cel, set);\n };\n Tracker.getCoordinate = function (cel, set) {\n var position = cel.currentPositions[set];\n if (!position)\n return new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate();\n if (!cel.offset)\n return position;\n return new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(position.x + cel.offset.x, position.y + cel.offset.y);\n };\n Tracker.prototype.setPlayArea = function (set) {\n this.set = set;\n this.menu.querySelectorAll(\"button\").forEach(function (button) {\n button.classList.remove(cssClass);\n });\n this.menu.querySelector(\"button[data-set=\\\"\" + set + \"\\\"]\").classList.add(cssClass);\n var elements = this.playSpace.querySelectorAll(\".cel-image\");\n this.playset.cels.forEach(function (cel, index) {\n var element = elements[index];\n element.style.visibility = \"hidden\";\n if (cel.sets[set]) {\n element.style.visibility = \"visible\";\n var position = Tracker.getCoordinate(cel, set);\n element.style.left = position.x + \"px\";\n element.style.top = position.y + \"px\";\n }\n });\n };\n Tracker.prototype.addEvents = function () {\n var _this = this;\n var previousEvent = null;\n var elements = this.playSpace.querySelectorAll(\".cel-image\");\n elements.forEach(function (element) {\n var mousemove = function (move) {\n var movement = new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(move.clientX - previousEvent.clientX, move.clientY - previousEvent.clientY);\n previousEvent = move;\n var group = _this.getGroup(element);\n group.forEach(function (item) {\n var index = parseInt(item.attributes.getNamedItem(\"data-index\").value);\n var cel = _this.playset.cels[index];\n if (cel.currentFix == 0) {\n var position = Tracker.adjustPlacement(cel, _this.set, movement);\n item.style.left = position.x + \"px\";\n item.style.top = position.y + \"px\";\n }\n });\n };\n element.addEventListener(\"mousedown\", function (down) {\n previousEvent = down;\n _this.getGroup(element).forEach(function (item) {\n var index = parseInt(item.attributes.getNamedItem(\"data-index\").value);\n var cel = _this.playset.cels[index];\n if (cel.currentFix > 0)\n cel.currentFix--;\n });\n window.addEventListener(\"mousemove\", mousemove);\n window.addEventListener(\"mouseup\", function () {\n previousEvent = null;\n window.removeEventListener(\"mousemove\", mousemove);\n });\n });\n });\n };\n Tracker.prototype.getGroup = function (element) {\n var id = element.attributes.getNamedItem(\"data-id\").value;\n return this.playSpace.querySelectorAll(\".cel-image[data-id=\\\"\" + id + \"\\\"]\");\n };\n Tracker.prototype.reset = function () {\n var _this = this;\n this.playSpace.querySelectorAll(\".cel-image\").forEach(function (element) {\n element.style.visibility = \"hidden\";\n element.style.left = \"0\";\n element.style.top = \"0\";\n });\n this.playset.cels.forEach(function (cel) {\n if (!_this.maxFixById[cel.id]) {\n _this.maxFixById[cel.id] = 0;\n }\n if (_this.maxFixById[cel.id] < cel.fix) {\n _this.maxFixById[cel.id] = cel.fix;\n }\n });\n this.playset.cels.forEach(function (cel) {\n cel.currentFix = _this.maxFixById[cel.id];\n cel.currentPositions = cel.initialPositions.map(function (position) { return position ? new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(position.x, position.y) : null; });\n });\n };\n Tracker.prototype.setMenu = function () {\n var _this = this;\n var reset = this.menu.querySelector(\"button[data-rel=\\\"reset\\\"]\");\n reset.addEventListener(\"click\", function () {\n _this.reset();\n _this.setPlayArea(_this.set);\n });\n this.playset.enabledSets.forEach(function (enabled, index) {\n if (enabled) {\n var button = new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"li\")\n .addChildren(new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"button\")\n .addClass(\"mdc-button\")\n .addAttributes({ \"data-set\": index })\n .addChildren(new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"span\").addClass(\"mdc-button__ripple\"), new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"span\").addClass(\"mdc-button__label\").setText(index.toString()))).build();\n button.addEventListener(\"click\", function () {\n _this.setPlayArea(index);\n });\n _this.menu.appendChild(button);\n }\n });\n };\n return Tracker;\n}());\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tracker);\n\n\n//# sourceURL=webpack://fxl.codes.kisekae/./Scripts/tracker.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _pto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pto */ \"./Scripts/pto.ts\");\n/* harmony import */ var _utility__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utility */ \"./Scripts/utility.ts\");\n\n\nvar cssClass = \"active-set\";\nvar Tracker = (function () {\n function Tracker(playset, menu, playSpace) {\n this.set = 0;\n this.setPalettes = [];\n this.maxFixById = {};\n this.playset = playset;\n this.menu = menu;\n this.playSpace = playSpace;\n this.addEvents();\n this.reset();\n this.setMenu();\n }\n Tracker.adjustPlacement = function (cel, set, movement) {\n var x = cel.currentPositions[set].x + movement.x;\n var y = cel.currentPositions[set].y + movement.y;\n cel.currentPositions[set] = new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(x, y);\n return Tracker.getCoordinate(cel, set);\n };\n Tracker.getCoordinate = function (cel, set) {\n var position = cel.currentPositions[set];\n if (!position)\n return new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate();\n if (!cel.offset)\n return position;\n return new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(position.x + cel.offset.x, position.y + cel.offset.y);\n };\n Tracker.prototype.setPlayArea = function (set) {\n this.set = set;\n this.menu.querySelectorAll(\"button\").forEach(function (button) {\n button.classList.remove(cssClass);\n });\n this.menu.querySelector(\"button[data-set=\\\"\" + set + \"\\\"]\").classList.add(cssClass);\n var elements = this.playSpace.querySelectorAll(\".cel-image\");\n this.playset.cels.forEach(function (cel, index) {\n var element = elements[index];\n element.style.visibility = \"hidden\";\n if (cel.initialPositions[set] != null) {\n element.style.visibility = \"visible\";\n var position = Tracker.getCoordinate(cel, set);\n element.style.left = position.x + \"px\";\n element.style.top = position.y + \"px\";\n }\n });\n };\n Tracker.prototype.addEvents = function () {\n var _this = this;\n var previousEvent = null;\n var elements = this.playSpace.querySelectorAll(\".cel-image\");\n elements.forEach(function (element) {\n var mousemove = function (move) {\n var movement = new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(move.clientX - previousEvent.clientX, move.clientY - previousEvent.clientY);\n previousEvent = move;\n var group = _this.getGroup(element);\n group.forEach(function (item) {\n var index = parseInt(item.attributes.getNamedItem(\"data-index\").value);\n var cel = _this.playset.cels[index];\n if (cel.currentFix == 0) {\n var position = Tracker.adjustPlacement(cel, _this.set, movement);\n item.style.left = position.x + \"px\";\n item.style.top = position.y + \"px\";\n }\n });\n };\n element.addEventListener(\"mousedown\", function (down) {\n previousEvent = down;\n _this.getGroup(element).forEach(function (item) {\n var index = parseInt(item.attributes.getNamedItem(\"data-index\").value);\n var cel = _this.playset.cels[index];\n if (cel.currentFix > 0)\n cel.currentFix--;\n });\n window.addEventListener(\"mousemove\", mousemove);\n window.addEventListener(\"mouseup\", function () {\n previousEvent = null;\n window.removeEventListener(\"mousemove\", mousemove);\n });\n });\n });\n };\n Tracker.prototype.getGroup = function (element) {\n var id = element.attributes.getNamedItem(\"data-id\").value;\n return this.playSpace.querySelectorAll(\".cel-image[data-id=\\\"\" + id + \"\\\"]\");\n };\n Tracker.prototype.reset = function () {\n var _this = this;\n this.playSpace.querySelectorAll(\".cel-image\").forEach(function (element) {\n element.style.visibility = \"hidden\";\n element.style.left = \"0\";\n element.style.top = \"0\";\n });\n this.playset.cels.forEach(function (cel) {\n if (!_this.maxFixById[cel.id]) {\n _this.maxFixById[cel.id] = 0;\n }\n if (_this.maxFixById[cel.id] < cel.fix) {\n _this.maxFixById[cel.id] = cel.fix;\n }\n });\n this.playset.cels.forEach(function (cel) {\n cel.currentFix = _this.maxFixById[cel.id];\n cel.currentPositions = cel.initialPositions.map(function (position) { return position ? new _pto__WEBPACK_IMPORTED_MODULE_0__.Coordinate(position.x, position.y) : null; });\n });\n };\n Tracker.prototype.setMenu = function () {\n var _this = this;\n var reset = this.menu.querySelector(\"button[data-rel=\\\"reset\\\"]\");\n reset.addEventListener(\"click\", function () {\n _this.reset();\n _this.setPlayArea(_this.set);\n });\n this.playset.sets.forEach(function (enabled, index) {\n if (enabled) {\n var button = new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"li\")\n .addChildren(new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"button\")\n .addClass(\"mdc-button\")\n .addAttributes({ \"data-set\": index })\n .addChildren(new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"span\").addClass(\"mdc-button__ripple\"), new _utility__WEBPACK_IMPORTED_MODULE_1__[\"default\"](\"span\").addClass(\"mdc-button__label\").setText(index.toString()))).build();\n button.addEventListener(\"click\", function () {\n _this.setPlayArea(index);\n });\n _this.menu.appendChild(button);\n }\n });\n };\n return Tracker;\n}());\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tracker);\n\n\n//# sourceURL=webpack://fxl.codes.kisekae/./Scripts/tracker.ts?"); /***/ }),