diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab92f04..a7fc160 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,27 @@
# Change Log
+## v1.0.3 (May 27, 2023)
+
+This release contains critical fixes and improvements.
+
+### Added
+
+* Added tile status indicators (https://github.com/alekseynemiro/tapplayer/issues/33).
+
+### Changed
+
+* Improved color palette (https://github.com/alekseynemiro/tapplayer/issues/38).
+* Increased font size and increased spacing between controls (https://github.com/alekseynemiro/tapplayer/issues/37).
+* Changed labels on some buttons (https://github.com/alekseynemiro/tapplayer/issues/46).
+* Improved accessibility (https://github.com/alekseynemiro/tapplayer/issues/31).
+* Optimized app icon size (https://github.com/alekseynemiro/tapplayer/issues/40).
+
+### Fixed
+
+* Fixed bug with looping playback (https://github.com/alekseynemiro/tapplayer/issues/44).
+* Fixed playback stop issue (https://github.com/alekseynemiro/tapplayer/issues/39).
+* Fixed a bug with updating the project name in the list (https://github.com/alekseynemiro/tapplayer/issues/51).
+
## v1.0.2 (May 20, 2023)
This release contains critical fixes.
diff --git a/README.md b/README.md
index 5438da3..980adbf 100644
--- a/README.md
+++ b/README.md
@@ -2,17 +2,13 @@
This is small an Android app that allows you to play music files when you click (tap) on a tile.
-![TapPlayer](media-kit/banner1024x500.png)
+![TapPlayer](media-kit/banners/banner1024x500.png)
## Install
-Find the latest version in the Releases section:
-
-https://github.com/alekseynemiro/TapPlayer/releases
-
-or install the application through RuStore:
-
-https://apps.rustore.ru/app/ru.nemiro.apps.tapplayer
+* [Google Play](https://play.google.com/store/apps/details?id=ru.nemiro.apps.tapplayer&utm_source=github)
+* [RuStore](https://apps.rustore.ru/app/ru.nemiro.apps.tapplayer)
+* [Download](https://github.com/alekseynemiro/TapPlayer/releases)
## License
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..5e7f116
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,11 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported |
+| ------- | ------------------ |
+| 1.x | :white_check_mark: |
+
+## Reporting a Vulnerability
+
+If you find security issues, please [report them](https://github.com/alekseynemiro/tapplayer/issues/new).
diff --git a/media-kit/DESCRIPTION.md b/media-kit/DESCRIPTION.md
index d41bc7b..3f740e4 100644
--- a/media-kit/DESCRIPTION.md
+++ b/media-kit/DESCRIPTION.md
@@ -1,6 +1,6 @@
# TapPlayer
-![TapPlayer](banner1024x500.png)
+![TapPlayer](banners/banner1024x500.png)
## Short description
diff --git a/media-kit/DESCRIPTION.ru.md b/media-kit/DESCRIPTION.ru.md
index 6072827..09b8871 100644
--- a/media-kit/DESCRIPTION.ru.md
+++ b/media-kit/DESCRIPTION.ru.md
@@ -1,6 +1,6 @@
# TapPlayer
-![TapPlayer](banner1024x500.png)
+![TapPlayer](banners/banner1024x500.png)
## Краткое описание
diff --git a/media-kit/banner1024x500.png b/media-kit/banner1024x500.png
deleted file mode 100644
index 2ccd33d..0000000
Binary files a/media-kit/banner1024x500.png and /dev/null differ
diff --git a/media-kit/banners/banner1024x500.png b/media-kit/banners/banner1024x500.png
new file mode 100644
index 0000000..a673cb0
Binary files /dev/null and b/media-kit/banners/banner1024x500.png differ
diff --git a/media-kit/banners/banner1280x640.png b/media-kit/banners/banner1280x640.png
new file mode 100644
index 0000000..c0354b2
Binary files /dev/null and b/media-kit/banners/banner1280x640.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_1_MainPage.png b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_1_MainPage.png
new file mode 100644
index 0000000..18a9b9c
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_1_MainPage.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_2_ProjectSettings.png b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_2_ProjectSettings.png
new file mode 100644
index 0000000..894bc5a
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_2_ProjectSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_3_TileSettings.png b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_3_TileSettings.png
new file mode 100644
index 0000000..51dceab
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_3_TileSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_4_SelectColor.png b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_4_SelectColor.png
new file mode 100644
index 0000000..33caee3
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Smartphone_Android_4_SelectColor.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_1_MainPage.png b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_1_MainPage.png
new file mode 100644
index 0000000..5835938
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_1_MainPage.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_2_ProjectSettings.png b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_2_ProjectSettings.png
new file mode 100644
index 0000000..43fec81
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_2_ProjectSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_3_TileSettings.png b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_3_TileSettings.png
new file mode 100644
index 0000000..1285e35
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_3_TileSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_4_SelectColor.png b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_4_SelectColor.png
new file mode 100644
index 0000000..7b0fe86
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet10_Android_4_SelectColor.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_1_MainPage.png b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_1_MainPage.png
new file mode 100644
index 0000000..32257aa
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_1_MainPage.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_2_ProjectSettings.png b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_2_ProjectSettings.png
new file mode 100644
index 0000000..8b08d40
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_2_ProjectSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_3_TileSettings.png b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_3_TileSettings.png
new file mode 100644
index 0000000..bc4d254
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_3_TileSettings.png differ
diff --git a/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_4_SelectColor.png b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_4_SelectColor.png
new file mode 100644
index 0000000..fb6b52a
Binary files /dev/null and b/media-kit/history/2023-05-27/2023-05-27_Tablet7_Android_4_SelectColor.png differ
diff --git a/media-kit/history/2023-05-27/README.md b/media-kit/history/2023-05-27/README.md
new file mode 100644
index 0000000..fb2eca1
--- /dev/null
+++ b/media-kit/history/2023-05-27/README.md
@@ -0,0 +1,35 @@
+# 2023-05-27
+
+v1.0.3
+
+## Android
+
+### Smartphone
+
+![Android Smartphone Main](2023-05-27_Smartphone_Android_1_MainPage.png)
+
+![Android Smartphone New Project](2023-05-27_Smartphone_Android_2_ProjectSettings.png)
+
+![Android Smartphone Tile Editor](2023-05-27_Smartphone_Android_3_TileSettings.png)
+
+![Android Smartphone Select color](2023-05-27_Smartphone_Android_4_SelectColor.png)
+
+### Tablet 7''
+
+![Android Smartphone Main](2023-05-27_Tablet7_Android_1_MainPage.png)
+
+![Android Smartphone New Project](2023-05-27_Tablet7_Android_2_ProjectSettings.png)
+
+![Android Smartphone Tile Editor](2023-05-27_Tablet7_Android_3_TileSettings.png)
+
+![Android Smartphone Select color](2023-05-27_Tablet7_Android_4_SelectColor.png)
+
+### Tablet 10''
+
+![Android Smartphone Main](2023-05-27_Tablet10_Android_1_MainPage.png)
+
+![Android Smartphone New Project](2023-05-27_Tablet10_Android_2_ProjectSettings.png)
+
+![Android Smartphone Tile Editor](2023-05-27_Tablet10_Android_3_TileSettings.png)
+
+![Android Smartphone Tile Editor](2023-05-27_Tablet10_Android_4_SelectColor.png)
diff --git a/media-kit/history/README.ru.md b/media-kit/history/README.ru.md
index 91efc4f..72c1570 100644
--- a/media-kit/history/README.ru.md
+++ b/media-kit/history/README.ru.md
@@ -6,6 +6,10 @@
Записи, которые были сделаны в процессе работы над проектом:
+* https://vk.com/aleksey.developer?w=wall-96983816_195 - NotFoundException: 'Resource ID #0x7f0d003a'
+* https://vk.com/aleksey.developer?w=wall-96983816_193 - Организация рабочего процесса над проектом
+* https://vk.com/aleksey.developer?w=wall-96983816_192 - Публикация в Google Play
+* https://vk.com/aleksey.developer?w=wall-96983816_190 - Отправил запрос на публикацию приложения в Google Play
* https://vk.com/aleksey.developer?w=wall-96983816_185 - Результат тестирования приложения в Google Play
* https://vk.com/aleksey.developer?w=wall-96983816_183 - Google Play не поддерживает android:versionCodeMajor o_O
* https://vk.com/aleksey.developer?w=wall-96983816_180 - AndroidSDK съедает место на диске
diff --git a/media-kit/logo/logo.png b/media-kit/logo/logo.png
index e5e7f2f..e7aaafc 100644
Binary files a/media-kit/logo/logo.png and b/media-kit/logo/logo.png differ
diff --git a/media-kit/logo/logo.svg b/media-kit/logo/logo.svg
index 3ac75ed..fdce2bd 100644
--- a/media-kit/logo/logo.svg
+++ b/media-kit/logo/logo.svg
@@ -13,7 +13,10 @@
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
- sodipodi:docname="logo.svg">
+ sodipodi:docname="logo.svg"
+ inkscape:export-filename="F:\Projects\TapPlayer\media-kit\logo\logo256x256.png"
+ inkscape:export-xdpi="48"
+ inkscape:export-ydpi="48">
+
+
+
+
+
+
+
+
+
@@ -64,91 +102,108 @@
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(-22.67857,-18.142859)">
-
-
-
-
-
-
-
-
-
-
-
-
+ transform="translate(-22.67857,-18.142859)"
+ style="display:inline;opacity:0.999">
+
+
+
+
+
+
+
+
+
+
diff --git a/media-kit/logo/logo256x256.png b/media-kit/logo/logo256x256.png
new file mode 100644
index 0000000..1bd319f
Binary files /dev/null and b/media-kit/logo/logo256x256.png differ
diff --git a/media-kit/logo/logo512x512.png b/media-kit/logo/logo512x512.png
index e2d0280..22e9659 100644
Binary files a/media-kit/logo/logo512x512.png and b/media-kit/logo/logo512x512.png differ
diff --git a/media-kit/splash.svg b/media-kit/splash.svg
index 09aa6ca..08228f2 100644
--- a/media-kit/splash.svg
+++ b/media-kit/splash.svg
@@ -7,13 +7,13 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="512"
- height="512"
- viewBox="0 0 135.46668 135.46667"
+ width="64"
+ height="64"
+ viewBox="0 0 16.933335 16.933334"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
- sodipodi:docname="splash.svg">
+ sodipodi:docname="appicon.svg">
+ transform="matrix(0.12479108,0,0,0.11859697,19.848486,15.99117)">
+ width="44.601189"
+ height="46.869045"
+ x="22.678572"
+ y="18.142859" />
+ width="44.601189"
+ height="46.869045"
+ x="68.035706"
+ y="18.331846" />
+ width="44.601189"
+ height="46.869045"
+ x="113.58184"
+ y="18.142859" />
+ width="44.601189"
+ height="46.869045"
+ x="22.678577"
+ y="65.86235" />
+ width="44.601189"
+ height="46.869045"
+ x="68.035713"
+ y="66.051338" />
+ width="44.601189"
+ height="46.869045"
+ x="113.77084"
+ y="65.86235" />
+ width="44.601189"
+ height="46.869045"
+ x="22.67857"
+ y="113.86533" />
+ width="44.601189"
+ height="46.869045"
+ x="68.035706"
+ y="114.05431" />
+ width="44.601189"
+ height="46.869045"
+ x="113.77084"
+ y="113.86533" />
+ inkscape:transform-center-x="-15.647756"
+ transform="matrix(1.0480705,0,0,1.0647624,23.588842,10.174362)"
+ inkscape:transform-center-y="-1.4740642e-06" />
- TapPlayer
- v1
- by Aleksey Nemiro
diff --git a/src/TapPlayer.Maui/App.xaml b/src/TapPlayer.Maui/App.xaml
index b3200c8..59e26d2 100644
--- a/src/TapPlayer.Maui/App.xaml
+++ b/src/TapPlayer.Maui/App.xaml
@@ -15,6 +15,7 @@
+
diff --git a/src/TapPlayer.Maui/AppBuilder.cs b/src/TapPlayer.Maui/AppBuilder.cs
index ae4ebb6..fa161d4 100644
--- a/src/TapPlayer.Maui/AppBuilder.cs
+++ b/src/TapPlayer.Maui/AppBuilder.cs
@@ -18,6 +18,7 @@ public static MauiAppBuilder CreateBuilder()
builder
.UseMauiApp()
+ .UseMauiCommunityToolkit()
.UseMauiCommunityToolkitMediaElement()
.ConfigureFonts(fonts =>
{
diff --git a/src/TapPlayer.Maui/Components/ProjectEdit.xaml b/src/TapPlayer.Maui/Components/ProjectEdit.xaml
index 6fdf456..ab460e4 100644
--- a/src/TapPlayer.Maui/Components/ProjectEdit.xaml
+++ b/src/TapPlayer.Maui/Components/ProjectEdit.xaml
@@ -33,44 +33,50 @@
SizeChanged="MainScrollView_SizeChanged"
>
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
diff --git a/src/TapPlayer.Maui/Components/TileView.xaml b/src/TapPlayer.Maui/Components/TileView.xaml
new file mode 100644
index 0000000..97999f1
--- /dev/null
+++ b/src/TapPlayer.Maui/Components/TileView.xaml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TapPlayer.Maui/Components/TileView.xaml.cs b/src/TapPlayer.Maui/Components/TileView.xaml.cs
new file mode 100644
index 0000000..1006029
--- /dev/null
+++ b/src/TapPlayer.Maui/Components/TileView.xaml.cs
@@ -0,0 +1,100 @@
+using Microsoft.Maui.Graphics.Skia;
+using TapPlayer.Data.Enums;
+using TapPlayer.Maui.ViewModels;
+using Font = Microsoft.Maui.Graphics.Font;
+
+namespace TapPlayer.Maui.Components;
+
+public partial class TileView : ContentView
+{
+ public ITileViewModel Model => (ITileViewModel)BindingContext;
+
+ public TileView()
+ {
+ InitializeComponent();
+
+ BindingContextChanged += TileView_BindingContextChanged;
+ SizeChanged += TileView_SizeChanged;
+ }
+
+ protected void TileView_BindingContextChanged(object sender, EventArgs e)
+ {
+ if (Model == null)
+ {
+ return;
+ }
+
+ Model.Player?.Dispose();
+
+ Model.Player = new MediaPlayerViewModel(MediaPlayer)
+ {
+ Loop = Model.PlayType == PlayType.Loop,
+ };
+ }
+
+ protected void TileView_SizeChanged(object sender, EventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(TileName.Text))
+ {
+ return;
+ }
+
+ double contentWidth = Width - Padding.HorizontalThickness - TileName.Padding.HorizontalThickness;
+ double contentHeight = Height - Padding.VerticalThickness - TileViewConainer.RowDefinitions[0].Height.Value - TileName.Padding.VerticalThickness;
+
+ if (Math.Min(contentWidth, contentHeight) <= 0)
+ {
+ return;
+ }
+
+ double width = contentWidth - (contentWidth * 0.3);
+ double height = contentHeight - (contentHeight * 0.3);
+
+ double ratio = Math.Min(width, height);
+
+ if (ratio <= 0)
+ {
+ return;
+ }
+
+ using var bmp = new SkiaBitmapExportContext((int)width, (int)height, (float)DeviceDisplay.MainDisplayInfo.Density);
+ var font = new Font(TileName.FontFamily);
+ var canvas = bmp.Canvas;
+
+ if (canvas == null)
+ {
+ return;
+ }
+
+ float step = 2.0F;
+ float fontSize = (float)ratio;
+
+ var size = canvas.GetStringSize(
+ TileName.Text,
+ font,
+ fontSize,
+ HorizontalAlignment.Left,
+ VerticalAlignment.Top
+ );
+
+ while (size.Width > width || size.Height > height)
+ {
+ fontSize -= step;
+
+ if (fontSize < 8)
+ {
+ break;
+ }
+
+ size = canvas.GetStringSize(
+ TileName.Text,
+ font,
+ fontSize,
+ HorizontalAlignment.Left,
+ VerticalAlignment.Top
+ );
+ }
+
+ TileName.FontSize = fontSize;
+ }
+}
diff --git a/src/TapPlayer.Maui/Converters/ColorPaletteToSemanticDescriptionConverter.cs b/src/TapPlayer.Maui/Converters/ColorPaletteToSemanticDescriptionConverter.cs
new file mode 100644
index 0000000..fefb608
--- /dev/null
+++ b/src/TapPlayer.Maui/Converters/ColorPaletteToSemanticDescriptionConverter.cs
@@ -0,0 +1,54 @@
+using System.Globalization;
+using TapPlayer.Data.Enums;
+using TapPlayer.Maui.Extensions;
+using TapPlayer.Maui.Resources.Strings;
+
+namespace TapPlayer.Maui.Converters;
+
+internal class ColorPaletteToSemanticDescriptionConverter : IValueConverter
+{
+ private static readonly List ColorNames = new List
+ {
+ "Violet",
+ "Red",
+ "Yellow",
+ "Green",
+ "BlueGreen",
+ "Blue",
+ };
+
+ private static readonly List ColorBrightnessNames = new List
+ {
+ "Light",
+ "Light50",
+ "",
+ "Dark25",
+ "Dark50",
+ "Dark",
+ };
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return null;
+ }
+
+ if (value.GetType() != typeof(ColorPalette))
+ {
+ throw new InvalidCastException();
+ }
+
+ var color = (int)Enum.Parse(value.ToString()) + 1;
+ var group = (int)Math.Ceiling(color / 6.0) - 1;
+ var brightness = (color % 6 == 0 ? 6 : color % 6) - 1;
+ var key = $"Color{ColorNames[group]}{ColorBrightnessNames[brightness]}";
+
+ return CommonStrings.ResourceManager.GetString(key);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+}
diff --git a/src/TapPlayer.Maui/Converters/ColorPaletteToTileIndicatorTintColorConverter.cs b/src/TapPlayer.Maui/Converters/ColorPaletteToTileIndicatorTintColorConverter.cs
new file mode 100644
index 0000000..7091a23
--- /dev/null
+++ b/src/TapPlayer.Maui/Converters/ColorPaletteToTileIndicatorTintColorConverter.cs
@@ -0,0 +1,32 @@
+using Microsoft.Maui.Animations;
+using System.Globalization;
+using TapPlayer.Data.Enums;
+using TapPlayer.Maui.Extensions;
+
+namespace TapPlayer.Maui.Converters;
+
+internal class ColorPaletteToTileIndicatorTintColorConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return null;
+ }
+
+ if (value.GetType() != typeof(ColorPalette))
+ {
+ throw new InvalidCastException();
+ }
+
+ var index = (int)Enum.Parse(value.ToString());
+ var color = (Color)Application.Current.Resources.FindResource($"Color{index + 1}");
+
+ return Color.FromRgb(255, 255, 255).Lerp(color, 0.5);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+}
diff --git a/src/TapPlayer.Maui/Converters/ColorPaletteToTileStyleConverter.cs b/src/TapPlayer.Maui/Converters/ColorPaletteToTileStyleConverter.cs
new file mode 100644
index 0000000..435d8b5
--- /dev/null
+++ b/src/TapPlayer.Maui/Converters/ColorPaletteToTileStyleConverter.cs
@@ -0,0 +1,31 @@
+using System.Globalization;
+using TapPlayer.Data.Enums;
+using TapPlayer.Maui.Extensions;
+
+namespace TapPlayer.Maui.Converters;
+
+internal class ColorPaletteToTileStyleConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return null;
+ }
+
+ if (value.GetType() != typeof(ColorPalette))
+ {
+ throw new InvalidCastException();
+ }
+
+ var color = Enum.Parse(value.ToString());
+ var style = Application.Current.Resources.FindResource($"Tile{(int)color + 1}");
+
+ return style;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+}
diff --git a/src/TapPlayer.Maui/Converters/EmptyValueToBoolConverter.cs b/src/TapPlayer.Maui/Converters/EmptyValueToBoolConverter.cs
new file mode 100644
index 0000000..ed2f7cb
--- /dev/null
+++ b/src/TapPlayer.Maui/Converters/EmptyValueToBoolConverter.cs
@@ -0,0 +1,26 @@
+using System.Globalization;
+
+namespace TapPlayer.Maui.Converters;
+
+internal class EmptyValueToBoolConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return true;
+ }
+
+ if (value.GetType() == typeof(string))
+ {
+ return string.IsNullOrWhiteSpace(value.ToString());
+ }
+
+ throw new NotSupportedException($"{value.GetType()} is not supported.");
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+}
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Converters/FileViewModelConverter.cs b/src/TapPlayer.Maui/Converters/FileViewModelConverter.cs
index 91f61da..b664bfa 100644
--- a/src/TapPlayer.Maui/Converters/FileViewModelConverter.cs
+++ b/src/TapPlayer.Maui/Converters/FileViewModelConverter.cs
@@ -14,6 +14,11 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
return null;
}
+ if (parameter?.ToString()?.Equals("true", StringComparison.OrdinalIgnoreCase) == true)
+ {
+ return file.FullPath;
+ }
+
return file.Name;
}
diff --git a/src/TapPlayer.Maui/Converters/ReduceValueConverter.cs b/src/TapPlayer.Maui/Converters/ReduceValueConverter.cs
new file mode 100644
index 0000000..d1ced82
--- /dev/null
+++ b/src/TapPlayer.Maui/Converters/ReduceValueConverter.cs
@@ -0,0 +1,29 @@
+using System.Globalization;
+
+namespace TapPlayer.Maui.Converters;
+
+internal class ReduceValueConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return value;
+ }
+
+ if (System.Convert.ToInt32(value, CultureInfo.InvariantCulture) < 0)
+ {
+ return value;
+ }
+
+ var result = System.Convert.ToInt32(value, CultureInfo.InvariantCulture)
+ - System.Convert.ToInt32(parameter, CultureInfo.InvariantCulture);
+
+ return result;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return System.Convert.ToDouble(value, CultureInfo.InvariantCulture);
+ }
+}
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/MainPage.xaml b/src/TapPlayer.Maui/MainPage.xaml
index 49b1c18..b1e5906 100644
--- a/src/TapPlayer.Maui/MainPage.xaml
+++ b/src/TapPlayer.Maui/MainPage.xaml
@@ -16,9 +16,11 @@
VerticalOptions="Fill"
HorizontalOptions="Fill"
IsVisible="{Binding ShowTiles}"
+ RowSpacing="2"
+ ColumnSpacing="2"
/>
@@ -64,91 +102,108 @@
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(-22.67857,-18.142859)">
-
-
-
-
-
-
-
-
-
-
-
-
+ transform="translate(-22.67857,-18.142859)"
+ style="display:inline;opacity:0.999">
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TapPlayer.Maui/Resources/Images/background.svg b/src/TapPlayer.Maui/Resources/Images/background.svg
new file mode 100644
index 0000000..20e7756
--- /dev/null
+++ b/src/TapPlayer.Maui/Resources/Images/background.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Resources/Images/error.svg b/src/TapPlayer.Maui/Resources/Images/error.svg
new file mode 100644
index 0000000..67ea523
--- /dev/null
+++ b/src/TapPlayer.Maui/Resources/Images/error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Resources/Images/loop.svg b/src/TapPlayer.Maui/Resources/Images/loop.svg
new file mode 100644
index 0000000..f72d52d
--- /dev/null
+++ b/src/TapPlayer.Maui/Resources/Images/loop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Resources/Images/play2.svg b/src/TapPlayer.Maui/Resources/Images/play2.svg
new file mode 100644
index 0000000..dba685f
--- /dev/null
+++ b/src/TapPlayer.Maui/Resources/Images/play2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Resources/Images/tapplayer.svg b/src/TapPlayer.Maui/Resources/Images/tapplayer.svg
index 08228f2..fdce2bd 100644
--- a/src/TapPlayer.Maui/Resources/Images/tapplayer.svg
+++ b/src/TapPlayer.Maui/Resources/Images/tapplayer.svg
@@ -7,13 +7,16 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64"
- height="64"
- viewBox="0 0 16.933335 16.933334"
+ width="512"
+ height="512"
+ viewBox="0 0 135.46668 135.46667"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
- sodipodi:docname="appicon.svg">
+ sodipodi:docname="logo.svg"
+ inkscape:export-filename="F:\Projects\TapPlayer\media-kit\logo\logo256x256.png"
+ inkscape:export-xdpi="48"
+ inkscape:export-ydpi="48">
+
+
+
+
+
+
+
+
+
@@ -64,91 +102,108 @@
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(-22.67857,-18.142859)">
-
-
-
-
-
-
-
-
-
-
-
-
+ transform="translate(-22.67857,-18.142859)"
+ style="display:inline;opacity:0.999">
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TapPlayer.Maui/Resources/Images/volume_off.svg b/src/TapPlayer.Maui/Resources/Images/volume_off.svg
new file mode 100644
index 0000000..5266dc0
--- /dev/null
+++ b/src/TapPlayer.Maui/Resources/Images/volume_off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.Designer.cs b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.Designer.cs
index 01b6302..a1b6603 100644
--- a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.Designer.cs
+++ b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.Designer.cs
@@ -87,6 +87,15 @@ internal static string Background {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Background playback.
+ ///
+ internal static string BackgroundPlayback {
+ get {
+ return ResourceManager.GetString("BackgroundPlayback", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Cancel.
///
@@ -132,6 +141,168 @@ internal static string CloseTileEditor {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Blue.
+ ///
+ internal static string ColorBlue {
+ get {
+ return ResourceManager.GetString("ColorBlue", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark blue.
+ ///
+ internal static string ColorBlueDark {
+ get {
+ return ResourceManager.GetString("ColorBlueDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark blue 25%.
+ ///
+ internal static string ColorBlueDark25 {
+ get {
+ return ResourceManager.GetString("ColorBlueDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark blue 50%.
+ ///
+ internal static string ColorBlueDark50 {
+ get {
+ return ResourceManager.GetString("ColorBlueDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Sea wave.
+ ///
+ internal static string ColorBlueGreen {
+ get {
+ return ResourceManager.GetString("ColorBlueGreen", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sea wave.
+ ///
+ internal static string ColorBlueGreenDark {
+ get {
+ return ResourceManager.GetString("ColorBlueGreenDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sea wave 25%.
+ ///
+ internal static string ColorBlueGreenDark25 {
+ get {
+ return ResourceManager.GetString("ColorBlueGreenDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sea wave 50%.
+ ///
+ internal static string ColorBlueGreenDark50 {
+ get {
+ return ResourceManager.GetString("ColorBlueGreenDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light sea wave.
+ ///
+ internal static string ColorBlueGreenLight {
+ get {
+ return ResourceManager.GetString("ColorBlueGreenLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light sea wave 50%.
+ ///
+ internal static string ColorBlueGreenLight50 {
+ get {
+ return ResourceManager.GetString("ColorBlueGreenLight50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light blue.
+ ///
+ internal static string ColorBlueLight {
+ get {
+ return ResourceManager.GetString("ColorBlueLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light blue 50%.
+ ///
+ internal static string ColorBlueLight50 {
+ get {
+ return ResourceManager.GetString("ColorBlueLight50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Green.
+ ///
+ internal static string ColorGreen {
+ get {
+ return ResourceManager.GetString("ColorGreen", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark green.
+ ///
+ internal static string ColorGreenDark {
+ get {
+ return ResourceManager.GetString("ColorGreenDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark green 25%.
+ ///
+ internal static string ColorGreenDark25 {
+ get {
+ return ResourceManager.GetString("ColorGreenDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark green 50%.
+ ///
+ internal static string ColorGreenDark50 {
+ get {
+ return ResourceManager.GetString("ColorGreenDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light green.
+ ///
+ internal static string ColorGreenLight {
+ get {
+ return ResourceManager.GetString("ColorGreenLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light green 50%.
+ ///
+ internal static string ColorGreenLight50 {
+ get {
+ return ResourceManager.GetString("ColorGreenLight50", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Color palette.
///
@@ -141,6 +312,168 @@ internal static string ColorPalette {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Red.
+ ///
+ internal static string ColorRed {
+ get {
+ return ResourceManager.GetString("ColorRed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark red.
+ ///
+ internal static string ColorRedDark {
+ get {
+ return ResourceManager.GetString("ColorRedDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark red 25%.
+ ///
+ internal static string ColorRedDark25 {
+ get {
+ return ResourceManager.GetString("ColorRedDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark red 50%.
+ ///
+ internal static string ColorRedDark50 {
+ get {
+ return ResourceManager.GetString("ColorRedDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light red.
+ ///
+ internal static string ColorRedLight {
+ get {
+ return ResourceManager.GetString("ColorRedLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light red 50%.
+ ///
+ internal static string ColorRedLight50 {
+ get {
+ return ResourceManager.GetString("ColorRedLight50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Violet.
+ ///
+ internal static string ColorViolet {
+ get {
+ return ResourceManager.GetString("ColorViolet", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark violet.
+ ///
+ internal static string ColorVioletDark {
+ get {
+ return ResourceManager.GetString("ColorVioletDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark violet 25%.
+ ///
+ internal static string ColorVioletDark25 {
+ get {
+ return ResourceManager.GetString("ColorVioletDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark violet 50%.
+ ///
+ internal static string ColorVioletDark50 {
+ get {
+ return ResourceManager.GetString("ColorVioletDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light violet.
+ ///
+ internal static string ColorVioletLight {
+ get {
+ return ResourceManager.GetString("ColorVioletLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light violet 50%.
+ ///
+ internal static string ColorVioletLight50 {
+ get {
+ return ResourceManager.GetString("ColorVioletLight50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Sand.
+ ///
+ internal static string ColorYellow {
+ get {
+ return ResourceManager.GetString("ColorYellow", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sand.
+ ///
+ internal static string ColorYellowDark {
+ get {
+ return ResourceManager.GetString("ColorYellowDark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sand 25%.
+ ///
+ internal static string ColorYellowDark25 {
+ get {
+ return ResourceManager.GetString("ColorYellowDark25", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Dark sand 50%.
+ ///
+ internal static string ColorYellowDark50 {
+ get {
+ return ResourceManager.GetString("ColorYellowDark50", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light sand.
+ ///
+ internal static string ColorYellowLight {
+ get {
+ return ResourceManager.GetString("ColorYellowLight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на Light sand 50%.
+ ///
+ internal static string ColorYellowLight50 {
+ get {
+ return ResourceManager.GetString("ColorYellowLight50", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Confirmation.
///
@@ -159,6 +492,15 @@ internal static string CreateProject {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Delete project.
+ ///
+ internal static string DeleteProject {
+ get {
+ return ResourceManager.GetString("DeleteProject", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Error.
///
@@ -177,6 +519,15 @@ internal static string Exit {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Is playing.
+ ///
+ internal static string IsPlaying {
+ get {
+ return ResourceManager.GetString("IsPlaying", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Loop.
///
@@ -186,6 +537,15 @@ internal static string Loop {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Looped playback.
+ ///
+ internal static string LoopedPlayback {
+ get {
+ return ResourceManager.GetString("LoopedPlayback", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на New project.
///
@@ -195,6 +555,15 @@ internal static string NewProject {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Playback file not selected.
+ ///
+ internal static string NoSource {
+ get {
+ return ResourceManager.GetString("NoSource", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Ok.
///
@@ -205,7 +574,17 @@ internal static string Ok {
}
///
- /// Ищет локализованную строку, похожую на To get started, open a project or create a new one..
+ /// Ищет локализованную строку, похожую на Apply changes and close the tile config dialog..
+ ///
+ internal static string OkTileEditor {
+ get {
+ return ResourceManager.GetString("OkTileEditor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Ищет локализованную строку, похожую на To get started, open a project
+ ///or create a new one:.
///
internal static string OpenOrCreateProjectToStart {
get {
@@ -303,15 +682,6 @@ internal static string SaveProject {
}
}
- ///
- /// Ищет локализованную строку, похожую на Save changes of tile settings..
- ///
- internal static string SaveTile {
- get {
- return ResourceManager.GetString("SaveTile", resourceCulture);
- }
- }
-
///
/// Ищет локализованную строку, похожую на Select color.
///
@@ -384,6 +754,15 @@ internal static string TitleSettings {
}
}
+ ///
+ /// Ищет локализованную строку, похожую на Unable to play due to an error.
+ ///
+ internal static string UnableToPlay {
+ get {
+ return ResourceManager.GetString("UnableToPlay", resourceCulture);
+ }
+ }
+
///
/// Ищет локализованную строку, похожую на Yes.
///
diff --git a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.resx b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.resx
index 9b621ce..82f1184 100644
--- a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.resx
+++ b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.resx
@@ -129,6 +129,10 @@
background
Checkbox
+
+ Background playback
+ Semantic
+
Cancel
Button
@@ -145,10 +149,154 @@
Close the tile editor without saving changes.
+
+ Blue
+ Semantic
+
+
+ Dark blue
+ Semantic
+
+
+ Dark blue 25%
+ Semantic
+
+
+ Dark blue 50%
+ Semantic
+
+
+ Sea wave
+ Semantic
+
+
+ Dark sea wave
+ Semantic
+
+
+ Dark sea wave 25%
+ Semantic
+
+
+ Dark sea wave 50%
+ Semantic
+
+
+ Light sea wave
+ Semantic
+
+
+ Light sea wave 50%
+ Semantic
+
+
+ Light blue
+ Semantic
+
+
+ Light blue 50%
+ Semantic
+
+
+ Green
+ Semantic
+
+
+ Dark green
+ Semantic
+
+
+ Dark green 25%
+ Semantic
+
+
+ Dark green 50%
+ Semantic
+
+
+ Light green
+ Semantic
+
+
+ Light green 50%
+ Semantic
+
Color palette
Title
+
+ Red
+ Semantic
+
+
+ Dark red
+ Semantic
+
+
+ Dark red 25%
+ Semantic
+
+
+ Dark red 50%
+ Semantic
+
+
+ Light red
+ Semantic
+
+
+ Light red 50%
+ Semantic
+
+
+ Violet
+ Semantic
+
+
+ Dark violet
+ Semantic
+
+
+ Dark violet 25%
+ Semantic
+
+
+ Dark violet 50%
+ Semantic
+
+
+ Light violet
+ Semantic
+
+
+ Light violet 50%
+ Semantic
+
+
+ Sand
+ Semantic
+
+
+ Dark sand
+ Semantic
+
+
+ Dark sand 25%
+ Semantic
+
+
+ Dark sand 50%
+ Semantic
+
+
+ Light sand
+ Semantic
+
+
+ Light sand 50%
+ Semantic
+
Confirmation
Title
@@ -157,6 +305,10 @@
Create project
Menu/Button
+
+ Delete project
+ Semantic
+
Error
Title
@@ -165,25 +317,42 @@
Exit
Menu
+
+ Is playing
+ Semantic
+
Loop
Radio
+
+ Looped playback
+ Semantic
+
New project
Title
+
+ Playback file not selected
+ Semantic
+
Ok
Button
+
+ Apply changes and close the tile config dialog.
+ Semantic
+
- To get started, open a project or create a new one.
+ To get started, open a project
+or create a new one:
Message
Open project
- Menu/Button
+ Menu/Button/Semantic
Play once
@@ -211,7 +380,7 @@
Project settings
- Menu/Title
+ Menu/Title/Semantic
Save
@@ -220,9 +389,6 @@
Save changes of project settings.
-
- Save changes of tile settings.
-
Select color
Button
@@ -253,6 +419,10 @@
Tile settings
Title
+
+ Unable to play due to an error
+ Semantic
+
Yes
Button
diff --git a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.ru.resx b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.ru.resx
index 54019af..1fef6b4 100644
--- a/src/TapPlayer.Maui/Resources/Strings/CommonStrings.ru.resx
+++ b/src/TapPlayer.Maui/Resources/Strings/CommonStrings.ru.resx
@@ -128,6 +128,9 @@
играть в фоне, не останавливая другие звуки
+
+ Воспроизведение в фоне
+
Отмена
@@ -143,32 +146,156 @@
Закрыть настройки плитки без сохранения изменений.
+
+ Синий
+
+
+ Тёмно-синий
+
+
+ Тёмно-синий 25%
+
+
+ Тёмно-синий 50%
+
+
+ Морская волна
+
+
+ Тёмная морская волна
+
+
+ Тёмная морская волна 25%
+
+
+ Тёмная морская волна 50%
+
+
+ Светлая морская волна
+
+
+ Светлая морская волна 50%
+
+
+ Светло-синий
+
+
+ Светло-синий 50%
+
+
+ Зелёный
+
+
+ Тёмно-зелёный
+
+
+ Тёмно-зелёный 25%
+
+
+ Тёмно-зелёный 50%
+
+
+ Светло-зелёный
+
+
+ Светло-зелёный 50%
+
Палитра
+
+ Красный
+
+
+ Тёмно-красный
+
+
+ Тёмно-красный 25%
+
+
+ Тёмно-красный 50%
+
+
+ Светло-красный
+
+
+ Светло-красный 50%
+
+
+ Фиолетовый
+
+
+ Тёмно-фиолетовый
+
+
+ Тёмно-фиолетовый 25%
+
+
+ Тёмно-фиолетовый 50%
+
+
+ Светло-фиолетовый
+
+
+ Светло-фиолетовый 50%
+
+
+ Песочный
+
+
+ Тёмно-песочный
+
+
+ Тёмно-песочный 25%
+
+
+ Тёмно-песочный 50%
+
+
+ Светло-песочный
+
+
+ Светло-песочный 50%
+
Подтверждение
Новый проект
+
+ Удалить проект
+
Ошибка
Выход
+
+ Играет сейчас
+
зациклить
+
+ Цикличное воспроизведение
+
Новый проект
+
+ Файл не выбран
+
Ok
+
+ Применить изменения настроек плитки и закрыть диалог.
+
- Откройте существующий проект или создайте новый.
+ Откройте существующий проект
+или создайте новый:
Открыть проект
@@ -200,9 +327,6 @@
Сохранить изменения настроек проекта и закрыть диалог.
-
- Сохранить изменения настроек плитки и закрыть диалог.
-
Выбрать цвет
@@ -227,6 +351,9 @@
Параметры плитки
+
+ Невозможно воспроизвести
+
Да
diff --git a/src/TapPlayer.Maui/Resources/Styles/Styles.xaml b/src/TapPlayer.Maui/Resources/Styles/Styles.xaml
index 71698b6..baddd71 100644
--- a/src/TapPlayer.Maui/Resources/Styles/Styles.xaml
+++ b/src/TapPlayer.Maui/Resources/Styles/Styles.xaml
@@ -39,9 +39,10 @@
-
+
-
+
+
@@ -82,7 +83,7 @@
-
+
@@ -102,7 +103,7 @@
-
+
@@ -140,7 +141,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TapPlayer.Maui/SelectColorPage.xaml b/src/TapPlayer.Maui/SelectColorPage.xaml
index 6d1bf0d..11421fe 100644
--- a/src/TapPlayer.Maui/SelectColorPage.xaml
+++ b/src/TapPlayer.Maui/SelectColorPage.xaml
@@ -11,6 +11,7 @@
+
@@ -60,6 +61,7 @@
Clicked="Color_Clicked"
WidthRequest="{Binding CellWidth, Source={x:Reference Me}}"
HeightRequest="{Binding CellHeight, Source={x:Reference Me}}"
+ SemanticProperties.Description="{Binding ., Converter={StaticResource ColorPaletteToSemanticDescriptionConverter}}"
/>
diff --git a/src/TapPlayer.Maui/Services/AppInfo.cs b/src/TapPlayer.Maui/Services/AppInfo.cs
index 404b59e..5830307 100644
--- a/src/TapPlayer.Maui/Services/AppInfo.cs
+++ b/src/TapPlayer.Maui/Services/AppInfo.cs
@@ -12,7 +12,7 @@ internal class AppInfo : IAppInfo
public string VersionString => $"{Version.Major}.{Version.Minor}.{Version.Revision}";
- public Version Version => new Version(1, 0, 0, 2);
+ public Version Version => new Version(1, 0, 0, 3);
public string BuildString => "0";
diff --git a/src/TapPlayer.Maui/Services/ITapPlayerService.cs b/src/TapPlayer.Maui/Services/ITapPlayerService.cs
index 27055c2..4608c42 100644
--- a/src/TapPlayer.Maui/Services/ITapPlayerService.cs
+++ b/src/TapPlayer.Maui/Services/ITapPlayerService.cs
@@ -7,7 +7,7 @@ public interface ITapPlayerService
{
void Set(ObservableCollection tiles);
- void StopAllExcludingBackground();
+ void StopAllExcludingBackground(Func additionalConditions);
void StopAll();
diff --git a/src/TapPlayer.Maui/Services/NavigationService.cs b/src/TapPlayer.Maui/Services/NavigationService.cs
index 22f71d2..3e43fae 100644
--- a/src/TapPlayer.Maui/Services/NavigationService.cs
+++ b/src/TapPlayer.Maui/Services/NavigationService.cs
@@ -1,4 +1,5 @@
using TapPlayer.Core.Services.Projects;
+using TapPlayer.Maui.ViewModels;
namespace TapPlayer.Maui.Services;
@@ -85,6 +86,7 @@ public async Task CloseProjectEditor()
if (prevPage is ProjectListPage)
{
+ ((IProjectListPageViewModel)prevPage.BindingContext).LoadCommand.Execute(null);
await PopAsync();
}
else
diff --git a/src/TapPlayer.Maui/Services/TapPlayerService.cs b/src/TapPlayer.Maui/Services/TapPlayerService.cs
index fd0e858..c98717a 100644
--- a/src/TapPlayer.Maui/Services/TapPlayerService.cs
+++ b/src/TapPlayer.Maui/Services/TapPlayerService.cs
@@ -17,11 +17,12 @@ public void Set(ObservableCollection tiles)
}
}
- public void StopAllExcludingBackground()
+ public void StopAllExcludingBackground(Func additionalConditions)
{
var activeTiles = _tiles
.Where(x => x.Player != null && x.Player.IsPlaying)
.Where(x => !x.IsBackground)
+ .Where(additionalConditions)
.ToList();
foreach (var tile in activeTiles)
diff --git a/src/TapPlayer.Maui/TapPlayer.Maui.csproj b/src/TapPlayer.Maui/TapPlayer.Maui.csproj
index 56ce621..64184fd 100644
--- a/src/TapPlayer.Maui/TapPlayer.Maui.csproj
+++ b/src/TapPlayer.Maui/TapPlayer.Maui.csproj
@@ -16,8 +16,8 @@
285CA652-00D1-4F06-B73E-B9FA1B95B70D
- 1.0.2
- 20230520
+ 1.0.3
+ 20230527
33.0
10.0.17763.0
@@ -33,14 +33,14 @@
False
- 20230520
- 1.0.2
+ 20230527
+ 1.0.3
True
- 20230520
- 1.0.2
+ 20230527
+ 1.0.3
False
aab
../../build/app.keystore
@@ -50,13 +50,13 @@
- 20230520
- 1.0.2
+ 20230527
+ 1.0.3
- 20230520
- 1.0.2
+ 20230527
+ 1.0.3
@@ -69,6 +69,11 @@
+
+
+
+
+
@@ -78,15 +83,21 @@
+
+
+
+
+
+
@@ -102,12 +113,18 @@
MSBuild:Compile
+
+ MSBuild:Compile
+
MSBuild:Compile
MSBuild:Compile
+
+ MSBuild:Compile
+
MSBuild:Compile
@@ -138,6 +155,9 @@
+
+ TileView.xaml
+
True
True
diff --git a/src/TapPlayer.Maui/TileEditPage.xaml b/src/TapPlayer.Maui/TileEditPage.xaml
index 0b4b9ba..4cf6159 100644
--- a/src/TapPlayer.Maui/TileEditPage.xaml
+++ b/src/TapPlayer.Maui/TileEditPage.xaml
@@ -11,10 +11,12 @@
+
@@ -39,7 +41,7 @@
-
+
@@ -78,9 +88,10 @@
>
@@ -98,11 +109,11 @@
-
+