Scaffolding

This commit is contained in:
rjindael 2023-06-15 17:05:06 -07:00
parent 79bf276ab9
commit a40d900653
No known key found for this signature in database
GPG Key ID: D069369C906CCF31
66 changed files with 780 additions and 1499 deletions

View File

@ -1,13 +0,0 @@
using Estara.Core.Models;
namespace Estara.Core.Contracts.Services;
// Remove this class once your pages/features are using your data.
public interface ISampleDataService
{
Task<IEnumerable<SampleOrder>> GetContentGridDataAsync();
Task<IEnumerable<SampleOrder>> GetGridDataAsync();
Task<IEnumerable<SampleOrder>> GetListDetailsDataAsync();
}

View File

@ -1,60 +0,0 @@
namespace Estara.Core.Models;
// Model for the SampleDataService. Replace with your own model.
public class SampleCompany
{
public string CompanyID
{
get; set;
}
public string CompanyName
{
get; set;
}
public string ContactName
{
get; set;
}
public string ContactTitle
{
get; set;
}
public string Address
{
get; set;
}
public string City
{
get; set;
}
public string PostalCode
{
get; set;
}
public string Country
{
get; set;
}
public string Phone
{
get; set;
}
public string Fax
{
get; set;
}
public ICollection<SampleOrder> Orders
{
get; set;
}
}

View File

@ -1,81 +0,0 @@
namespace Estara.Core.Models;
// Model for the SampleDataService. Replace with your own model.
public class SampleOrder
{
public long OrderID
{
get; set;
}
public DateTime OrderDate
{
get; set;
}
public DateTime RequiredDate
{
get; set;
}
public DateTime ShippedDate
{
get; set;
}
public string ShipperName
{
get; set;
}
public string ShipperPhone
{
get; set;
}
public double Freight
{
get; set;
}
public string Company
{
get; set;
}
public string ShipTo
{
get; set;
}
public double OrderTotal
{
get; set;
}
public string Status
{
get; set;
}
public int SymbolCode
{
get; set;
}
public string SymbolName
{
get; set;
}
public char Symbol => (char)SymbolCode;
public ICollection<SampleOrderDetail> Details
{
get; set;
}
public string ShortDescription => $"Order ID: {OrderID}";
public override string ToString() => $"{Company} {Status}";
}

View File

@ -1,52 +0,0 @@
namespace Estara.Core.Models;
// Model for the SampleDataService. Replace with your own model.
public class SampleOrderDetail
{
public long ProductID
{
get; set;
}
public string ProductName
{
get; set;
}
public int Quantity
{
get; set;
}
public double Discount
{
get; set;
}
public string QuantityPerUnit
{
get; set;
}
public double UnitPrice
{
get; set;
}
public string CategoryName
{
get; set;
}
public string CategoryDescription
{
get; set;
}
public double Total
{
get; set;
}
public string ShortDescription => $"Product ID: {ProductID} - {ProductName}";
}

View File

@ -1,5 +0,0 @@
*Recommended Markdown Viewer: [Markdown Editor](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor2)*
## Getting Started
The Core project contains code that can be [reused across multiple application projects](https://docs.microsoft.com/dotnet/standard/net-standard#net-5-and-net-standard).

View File

@ -1,522 +0,0 @@
using Estara.Core.Contracts.Services;
using Estara.Core.Models;
namespace Estara.Core.Services;
// This class holds sample data used by some generated pages to show how they can be used.
// TODO: The following classes have been created to display sample data. Delete these files once your app is using real data.
// 1. Contracts/Services/ISampleDataService.cs
// 2. Services/SampleDataService.cs
// 3. Models/SampleCompany.cs
// 4. Models/SampleOrder.cs
// 5. Models/SampleOrderDetail.cs
public class SampleDataService : ISampleDataService
{
private List<SampleOrder> _allOrders;
public SampleDataService()
{
}
private static IEnumerable<SampleOrder> AllOrders()
{
// The following is order summary data
var companies = AllCompanies();
return companies.SelectMany(c => c.Orders);
}
private static IEnumerable<SampleCompany> AllCompanies()
{
return new List<SampleCompany>()
{
new SampleCompany()
{
CompanyID = "ALFKI",
CompanyName = "Company A",
ContactName = "Maria Anders",
ContactTitle = "Sales Representative",
Address = "Obere Str. 57",
City = "Berlin",
PostalCode = "12209",
Country = "Germany",
Phone = "030-0074321",
Fax = "030-0076545",
Orders = new List<SampleOrder>()
{
new SampleOrder()
{
OrderID = 10643, // Symbol Globe
OrderDate = new DateTime(1997, 8, 25),
RequiredDate = new DateTime(1997, 9, 22),
ShippedDate = new DateTime(1997, 9, 22),
ShipperName = "Speedy Express",
ShipperPhone = "(503) 555-9831",
Freight = 29.46,
Company = "Company A",
ShipTo = "Company A, Obere Str. 57, Berlin, 12209, Germany",
OrderTotal = 814.50,
Status = "Shipped",
SymbolCode = 57643,
SymbolName = "Globe",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 28,
ProductName = "Rössle Sauerkraut",
Quantity = 15,
Discount = 0.25,
QuantityPerUnit = "25 - 825 g cans",
UnitPrice = 45.60,
CategoryName = "Produce",
CategoryDescription = "Dried fruit and bean curd",
Total = 513.00
},
new SampleOrderDetail()
{
ProductID = 39,
ProductName = "Chartreuse verte",
Quantity = 21,
Discount = 0.25,
QuantityPerUnit = "750 cc per bottle",
UnitPrice = 18.0,
CategoryName = "Beverages",
CategoryDescription = "Soft drinks, coffees, teas, beers, and ales",
Total = 283.50
},
new SampleOrderDetail()
{
ProductID = 46,
ProductName = "Spegesild",
Quantity = 2,
Discount = 0.25,
QuantityPerUnit = "4 - 450 g glasses",
UnitPrice = 12.0,
CategoryName = "Seafood",
CategoryDescription = "Seaweed and fish",
Total = 18.00
}
}
},
new SampleOrder()
{
OrderID = 10835, // Symbol Music
OrderDate = new DateTime(1998, 1, 15),
RequiredDate = new DateTime(1998, 2, 12),
ShippedDate = new DateTime(1998, 1, 21),
ShipperName = "Federal Shipping",
ShipperPhone = "(503) 555-9931",
Freight = 69.53,
Company = "Company A",
ShipTo = "Company A, Obere Str. 57, Berlin, 12209, Germany",
OrderTotal = 845.80,
Status = "Closed",
SymbolCode = 57737,
SymbolName = "Audio",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 59,
ProductName = "Raclette Courdavault",
Quantity = 15,
Discount = 0,
QuantityPerUnit = "5 kg pkg.",
UnitPrice = 55.00,
CategoryName = "Dairy Products",
CategoryDescription = "Cheeses",
Total = 825.00
},
new SampleOrderDetail()
{
ProductID = 77,
ProductName = "Original Frankfurter grüne Soße",
Quantity = 2,
Discount = 0.2,
QuantityPerUnit = "12 boxes",
UnitPrice = 13.0,
CategoryName = "Condiments",
CategoryDescription = "Sweet and savory sauces, relishes, spreads, and seasonings",
Total = 20.80
}
}
},
new SampleOrder()
{
OrderID = 10952, // Symbol Calendar
OrderDate = new DateTime(1998, 3, 16),
RequiredDate = new DateTime(1998, 4, 27),
ShippedDate = new DateTime(1998, 3, 24),
ShipperName = "Speedy Express",
ShipperPhone = "(503) 555-9831",
Freight = 40.42,
Company = "Company A",
ShipTo = "Company A, Obere Str. 57, Berlin, 12209, Germany",
OrderTotal = 471.20,
Status = "Closed",
SymbolCode = 57699,
SymbolName = "Calendar",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 6,
ProductName = "Grandma's Boysenberry Spread",
Quantity = 16,
Discount = 0.05,
QuantityPerUnit = "12 - 8 oz jars",
UnitPrice = 25.0,
CategoryName = "Condiments",
CategoryDescription = "Sweet and savory sauces, relishes, spreads, and seasonings",
Total = 380.00
},
new SampleOrderDetail()
{
ProductID = 28,
ProductName = "Rössle Sauerkraut",
Quantity = 2,
Discount = 0,
QuantityPerUnit = "25 - 825 g cans",
UnitPrice = 45.60,
CategoryName = "Produce",
CategoryDescription = "Dried fruit and bean curd",
Total = 91.20
}
}
}
}
},
new SampleCompany()
{
CompanyID = "ANATR",
CompanyName = "Company F",
ContactName = "Ana Trujillo",
ContactTitle = "Owner",
Address = "Avda. de la Constitución 2222",
City = "México D.F.",
PostalCode = "05021",
Country = "Mexico",
Phone = "(5) 555-4729",
Fax = "(5) 555-3745",
Orders = new List<SampleOrder>()
{
new SampleOrder()
{
OrderID = 10625, // Symbol Camera
OrderDate = new DateTime(1997, 8, 8),
RequiredDate = new DateTime(1997, 9, 5),
ShippedDate = new DateTime(1997, 8, 14),
ShipperName = "Speedy Express",
ShipperPhone = "(503) 555-9831",
Freight = 43.90,
Company = "Company F",
ShipTo = "Company F, Avda. de la Constitución 2222, 05021, México D.F., Mexico",
OrderTotal = 469.75,
Status = "Shipped",
SymbolCode = 57620,
SymbolName = "Camera",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 14,
ProductName = "Tofu",
Quantity = 3,
Discount = 0,
QuantityPerUnit = "40 - 100 g pkgs.",
UnitPrice = 23.25,
CategoryName = "Produce",
CategoryDescription = "Dried fruit and bean curd",
Total = 69.75
},
new SampleOrderDetail()
{
ProductID = 42,
ProductName = "Singaporean Hokkien Fried Mee",
Quantity = 5,
Discount = 0,
QuantityPerUnit = "32 - 1 kg pkgs.",
UnitPrice = 14.0,
CategoryName = "Grains/Cereals",
CategoryDescription = "Breads, crackers, pasta, and cereal",
Total = 70.00
},
new SampleOrderDetail()
{
ProductID = 60,
ProductName = "Camembert Pierrot",
Quantity = 10,
Discount = 0,
QuantityPerUnit = "15 - 300 g rounds",
UnitPrice = 34.00,
CategoryName = "Dairy Products",
CategoryDescription = "Cheeses",
Total = 340.00
}
}
},
new SampleOrder()
{
OrderID = 10926, // Symbol Clock
OrderDate = new DateTime(1998, 3, 4),
RequiredDate = new DateTime(1998, 4, 1),
ShippedDate = new DateTime(1998, 3, 11),
ShipperName = "Federal Shipping",
ShipperPhone = "(503) 555-9931",
Freight = 39.92,
Company = "Company F",
ShipTo = "Company F, Avda. de la Constitución 2222, 05021, México D.F., Mexico",
OrderTotal = 507.20,
Status = "Shipped",
SymbolCode = 57633,
SymbolName = "Clock",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 11,
ProductName = "Queso Cabrales",
Quantity = 2,
Discount = 0,
QuantityPerUnit = "1 kg pkg.",
UnitPrice = 21.0,
CategoryName = "Dairy Products",
CategoryDescription = "Cheeses",
Total = 42.00
},
new SampleOrderDetail()
{
ProductID = 13,
ProductName = "Konbu",
Quantity = 10,
Discount = 0,
QuantityPerUnit = "2 kg box",
UnitPrice = 6.0,
CategoryName = "Seafood",
CategoryDescription = "Seaweed and fish",
Total = 60.00
},
new SampleOrderDetail()
{
ProductID = 19,
ProductName = "Teatime Chocolate Biscuits",
Quantity = 7,
Discount = 0,
QuantityPerUnit = "10 boxes x 12 pieces",
UnitPrice = 9.20,
CategoryName = "Confections",
CategoryDescription = "Desserts, candies, and sweet breads",
Total = 64.40
},
new SampleOrderDetail()
{
ProductID = 72,
ProductName = "Mozzarella di Giovanni",
Quantity = 10,
Discount = 0,
QuantityPerUnit = "24 - 200 g pkgs.",
UnitPrice = 34.80,
CategoryName = "Dairy Products",
CategoryDescription = "Cheeses",
Total = 340.80
}
}
}
}
},
new SampleCompany()
{
CompanyID = "ANTON",
CompanyName = "Company Z",
ContactName = "Antonio Moreno",
ContactTitle = "Owner",
Address = "Mataderos 2312",
City = "México D.F.",
PostalCode = "05023",
Country = "Mexico",
Phone = "(5) 555-3932",
Fax = string.Empty,
Orders = new List<SampleOrder>()
{
new SampleOrder()
{
OrderID = 10507, // Symbol Contact
OrderDate = new DateTime(1997, 4, 15),
RequiredDate = new DateTime(1997, 5, 13),
ShippedDate = new DateTime(1997, 4, 22),
ShipperName = "Speedy Express",
ShipperPhone = "(503) 555-9831",
Freight = 47.45,
Company = "Company Z",
ShipTo = "Company Z, Mataderos 2312, 05023, México D.F., Mexico",
OrderTotal = 978.50,
Status = "Closed",
SymbolCode = 57661,
SymbolName = "Contact",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 43,
ProductName = "Ipoh Coffee",
Quantity = 15,
Discount = 0.15,
QuantityPerUnit = "16 - 500 g tins",
UnitPrice = 46.0,
CategoryName = "Beverages",
CategoryDescription = "Soft drinks, coffees, teas, beers, and ales",
Total = 816.00
},
new SampleOrderDetail()
{
ProductID = 48,
ProductName = "Chocolade",
Quantity = 15,
Discount = 0.15,
QuantityPerUnit = "10 pkgs.",
UnitPrice = 12.75,
CategoryName = "Confections",
CategoryDescription = "Desserts, candies, and sweet breads",
Total = 162.50
}
}
},
new SampleOrder()
{
OrderID = 10573, // Symbol Star
OrderDate = new DateTime(1997, 6, 19),
RequiredDate = new DateTime(1997, 7, 17),
ShippedDate = new DateTime(1997, 6, 20),
ShipperName = "Federal Shipping",
ShipperPhone = "(503) 555-9931",
Freight = 84.84,
Company = "Company Z",
ShipTo = "Company Z, Mataderos 2312, 05023, México D.F., Mexico",
OrderTotal = 2082.00,
Status = "Closed",
SymbolCode = 57619,
SymbolName = "Favorite",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 17,
ProductName = "Alice Mutton",
Quantity = 18,
Discount = 0,
QuantityPerUnit = "20 - 1 kg tins",
UnitPrice = 39.00,
CategoryName = "Meat/Poultry",
CategoryDescription = "Prepared meats",
Total = 702.00
},
new SampleOrderDetail()
{
ProductID = 34,
ProductName = "Sasquatch Ale",
Quantity = 40,
Discount = 0,
QuantityPerUnit = "24 - 12 oz bottles",
UnitPrice = 14.0,
CategoryName = "Beverages",
CategoryDescription = "Soft drinks, coffees, teas, beers, and ales",
Total = 560.00
},
new SampleOrderDetail()
{
ProductID = 53,
ProductName = "Perth Pasties",
Quantity = 25,
Discount = 0,
QuantityPerUnit = "48 pieces",
UnitPrice = 32.80,
CategoryName = "Meat/Poultry",
CategoryDescription = "Prepared meats",
Total = 820.00
}
}
},
new SampleOrder()
{
OrderID = 10682, // Symbol Home
OrderDate = new DateTime(1997, 9, 25),
RequiredDate = new DateTime(1997, 10, 23),
ShippedDate = new DateTime(1997, 10, 1),
ShipperName = "United Package",
ShipperPhone = "(503) 555-3199",
Freight = 36.13,
Company = "Company Z",
ShipTo = "Company Z, Mataderos 2312, 05023, México D.F., Mexico",
OrderTotal = 375.50,
Status = "Closed",
SymbolCode = 57615,
SymbolName = "Home",
Details = new List<SampleOrderDetail>()
{
new SampleOrderDetail()
{
ProductID = 33,
ProductName = "Geitost",
Quantity = 30,
Discount = 0,
QuantityPerUnit = "500 g",
UnitPrice = 2.50,
CategoryName = "Dairy Products",
CategoryDescription = "Cheeses",
Total = 75.00
},
new SampleOrderDetail()
{
ProductID = 66,
ProductName = "Louisiana Hot Spiced Okra",
Quantity = 4,
Discount = 0,
QuantityPerUnit = "24 - 8 oz jars",
UnitPrice = 17.00,
CategoryName = "Condiments",
CategoryDescription = "Sweet and savory sauces, relishes, spreads, and seasonings",
Total = 68.00
},
new SampleOrderDetail()
{
ProductID = 75,
ProductName = "Rhönbräu Klosterbier",
Quantity = 30,
Discount = 0,
QuantityPerUnit = "24 - 0.5 l bottles",
UnitPrice = 7.75,
CategoryName = "Beverages",
CategoryDescription = "Soft drinks, coffees, teas, beers, and ales",
Total = 232.50
}
}
}
}
}
};
}
public async Task<IEnumerable<SampleOrder>> GetContentGridDataAsync()
{
_allOrders ??= new List<SampleOrder>(AllOrders());
await Task.CompletedTask;
return _allOrders;
}
public async Task<IEnumerable<SampleOrder>> GetGridDataAsync()
{
_allOrders ??= new List<SampleOrder>(AllOrders());
await Task.CompletedTask;
return _allOrders;
}
public async Task<IEnumerable<SampleOrder>> GetListDetailsDataAsync()
{
_allOrders ??= new List<SampleOrder>(AllOrders());
await Task.CompletedTask;
return _allOrders;
}
}

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{e0bc6fde-61da-4acf-bade-332bdb54d1c9}</ProjectGuid>
<RootNamespace>EstaraPatcher</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;ESTARAPATCHER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;ESTARAPATCHER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;ESTARAPATCHER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;ESTARAPATCHER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -0,0 +1,20 @@
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
// TODO: Add DLL patching code from @orcfoss/Lure.
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

View File

@ -0,0 +1,5 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files
#include <windows.h>

5
Estara.Patcher/pch.cpp Normal file
View File

@ -0,0 +1,5 @@
// pch.cpp: source file corresponding to the pre-compiled header
#include "pch.h"
// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.

13
Estara.Patcher/pch.h Normal file
View File

@ -0,0 +1,13 @@
// pch.h: This is a precompiled header file.
// Files listed below are compiled only once, improving build performance for future builds.
// This also affects IntelliSense performance, including code completion and many code browsing features.
// However, files listed here are ALL re-compiled if any one of them is updated between builds.
// Do not add files here that you will be updating frequently as this negates the performance advantage.
#ifndef PCH_H
#define PCH_H
// add headers that you want to pre-compile here
#include "framework.h"
#endif //PCH_H

9
Estara.Tools/App.xaml Normal file
View File

@ -0,0 +1,9 @@
<Application x:Class="Estara.Tools.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Estara.Tools"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

15
Estara.Tools/App.xaml.cs Normal file
View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace Estara.Tools;
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}

View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Estara.Core\Estara.Core.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
<Window x:Class="Estara.Tools.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Estara.Tools"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Estara.Tools;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// TODO: Add a basic toolset.
}

View File

@ -7,6 +7,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Estara", "Estara\Estara.csp
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Estara.Core", "Estara.Core\Estara.Core.csproj", "{6FC83ED3-8060-4415-9B1C-1B7DA39D8AD4}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Estara.Patcher", "Estara.Patcher\Estara.Patcher.vcxproj", "{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Estara.Tools", "Estara.Tools\Estara.Tools.csproj", "{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -59,6 +63,38 @@ Global
{6FC83ED3-8060-4415-9B1C-1B7DA39D8AD4}.Release|x64.Build.0 = Release|x64
{6FC83ED3-8060-4415-9B1C-1B7DA39D8AD4}.Release|x86.ActiveCfg = Release|x86
{6FC83ED3-8060-4415-9B1C-1B7DA39D8AD4}.Release|x86.Build.0 = Release|x86
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|Any CPU.ActiveCfg = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|Any CPU.Build.0 = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|arm64.ActiveCfg = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|arm64.Build.0 = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|x64.ActiveCfg = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|x64.Build.0 = Debug|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|x86.ActiveCfg = Debug|Win32
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Debug|x86.Build.0 = Debug|Win32
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|Any CPU.ActiveCfg = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|Any CPU.Build.0 = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|arm64.ActiveCfg = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|arm64.Build.0 = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|x64.ActiveCfg = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|x64.Build.0 = Release|x64
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|x86.ActiveCfg = Release|Win32
{E0BC6FDE-61DA-4ACF-BADE-332BDB54D1C9}.Release|x86.Build.0 = Release|Win32
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|arm64.ActiveCfg = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|arm64.Build.0 = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|x64.ActiveCfg = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|x64.Build.0 = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|x86.ActiveCfg = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Debug|x86.Build.0 = Debug|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|Any CPU.Build.0 = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|arm64.ActiveCfg = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|arm64.Build.0 = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|x64.ActiveCfg = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|x64.Build.0 = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|x86.ActiveCfg = Release|Any CPU
{AFF88B22-7CB0-4F5B-B707-EFCDAAAA204C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -22,7 +22,7 @@ public class DefaultActivationHandler : ActivationHandler<LaunchActivatedEventAr
protected async override Task HandleInternalAsync(LaunchActivatedEventArgs args)
{
_navigationService.NavigateTo(typeof(MainViewModel).FullName!, args.Arguments);
_navigationService.NavigateTo(typeof(PlayViewModel).FullName!, args.Arguments);
await Task.CompletedTask;
}

View File

@ -69,24 +69,29 @@ public partial class App : Application
services.AddSingleton<INavigationService, NavigationService>();
// Core Services
services.AddSingleton<ISampleDataService, SampleDataService>();
services.AddSingleton<IFileService, FileService>();
// Views and ViewModels
services.AddTransient<SettingsViewModel>();
services.AddTransient<SettingsPage>();
services.AddTransient<DataGridViewModel>();
services.AddTransient<DataGridPage>();
services.AddTransient<ContentGridDetailViewModel>();
services.AddTransient<ContentGridDetailPage>();
services.AddTransient<ContentGridViewModel>();
services.AddTransient<ContentGridPage>();
services.AddTransient<ListDetailsViewModel>();
services.AddTransient<ListDetailsPage>();
services.AddTransient<MainViewModel>();
services.AddTransient<MainPage>();
services.AddTransient<ShellPage>();
services.AddTransient<PlayViewModel>();
services.AddTransient<PlayPage>();
services.AddTransient<PlayViewModel>();
services.AddTransient<PlayPage>();
services.AddTransient<HostViewModel>();
services.AddTransient<HostPage>();
services.AddTransient<CharacterViewModel>();
services.AddTransient<CharacterPage>();
services.AddTransient<VersionsViewModel>();
services.AddTransient<VersionsPage>();
services.AddTransient<PlacesViewModel>();
services.AddTransient<PlacesPage>();
services.AddTransient<PackagesViewModel>();
services.AddTransient<PackagesPage>();
services.AddTransient<BookmarksViewModel>();
services.AddTransient<BookmarksPage>();
services.AddTransient<ShellViewModel>();
services.AddTransient<ShellPage>();
// Configuration
services.Configure<LocalSettingsOptions>(context.Configuration.GetSection(nameof(LocalSettingsOptions)));

View File

@ -25,6 +25,10 @@
<AppxBundle>Never</AppxBundle>
<AppInstallerUri>https://kiseki.lol/estara</AppInstallerUri>
</PropertyGroup>
<ItemGroup>
<None Remove="Views\BookmarksPage.xaml" />
<None Remove="Views\CharacterPage.xaml" />
</ItemGroup>
<ItemGroup>
<Manifest Include="$(ApplicationManifest)" />
@ -48,6 +52,12 @@
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<Page Update="Views\CharacterPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Update="Views\BookmarksPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup Condition="'$(DisableMsixProjectCapabilityAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">

View File

@ -1,27 +0,0 @@
*Recommended Markdown Viewer: [Markdown Editor](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor2)*
## Getting Started
Browse and address `TODO:` comments in `View -> Task List` to learn the codebase and understand next steps for turning the generated code into production code.
Explore the [WinUI Gallery](https://www.microsoft.com/store/productId/9P3JFPWWDZRC) to learn about available controls and design patterns.
Relaunch Template Studio to modify the project by right-clicking on the project in `View -> Solution Explorer` then selecting `Add -> New Item (Template Studio)`.
## Publishing
For projects with MSIX packaging, right-click on the application project and select `Package and Publish -> Create App Packages...` to create an MSIX package.
For projects without MSIX packaging, follow the [deployment guide](https://docs.microsoft.com/windows/apps/windows-app-sdk/deploy-unpackaged-apps) or add the `Self-Contained` Feature to enable xcopy deployment.
## CI Pipelines
See [README.md](https://github.com/microsoft/TemplateStudio/blob/main/docs/WinUI/pipelines/README.md) for guidance on building and testing projects in CI pipelines.
## Changelog
See [releases](https://github.com/microsoft/TemplateStudio/releases) and [milestones](https://github.com/microsoft/TemplateStudio/milestones).
## Feedback
Bugs and feature requests should be filed at https://aka.ms/templatestudio.

View File

@ -14,11 +14,13 @@ public class PageService : IPageService
public PageService()
{
Configure<MainViewModel, MainPage>();
Configure<ListDetailsViewModel, ListDetailsPage>();
Configure<ContentGridViewModel, ContentGridPage>();
Configure<ContentGridDetailViewModel, ContentGridDetailPage>();
Configure<DataGridViewModel, DataGridPage>();
Configure<PlayViewModel, PlayPage>();
Configure<HostViewModel, HostPage>();
Configure<CharacterViewModel, CharacterPage>();
Configure<VersionsViewModel, VersionsPage>();
Configure<PlacesViewModel, PlacesPage>();
Configure<PackagesViewModel, PackagesPage>();
Configure<BookmarksViewModel, BookmarksPage>();
Configure<SettingsViewModel, SettingsPage>();
}

View File

@ -1,5 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
@ -61,23 +120,32 @@
<data name="AppDisplayName" xml:space="preserve">
<value>Estara</value>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Estara</value>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Estara</value>
</data>
<data name="Shell_Main.Content" xml:space="preserve">
<value>Main</value>
</data>
<data name="ListDetails_NoSelection.Text" xml:space="preserve">
<value>Select an item from the list.</value>
<data name="Shell_Play.Content" xml:space="preserve">
<value>Play</value>
</data>
<data name="Shell_ListDetails.Content" xml:space="preserve">
<value>ListDetails</value>
<data name="Shell_Host.Content" xml:space="preserve">
<value>Host</value>
</data>
<data name="Shell_ContentGrid.Content" xml:space="preserve">
<value>ContentGrid</value>
<data name="Shell_Character.Content" xml:space="preserve">
<value>Character</value>
</data>
<data name="Shell_DataGrid.Content" xml:space="preserve">
<value>DataGrid</value>
<data name="Shell_Versions.Content" xml:space="preserve">
<value>Versions</value>
</data>
<data name="Shell_Places.Content" xml:space="preserve">
<value>Places</value>
</data>
<data name="Shell_Packages.Content" xml:space="preserve">
<value>Packages</value>
</data>
<data name="Shell_Bookmarks.Content" xml:space="preserve">
<value>Bookmarks</value>
</data>
<data name="Settings_Personalization.Text" xml:space="preserve">
<value>Personalization</value>
@ -98,13 +166,13 @@
<value>About this application</value>
</data>
<data name="Settings_AboutDescription.Text" xml:space="preserve">
<value>TODO: Replace with your app description.</value>
<value>A Kiseki experiment</value>
</data>
<data name="SettingsPage_PrivacyTermsLink.Content" xml:space="preserve">
<value>Privacy Statement</value>
<data name="SettingsPage_SourceLink.Content" xml:space="preserve">
<value>Source</value>
</data>
<data name="SettingsPage_PrivacyTermsLink.NavigateUri" xml:space="preserve">
<value>https://YourPrivacyUrlGoesHere/</value>
<data name="SettingsPage_SourceLink.NavigateUri" xml:space="preserve">
<value>https://github.com/kiseki-lol/estara</value>
</data>
<data name="AppNotificationSamplePayload" xml:space="preserve">
<value>&lt;toast launch="action=ToastClick"&gt;
@ -120,4 +188,4 @@
&lt;/actions&gt;
&lt;/toast&gt;</value>
</data>
</root>
</root>

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class BookmarksViewModel : ObservableRecipient
{
public BookmarksViewModel()
{
//
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class CharacterViewModel : ObservableRecipient
{
public CharacterViewModel()
{
//
}
}

View File

@ -1,33 +0,0 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Estara.Contracts.ViewModels;
using Estara.Core.Contracts.Services;
using Estara.Core.Models;
namespace Estara.ViewModels;
public partial class ContentGridDetailViewModel : ObservableRecipient, INavigationAware
{
private readonly ISampleDataService _sampleDataService;
[ObservableProperty]
private SampleOrder? item;
public ContentGridDetailViewModel(ISampleDataService sampleDataService)
{
_sampleDataService = sampleDataService;
}
public async void OnNavigatedTo(object parameter)
{
if (parameter is long orderID)
{
var data = await _sampleDataService.GetContentGridDataAsync();
Item = data.First(i => i.OrderID == orderID);
}
}
public void OnNavigatedFrom()
{
}
}

View File

@ -1,52 +0,0 @@
using System.Collections.ObjectModel;
using System.Windows.Input;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Estara.Contracts.Services;
using Estara.Contracts.ViewModels;
using Estara.Core.Contracts.Services;
using Estara.Core.Models;
namespace Estara.ViewModels;
public partial class ContentGridViewModel : ObservableRecipient, INavigationAware
{
private readonly INavigationService _navigationService;
private readonly ISampleDataService _sampleDataService;
public ObservableCollection<SampleOrder> Source { get; } = new ObservableCollection<SampleOrder>();
public ContentGridViewModel(INavigationService navigationService, ISampleDataService sampleDataService)
{
_navigationService = navigationService;
_sampleDataService = sampleDataService;
}
public async void OnNavigatedTo(object parameter)
{
Source.Clear();
// TODO: Replace with real data.
var data = await _sampleDataService.GetContentGridDataAsync();
foreach (var item in data)
{
Source.Add(item);
}
}
public void OnNavigatedFrom()
{
}
[RelayCommand]
private void OnItemClick(SampleOrder? clickedItem)
{
if (clickedItem != null)
{
_navigationService.SetListDataItemForNextConnectedAnimation(clickedItem);
_navigationService.NavigateTo(typeof(ContentGridDetailViewModel).FullName!, clickedItem.OrderID);
}
}
}

View File

@ -1,38 +0,0 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using Estara.Contracts.ViewModels;
using Estara.Core.Contracts.Services;
using Estara.Core.Models;
namespace Estara.ViewModels;
public partial class DataGridViewModel : ObservableRecipient, INavigationAware
{
private readonly ISampleDataService _sampleDataService;
public ObservableCollection<SampleOrder> Source { get; } = new ObservableCollection<SampleOrder>();
public DataGridViewModel(ISampleDataService sampleDataService)
{
_sampleDataService = sampleDataService;
}
public async void OnNavigatedTo(object parameter)
{
Source.Clear();
// TODO: Replace with real data.
var data = await _sampleDataService.GetGridDataAsync();
foreach (var item in data)
{
Source.Add(item);
}
}
public void OnNavigatedFrom()
{
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class HostViewModel : ObservableRecipient
{
public HostViewModel()
{
//
}
}

View File

@ -1,46 +0,0 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using Estara.Contracts.ViewModels;
using Estara.Core.Contracts.Services;
using Estara.Core.Models;
namespace Estara.ViewModels;
public partial class ListDetailsViewModel : ObservableRecipient, INavigationAware
{
private readonly ISampleDataService _sampleDataService;
[ObservableProperty]
private SampleOrder? selected;
public ObservableCollection<SampleOrder> SampleItems { get; private set; } = new ObservableCollection<SampleOrder>();
public ListDetailsViewModel(ISampleDataService sampleDataService)
{
_sampleDataService = sampleDataService;
}
public async void OnNavigatedTo(object parameter)
{
SampleItems.Clear();
// TODO: Replace with real data.
var data = await _sampleDataService.GetListDetailsDataAsync();
foreach (var item in data)
{
SampleItems.Add(item);
}
}
public void OnNavigatedFrom()
{
}
public void EnsureItemSelected()
{
Selected ??= SampleItems.First();
}
}

View File

@ -1,10 +0,0 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class MainViewModel : ObservableRecipient
{
public MainViewModel()
{
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class PackagesViewModel : ObservableRecipient
{
public PackagesViewModel()
{
//
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class PlacesViewModel : ObservableRecipient
{
public PlacesViewModel()
{
//
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class PlayViewModel : ObservableRecipient
{
public PlayViewModel()
{
//
}
}

View File

@ -0,0 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace Estara.ViewModels;
public partial class VersionsViewModel : ObservableRecipient
{
public VersionsViewModel()
{
//
}
}

View File

@ -1,5 +1,5 @@
<Page
x:Class="Estara.Views.MainPage"
x:Class="Estara.Views.BookmarksPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@ -7,6 +7,6 @@
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class BookmarksPage : Page
{
public BookmarksViewModel ViewModel
{
get;
}
public BookmarksPage()
{
ViewModel = App.GetService<BookmarksViewModel>();
InitializeComponent();
}
}

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.CharacterPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class CharacterPage : Page
{
public CharacterViewModel ViewModel
{
get;
}
public CharacterPage()
{
ViewModel = App.GetService<CharacterViewModel>();
InitializeComponent();
}
}

View File

@ -1,107 +0,0 @@
<Page
x:Class="Estara.Views.ContentGridDetailPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:models="using:Estara.Core.Models"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<!--641 is the default CompactModeThresholdWidth in NavigationView -->
<AdaptiveTrigger MinWindowWidth="641" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="propertiesGroup1.(RelativePanel.RightOf)" Value="itemHero" />
<Setter Target="propertiesGroup1.(RelativePanel.Below)" Value="title" />
<Setter Target="propertiesGroup2.(RelativePanel.RightOf)" Value="propertiesGroup1" />
<Setter Target="propertiesGroup2.(RelativePanel.Below)" Value="title" />
<Setter Target="propertiesGroup1.Width" Value="200" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ScrollViewer
IsTabStop="True">
<StackPanel
x:Name="contentPanel">
<RelativePanel>
<Grid
x:Name="itemHero"
Width="200"
Height="200"
Margin="{StaticResource SmallRightMargin}"
Padding="{StaticResource XSmallLeftTopRightBottomMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
RelativePanel.AlignTopWithPanel="True"
RelativePanel.AlignLeftWithPanel="True">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="70"
Glyph="{x:Bind ViewModel.Item.Symbol}"
AutomationProperties.Name="{x:Bind ViewModel.Item.SymbolName}" />
</Grid>
<TextBlock
x:Name="title"
Margin="{StaticResource XXSmallTopMargin}"
RelativePanel.AlignTopWithPanel="True"
RelativePanel.RightOf="itemHero"
Style="{ThemeResource TitleTextBlockStyle}"
Text="{x:Bind ViewModel.Item.Company, Mode=OneWay}" />
<StackPanel x:Name="propertiesGroup1" RelativePanel.Below="itemHero">
<StackPanel x:Name="statusGroup" Margin="{StaticResource SmallTopMargin}">
<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}" Text="Status" />
<TextBlock Style="{ThemeResource BodyTextBlockStyle}" Text="{x:Bind ViewModel.Item.Status}" />
</StackPanel>
<StackPanel x:Name="orderDateGroup" Margin="{StaticResource SmallTopMargin}">
<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}" Text="Order date" />
<TextBlock Style="{ThemeResource BodyTextBlockStyle}" Text="{x:Bind ViewModel.Item.OrderDate}" />
</StackPanel>
</StackPanel>
<StackPanel x:Name="propertiesGroup2" RelativePanel.Below="propertiesGroup1">
<StackPanel x:Name="shipToGroup" Margin="{StaticResource SmallTopMargin}">
<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}" Text="Ship to" />
<TextBlock Style="{ThemeResource BodyTextBlockStyle}" Text="{x:Bind ViewModel.Item.ShipTo}" />
</StackPanel>
<StackPanel x:Name="orderTotalGroup" Margin="{StaticResource SmallTopMargin}">
<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}" Text="Order total" />
<TextBlock Style="{ThemeResource BodyTextBlockStyle}" Text="{x:Bind ViewModel.Item.OrderTotal}" />
</StackPanel>
</StackPanel>
</RelativePanel>
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Style="{ThemeResource SubtitleTextBlockStyle}"
Text="Note 1" />
<TextBlock
Style="{ThemeResource BodyTextBlockStyle}"
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Style="{ThemeResource SubtitleTextBlockStyle}"
Text="Note 2" />
<TextBlock
Margin="{StaticResource MediumBottomMargin}"
Style="{ThemeResource BodyTextBlockStyle}"
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
</StackPanel>
</ScrollViewer>
</Grid>
</Page>

View File

@ -1,43 +0,0 @@
using CommunityToolkit.WinUI.UI.Animations;
using Estara.Contracts.Services;
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Navigation;
namespace Estara.Views;
public sealed partial class ContentGridDetailPage : Page
{
public ContentGridDetailViewModel ViewModel
{
get;
}
public ContentGridDetailPage()
{
ViewModel = App.GetService<ContentGridDetailViewModel>();
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
this.RegisterElementForConnectedAnimation("animationKeyContentGrid", itemHero);
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
if (e.NavigationMode == NavigationMode.Back)
{
var navigationService = App.GetService<INavigationService>();
if (ViewModel.Item != null)
{
navigationService.SetListDataItemForNextConnectedAnimation(ViewModel.Item);
}
}
}
}

View File

@ -1,43 +0,0 @@
<Page
x:Class="Estara.Views.ContentGridPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:animations="using:CommunityToolkit.WinUI.UI.Animations"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:models="using:Estara.Core.Models"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
<controls:AdaptiveGridView
animations:Connected.ListItemElementName="itemThumbnail"
animations:Connected.ListItemKey="animationKeyContentGrid"
DesiredWidth="180"
ItemHeight="160"
IsItemClickEnabled="True"
ItemClickCommand="{x:Bind ViewModel.ItemClickCommand}"
ItemsSource="{x:Bind ViewModel.Source,Mode=OneWay}"
SelectionMode="None"
StretchContentForSingleRow="False">
<controls:AdaptiveGridView.ItemTemplate>
<DataTemplate x:DataType="models:SampleOrder">
<Grid
x:Name="itemThumbnail"
Padding="{StaticResource XSmallLeftTopRightBottomMargin}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<FontIcon
Glyph="{x:Bind Symbol}"
AutomationProperties.Name="{x:Bind SymbolName}" />
<TextBlock
Margin="{StaticResource XXSmallTopMargin}"
HorizontalAlignment="Center"
Style="{ThemeResource BodyTextStyle}"
Text="{x:Bind Company}" />
</StackPanel>
</Grid>
</DataTemplate>
</controls:AdaptiveGridView.ItemTemplate>
</controls:AdaptiveGridView>
</Grid>
</Page>

View File

@ -1,19 +0,0 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class ContentGridPage : Page
{
public ContentGridViewModel ViewModel
{
get;
}
public ContentGridPage()
{
ViewModel = App.GetService<ContentGridViewModel>();
InitializeComponent();
}
}

View File

@ -1,40 +0,0 @@
<Page
x:Class="Estara.Views.DataGridPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
<controls:DataGrid
AutoGenerateColumns="False"
GridLinesVisibility="Horizontal"
ItemsSource="{x:Bind ViewModel.Source, Mode=OneWay}">
<controls:DataGrid.Resources>
<SolidColorBrush x:Key="DataGridColumnHeaderBackgroundColor" Color="Transparent" />
</controls:DataGrid.Resources>
<controls:DataGrid.Columns>
<!-- TODO: Replace column definitions to match real data. Consider adding Header values to Resources.resw. -->
<controls:DataGridTextColumn Binding="{Binding OrderID}" Header="OrderID" />
<controls:DataGridTextColumn Binding="{Binding OrderDate}" Header="OrderDate" />
<controls:DataGridTextColumn Binding="{Binding Company}" Header="Company" />
<controls:DataGridTextColumn Binding="{Binding ShipTo}" Header="ShipTo" />
<controls:DataGridTextColumn Binding="{Binding OrderTotal}" Header="OrderTotal" />
<controls:DataGridTextColumn Binding="{Binding Status}" Header="Status" />
<controls:DataGridTemplateColumn Header="Symbol">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<FontIcon
HorizontalAlignment="Left"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
Glyph="{Binding Symbol}"
AutomationProperties.Name="{Binding SymbolName}" />
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
</controls:DataGrid.Columns>
</controls:DataGrid>
</Grid>
</Page>

View File

@ -1,21 +0,0 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
// TODO: Change the grid as appropriate for your app. Adjust the column definitions on DataGridPage.xaml.
// For more details, see the documentation at https://docs.microsoft.com/windows/communitytoolkit/controls/datagrid.
public sealed partial class DataGridPage : Page
{
public DataGridViewModel ViewModel
{
get;
}
public DataGridPage()
{
ViewModel = App.GetService<DataGridViewModel>();
InitializeComponent();
}
}

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.HostPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -4,16 +4,16 @@ using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class MainPage : Page
public sealed partial class HostPage : Page
{
public MainViewModel ViewModel
public HostViewModel ViewModel
{
get;
}
public MainPage()
public HostPage()
{
ViewModel = App.GetService<MainViewModel>();
ViewModel = App.GetService<HostViewModel>();
InitializeComponent();
}
}
}

View File

@ -1,73 +0,0 @@
<UserControl
x:Class="Estara.Views.ListDetailsDetailControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<ScrollViewer
Name="ForegroundElement"
HorizontalAlignment="Stretch"
VerticalScrollMode="Enabled"
IsTabStop="True">
<StackPanel HorizontalAlignment="Left">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="48"
Glyph="{x:Bind ListDetailsMenuItem.Symbol, Mode=OneWay}"
AutomationProperties.Name="{x:Bind ListDetailsMenuItem.SymbolName, Mode=OneWay}" />
<TextBlock
Margin="{StaticResource SmallLeftMargin}"
VerticalAlignment="Center"
Text="{x:Bind ListDetailsMenuItem.Company, Mode=OneWay}"
Style="{ThemeResource TitleTextBlockStyle}" />
</StackPanel>
<StackPanel Padding="0,15,0,0">
<TextBlock Text="Status" Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock Text="{x:Bind ListDetailsMenuItem.Status, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Text="Order date"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock Text="{x:Bind ListDetailsMenuItem.OrderDate, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Text="Company"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock Text="{x:Bind ListDetailsMenuItem.Company, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Text="Ship to"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock Text="{x:Bind ListDetailsMenuItem.ShipTo, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Text="Order total"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock Text="{x:Bind ListDetailsMenuItem.OrderTotal, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Text="Note 1"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock
Style="{StaticResource DetailBodyStyle}"
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
<TextBlock
Margin="{StaticResource SmallTopMargin}"
Text="Note 2"
Style="{StaticResource DetailSubTitleStyle}" />
<TextBlock
Margin="{StaticResource MediumBottomMargin}"
Style="{StaticResource DetailBodyStyle}"
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
</StackPanel>
</StackPanel>
</ScrollViewer>
</UserControl>

View File

@ -1,30 +0,0 @@
using Estara.Core.Models;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class ListDetailsDetailControl : UserControl
{
public SampleOrder? ListDetailsMenuItem
{
get => GetValue(ListDetailsMenuItemProperty) as SampleOrder;
set => SetValue(ListDetailsMenuItemProperty, value);
}
public static readonly DependencyProperty ListDetailsMenuItemProperty = DependencyProperty.Register("ListDetailsMenuItem", typeof(SampleOrder), typeof(ListDetailsDetailControl), new PropertyMetadata(null, OnListDetailsMenuItemPropertyChanged));
public ListDetailsDetailControl()
{
InitializeComponent();
}
private static void OnListDetailsMenuItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is ListDetailsDetailControl control)
{
control.ForegroundElement.ChangeView(0, 0, 1);
}
}
}

View File

@ -1,100 +0,0 @@
<Page
x:Class="Estara.Views.ListDetailsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:models="using:Estara.Core.Models"
xmlns:views="using:Estara.Views"
xmlns:behaviors="using:Estara.Behaviors"
behaviors:NavigationViewHeaderBehavior.HeaderMode="Never"
mc:Ignorable="d">
<Page.Resources>
<DataTemplate x:Key="ItemTemplate" x:DataType="models:SampleOrder">
<Grid Height="60">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<FontIcon
Grid.Column="0"
VerticalAlignment="Center"
FontSize="32"
Glyph="{x:Bind Symbol}"
AutomationProperties.Name="{x:Bind SymbolName}" />
<StackPanel
Grid.Column="1"
Margin="{StaticResource SmallLeftMargin}"
VerticalAlignment="Center">
<TextBlock Text="{x:Bind Company}" Style="{StaticResource ListTitleStyle}" />
<TextBlock Text="{x:Bind Status}" Style="{StaticResource ListSubTitleStyle}" />
</StackPanel>
</Grid>
</DataTemplate>
<DataTemplate x:Key="DetailsTemplate">
<Grid>
<views:ListDetailsDetailControl ListDetailsMenuItem="{Binding}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="NoSelectionContentTemplate">
<Grid>
<TextBlock
x:Uid="ListDetails_NoSelection"
HorizontalAlignment="Center"
VerticalAlignment="Center"
TextAlignment="Center"
Style="{ThemeResource SubtitleTextBlockStyle}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="ListHeaderTemplate">
<Grid Height="40">
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource ListTitleStyle}"
Text="{Binding}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="MinimalListHeaderTemplate">
<Grid Height="40">
<TextBlock
Margin="96,0,0,0"
VerticalAlignment="Center"
Style="{StaticResource ListTitleStyle}"
Text="{Binding}" />
</Grid>
</DataTemplate>
</Page.Resources>
<Grid x:Name="ContentArea">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<!--641 is the default CompactModeThresholdWidth in NavigationView -->
<AdaptiveTrigger MinWindowWidth="641" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="ListDetailsViewControl.ListHeaderTemplate" Value="{StaticResource ListHeaderTemplate}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<controls:ListDetailsView
x:Uid="ListDetails"
x:Name="ListDetailsViewControl"
BackButtonBehavior="Manual"
Background="Transparent"
BorderBrush="Transparent"
DetailsTemplate="{StaticResource DetailsTemplate}"
ItemsSource="{x:Bind ViewModel.SampleItems}"
ItemTemplate="{StaticResource ItemTemplate}"
ListHeaderTemplate="{StaticResource MinimalListHeaderTemplate}"
NoSelectionContentTemplate="{StaticResource NoSelectionContentTemplate}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=TwoWay}"
ViewStateChanged="OnViewStateChanged"/>
</Grid>
</Page>

View File

@ -1,29 +0,0 @@
using CommunityToolkit.WinUI.UI.Controls;
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class ListDetailsPage : Page
{
public ListDetailsViewModel ViewModel
{
get;
}
public ListDetailsPage()
{
ViewModel = App.GetService<ListDetailsViewModel>();
InitializeComponent();
}
private void OnViewStateChanged(object sender, ListDetailsViewState e)
{
if (e == ListDetailsViewState.Both)
{
ViewModel.EnsureItemSelected();
}
}
}

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.PackagesPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class PackagesPage : Page
{
public PackagesViewModel ViewModel
{
get;
}
public PackagesPage()
{
ViewModel = App.GetService<PackagesViewModel>();
InitializeComponent();
}
}

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.PlacesPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class PlacesPage : Page
{
public PlacesViewModel ViewModel
{
get;
}
public PlacesPage()
{
ViewModel = App.GetService<PlacesViewModel>();
InitializeComponent();
}
}

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.PlayPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class PlayPage : Page
{
public PlayViewModel ViewModel
{
get;
}
public PlayPage()
{
ViewModel = App.GetService<PlayViewModel>();
InitializeComponent();
}
}

View File

@ -60,7 +60,7 @@
x:Uid="Settings_AboutDescription"
Margin="{StaticResource XSmallTopMargin}"
Style="{ThemeResource BodyTextBlockStyle}" />
<HyperlinkButton x:Uid="SettingsPage_PrivacyTermsLink" Margin="{StaticResource SettingsPageHyperlinkButtonMargin}" />
<HyperlinkButton x:Uid="SettingsPage_SourceLink" Margin="{StaticResource SettingsPageHyperlinkButtonMargin}" />
</StackPanel>
</StackPanel>
</Grid>

View File

@ -4,7 +4,6 @@ using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
// TODO: Set the URL for your privacy policy by updating SettingsPage_PrivacyTermsLink.NavigateUri in Resources.resw.
public sealed partial class SettingsPage : Page
{
public SettingsViewModel ViewModel

View File

@ -28,7 +28,7 @@
<NavigationView
x:Name="NavigationViewControl"
Canvas.ZIndex="0"
IsBackButtonVisible="Visible"
IsBackButtonVisible="Collapsed"
IsBackEnabled="{x:Bind ViewModel.IsBackEnabled, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"
IsSettingsVisible="True"
@ -43,24 +43,39 @@
TODO: Update item icons by updating FontIcon.Glyph properties.
https://docs.microsoft.com/windows/apps/design/style/segoe-fluent-icons-font#icon-list
-->
<NavigationViewItem x:Uid="Shell_Main" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.MainViewModel">
<NavigationViewItem x:Uid="Shell_Play" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.PlayViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe7c3;"/>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe768;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_ListDetails" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.ListDetailsViewModel">
<NavigationViewItem x:Uid="Shell_Host" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.HostViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xea37;"/>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe774;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_ContentGrid" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.ContentGridViewModel">
<NavigationViewItem x:Uid="Shell_Character" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.CharacterViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xf0e2;"/>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe776;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_DataGrid" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.DataGridViewModel">
<NavigationViewItem x:Uid="Shell_Versions" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.VersionsViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe80a;"/>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe71d;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_Places" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.PlacesViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe707;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_Packages" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.PackagesViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xe7b8;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem x:Uid="Shell_Bookmarks" helpers:NavigationHelper.NavigateTo="Estara.ViewModels.BookmarksViewModel">
<NavigationViewItem.Icon>
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xeb51;"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
</NavigationView.MenuItems>

View File

@ -11,7 +11,6 @@ using Windows.System;
namespace Estara.Views;
// TODO: Update NavigationViewItem titles and icons in ShellPage.xaml.
public sealed partial class ShellPage : Page
{
public ShellViewModel ViewModel

View File

@ -0,0 +1,12 @@
<Page
x:Class="Estara.Views.VersionsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
</Grid>
</Page>

View File

@ -0,0 +1,19 @@
using Estara.ViewModels;
using Microsoft.UI.Xaml.Controls;
namespace Estara.Views;
public sealed partial class VersionsPage : Page
{
public VersionsViewModel ViewModel
{
get;
}
public VersionsPage()
{
ViewModel = App.GetService<VersionsViewModel>();
InitializeComponent();
}
}

View File

@ -1,6 +1,13 @@
# Estara
A Kiseki experiment
# Notice
We want to inform you that our project is currently a work in progress. While it is open source and available for developers to explore, please be aware that Estara is not intended for regular user consumption. Unless you are experienced in software development, we kindly advise against installing Estara in its current state. Thank you for your understanding.
# Requirements
- 64-bit version of Windows build 17763 or greater (i.e., Version 1809 or greater)
- .NET 7 runtime (download via `winget install Microsoft.DotNet.SDK.7`)
# License
```
Estara - A Kiseki experiment