diff --git a/NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp b/NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp
index d15ba97..bd86402 100644
--- a/NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp
+++ b/NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp
@@ -528,6 +528,7 @@ Adw.PreferencesWindow _root {
Gtk.Button _addFgColorButton {
icon-name: "list-add-symbolic";
+ tooltip-text: _("Add foreground color");
styles [ "circular" ]
}
@@ -549,6 +550,7 @@ Adw.PreferencesWindow _root {
Gtk.Button _addBgColorButton {
icon-name: "list-add-symbolic";
+ tooltip-text: _("Add background color");
styles [ "circular" ]
}
@@ -562,62 +564,109 @@ Adw.PreferencesWindow _root {
}
Adw.PreferencesPage {
- title: _("Image");
+ title: _("Images");
icon-name: "image-x-generic-symbolic";
Gtk.Box {
orientation: vertical;
+ margin-top: 12;
+ margin-start: 12;
+ margin-end: 12;
+ margin-bottom: 12;
+ spacing: 12;
Gtk.Box {
- spacing: 6;
+ Gtk.Box {
+ Gtk.ToggleButton _bgImgButton {
+ label: _("Background");
+ active: true;
+ }
- Gtk.Button _addImageButton {
- halign: start;
- margin-top: 12;
- margin-start: 12;
- margin-end: 12;
- margin-bottom: 6;
+ Gtk.ToggleButton {
+ label: _("Foreground");
+ active: bind _bgImgButton.active bidirectional inverted;
+ }
+
+ styles ["linked"]
+ }
+ Gtk.Separator {
+ hexpand: true;
+
+ styles ["spacer"]
+ }
+
+ Gtk.Button _addImageButton {
Adw.ButtonContent {
label: _("Add Image");
icon-name: "list-add-symbolic";
}
}
+ }
- Gtk.Separator {
- styles [ "spacer" ]
+ Gtk.Box {
+ Gtk.Label {
+ hexpand: true;
+ halign: start;
+ margin-start: 12;
+ label: _("Scale");
}
- Gtk.Label {
+ Gtk.SpinButton _imgScaleSpin {
+ valign: center;
margin-top: 6;
- label: _("Scale");
+ margin-start: 6;
+ margin-end: 6;
+ margin-bottom: 6;
+ digits: 2;
+ adjustment: Gtk.Adjustment {
+ lower: 0.1;
+ upper: 1.0;
+ step-increment: 0.05;
+ };
}
- Gtk.Scale _imageScale {
+ Gtk.Separator {}
+
+ Gtk.Label {
hexpand: true;
+ halign: start;
+ margin-start: 12;
+ label: _("Alpha");
+ }
+
+ Gtk.SpinButton _imgAlphaSpin {
+ valign: center;
margin-top: 6;
+ margin-start: 6;
margin-end: 6;
+ margin-bottom: 6;
+ digits: 2;
adjustment: Gtk.Adjustment {
- lower: 0.10;
+ lower: 0.1;
upper: 1.0;
step-increment: 0.05;
};
}
+
+ styles ["card"]
+ }
+
+ Gtk.Label {
+ label: _("Foreground image is only shown with Box drawing modes.");
+ visible: bind _bgImgButton.active inverted;
+
+ styles ["warning"]
}
Gtk.Stack _imagesStack
{
- margin-top: 6;
- margin-start: 12;
- margin-end: 12;
- margin-bottom: 12;
-
Gtk.StackPage {
name: "empty";
child: Adw.StatusPage {
vexpand: true;
- title: "No Images";
- description: "Add an image to use it in Cavalier.";
+ title: _("No Images");
+ description: _("Add an image to use it in Cavalier.");
icon-name: "image-x-generic-symbolic";
};
}
@@ -630,10 +679,6 @@ Adw.PreferencesWindow _root {
Gtk.FlowBox _imagesFlowBox {
valign: start;
- margin-top: 6;
- margin-start: 6;
- margin-end: 6;
- margin-bottom: 6;
homogeneous: true;
min-children-per-line: 3;
diff --git a/NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp b/NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp
index e58ae39..75bb775 100644
--- a/NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp
+++ b/NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp
@@ -117,12 +117,32 @@ Gtk.ShortcutsWindow _shortcuts {
Gtk.ShortcutsShortcut {
title: _("Change Background Image");
- accelerator: "I I";
+ accelerator: "1 1";
}
Gtk.ShortcutsShortcut {
- title: _("Change Image Scale");
- accelerator: "A A";
+ title: _("Change Background Image Scale");
+ accelerator: "2 2";
+ }
+
+ Gtk.ShortcutsShortcut {
+ title: _("Change Background Image Alpha");
+ accelerator: "3 3";
+ }
+
+ Gtk.ShortcutsShortcut {
+ title: _("Change Foreground Image");
+ accelerator: "4 4";
+ }
+
+ Gtk.ShortcutsShortcut {
+ title: _("Change Foreground Image Scale");
+ accelerator: "5 5";
+ }
+
+ Gtk.ShortcutsShortcut {
+ title: _("Change Foreground Image Alpha");
+ accelerator: "6 6";
}
}
diff --git a/NickvisionCavalier.GNOME/NickvisionCavalier.GNOME.csproj b/NickvisionCavalier.GNOME/NickvisionCavalier.GNOME.csproj
index 779ef39..6060632 100644
--- a/NickvisionCavalier.GNOME/NickvisionCavalier.GNOME.csproj
+++ b/NickvisionCavalier.GNOME/NickvisionCavalier.GNOME.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/NickvisionCavalier.GNOME/Program.cs b/NickvisionCavalier.GNOME/Program.cs
index 3c00646..3f2c431 100644
--- a/NickvisionCavalier.GNOME/Program.cs
+++ b/NickvisionCavalier.GNOME/Program.cs
@@ -34,7 +34,10 @@ public Program(string[] args)
_mainWindow = null;
_mainWindowController = new MainWindowController(args);
_mainWindowController.AppInfo.Changelog =
- @"* Updated translations (Thanks everyone on Weblate!)";
+ @"* Added ability to set foreground image for Box modes
+ * Transparency can now be set both for background and foreground image
+ * Cavalier switched back to using PulseAudio by default. You can still switch audio backend to whatever is supported by CAVA using CAVALIER_INPUT_METHOD environment variable
+ * Updated translations (Thanks everyone on Weblate!)";
_application.OnActivate += OnActivate;
if (File.Exists(Path.GetFullPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) + "/org.nickvision.cavalier.gresource"))
{
diff --git a/NickvisionCavalier.GNOME/Views/PreferencesDialog.cs b/NickvisionCavalier.GNOME/Views/PreferencesDialog.cs
index e735772..9d12d5c 100644
--- a/NickvisionCavalier.GNOME/Views/PreferencesDialog.cs
+++ b/NickvisionCavalier.GNOME/Views/PreferencesDialog.cs
@@ -14,7 +14,7 @@ namespace NickvisionCavalier.GNOME.Views;
///
/// The PreferencesDialog for the application
///
-public partial class PreferencesDialog : Adw.PreferencesWindow
+public class PreferencesDialog : Adw.PreferencesWindow
{
private bool _avoidCAVAReload;
private bool _removingImages;
@@ -65,8 +65,10 @@ public partial class PreferencesDialog : Adw.PreferencesWindow
[Gtk.Connect] private readonly Gtk.Grid _colorsGrid;
[Gtk.Connect] private readonly Gtk.Button _addFgColorButton;
[Gtk.Connect] private readonly Gtk.Button _addBgColorButton;
+ [Gtk.Connect] private readonly Gtk.ToggleButton _bgImgButton;
[Gtk.Connect] private readonly Gtk.Button _addImageButton;
- [Gtk.Connect] private readonly Gtk.Scale _imageScale;
+ [Gtk.Connect] private readonly Gtk.SpinButton _imgScaleSpin;
+ [Gtk.Connect] private readonly Gtk.SpinButton _imgAlphaSpin;
[Gtk.Connect] private readonly Gtk.Stack _imagesStack;
[Gtk.Connect] private readonly Gtk.FlowBox _imagesFlowBox;
@@ -441,32 +443,114 @@ private PreferencesDialog(Gtk.Builder builder, PreferencesViewController control
};
application.AddAction(actPrevProfile);
application.SetAccelsForAction("app.prev-profile", new string[] { "p" });
- //Next Image Action
- var actNextImage = Gio.SimpleAction.New("next-image", null);
- actNextImage.OnActivate += (sender, e) =>
- {
- _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.ImageIndex < _controller.ImagesList.Count - 1 ? _controller.ImageIndex + 2 : 0));
- };
- application.AddAction(actNextImage);
- application.SetAccelsForAction("app.next-image", new string[] { "i" });
- //Previous Image Action
- var actPrevImage = Gio.SimpleAction.New("prev-image", null);
- actPrevImage.OnActivate += (sender, e) =>
- {
- _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.ImageIndex > -1 ? _controller.ImageIndex : _controller.ImagesList.Count));
- };
- application.AddAction(actPrevImage);
- application.SetAccelsForAction("app.prev-image", new string[] { "i" });
- // Increase Image Scale
- var actIncImgScale = Gio.SimpleAction.New("inc-img-scale", null);
- actIncImgScale.OnActivate += (sender, e) => _imageScale.SetValue(_imageScale.GetValue() + 0.1f);
- application.AddAction(actIncImgScale);
- application.SetAccelsForAction("app.inc-img-scale", new string[] { "a" });
- // Decrease Image Scale
- var actDecImgScale = Gio.SimpleAction.New("dec-img-scale", null);
- actDecImgScale.OnActivate += (sender, e) => _imageScale.SetValue(_imageScale.GetValue() - 0.1f);
- application.AddAction(actDecImgScale);
- application.SetAccelsForAction("app.dec-img-scale", new string[] { "a" });
+ //Next Background Image Action
+ var actNextBgImage = Gio.SimpleAction.New("next-bg-image", null);
+ actNextBgImage.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.BgImageIndex < _controller.ImagesList.Count - 1 ? _controller.BgImageIndex + 2 : 0));
+ };
+ application.AddAction(actNextBgImage);
+ application.SetAccelsForAction("app.next-bg-image", new string[] { "1" });
+ //Previous Background Image Action
+ var actPrevBgImage = Gio.SimpleAction.New("prev-bg-image", null);
+ actPrevBgImage.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.BgImageIndex > -1 ? _controller.BgImageIndex : _controller.ImagesList.Count)!);
+ };
+ application.AddAction(actPrevBgImage);
+ application.SetAccelsForAction("app.prev-bg-image", new string[] { "exclam" });
+ // Increase Background Image Scale
+ var actIncBgImgScale = Gio.SimpleAction.New("inc-bg-img-scale", null);
+ actIncBgImgScale.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imgScaleSpin.SetValue(_imgScaleSpin.GetValue() + 0.05f);
+ };
+ application.AddAction(actIncBgImgScale);
+ application.SetAccelsForAction("app.inc-bg-img-scale", new string[] { "2" });
+ // Decrease Background Image Scale
+ var actDecBgImgScale = Gio.SimpleAction.New("dec-bg-img-scale", null);
+ actDecBgImgScale.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imgScaleSpin.SetValue(_imgScaleSpin.GetValue() - 0.05f);
+ };
+ application.AddAction(actDecBgImgScale);
+ application.SetAccelsForAction("app.dec-bg-img-scale", new string[] { "at" });
+ // Increase Background Image Alpha
+ var actIncBgImgAlpha = Gio.SimpleAction.New("inc-bg-img-alpha", null);
+ actIncBgImgAlpha.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imgAlphaSpin.SetValue(_imgAlphaSpin.GetValue() + 0.05f);
+ };
+ application.AddAction(actIncBgImgAlpha);
+ application.SetAccelsForAction("app.inc-bg-img-alpha", new string[] { "3" });
+ // Decrease Background Image Alpha
+ var actDecBgImgAlpha = Gio.SimpleAction.New("dec-bg-img-alpha", null);
+ actDecBgImgAlpha.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(true);
+ _imgAlphaSpin.SetValue(_imgAlphaSpin.GetValue() - 0.05f);
+ };
+ application.AddAction(actDecBgImgAlpha);
+ application.SetAccelsForAction("app.dec-bg-img-alpha", new string[] { "numbersign" });
+ //Next Foreground Image Action
+ var actNextFgImage = Gio.SimpleAction.New("next-fg-image", null);
+ actNextFgImage.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.FgImageIndex < _controller.ImagesList.Count - 1 ? _controller.FgImageIndex + 2 : 0));
+ };
+ application.AddAction(actNextFgImage);
+ application.SetAccelsForAction("app.next-fg-image", new string[] { "4" });
+ //Previous Background Image Action
+ var actPrevFgImage = Gio.SimpleAction.New("prev-fg-image", null);
+ actPrevFgImage.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.FgImageIndex > -1 ? _controller.FgImageIndex : _controller.ImagesList.Count)!);
+ };
+ application.AddAction(actPrevFgImage);
+ application.SetAccelsForAction("app.prev-fg-image", new string[] { "dollar" });
+ // Increase Background Image Scale
+ var actIncFgImgScale = Gio.SimpleAction.New("inc-fg-img-scale", null);
+ actIncFgImgScale.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imgScaleSpin.SetValue(_imgScaleSpin.GetValue() + 0.05f);
+ };
+ application.AddAction(actIncFgImgScale);
+ application.SetAccelsForAction("app.inc-fg-img-scale", new string[] { "5" });
+ // Decrease Background Image Scale
+ var actDecFgImgScale = Gio.SimpleAction.New("dec-fg-img-scale", null);
+ actDecFgImgScale.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imgScaleSpin.SetValue(_imgScaleSpin.GetValue() - 0.05f);
+ };
+ application.AddAction(actDecFgImgScale);
+ application.SetAccelsForAction("app.dec-fg-img-scale", new string[] { "percent" });
+ // Increase Background Image Alpha
+ var actIncFgImgAlpha = Gio.SimpleAction.New("inc-fg-img-alpha", null);
+ actIncFgImgAlpha.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imgAlphaSpin.SetValue(_imgAlphaSpin.GetValue() + 0.05f);
+ };
+ application.AddAction(actIncFgImgAlpha);
+ application.SetAccelsForAction("app.inc-fg-img-alpha", new string[] { "6" });
+ // Decrease Background Image Alpha
+ var actDecFgImgAlpha = Gio.SimpleAction.New("dec-fg-img-alpha", null);
+ actDecFgImgAlpha.OnActivate += (sender, e) =>
+ {
+ _bgImgButton.SetActive(false);
+ _imgAlphaSpin.SetValue(_imgAlphaSpin.GetValue() - 0.05f);
+ };
+ application.AddAction(actDecFgImgAlpha);
+ application.SetAccelsForAction("app.dec-fg-img-alpha", new string[] { "asciicircum" });
//Build UI
builder.Connect(this);
OnCloseRequest += (sender, e) =>
@@ -785,12 +869,46 @@ private PreferencesDialog(Gtk.Builder builder, PreferencesViewController control
_addBgColorButton.OnClicked += async (sender, e) => await AddColorAsync(ColorType.Background);
UpdateColorsGrid();
_addImageButton.OnClicked += async (sender, e) => await AddImageAsync();
- _imageScale.OnValueChanged += (sender, e) => _controller.ImageScale = (float)_imageScale.GetValue();
+ _bgImgButton.OnToggled += (sender, e) =>
+ {
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex((_bgImgButton.GetActive() ? _controller.BgImageIndex : _controller.FgImageIndex) + 1) ?? _imagesFlowBox.GetChildAtIndex(0)!);
+ _imgScaleSpin.SetValue(_bgImgButton.GetActive() ? _controller.BgImageScale : _controller.FgImageScale);
+ _imgAlphaSpin.SetValue(_bgImgButton.GetActive() ? _controller.BgImageAlpha : _controller.FgImageAlpha);
+ };
+ _imgScaleSpin.OnValueChanged += (sender, e) =>
+ {
+ if (_bgImgButton.GetActive())
+ {
+ _controller.BgImageScale = (float)_imgScaleSpin.GetValue();
+ }
+ else
+ {
+ _controller.FgImageScale = (float)_imgScaleSpin.GetValue();
+ }
+ };
+ _imgAlphaSpin.OnValueChanged += (sender, e) =>
+ {
+ if (_bgImgButton.GetActive())
+ {
+ _controller.BgImageAlpha = (float)_imgAlphaSpin.GetValue();
+ }
+ else
+ {
+ _controller.FgImageAlpha = (float)_imgAlphaSpin.GetValue();
+ }
+ };
_imagesFlowBox.OnSelectedChildrenChanged += (sender, e) =>
{
if (!_removingImages)
{
- _controller.ImageIndex = _imagesFlowBox.GetSelectedChildrenIndices()[0] - 1;
+ if (_bgImgButton.GetActive())
+ {
+ _controller.BgImageIndex = _imagesFlowBox.GetSelectedChildrenIndices()[0] - 1;
+ }
+ else
+ {
+ _controller.FgImageIndex = _imagesFlowBox.GetSelectedChildrenIndices()[0] - 1;
+ }
}
};
// Update view when controller has changed by cmd options
@@ -871,8 +989,9 @@ public bool LoadInstantSettings()
_autohideHeaderSwitch.SetActive(_controller.AutohideHeader);
_reverseSwitch.SetActive(_controller.ReverseOrder);
UpdateColorProfiles();
- _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.ImageIndex + 1) ?? _imagesFlowBox.GetChildAtIndex(0)!);
- _imageScale.SetValue(_controller.ImageScale);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex((_bgImgButton.GetActive() ? _controller.BgImageIndex : _controller.FgImageIndex) + 1) ?? _imagesFlowBox.GetChildAtIndex(0)!);
+ _imgScaleSpin.SetValue(_bgImgButton.GetActive() ? _controller.BgImageScale : _controller.FgImageScale);
+ _imgAlphaSpin.SetValue(_bgImgButton.GetActive() ? _controller.BgImageAlpha : _controller.FgImageAlpha);
if (_controller.Hearts)
{
_spineRow.SetTitle(_("Hearts"));
@@ -1060,10 +1179,10 @@ public void UpdateImagesList()
if (paths.Count == 0)
{
_imagesStack.SetVisibleChildName("empty");
- _imageScale.SetSensitive(false);
+ _imgScaleSpin.SetSensitive(false);
return;
}
- _imageScale.SetSensitive(true);
+ _imgScaleSpin.SetSensitive(true);
_imagesStack.SetVisibleChildName("images");
_removingImages = true;
while (_imagesFlowBox.GetChildAtIndex(1) != null)
@@ -1078,7 +1197,7 @@ public void UpdateImagesList()
image.OnRemoveImage += RemoveImage;
_imagesFlowBox.Append(image);
}
- _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex(_controller.ImageIndex + 1) ?? _imagesFlowBox.GetChildAtIndex(0)!);
+ _imagesFlowBox.SelectChild(_imagesFlowBox.GetChildAtIndex((_bgImgButton.GetActive() ? _controller.BgImageIndex : _controller.FgImageIndex) + 1) ?? _imagesFlowBox.GetChildAtIndex(0)!);
}
///
@@ -1102,6 +1221,8 @@ public async Task AddImageAsync()
{
var file = await dialog.OpenAsync(this);
_controller.AddImage(file.GetPath());
+ _controller.BgImageIndex = -1;
+ _controller.FgImageIndex = -1;
UpdateImagesList();
}
catch { }
@@ -1113,7 +1234,8 @@ public async Task AddImageAsync()
/// Index of image to remove
public void RemoveImage(int index)
{
- _controller.ImageIndex = -1;
+ _controller.BgImageIndex = -1;
+ _controller.FgImageIndex = -1;
File.Delete(_controller.ImagesList[index]);
UpdateImagesList();
}
diff --git a/NickvisionCavalier.GNOME/nuget-sources.json b/NickvisionCavalier.GNOME/nuget-sources.json
index 93ae1e0..f83d85d 100644
--- a/NickvisionCavalier.GNOME/nuget-sources.json
+++ b/NickvisionCavalier.GNOME/nuget-sources.json
@@ -1,4 +1,11 @@
[
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/ace4896.dbus.services.secrets/1.1.0/ace4896.dbus.services.secrets.1.1.0.nupkg",
+ "sha512": "f886b36f49c3bb651d4aeea8ed666e2dd362997b3af02cba3ed5c3866c0c06d55949ba4dafdf445c8778f2bba2fb0fd10a71fe5ecf531b2d02613e4d260950f3",
+ "dest": "nuget-sources",
+ "dest-filename": "ace4896.dbus.services.secrets.1.1.0.nupkg"
+ },
{
"type": "file",
"url": "https://api.nuget.org/v3-flatcontainer/commandlineparser/2.9.1/commandlineparser.2.9.1.nupkg",
@@ -118,6 +125,20 @@
"dest": "nuget-sources",
"dest-filename": "markdig.0.31.0.nupkg"
},
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/meziantou.framework.win32.credentialmanager/1.4.2/meziantou.framework.win32.credentialmanager.1.4.2.nupkg",
+ "sha512": "75c861c9f4ea0eb3ec84f4dd6f369c57240975acc67f10d03913c969618f299adbc4e4be5d295db388d09a44b501c561f02f1aa78f2edea99f8cdefbafc2edfd",
+ "dest": "nuget-sources",
+ "dest-filename": "meziantou.framework.win32.credentialmanager.1.4.2.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/microsoft.data.sqlite.core/7.0.5/microsoft.data.sqlite.core.7.0.5.nupkg",
+ "sha512": "319cc8ad58d2133f850404bf40bdf6fba64781565913a482b055403c12180ace43e5d12098b5b68f7d170eff57ed15c9ca70f5801150d94b892ffe012ecf7f5c",
+ "dest": "nuget-sources",
+ "dest-filename": "microsoft.data.sqlite.core.7.0.5.nupkg"
+ },
{
"type": "file",
"url": "https://api.nuget.org/v3-flatcontainer/microsoft.netcore.targets/5.0.0/microsoft.netcore.targets.5.0.0.nupkg",
@@ -127,10 +148,10 @@
},
{
"type": "file",
- "url": "https://api.nuget.org/v3-flatcontainer/nickvision.aura/2023.8.2/nickvision.aura.2023.8.2.nupkg",
- "sha512": "e86dee781f4b1d48a2a8eda5249da314248b980959a9a2dcff8e4b034c85bd18390b43a9ea362ed623e3ed0f3836a3d9299a334378353e6fb5757b5bac25c586",
+ "url": "https://api.nuget.org/v3-flatcontainer/nickvision.aura/2023.9.3/nickvision.aura.2023.9.3.nupkg",
+ "sha512": "4f2d37373baf8a86ab30ddb5aea90e0ce905cb660cc1978a10d59c422d5f501227bcdf492fa57bfe853eabb5fc6248ae20ab933ec1dd1d773bb54088f329a5ca",
"dest": "nuget-sources",
- "dest-filename": "nickvision.aura.2023.8.2.nupkg"
+ "dest-filename": "nickvision.aura.2023.9.3.nupkg"
},
{
"type": "file",
@@ -167,6 +188,55 @@
"dest": "nuget-sources",
"dest-filename": "skiasharp.nativeassets.win32.2.88.3.nupkg"
},
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/sqlitepclraw.bundle_e_sqlcipher/2.1.5/sqlitepclraw.bundle_e_sqlcipher.2.1.5.nupkg",
+ "sha512": "c86a1641f66f54565ff7750b3a6f21bcfdfc59c4cc633dab0f1410e5b0ee8c15b81e9d18130c3a13e47e7a29ee75e179082885f421342a4e6560df39962b6246",
+ "dest": "nuget-sources",
+ "dest-filename": "sqlitepclraw.bundle_e_sqlcipher.2.1.5.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/2.1.4/sqlitepclraw.core.2.1.4.nupkg",
+ "sha512": "4a654a227445d97e0c3c00223f819b90d64746e7b2483c4ff0b69ae02d6d3f22a68df7d6c00245aed6f2c51610dc29714fbe6765a8fbe42795f90448c04909d2",
+ "dest": "nuget-sources",
+ "dest-filename": "sqlitepclraw.core.2.1.4.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/2.1.5/sqlitepclraw.core.2.1.5.nupkg",
+ "sha512": "10379c318ea178769db9164d8bf569469fbdea73659668200d6394ab2163b9229e8a883de4702e0fdaebb4b1c2fae1f263424aa5e9765ac507eba7fceedc8a7b",
+ "dest": "nuget-sources",
+ "dest-filename": "sqlitepclraw.core.2.1.5.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/sqlitepclraw.lib.e_sqlcipher/2.1.5/sqlitepclraw.lib.e_sqlcipher.2.1.5.nupkg",
+ "sha512": "570f8c23f5fe20d742ccb05128ac0b45cf55ab1912d89dbeabca44036ae161e25c73d803be629d4186a0db75fb52898b221b4de21dde886557c8ed5f4b8d545a",
+ "dest": "nuget-sources",
+ "dest-filename": "sqlitepclraw.lib.e_sqlcipher.2.1.5.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/sqlitepclraw.provider.e_sqlcipher/2.1.5/sqlitepclraw.provider.e_sqlcipher.2.1.5.nupkg",
+ "sha512": "01e5db3a24867b4b563604a3b8aee0fac044354550ea80f8a836b3ad6bbc9949d4dfca358eb9294301e96220e1319463fac84b4099c99a54470ab7a92a6e8eb2",
+ "dest": "nuget-sources",
+ "dest-filename": "sqlitepclraw.provider.e_sqlcipher.2.1.5.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/system.io.pipelines/6.0.0/system.io.pipelines.6.0.0.nupkg",
+ "sha512": "c5983b4510bc8ae4116133ffb9b280fe61d99d47ef52dd78e5bfd03e090901896d5d5fd738dae57006b971840a4d9422bded33ddefa5e927d75d309ef1f70dea",
+ "dest": "nuget-sources",
+ "dest-filename": "system.io.pipelines.6.0.0.nupkg"
+ },
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/system.memory/4.5.3/system.memory.4.5.3.nupkg",
+ "sha512": "70fce15a52cc76aacbae05c8e89e2e398d1d32903f63f640a7dd4a3e5747f2c7a887d4bfd22f2a2e40274906cf91648dfd169734fb7c74eb9b4f72614084e1db",
+ "dest": "nuget-sources",
+ "dest-filename": "system.memory.4.5.3.nupkg"
+ },
{
"type": "file",
"url": "https://api.nuget.org/v3-flatcontainer/tmds.dbus/0.15.0/tmds.dbus.0.15.0.nupkg",
@@ -174,6 +244,13 @@
"dest": "nuget-sources",
"dest-filename": "tmds.dbus.0.15.0.nupkg"
},
+ {
+ "type": "file",
+ "url": "https://api.nuget.org/v3-flatcontainer/tmds.dbus.protocol/0.15.0/tmds.dbus.protocol.0.15.0.nupkg",
+ "sha512": "45958a88536d1daa769934986b3ac514cdc1104a936bc404dbdec550c958847e7408af621350c09fa51bc4b837fb88471ec6e6056c4aaa2cebf30f044cd834e9",
+ "dest": "nuget-sources",
+ "dest-filename": "tmds.dbus.protocol.0.15.0.nupkg"
+ },
{
"type": "file",
"url": "https://api.nuget.org/v3-flatcontainer/cake.tool/3.1.0/cake.tool.3.1.0.nupkg",
diff --git a/NickvisionCavalier.Shared/Controllers/MainWindowController.cs b/NickvisionCavalier.Shared/Controllers/MainWindowController.cs
index fe2b5c2..706a65a 100644
--- a/NickvisionCavalier.Shared/Controllers/MainWindowController.cs
+++ b/NickvisionCavalier.Shared/Controllers/MainWindowController.cs
@@ -10,7 +10,6 @@ namespace NickvisionCavalier.Shared.Controllers;
///
public class MainWindowController
{
- public Aura Aura { get; init; }
///
/// Gets the AppInfo object
///
@@ -58,9 +57,11 @@ public class MainWindowController
/// Command-line arguments
public MainWindowController(string[] args)
{
- Aura = new Aura("org.nickvision.cavalier", "Nickvision Cavalier", _("Cavalier"), _("Visualize audio with CAVA"));
+ Aura.Init("org.nickvision.cavalier", "Nickvision Cavalier");
Aura.Active.SetConfig("config");
- AppInfo.Version = "2023.8.2-next";
+ AppInfo.ShortName = _("Cavalier");
+ AppInfo.Description = _("Visualize audio with CAVA");
+ AppInfo.Version = "2023.9.0-beta1";
AppInfo.SourceRepo = new Uri("https://github.com/NickvisionApps/Cavalier");
AppInfo.IssueTracker = new Uri("https://github.com/NickvisionApps/Cavalier/issues/new");
AppInfo.SupportUrl = new Uri("https://github.com/NickvisionApps/Cavalier/discussions");
@@ -72,7 +73,7 @@ public MainWindowController(string[] args)
AppInfo.Artists[_("David Lapshin")] = new Uri("https://github.com/daudix-UFO");
AppInfo.TranslatorCredits = _("translator-credits");
PreferencesViewController = new PreferencesViewController();
- var ipc = Aura.Communicate(args);
+ var ipc = Aura.Active.Communicate(args);
ipc.CommandReceived += HandleCommandLine;
HandleCommandLine(this, args);
}
diff --git a/NickvisionCavalier.Shared/Controllers/PreferencesViewController.cs b/NickvisionCavalier.Shared/Controllers/PreferencesViewController.cs
index 333018e..3896d5b 100644
--- a/NickvisionCavalier.Shared/Controllers/PreferencesViewController.cs
+++ b/NickvisionCavalier.Shared/Controllers/PreferencesViewController.cs
@@ -30,14 +30,15 @@ public List ImagesList
get
{
var result = new List();
- if (!Directory.Exists($"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images"))
+ var imagesDir = $"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}images";
+ if (!Directory.Exists(imagesDir))
{
- Directory.CreateDirectory($"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images");
+ Directory.CreateDirectory(imagesDir);
return result;
}
- foreach (var file in Directory.GetFiles($"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images"))
+ foreach (var file in Directory.GetFiles(imagesDir))
{
- var extension = Path.GetExtension(file);
+ var extension = Path.GetExtension(file).ToLower();
if (extension == ".jpg" || extension == ".jpeg" || extension == ".png")
{
result.Add(file);
@@ -349,21 +350,61 @@ public int ActiveProfile
///
/// Index of a background image to load (-1 to not load anything)
///
- public int ImageIndex
+ public int BgImageIndex
{
- get => Configuration.Current.ImageIndex;
+ get => Configuration.Current.BgImageIndex;
- set => Configuration.Current.ImageIndex = value;
+ set => Configuration.Current.BgImageIndex = value;
}
///
/// Background image scale (0.1-1.0, 1.0 - fill the window)
///
- public float ImageScale
+ public float BgImageScale
{
- get => Configuration.Current.ImageScale;
-
- set => Configuration.Current.ImageScale = value;
+ get => Configuration.Current.BgImageScale;
+
+ set => Configuration.Current.BgImageScale = value;
+ }
+
+ ///
+ /// Background image transparency (0.1-1.0, 1.0 - fully opaque)
+ ///
+ public float BgImageAlpha
+ {
+ get => Configuration.Current.BgImageAlpha;
+
+ set => Configuration.Current.BgImageAlpha = value;
+ }
+
+ ///
+ /// Index of a foreground image to load (-1 to not load anything)
+ ///
+ public int FgImageIndex
+ {
+ get => Configuration.Current.FgImageIndex;
+
+ set => Configuration.Current.FgImageIndex = value;
+ }
+
+ ///
+ /// Foreground image scale (0.1-1.0, 1.0 - fill the window)
+ ///
+ public float FgImageScale
+ {
+ get => Configuration.Current.FgImageScale;
+
+ set => Configuration.Current.FgImageScale = value;
+ }
+
+ ///
+ /// Foreground image transparency (0.1-1.0, 1.0 - fully opaque)
+ ///
+ public float FgImageAlpha
+ {
+ get => Configuration.Current.FgImageAlpha;
+
+ set => Configuration.Current.FgImageAlpha = value;
}
///
@@ -490,17 +531,40 @@ public void HandleCommandLine(object? sender, string[] args)
updateCavalier = true;
}
}
- if (o.ImageIndex.HasValue)
+ if (o.BgImageIndex.HasValue)
+ {
+ if (o.BgImageIndex.Value > -1 && o.BgImageIndex.Value <= ImagesList.Count)
+ {
+ BgImageIndex = o.BgImageIndex.Value - 1;
+ updateCavalier = true;
+ }
+ }
+ if (o.BgImageScale.HasValue)
+ {
+ BgImageScale = Math.Max(0.1f, Math.Min(o.BgImageScale.Value / 100f, 1f));
+ updateCavalier = true;
+ }
+ if (o.BgImageAlpha.HasValue)
+ {
+ BgImageAlpha = Math.Max(0.1f, Math.Min(o.BgImageAlpha.Value / 100f, 1f));
+ updateCavalier = true;
+ }
+ if (o.FgImageIndex.HasValue)
{
- if (o.ImageIndex.Value > -1 && o.ImageIndex.Value <= ImagesList.Count)
+ if (o.FgImageIndex.Value > -1 && o.FgImageIndex.Value <= ImagesList.Count)
{
- ImageIndex = o.ImageIndex.Value - 1;
+ FgImageIndex = o.FgImageIndex.Value - 1;
updateCavalier = true;
}
}
- if (o.ImageScale.HasValue)
+ if (o.FgImageScale.HasValue)
+ {
+ FgImageScale = Math.Max(0.1f, Math.Min(o.FgImageScale.Value / 100f, 1f));
+ updateCavalier = true;
+ }
+ if (o.FgImageAlpha.HasValue)
{
- ImageScale = Math.Max(0.1f, Math.Min(o.ImageScale.Value / 100f, 1f));
+ FgImageAlpha = Math.Max(0.1f, Math.Min(o.FgImageAlpha.Value / 100f, 1f));
updateCavalier = true;
}
if (o.Hearts)
@@ -634,11 +698,11 @@ public void AddImage(string path)
var baseFilename = Path.GetFileName(path);
var filename = baseFilename;
var i = 0;
- while (File.Exists($"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images{Path.DirectorySeparatorChar}{filename}"))
+ while (File.Exists($"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}images{Path.DirectorySeparatorChar}{filename}"))
{
i++;
filename = $"{Path.GetFileNameWithoutExtension(baseFilename)}-{i}{Path.GetExtension(baseFilename)}";
}
- File.Copy(path, $"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images{Path.DirectorySeparatorChar}{filename}");
+ File.Copy(path, $"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}images{Path.DirectorySeparatorChar}{filename}");
}
}
diff --git a/NickvisionCavalier.Shared/Models/CAVA.cs b/NickvisionCavalier.Shared/Models/CAVA.cs
index 6325697..f7f2513 100644
--- a/NickvisionCavalier.Shared/Models/CAVA.cs
+++ b/NickvisionCavalier.Shared/Models/CAVA.cs
@@ -18,7 +18,7 @@ public class CAVA : IDisposable
public CAVA()
{
_disposed = false;
- _configPath = $"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}cava_config";
+ _configPath = $"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}cava_config";
UpdateConfig();
_proc = new Process
{
@@ -74,7 +74,7 @@ private void UpdateConfig()
autosens = {(Configuration.Current.Autosens ? "1" : "0")}
sensitivity = {Math.Pow(Configuration.Current.Sensitivity, 2)}
[input]
- method = {Environment.GetEnvironmentVariable("CAVALIER_INPUT_METHOD") ?? "pipewire"}
+ method = {Environment.GetEnvironmentVariable("CAVALIER_INPUT_METHOD") ?? "pulse"}
[output]
method = raw
raw_target = /dev/stdout
diff --git a/NickvisionCavalier.Shared/Models/CmdOptions.cs b/NickvisionCavalier.Shared/Models/CmdOptions.cs
index 12dac28..39b9edf 100644
--- a/NickvisionCavalier.Shared/Models/CmdOptions.cs
+++ b/NickvisionCavalier.Shared/Models/CmdOptions.cs
@@ -104,13 +104,33 @@ public class CmdOptions {
///
/// Index of a background image to load (0 to not load anything)
///
- [Option('i', "image-index", Required = false, HelpText = "Index of image to draw (0 for no image)")]
- public int? ImageIndex { get; set; }
+ [Option("bg-index", Required = false, HelpText = "Index of background image to draw (0 for no image)")]
+ public int? BgImageIndex { get; set; }
///
/// Background image scale (10-100, 100 - fill the window)
///
- [Option('a', "image-scale", Required = false, HelpText = "Background image scale in percent (10-100)")]
- public uint? ImageScale { get; set; }
+ [Option("bg-scale", Required = false, HelpText = "Background image scale in percent (10-100)")]
+ public uint? BgImageScale { get; set; }
+ ///
+ /// Background image transparency (10-100, 100 - fully opaque)
+ ///
+ [Option("bg-alpha", Required = false, HelpText = "Background image alpha in percent (10-100)")]
+ public uint? BgImageAlpha { get; set; }
+ ///
+ /// Index of a background image to load (0 to not load anything)
+ ///
+ [Option("fg-index", Required = false, HelpText = "Index of foreground image to draw (0 for no image)")]
+ public int? FgImageIndex { get; set; }
+ ///
+ /// Background image scale (10-100, 100 - fill the window)
+ ///
+ [Option("fg-scale", Required = false, HelpText = "Background image scale in percent (10-100)")]
+ public uint? FgImageScale { get; set; }
+ ///
+ /// Foreground image transparency (10-100, 100 - fully opaque)
+ ///
+ [Option("fg-alpha", Required = false, HelpText = "Foreground image alpha in percent (10-100)")]
+ public uint? FgImageAlpha { get; set; }
///
/// Whether to replace Spine mode with Hearts mode (easter egg)
///
diff --git a/NickvisionCavalier.Shared/Models/Configuration.cs b/NickvisionCavalier.Shared/Models/Configuration.cs
index 32e7748..fdd2556 100644
--- a/NickvisionCavalier.Shared/Models/Configuration.cs
+++ b/NickvisionCavalier.Shared/Models/Configuration.cs
@@ -132,11 +132,27 @@ public class Configuration : ConfigurationBase
///
/// Index of a background image to load (-1 to not load anything)
///
- public int ImageIndex { get; set; }
+ public int BgImageIndex { get; set; }
///
/// Background image scale (0.1-1.0, 1.0 - fill the window)
///
- public float ImageScale { get; set; }
+ public float BgImageScale { get; set; }
+ ///
+ /// Background image transparency (0.1-1.0, 1.0 - fully opaque)
+ ///
+ public float BgImageAlpha { get; set; }
+ ///
+ /// Index of a foreground image to load (-1 to not load anything)
+ ///
+ public int FgImageIndex { get; set; }
+ ///
+ /// Foreground image scale (0.1-1.0, 1.0 - fill the window)
+ ///
+ public float FgImageScale { get; set; }
+ ///
+ /// Foreground image transparency (0.1-1.0, 1.0 - fully opaque)
+ ///
+ public float FgImageAlpha { get; set; }
///
/// Whether to replace Spine mode with Hearts mode (easter egg)
///
@@ -176,8 +192,12 @@ public Configuration()
Rotation = 0f;
ColorProfiles = new List { new ColorProfile() };
ActiveProfile = 0;
- ImageIndex = -1;
- ImageScale = 1.0f;
+ BgImageIndex = -1;
+ BgImageScale = 1f;
+ BgImageAlpha = 1f;
+ FgImageIndex = -1;
+ FgImageScale = 1f;
+ FgImageAlpha = 1f;
Hearts = false;
}
diff --git a/NickvisionCavalier.Shared/Models/Renderer.cs b/NickvisionCavalier.Shared/Models/Renderer.cs
index ff1e2b3..2788381 100644
--- a/NickvisionCavalier.Shared/Models/Renderer.cs
+++ b/NickvisionCavalier.Shared/Models/Renderer.cs
@@ -12,14 +12,23 @@ namespace NickvisionCavalier.Shared.Models;
///
public class Renderer
{
- private delegate void DrawFunc(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint);
- private DrawFunc? _drawFunc;
- private int _imageIndex;
- private SKBitmap? _imageBitmap;
- private SKBitmap? _targetBitmap;
+ private enum GradientType
+ {
+ Background = 0,
+ Foreground
+ }
+
+ private delegate SKPath? DrawFunc(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint);
private float _oldWidth;
private float _oldHeight;
- private float _oldScale;
+ private int _bgImageIndex;
+ private SKBitmap? _bgImageBitmap;
+ private SKBitmap? _bgTargetBitmap;
+ private float _oldBgScale;
+ private int _fgImageIndex;
+ private SKBitmap? _fgImageBitmap;
+ private SKBitmap? _fgTargetBitmap;
+ private float _oldFgScale;
///
/// Renderer's canvas to draw on
@@ -32,10 +41,12 @@ public class Renderer
public Renderer()
{
Canvas = null;
- _imageIndex = -1;
+ _bgImageIndex = -1;
+ _fgImageIndex = -1;
_oldWidth = 0;
_oldHeight = 0;
- _oldScale = 0.0f;
+ _oldBgScale = 0f;
+ _oldFgScale = 0f;
}
///
@@ -60,55 +71,102 @@ public void Draw(float[] sample, float width, float height)
};
if (profile.BgColors.Count > 1)
{
- bgPaint.Shader = CreateGradient(profile.BgColors, width, height);
+ bgPaint.Shader = CreateGradient(GradientType.Background, profile.BgColors, width, height);
}
else
{
bgPaint.Color = SKColor.Parse(profile.BgColors[0]);
}
Canvas.DrawRect(0, 0, width, height, bgPaint);
- // Draw image
- if (_imageIndex != Configuration.Current.ImageIndex)
+ // Prepare images
+ if (_bgImageIndex != Configuration.Current.BgImageIndex)
+ {
+ _bgImageBitmap?.Dispose();
+ _bgTargetBitmap?.Dispose();
+ if (Configuration.Current.BgImageIndex != -1)
+ {
+ var images = new List();
+ foreach (var file in Directory.GetFiles($"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}images"))
+ {
+ var extension = Path.GetExtension(file).ToLower();
+ if (extension == ".jpg" || extension == ".jpeg" || extension == ".png")
+ {
+ images.Add(file);
+ }
+ }
+ images.Sort();
+ if (Configuration.Current.BgImageIndex < images.Count)
+ {
+ _bgImageBitmap = SKBitmap.Decode(images[Configuration.Current.BgImageIndex]);
+ _oldBgScale = 0f; // To enforce redraw
+ }
+ else
+ {
+ Configuration.Current.BgImageIndex = -1;
+ }
+ }
+ _bgImageIndex = Configuration.Current.BgImageIndex;
+ }
+ if (_fgImageIndex != Configuration.Current.FgImageIndex)
{
- _imageBitmap?.Dispose();
- _targetBitmap?.Dispose();
- if (Configuration.Current.ImageIndex != -1)
+ _fgImageBitmap?.Dispose();
+ _fgTargetBitmap?.Dispose();
+ if (Configuration.Current.FgImageIndex != -1)
{
var images = new List();
- foreach (var file in Directory.GetFiles($"{ConfigurationLoader.ConfigDir}{Path.DirectorySeparatorChar}images"))
+ foreach (var file in Directory.GetFiles($"{UserDirectories.ApplicationConfig}{Path.DirectorySeparatorChar}images"))
{
- if (file.EndsWith(".jpg") || file.EndsWith(".jpeg") || file.EndsWith(".png"))
+ var extension = Path.GetExtension(file).ToLower();
+ if (extension == ".jpg" || extension == ".jpeg" || extension == ".png")
{
images.Add(file);
}
}
images.Sort();
- if (Configuration.Current.ImageIndex < images.Count)
+ if (Configuration.Current.FgImageIndex < images.Count)
{
- _imageBitmap = SKBitmap.Decode(images[Configuration.Current.ImageIndex]);
- _oldScale = 0.0f; // To enforce redraw
+ _fgImageBitmap = SKBitmap.Decode(images[Configuration.Current.FgImageIndex]);
+ _oldFgScale = 0f; // To enforce redraw
}
else
{
- Configuration.Current.ImageIndex = -1;
+ Configuration.Current.FgImageIndex = -1;
}
}
- _imageIndex = Configuration.Current.ImageIndex;
+ _fgImageIndex = Configuration.Current.FgImageIndex;
}
- if (_imageIndex != -1)
+ if (_oldWidth != width || _oldHeight != height || Math.Abs(_oldBgScale - Configuration.Current.BgImageScale) > 0.01f)
{
- if (_oldWidth != width || _oldHeight != height || Math.Abs(_oldScale - Configuration.Current.ImageScale) > 0.01f)
+ _oldBgScale = Configuration.Current.BgImageScale;
+ if (_bgImageIndex != -1)
{
- _oldWidth = width;
- _oldHeight = height;
- _oldScale = Configuration.Current.ImageScale;
- var scale = Math.Max(width / _imageBitmap!.Width, height / _imageBitmap.Height);
- var rect = new SKRect(0, 0, _imageBitmap.Width * scale, _imageBitmap.Height * scale);
- _targetBitmap?.Dispose();
- _targetBitmap = new SKBitmap((int)(rect.Width * Configuration.Current.ImageScale), (int)(rect.Height * Configuration.Current.ImageScale));
- _imageBitmap.ScalePixels(_targetBitmap, SKFilterQuality.Medium);
+ var bgScale = Math.Max(width / _bgImageBitmap!.Width, height / _bgImageBitmap.Height);
+ var bgRect = new SKRect(0, 0, _bgImageBitmap.Width * bgScale, _bgImageBitmap.Height * bgScale);
+ _bgTargetBitmap?.Dispose();
+ _bgTargetBitmap = new SKBitmap((int)(bgRect.Width * Configuration.Current.BgImageScale), (int)(bgRect.Height * Configuration.Current.BgImageScale));
+ _bgImageBitmap.ScalePixels(_bgTargetBitmap, SKFilterQuality.Medium);
}
- Canvas.DrawBitmap(_targetBitmap, width / 2 - _targetBitmap!.Width / 2f, height / 2 - _targetBitmap.Height / 2f);
+ }
+ if (_oldWidth != width || _oldHeight != height || Math.Abs(_oldFgScale - Configuration.Current.FgImageScale) > 0.01f)
+ {
+ _oldFgScale = Configuration.Current.FgImageScale;
+ if (_fgImageIndex != -1)
+ {
+ var fgScale = Math.Max(width / _fgImageBitmap!.Width, height / _fgImageBitmap.Height);
+ var fgRect = new SKRect(0, 0, _fgImageBitmap.Width * fgScale, _fgImageBitmap.Height * fgScale);
+ _fgTargetBitmap?.Dispose();
+ _fgTargetBitmap = new SKBitmap((int)(fgRect.Width * Configuration.Current.FgImageScale), (int)(fgRect.Height * Configuration.Current.FgImageScale));
+ _fgImageBitmap.ScalePixels(_fgTargetBitmap, SKFilterQuality.Medium);
+ }
+ }
+ _oldWidth = width;
+ _oldHeight = height;
+ // Draw background image
+ if (_bgImageIndex != -1)
+ {
+ using var paint = new SKPaint();
+ paint.Color = paint.Color.WithAlpha((byte)(255 * Configuration.Current.BgImageAlpha));
+ Canvas.DrawBitmap(_bgTargetBitmap, width / 2 - _bgTargetBitmap!.Width / 2f, height / 2 - _bgTargetBitmap.Height / 2f, paint);
}
// Draw foreground
width -= Configuration.Current.AreaMargin * 2;
@@ -119,15 +177,15 @@ public void Draw(float[] sample, float width, float height)
StrokeWidth = Configuration.Current.LinesThickness,
IsAntialias = true
};
- if (profile.FgColors.Count > 1 && Configuration.Current.Mode != DrawingMode.SpineBox && Configuration.Current.Mode != DrawingMode.SpineCircle && Configuration.Current.Mode != DrawingMode.WaveCircle)
+ if (profile.FgColors.Count > 1 && Configuration.Current.Mode != DrawingMode.SpineBox && Configuration.Current.Mode != DrawingMode.SpineCircle)
{
- fgPaint.Shader = CreateGradient(profile.FgColors, width, height, true, Configuration.Current.AreaMargin);
+ fgPaint.Shader = CreateGradient(GradientType.Foreground, profile.FgColors, width, height, Configuration.Current.AreaMargin);
}
else
{
fgPaint.Color = SKColor.Parse(profile.FgColors[0]);
}
- _drawFunc = Configuration.Current.Mode switch
+ DrawFunc drawFunc = Configuration.Current.Mode switch
{
DrawingMode.LevelsBox => DrawLevelsBox,
DrawingMode.ParticlesBox => DrawParticlesBox,
@@ -143,37 +201,72 @@ public void Draw(float[] sample, float width, float height)
};
if (Configuration.Current.Mirror == Mirror.Full)
{
- _drawFunc(sample, Configuration.Current.Direction,
+ using var path1 = drawFunc(sample, Configuration.Current.Direction,
(width + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetX + Configuration.Current.AreaMargin,
(height + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetY + Configuration.Current.AreaMargin,
GetMirrorWidth(width), GetMirrorHeight(height),
Configuration.Current.Rotation, fgPaint);
- _drawFunc(Configuration.Current.ReverseMirror ? sample.Reverse().ToArray() : sample, GetMirrorDirection(),
+ using var path2 = drawFunc(Configuration.Current.ReverseMirror ? sample.Reverse().ToArray() : sample, GetMirrorDirection(),
(width + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetX + GetMirrorX(width),
(height + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetY + GetMirrorY(height),
GetMirrorWidth(width), GetMirrorHeight(height),
-Configuration.Current.Rotation, fgPaint);
+ if (path1 != null && path2 != null && _fgImageIndex != -1)
+ {
+ using var path = new SKPath();
+ path.AddPath(path1);
+ path.AddPath(path2);
+ Canvas.Save();
+ Canvas.ClipPath(path);
+ using var paint = new SKPaint();
+ paint.Color = paint.Color.WithAlpha((byte)(255 * Configuration.Current.FgImageAlpha));
+ Canvas.DrawBitmap(_fgTargetBitmap,
+ (width + Configuration.Current.AreaMargin * 2) / 2f - _fgTargetBitmap!.Width / 2f,
+ (height + Configuration.Current.AreaMargin * 2) / 2f - _fgTargetBitmap.Height / 2f, paint);
+ Canvas.Restore();
+ }
}
else if (Configuration.Current.Mirror == Mirror.SplitChannels)
{
- _drawFunc(sample.Take(sample.Length / 2).ToArray(), Configuration.Current.Direction,
+ using var path1 = drawFunc(sample.Take(sample.Length / 2).ToArray(), Configuration.Current.Direction,
(width + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetX + Configuration.Current.AreaMargin,
(height + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetY + Configuration.Current.AreaMargin,
GetMirrorWidth(width), GetMirrorHeight(height),
Configuration.Current.Rotation, fgPaint);
- _drawFunc(Configuration.Current.ReverseMirror ? sample.Skip(sample.Length / 2).ToArray() : sample.Skip(sample.Length / 2).Reverse().ToArray(), GetMirrorDirection(),
+ using var path2 = drawFunc(Configuration.Current.ReverseMirror ? sample.Skip(sample.Length / 2).ToArray() : sample.Skip(sample.Length / 2).Reverse().ToArray(), GetMirrorDirection(),
(width + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetX + GetMirrorX(width),
(height + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetY + GetMirrorY(height),
GetMirrorWidth(width), GetMirrorHeight(height),
-Configuration.Current.Rotation, fgPaint);
+ if (path1 != null && path2 != null && _fgImageIndex != -1)
+ {
+ using var path = new SKPath();
+ path.AddPath(path1);
+ path.AddPath(path2);
+ Canvas.Save();
+ Canvas.ClipPath(path);
+ using var paint = new SKPaint();
+ paint.Color = paint.Color.WithAlpha((byte)(255 * Configuration.Current.FgImageAlpha));
+ Canvas.DrawBitmap(_fgTargetBitmap, width / 2 - _fgTargetBitmap!.Width / 2f, height / 2 - _fgTargetBitmap.Height / 2f, paint);
+ Canvas.Restore();
+ }
}
else
{
- _drawFunc(sample, Configuration.Current.Direction,
+ using var path = drawFunc(sample, Configuration.Current.Direction,
(width + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetX + Configuration.Current.AreaMargin,
(height + Configuration.Current.AreaMargin * 2) * Configuration.Current.AreaOffsetY + Configuration.Current.AreaMargin,
width, height,
Configuration.Current.Rotation, fgPaint);
+ if (path != null && _fgImageIndex != -1)
+ {
+ Canvas.Save();
+ Canvas.ClipPath(path);
+ using var paint = new SKPaint();
+ paint.Color = paint.Color.WithAlpha((byte)(255 * Configuration.Current.FgImageAlpha));
+ Canvas.DrawBitmap(_fgTargetBitmap, width / 2 - _fgTargetBitmap!.Width / 2f, height / 2 - _fgTargetBitmap.Height / 2f, paint);
+ Canvas.Restore();
+ }
}
Canvas.Flush();
}
@@ -181,16 +274,45 @@ public void Draw(float[] sample, float width, float height)
///
/// Create gradient shader
///
+ /// Gradient type (foreground or background)
/// List of colors as strings
/// Canvas width
/// Canvas height
- /// Whether to create gradient for foreground, there's a difference for Circle modes
/// Area margin
/// Skia Shader
- private SKShader CreateGradient(List colorStrings, float width, float height, bool foreground = false, uint margin = 0)
+ private SKShader CreateGradient(GradientType type, List colorStrings, float width, float height, uint margin = 0)
{
var colors = colorStrings.Select(c => SKColor.Parse(c)).Reverse().ToArray();
- if (Configuration.Current.Mirror != Mirror.Off && !(foreground && Configuration.Current.Mode > DrawingMode.WaveCircle))
+ if (type == GradientType.Foreground)
+ {
+ if (Configuration.Current.Mode == DrawingMode.WaveCircle)
+ {
+ if (Configuration.Current.Mirror > Mirror.Off)
+ {
+ width = GetMirrorWidth(width);
+ height = GetMirrorHeight(height);
+ }
+ var fullRadius = Math.Min(width, height) / 2;
+ var innerRadius = fullRadius * Configuration.Current.InnerRadius;
+ var positions = new float[colors.Length];
+ for (int i = 0; i < colors.Length; i++)
+ {
+ positions[i] = (i + (colors.Length - 1 - i) * innerRadius / fullRadius) / (colors.Length - 1);
+ }
+ return SKShader.CreateRadialGradient(new SKPoint(width / 2, height / 2),
+ fullRadius, colors, positions, SKShaderTileMode.Clamp);
+ }
+ if (Configuration.Current.Mode > DrawingMode.WaveCircle)
+ {
+ if (Configuration.Current.Mirror > Mirror.Off)
+ {
+ width = GetMirrorWidth(width);
+ height = GetMirrorHeight(height);
+ }
+ return SKShader.CreateLinearGradient(new SKPoint(margin, Math.Min(width, height) * Configuration.Current.InnerRadius / 2), new SKPoint(margin, Math.Min(width, height) / 2), colors, SKShaderTileMode.Clamp);
+ }
+ }
+ if (Configuration.Current.Mirror != Mirror.Off)
{
var mirrorColors = new SKColor[colors.Length * 2];
if (Configuration.Current.Direction == DrawingDirection.BottomTop || Configuration.Current.Direction == DrawingDirection.RightLeft)
@@ -202,21 +324,12 @@ private SKShader CreateGradient(List colorStrings, float width, float he
colors.CopyTo(mirrorColors, colors.Length);
colors = mirrorColors;
}
- if (Configuration.Current.Mode > DrawingMode.WaveCircle && foreground)
- {
- if (Configuration.Current.Mirror > Mirror.Off)
- {
- width = GetMirrorWidth(width);
- height = GetMirrorHeight(height);
- }
- return SKShader.CreateLinearGradient(new SKPoint(margin, Math.Min(width, height) * Configuration.Current.InnerRadius / 2), new SKPoint(margin, Math.Min(width, height) / 2), colors, SKShaderTileMode.Clamp);
- }
return Configuration.Current.Direction switch
{
- DrawingDirection.TopBottom => SKShader.CreateLinearGradient(new SKPoint(margin, margin), new SKPoint(margin, height), colors, SKShaderTileMode.Clamp),
- DrawingDirection.BottomTop => SKShader.CreateLinearGradient(new SKPoint(margin, height), new SKPoint(margin, margin), colors, SKShaderTileMode.Clamp),
- DrawingDirection.LeftRight => SKShader.CreateLinearGradient(new SKPoint(margin, margin), new SKPoint(width, margin), colors, SKShaderTileMode.Clamp),
- _ => SKShader.CreateLinearGradient(new SKPoint(width, margin), new SKPoint(margin, margin), colors, SKShaderTileMode.Clamp)
+ DrawingDirection.TopBottom => SKShader.CreateLinearGradient(new SKPoint(margin, margin + height * Configuration.Current.AreaOffsetY), new SKPoint(margin, height * (1 + Configuration.Current.AreaOffsetY)), colors, SKShaderTileMode.Clamp),
+ DrawingDirection.BottomTop => SKShader.CreateLinearGradient(new SKPoint(margin, height * (1 + Configuration.Current.AreaOffsetY)), new SKPoint(margin, margin + height * Configuration.Current.AreaOffsetY), colors, SKShaderTileMode.Clamp),
+ DrawingDirection.LeftRight => SKShader.CreateLinearGradient(new SKPoint(margin + width * Configuration.Current.AreaOffsetX, margin), new SKPoint(width * (1 + Configuration.Current.AreaOffsetX), margin), colors, SKShaderTileMode.Clamp),
+ _ => SKShader.CreateLinearGradient(new SKPoint(width * (1 + Configuration.Current.AreaOffsetX), margin), new SKPoint(margin + width * Configuration.Current.AreaOffsetX, margin), colors, SKShaderTileMode.Clamp)
};
}
@@ -243,7 +356,7 @@ private float GetMirrorX(float width)
{
if (Configuration.Current.Direction == DrawingDirection.LeftRight || Configuration.Current.Direction == DrawingDirection.RightLeft)
{
- return width / 2.0f + Configuration.Current.AreaMargin;
+ return width / 2f + Configuration.Current.AreaMargin;
}
return Configuration.Current.AreaMargin;
}
@@ -256,7 +369,7 @@ private float GetMirrorY(float height)
{
if (Configuration.Current.Direction == DrawingDirection.TopBottom || Configuration.Current.Direction == DrawingDirection.BottomTop)
{
- return height / 2.0f + Configuration.Current.AreaMargin;
+ return height / 2f + Configuration.Current.AreaMargin;
}
return Configuration.Current.AreaMargin;
}
@@ -269,7 +382,7 @@ private float GetMirrorWidth(float width)
{
if (Configuration.Current.Direction == DrawingDirection.LeftRight || Configuration.Current.Direction == DrawingDirection.RightLeft)
{
- return width / 2.0f;
+ return width / 2f;
}
return width;
}
@@ -282,7 +395,7 @@ private float GetMirrorHeight(float height)
{
if (Configuration.Current.Direction == DrawingDirection.TopBottom || Configuration.Current.Direction == DrawingDirection.BottomTop)
{
- return height / 2.0f;
+ return height / 2f;
}
return height;
}
@@ -297,10 +410,13 @@ private float GetMirrorHeight(float height)
/// Drawing width
/// Drawing height
/// Skia paint
- private void DrawWaveBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// Rotation angle in radians (only used in Circle modes)
+ /// Skia paint
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawWaveBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / (sample.Length - 1);
- using var path = new SKPath();
+ var path = new SKPath();
switch (direction)
{
case DrawingDirection.TopBottom:
@@ -381,6 +497,33 @@ private void DrawWaveBox(float[] sample, DrawingDirection direction, float x, fl
break;
}
Canvas.DrawPath(path, paint);
+ if (!Configuration.Current.Filling)
+ {
+ switch (direction)
+ {
+ case DrawingDirection.TopBottom:
+ path.LineTo(x + width, y);
+ path.LineTo(x, y);
+ path.Close();
+ break;
+ case DrawingDirection.BottomTop:
+ path.LineTo(x + width, y + height);
+ path.LineTo(x, y + height);
+ path.Close();
+ break;
+ case DrawingDirection.LeftRight:
+ path.LineTo(x, y + height);
+ path.LineTo(x, y);
+ path.Close();
+ break;
+ case DrawingDirection.RightLeft:
+ path.LineTo(x + width, y + height);
+ path.LineTo(x + width, y);
+ path.Close();
+ break;
+ }
+ }
+ return path;
}
///
@@ -392,12 +535,15 @@ private void DrawWaveBox(float[] sample, DrawingDirection direction, float x, fl
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawLevelsBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawLevelsBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / sample.Length;
var itemWidth = (direction < DrawingDirection.LeftRight ? step : width / 10) * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2);
var itemHeight = (direction < DrawingDirection.LeftRight ? height / 10 : step) * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2);
+ var path = new SKPath();
for (var i = 0; i < sample.Length; i++)
{
for (var j = 0; j < Math.Floor(sample[i] * 10); j++)
@@ -405,40 +551,50 @@ private void DrawLevelsBox(float[] sample, DrawingDirection direction, float x,
switch (direction)
{
case DrawingDirection.TopBottom:
- Canvas.DrawRoundRect(
- x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + height / 10 * j + height / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + height / 10 * j + height / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + step * (i + Configuration.Current.ItemsOffset) + itemWidth,
+ y + height / 10 * j + height / 10 * Configuration.Current.ItemsOffset + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.BottomTop:
- Canvas.DrawRoundRect(
- x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + height / 10 * (9 - j) + height / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + height / 10 * (9 - j) + height / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + step * (i + Configuration.Current.ItemsOffset) + itemWidth,
+ y + height / 10 * (9 - j) + height / 10 * Configuration.Current.ItemsOffset + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.LeftRight:
- Canvas.DrawRoundRect(
- x + width / 10 * j + width / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + width / 10 * j + width / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + width / 10 * j + width / 10 * Configuration.Current.ItemsOffset + itemWidth,
+ y + step * (i + Configuration.Current.ItemsOffset) + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.RightLeft:
- Canvas.DrawRoundRect(
- x + width / 10 * (9 - j) + width / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + width / 10 * (9 - j) + width / 10 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + width / 10 * (9 - j) + width / 10 * Configuration.Current.ItemsOffset + itemWidth,
+ y + step * (i + Configuration.Current.ItemsOffset) + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
}
}
}
+ Canvas.DrawPath(path, paint);
+ return path;
}
///
@@ -450,50 +606,63 @@ private void DrawLevelsBox(float[] sample, DrawingDirection direction, float x,
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawParticlesBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawParticlesBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / sample.Length;
var itemWidth = (direction < DrawingDirection.LeftRight ? step : width / 11) * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2);
var itemHeight = (direction < DrawingDirection.LeftRight ? height / 11 : step) * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2);
+ var path = new SKPath();
for (var i = 0; i < sample.Length; i++)
{
switch (direction)
{
case DrawingDirection.TopBottom:
- Canvas.DrawRoundRect(
- x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + height / 11 * 10 * sample[i] + height / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + height / 11 * 10 * sample[i] + height / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + step * (i + Configuration.Current.ItemsOffset) + itemWidth,
+ y + height / 11 * 10 * sample[i] + height / 11 * Configuration.Current.ItemsOffset + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.BottomTop:
- Canvas.DrawRoundRect(
- x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + height / 11 * 10 * (1 - sample[i]) + height / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + height / 11 * 10 * (1 - sample[i]) + height / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + step * (i + Configuration.Current.ItemsOffset) + itemWidth,
+ y + height / 11 * 10 * (1 - sample[i]) + height / 11 * Configuration.Current.ItemsOffset + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.LeftRight:
- Canvas.DrawRoundRect(
- x + width / 11 * 10 * sample[i] + width / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + width / 11 * 10 * sample[i] + width / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + width / 11 * 10 * sample[i] + width / 11 * Configuration.Current.ItemsOffset + itemWidth,
+ y + step * (i + Configuration.Current.ItemsOffset) + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
case DrawingDirection.RightLeft:
- Canvas.DrawRoundRect(
- x + width / 11 * 10 * (1 - sample[i]) + width / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- itemWidth, itemHeight,
- itemWidth / 2 * Configuration.Current.ItemsRoundness, itemHeight / 2 * Configuration.Current.ItemsRoundness,
- paint);
+ path.AddRoundRect(
+ new SKRect(
+ x + width / 11 * 10 * (1 - sample[i]) + width / 11 * Configuration.Current.ItemsOffset + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ x + width / 11 * 10 * (1 - sample[i]) + width / 11 * Configuration.Current.ItemsOffset + itemWidth,
+ y + step * (i + Configuration.Current.ItemsOffset) + itemHeight),
+ itemWidth / 2 * Configuration.Current.ItemsRoundness,
+ itemHeight / 2 * Configuration.Current.ItemsRoundness);
break;
}
}
+ Canvas.DrawPath(path, paint);
+ return path;
}
///
@@ -505,10 +674,13 @@ private void DrawParticlesBox(float[] sample, DrawingDirection direction, float
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawBarsBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawBarsBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / sample.Length;
+ var path = new SKPath();
for (var i = 0; i < sample.Length; i++)
{
if (sample[i] == 0)
@@ -518,39 +690,37 @@ private void DrawBarsBox(float[] sample, DrawingDirection direction, float x, fl
switch (direction)
{
case DrawingDirection.TopBottom:
- Canvas.DrawRect(
+ path.AddRect(new SKRect(
x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
(Configuration.Current.Filling ? y : y + Configuration.Current.LinesThickness / 2) - 1,
- step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- height * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness) + 1,
- paint);
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2) + step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
+ y + height * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness) + 1));
break;
case DrawingDirection.BottomTop:
- Canvas.DrawRect(
+ path.AddRect(new SKRect(
x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
y + height * (1 - sample[i]) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- height * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness) + 1,
- paint);
+ x + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2) + step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
+ y + height - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness) + 1));
break;
case DrawingDirection.LeftRight:
- Canvas.DrawRect(
+ path.AddRect(new SKRect(
Configuration.Current.Filling ? x : x + Configuration.Current.LinesThickness / 2,
y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- width * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- paint);
+ x + width * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2) + step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness)));
break;
case DrawingDirection.RightLeft:
- Canvas.DrawRect(
+ path.AddRect(new SKRect(
x + width * (1 - sample[i]) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
- width * sample[i] - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness),
- paint);
+ x + width - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2),
+ y + step * (i + Configuration.Current.ItemsOffset) + (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness / 2) + step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness)));
break;
};
}
+ Canvas.DrawPath(path, paint);
+ return path;
}
///
@@ -562,11 +732,14 @@ private void DrawBarsBox(float[] sample, DrawingDirection direction, float x, fl
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawSpineBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawSpineBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / sample.Length;
var itemSize = step * (1 - Configuration.Current.ItemsOffset * 2) - (Configuration.Current.Filling ? 0 : Configuration.Current.LinesThickness);
+ var totalPath = new SKPath();
for (var i = 0; i < sample.Length; i++)
{
if (sample[i] == 0)
@@ -581,7 +754,7 @@ private void DrawSpineBox(float[] sample, DrawingDirection direction, float x, f
{
Canvas.Save();
using var path = new SKPath();
- DrawHeart(path, itemSize);
+ CreateHeart(path, itemSize);
Canvas.Translate(x + step * i + step / 2, y + height / 2);
Canvas.Scale(sample[i]);
Canvas.DrawPath(path, GetSpinePaint(paint, sample[i]));
@@ -594,6 +767,11 @@ private void DrawSpineBox(float[] sample, DrawingDirection direction, float x, f
itemSize * sample[i], itemSize * sample[i],
itemSize * sample[i] / 2 * Configuration.Current.ItemsRoundness, itemSize * sample[i] / 2 * Configuration.Current.ItemsRoundness,
GetSpinePaint(paint, sample[i]));
+ totalPath.AddRect(new SKRect(
+ x + step * (i + 0.5f) + (1 - itemSize * sample[i]) / 2,
+ y + height / 2 - itemSize * sample[i] / 2,
+ x + step * (i + 0.5f) + (1 - itemSize * sample[i]) / 2 + itemSize * sample[i],
+ y + height / 2 - itemSize * sample[i] / 2 + itemSize * sample[i]));
break;
case DrawingDirection.LeftRight:
case DrawingDirection.RightLeft:
@@ -601,7 +779,7 @@ private void DrawSpineBox(float[] sample, DrawingDirection direction, float x, f
{
Canvas.Save();
using var path = new SKPath();
- DrawHeart(path, itemSize);
+ CreateHeart(path, itemSize);
Canvas.Translate(x + width / 2, y + step * i + step / 2);
Canvas.Scale(sample[i]);
Canvas.DrawPath(path, GetSpinePaint(paint, sample[i]));
@@ -617,14 +795,20 @@ private void DrawSpineBox(float[] sample, DrawingDirection direction, float x, f
break;
}
}
+ if (Configuration.Current.Hearts)
+ {
+ totalPath.Dispose();
+ return null;
+ }
+ return totalPath;
}
///
- /// Draw a heart for modified Spine mode
+ /// Modify path to create a heart for modified Spine mode
///
/// Path to use for drawing
/// Size of a square to fit a heart into
- private void DrawHeart(SKPath path, float itemSize)
+ private void CreateHeart(SKPath path, float itemSize)
{
path.MoveTo(0, itemSize / 2);
path.CubicTo(
@@ -679,8 +863,10 @@ private SKPaint GetSpinePaint(SKPaint paint, float sample)
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawSplitterBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawSplitterBox(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var step = (direction < DrawingDirection.LeftRight ? width : height) / sample.Length;
var path = new SKPath();
@@ -734,30 +920,35 @@ private void DrawSplitterBox(float[] sample, DrawingDirection direction, float x
break;
}
}
+ if (!Configuration.Current.Filling)
+ {
+ Canvas.DrawPath(path, paint);
+ }
+ switch (direction)
+ {
+ case DrawingDirection.TopBottom:
+ path.LineTo(x + width, y);
+ path.LineTo(x, y);
+ break;
+ case DrawingDirection.BottomTop:
+ path.LineTo(x + width, y + height);
+ path.LineTo(x, y + height);
+ break;
+ case DrawingDirection.LeftRight:
+ path.LineTo(x, y + height);
+ path.LineTo(x, y);
+ break;
+ case DrawingDirection.RightLeft:
+ path.LineTo(x + width, y + height);
+ path.LineTo(x + width, y);
+ break;
+ }
+ path.Close();
if (Configuration.Current.Filling)
{
- switch (direction)
- {
- case DrawingDirection.TopBottom:
- path.LineTo(x + width, y);
- path.LineTo(x, y);
- break;
- case DrawingDirection.BottomTop:
- path.LineTo(x + width, y + height);
- path.LineTo(x, y + height);
- break;
- case DrawingDirection.LeftRight:
- path.LineTo(x, y + height);
- path.LineTo(x, y);
- break;
- case DrawingDirection.RightLeft:
- path.LineTo(x + width, y + height);
- path.LineTo(x + width, y);
- break;
- }
- path.Close();
+ Canvas.DrawPath(path, paint);
}
- Canvas.DrawPath(path, paint);
+ return path;
}
///
@@ -769,58 +960,51 @@ private void DrawSplitterBox(float[] sample, DrawingDirection direction, float x
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawWaveCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawWaveCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var fullRadius = Math.Min(width, height) / 2;
var innerRadius = fullRadius * Configuration.Current.InnerRadius;
var radius = fullRadius - innerRadius;
- // Modify paint (this mode requires specific paint configuration)
+ Canvas.Save();
+ Canvas.Translate(x, y);
paint.Style = SKPaintStyle.Stroke;
paint.StrokeWidth = Configuration.Current.Filling ? fullRadius - innerRadius : Configuration.Current.LinesThickness;
- var colors = Configuration.Current.ColorProfiles[Configuration.Current.ActiveProfile].FgColors.Select(c => SKColor.Parse(c)).Reverse().ToArray();
- var positions = new float[Configuration.Current.ColorProfiles[Configuration.Current.ActiveProfile].FgColors.Count];
- for (int i = 0; i < colors.Length; i++)
- {
- positions[i] = (i + (colors.Length - 1 - i) * innerRadius / fullRadius) / (colors.Length - 1);
- }
- paint.Shader = SKShader.CreateRadialGradient(new SKPoint(x + width / 2, y + height / 2),
- fullRadius, colors, positions, SKShaderTileMode.Clamp);
- // Create path
using var path = new SKPath();
path.MoveTo(
- x + width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + rotation),
- y + height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + rotation));
+ width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + rotation),
+ height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + rotation));
for (var i = 0; i < sample.Length - 1; i++)
{
path.CubicTo(
- x + width / 2 + (innerRadius + radius * sample[i]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
- y + height / 2 + (innerRadius + radius * sample[i]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
- x + width / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
- y + height / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
- x + width / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 1) / sample.Length + rotation),
- y + height / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 1) / sample.Length + rotation));
+ width / 2 + (innerRadius + radius * sample[i]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
+ height / 2 + (innerRadius + radius * sample[i]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
+ width / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
+ height / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 0.5f) / sample.Length + rotation),
+ width / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (i + 1) / sample.Length + rotation),
+ height / 2 + (innerRadius + radius * sample[i+1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (i + 1) / sample.Length + rotation));
}
path.CubicTo(
- x + width / 2 + (innerRadius + radius * sample[^1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
- y + height / 2 + (innerRadius + radius * sample[^1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
- x + width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
- y + height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
- x + width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + rotation),
- y + height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + rotation));
+ width / 2 + (innerRadius + radius * sample[^1]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
+ height / 2 + (innerRadius + radius * sample[^1]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
+ width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
+ height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * (sample.Length - 0.5f) / sample.Length + rotation),
+ width / 2 + (innerRadius + radius * sample[0]) * (float)Math.Cos(Math.PI / 2 + rotation),
+ height / 2 + (innerRadius + radius * sample[0]) * (float)Math.Sin(Math.PI / 2 + rotation));
path.Close();
- // Draw
if (Configuration.Current.Filling)
{
- Canvas.Save();
Canvas.ClipPath(path, SKClipOperation.Intersect, true);
- Canvas.DrawCircle(new SKPoint(x + width / 2, y + height / 2), innerRadius + (fullRadius - innerRadius)/ 2, paint);
- Canvas.Restore();
+ Canvas.DrawCircle(new SKPoint(width / 2, height / 2), innerRadius + (fullRadius - innerRadius)/ 2, paint);
}
else
{
Canvas.DrawPath(path, paint);
}
+ Canvas.Restore();
+ return null;
}
///
@@ -832,8 +1016,10 @@ private void DrawWaveCircle(float[] sample, DrawingDirection direction, float x,
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawLevelsCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawLevelsCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var fullRadius = Math.Min(width, height) / 2;
var innerRadius = fullRadius * Configuration.Current.InnerRadius;
@@ -856,6 +1042,7 @@ private void DrawLevelsCircle(float[] sample, DrawingDirection direction, float
}
Canvas.Restore();
}
+ return null;
}
///
@@ -867,8 +1054,10 @@ private void DrawLevelsCircle(float[] sample, DrawingDirection direction, float
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawParticlesCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawParticlesCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var fullRadius = Math.Min(width, height) / 2;
var innerRadius = fullRadius * Configuration.Current.InnerRadius;
@@ -888,6 +1077,7 @@ private void DrawParticlesCircle(float[] sample, DrawingDirection direction, flo
paint);
Canvas.Restore();
}
+ return null;
}
///
@@ -899,8 +1089,10 @@ private void DrawParticlesCircle(float[] sample, DrawingDirection direction, flo
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawBarsCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawBarsCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var fullRadius = Math.Min(width, height) / 2;
var innerRadius = fullRadius * Configuration.Current.InnerRadius;
@@ -918,6 +1110,7 @@ private void DrawBarsCircle(float[] sample, DrawingDirection direction, float x,
paint);
Canvas.Restore();
}
+ return null;
}
///
@@ -929,8 +1122,10 @@ private void DrawBarsCircle(float[] sample, DrawingDirection direction, float x,
/// Top-left corner Y coordinate
/// Drawing width
/// Drawing height
+ /// Rotation angle in radians (only used in Circle modes)
/// Skia paint
- private void DrawSpineCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
+ /// SKPath for foreground image masking if supported, else null
+ private SKPath? DrawSpineCircle(float[] sample, DrawingDirection direction, float x, float y, float width, float height, float rotation, SKPaint paint)
{
var fullRadius = Math.Min(width, height) / 2;
var innerRadius = fullRadius * Configuration.Current.InnerRadius;
@@ -942,7 +1137,7 @@ private void DrawSpineCircle(float[] sample, DrawingDirection direction, float x
{
Canvas.Save();
using var path = new SKPath();
- DrawHeart(path, itemSize);
+ CreateHeart(path, itemSize);
Canvas.Translate(x + width / 2 + innerRadius * (float)Math.Cos(rotation + Math.PI / 2 + Math.PI * 2 * i / sample.Length), y + height / 2 + innerRadius * (float)Math.Sin(Math.PI / 2 + Math.PI * 2 * i / sample.Length));
Canvas.Scale(sample[i]);
Canvas.DrawPath(path, GetSpinePaint(paint, sample[i]));
@@ -961,5 +1156,6 @@ private void DrawSpineCircle(float[] sample, DrawingDirection direction, float x
GetSpinePaint(paint, sample[i]));
Canvas.Restore();
}
+ return null;
}
}
diff --git a/NickvisionCavalier.Shared/NickvisionCavalier.Shared.csproj b/NickvisionCavalier.Shared/NickvisionCavalier.Shared.csproj
index e4cbdc4..23efbf1 100644
--- a/NickvisionCavalier.Shared/NickvisionCavalier.Shared.csproj
+++ b/NickvisionCavalier.Shared/NickvisionCavalier.Shared.csproj
@@ -16,7 +16,7 @@
-
+
diff --git a/NickvisionCavalier.Shared/Resources/po/cavalier.pot b/NickvisionCavalier.Shared/Resources/po/cavalier.pot
index 995e5d6..faf1b36 100644
--- a/NickvisionCavalier.Shared/Resources/po/cavalier.pot
+++ b/NickvisionCavalier.Shared/Resources/po/cavalier.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr ""
@@ -26,17 +26,17 @@ msgstr ""
msgid "Add New Profile"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -44,11 +44,11 @@ msgstr ""
msgid "Cavalier"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr ""
@@ -56,21 +56,21 @@ msgstr ""
msgid "Default"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr ""
@@ -78,15 +78,15 @@ msgstr ""
msgid "GitHub Repo"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr ""
@@ -94,19 +94,19 @@ msgstr ""
msgid "New color profile will be a copy of the current active profile."
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr ""
@@ -114,20 +114,20 @@ msgstr ""
msgid "Profile Name"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -148,7 +148,7 @@ msgid ""
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr ""
@@ -406,23 +406,55 @@ msgstr ""
msgid "Foreground Colors"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+msgid "Add foreground color"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+msgid "Add background color"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+msgid "Images"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+msgid "Background"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+msgid "Foreground"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+msgid "No Images"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr ""
@@ -511,29 +543,45 @@ msgid "Change Background Image"
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+msgid "Change Background Image Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+msgid "Change Background Image Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+msgid "Change Foreground Image"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+msgid "Change Foreground Image Scale"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+msgid "Change Foreground Image Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr ""
@@ -556,7 +604,7 @@ msgid "11 drawing modes!"
msgstr ""
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
diff --git a/NickvisionCavalier.Shared/Resources/po/cs.po b/NickvisionCavalier.Shared/Resources/po/cs.po
index b5ab22a..89f18f3 100644
--- a/NickvisionCavalier.Shared/Resources/po/cs.po
+++ b/NickvisionCavalier.Shared/Resources/po/cs.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-08 18:31+0000\n"
"Last-Translator: Fjuro \n"
-"Language-Team: Czech \n"
+"Language-Team: Czech \n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Přidat"
@@ -28,17 +28,17 @@ msgstr "Přidat"
msgid "Add New Profile"
msgstr "Přidat nový profil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Opravdu chcete odstranit profil „{0}“?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Zrušit"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Zrušit"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Přispěvatelě na GitHubu ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -58,21 +58,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Výchozí"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Smazat"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Smazat Profil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Plný"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -80,15 +80,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "Repozitář GitHub"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Srdíčka"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "Obrázky JPEG a PNG"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Matrix Chat"
@@ -96,19 +96,19 @@ msgstr "Matrix Chat"
msgid "New color profile will be a copy of the current active profile."
msgstr "Nový barevný profil bude kopie současně aktivního profilu."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Vypnuto"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Zapnuto"
@@ -116,20 +116,20 @@ msgstr "Zapnuto"
msgid "Profile Name"
msgstr "Název profilu"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Vybrat obrázek"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Rozdělit kanály"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Písek Pískovec"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -152,7 +152,7 @@ msgstr ""
"video a sledujte, jak váš zvuk ožije!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Předvolby"
@@ -415,23 +415,61 @@ msgstr "Tmavý"
msgid "Foreground Colors"
msgstr "Barvy popředí"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Barvy popředí"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Barvy pozadí"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Barvy pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Obrázek"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Barvy pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Barvy popředí"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Přidat obrázek"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Měřítko"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Žádný obrázek"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Žádný obrázek"
@@ -520,29 +558,50 @@ msgid "Change Background Image"
msgstr "Změnit obrázek na pozadí"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Změnit obrázek na pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Změnit obrázek na pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Změnit obrázek na pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Změnit velikost obrázku"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Změnit obrázek na pozadí"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Aplikace"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Přepnout na celou obrazovku"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Klávesové zkratky"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "O aplikaci Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Ukončit"
@@ -566,7 +625,8 @@ msgid "11 drawing modes!"
msgstr "11 vykreslovacích režimů!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr "Nastavte jakoukoliv barvu nebo jako pozadí nebo popředí."
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
diff --git a/NickvisionCavalier.Shared/Resources/po/de.po b/NickvisionCavalier.Shared/Resources/po/de.po
index 78d2cae..352763e 100644
--- a/NickvisionCavalier.Shared/Resources/po/de.po
+++ b/NickvisionCavalier.Shared/Resources/po/de.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-16 04:51+0000\n"
"Last-Translator: Renner03 \n"
-"Language-Team: German \n"
+"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Hinzufügen"
@@ -28,17 +28,17 @@ msgstr "Hinzufügen"
msgid "Add New Profile"
msgstr "Neues Profil hinzufügen"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, fuzzy, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Soll dieses Profil wirklich entfernt werden?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Abbrechen"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Abbrechen"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Mitwirkende auf GitHub ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr ""
@@ -58,22 +58,22 @@ msgstr ""
msgid "Default"
msgstr "Standard"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Löschen"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, fuzzy
msgid "Delete Profile"
msgstr "Farbprofile"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
#, fuzzy
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -82,15 +82,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "JPEG und PNG Bilder"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
#, fuzzy
msgid "Matrix Chat"
msgstr "Matrix Chat"
@@ -99,20 +99,20 @@ msgstr "Matrix Chat"
msgid "New color profile will be a copy of the current active profile."
msgstr "Neues Farbprofil wird eine Kopie vom aktuellen Profil sein."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
#, fuzzy
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Aus"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
#, fuzzy
msgid "On"
msgstr "Öffnen"
@@ -121,21 +121,21 @@ msgstr "Öffnen"
msgid "Profile Name"
msgstr "Profilname"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "ein Bild auswählen"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
#, fuzzy
msgid "Split Channels"
msgstr "Kanäle"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Mitwirkende Übersetzer"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
#, fuzzy
@@ -157,7 +157,7 @@ msgid ""
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Einstellungen"
@@ -437,24 +437,60 @@ msgstr "Dunkel"
msgid "Foreground Colors"
msgstr "Vordergrundfarben"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Vordergrundfarben"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
#, fuzzy
msgid "Background Colors"
msgstr "Hintergrundfarben"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Hintergrundfarben"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+msgid "Images"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Hintergrundfarben"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Vordergrundfarben"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+msgid "No Images"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr ""
@@ -553,30 +589,46 @@ msgid "Change Background Image"
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+msgid "Change Background Image Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+msgid "Change Background Image Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+msgid "Change Foreground Image"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+msgid "Change Foreground Image Scale"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+msgid "Change Foreground Image Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Tastenkürzel"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
#, fuzzy
msgid "About Cavalier"
msgstr "Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Schließen"
@@ -604,7 +656,7 @@ msgstr "4 Zeichenmodi!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
#, fuzzy
-msgid "Set any color or a gradient for background and foreground."
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
"Eine einzige Farbe oder einen bis zu 10-farbigen Farbverlauf für Vorder- und "
"Hintergrund einstellen."
diff --git a/NickvisionCavalier.Shared/Resources/po/es.po b/NickvisionCavalier.Shared/Resources/po/es.po
index b0195ab..1c9806c 100644
--- a/NickvisionCavalier.Shared/Resources/po/es.po
+++ b/NickvisionCavalier.Shared/Resources/po/es.po
@@ -7,12 +7,12 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-09 12:21+0000\n"
-"Last-Translator: Óscar Fernández Díaz \n"
-"Language-Team: Spanish \n"
+"Last-Translator: Óscar Fernández Díaz \n"
+"Language-Team: Spanish \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Añadir"
@@ -29,17 +29,17 @@ msgstr "Añadir"
msgid "Add New Profile"
msgstr "Añadir perfil nuevo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "¿Está seguro de que desea eliminar el perfil \"{0}\"?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Cancelar"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -47,11 +47,11 @@ msgstr "Cancelar"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Colaboradores en GitHub ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -59,21 +59,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Predeterminado"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Borrar"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Borrar perfil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Completo"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -81,15 +81,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "Repo de GitHub"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Corazones"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "Imágenes JPEG y PNG"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Chat de Matrix"
@@ -97,19 +97,19 @@ msgstr "Chat de Matrix"
msgid "New color profile will be a copy of the current active profile."
msgstr "El perfil de color nuevo será una copia del perfil activo actual."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Apagado"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Activo"
@@ -117,20 +117,20 @@ msgstr "Activo"
msgid "Profile Name"
msgstr "Nombre del perfil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Seleccione una imagen"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Dividir canales"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Óscar Fernández Díaz "
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -153,7 +153,7 @@ msgstr ""
"y verá cómo el sonido cobra vida!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Preferencias"
@@ -416,23 +416,61 @@ msgstr "Oscuro"
msgid "Foreground Colors"
msgstr "Colores del primer plano"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Colores del primer plano"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Colores de fondo"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Colores de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Imagen"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Colores de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Colores del primer plano"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Añadir imagen"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Escala"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Sin imagen"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Sin imagen"
@@ -521,29 +559,50 @@ msgid "Change Background Image"
msgstr "Cambiar imagen de fondo"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Cambiar imagen de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Cambiar imagen de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Cambiar imagen de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Cambiar escala de la imagen"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Cambiar imagen de fondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Aplicación"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Conmutar pantalla completa"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Atajos del teclado"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "Acerca de Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Salir"
@@ -568,7 +627,8 @@ msgid "11 drawing modes!"
msgstr "¡11 modos de dibujo!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
"Establezca cualquier color o un degradado para el fondo y el primer plano."
diff --git a/NickvisionCavalier.Shared/Resources/po/fi.po b/NickvisionCavalier.Shared/Resources/po/fi.po
index c41ad0b..673af92 100644
--- a/NickvisionCavalier.Shared/Resources/po/fi.po
+++ b/NickvisionCavalier.Shared/Resources/po/fi.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-13 23:35+0000\n"
"Last-Translator: Jiri Grönroos \n"
-"Language-Team: Finnish \n"
+"Language-Team: Finnish \n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Lisää"
@@ -28,17 +28,17 @@ msgstr "Lisää"
msgid "Add New Profile"
msgstr "Lisää uusi profiili"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Haluatko varmasti poistaa profiilin \"{0}\"?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Peru"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Peru"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Avustajat GitHubissa ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -58,21 +58,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Oletus"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Poista"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Poista profiili"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Täysi"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -80,15 +80,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "GitHub-tietovarasto"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "JPEG- ja PNG-kuvat"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Matrix-keskustelu"
@@ -97,19 +97,19 @@ msgid "New color profile will be a copy of the current active profile."
msgstr ""
"Uusi väriprofiili tulee olemaan kopio nykyisestä aktiivisesta profiilista."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Pois"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Päällä"
@@ -117,20 +117,20 @@ msgstr "Päällä"
msgid "Profile Name"
msgstr "Profiilin nimi"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Valitse kuva"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Jaa kanavat"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Jiri Grönroos"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -153,7 +153,7 @@ msgstr ""
"video, ja näe, kuinka ääni herää eloon!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Asetukset"
@@ -412,23 +412,61 @@ msgstr "Tumma"
msgid "Foreground Colors"
msgstr "Edustavärit"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Edustavärit"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Taustavärit"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Taustavärit"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Kuva"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Taustavärit"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Edustavärit"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Lisää kuva"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Ei kuvaa"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Ei kuvaa"
@@ -521,29 +559,50 @@ msgid "Change Background Image"
msgstr "Vaihda taustakuva"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
-msgstr ""
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Vaihda taustakuva"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Vaihda taustakuva"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Vaihda taustakuva"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
+msgstr "Vaihda taustakuva"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Vaihda taustakuva"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Sovellus"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Koko näyttö päälle/pois"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Pikanäppäimet"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "Tietoja - Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Lopeta"
@@ -566,7 +625,7 @@ msgid "11 drawing modes!"
msgstr "11 piirtotilaa!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
diff --git a/NickvisionCavalier.Shared/Resources/po/fr.po b/NickvisionCavalier.Shared/Resources/po/fr.po
index 4824506..18a9725 100644
--- a/NickvisionCavalier.Shared/Resources/po/fr.po
+++ b/NickvisionCavalier.Shared/Resources/po/fr.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-08 10:00+0000\n"
"Last-Translator: rene-coty \n"
-"Language-Team: French \n"
+"Language-Team: French \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Ajouter"
@@ -28,17 +28,17 @@ msgstr "Ajouter"
msgid "Add New Profile"
msgstr "Ajouter un nouveau profil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Êtes-vous sûr⋅e de vouloir supprimer le profil « {0} » ?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Annuler"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Annuler"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Contributeurs sur GitHub ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -58,21 +58,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Par défaut"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Supprimer"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Supprimer le profil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Intégral"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -80,15 +80,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "Dépôt GitHub"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Cœurs"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "Images JPEG et PNG"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Discussion Matrix"
@@ -96,19 +96,19 @@ msgstr "Discussion Matrix"
msgid "New color profile will be a copy of the current active profile."
msgstr "Le nouveau profil de couleur sera une copie du profil actif actuel."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Désactivé"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Activé"
@@ -116,20 +116,20 @@ msgstr "Activé"
msgid "Profile Name"
msgstr "Nom du profil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Sélectionnez une image"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Séparer les canaux"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Irénée Thirion"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -152,7 +152,7 @@ msgstr ""
"pour le voir prendre vie !"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Préférences"
@@ -417,23 +417,61 @@ msgstr "Sombre"
msgid "Foreground Colors"
msgstr "Couleurs de premier-plan"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Couleurs de premier-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Couleurs d’arrière-plan"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Couleurs d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Image"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Couleurs d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Couleurs de premier-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Ajouter une image"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Mise à l’échelle"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Aucune image"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Aucune image"
@@ -522,29 +560,50 @@ msgid "Change Background Image"
msgstr "Changer l’image d’arrière-plan"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Changer l’image d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Changer l’image d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Changer l’image d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Changer l’échelle de l’image"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Changer l’image d’arrière-plan"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Application"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Basculer en plein écran"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Raccourcis clavier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "À propos de Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Quitter"
@@ -569,7 +628,8 @@ msgid "11 drawing modes!"
msgstr "11 modes de dessin !"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
"Définissez une couleur ou un dégradé pour l’arrière-plan et le premier-plan."
diff --git a/NickvisionCavalier.Shared/Resources/po/it.po b/NickvisionCavalier.Shared/Resources/po/it.po
index f6b4231..56c1267 100644
--- a/NickvisionCavalier.Shared/Resources/po/it.po
+++ b/NickvisionCavalier.Shared/Resources/po/it.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-12 15:48+0000\n"
"Last-Translator: albanobattistella \n"
-"Language-Team: Italian \n"
+"Language-Team: Italian \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Aggiungi"
@@ -28,17 +28,17 @@ msgstr "Aggiungi"
msgid "Add New Profile"
msgstr "Aggiungi nuovo profilo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Sei sicuro di voler rimuovere il profilo \"{0}\"?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Cancella"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Cancella"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Contributori su GitHub ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -58,21 +58,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Predefinito"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Cancella"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Elimina profilo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Pieno"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -80,15 +80,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "Repo GitHub"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Cuori"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "Immagini JPEG e PNG"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Chat Matrix"
@@ -96,19 +96,19 @@ msgstr "Chat Matrix"
msgid "New color profile will be a copy of the current active profile."
msgstr "Il nuovo profilo colore sarà una copia del profilo attivo corrente."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Off"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Acceso"
@@ -116,20 +116,20 @@ msgstr "Acceso"
msgid "Profile Name"
msgstr "Nome profilo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Seleziona un'immagine"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Dividi canali"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Albano Battistella"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -152,7 +152,7 @@ msgstr ""
"guarda un video e guarda il tuo suono prendere vita!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Preferenze"
@@ -417,23 +417,61 @@ msgstr "Scuro"
msgid "Foreground Colors"
msgstr "Colori in primo piano"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Colori in primo piano"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Colori di sfondo"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Colori di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Immagine"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Colori di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Colori in primo piano"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Aggiungi immagine"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Scala"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Nessuna immagine"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Nessuna immagine"
@@ -522,29 +560,50 @@ msgid "Change Background Image"
msgstr "Cambia immagine di sfondo"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Cambia immagine di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Cambia immagine di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Cambia immagine di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Cambia la scala dell'immagine"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Cambia immagine di sfondo"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Applicazione"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Attiva schermo intero"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Scorciatoie da tastiera"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "Informazioni su Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Esci"
@@ -569,7 +628,8 @@ msgid "11 drawing modes!"
msgstr "11 modalità di disegno!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr "Imposta qualsiasi colore o sfumatura per lo sfondo e il primo piano."
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
@@ -634,8 +694,8 @@ msgstr ""
#~ "Added option to change roundness of items in \"levels\" and \"particles\" "
#~ "modes."
#~ msgstr ""
-#~ "Aggiunta opzione per modificare la rotondità degli elementi in \"livelli"
-#~ "\" e modalità \"particelle\"."
+#~ "Aggiunta opzione per modificare la rotondità degli elementi in "
+#~ "\"livelli\" e modalità \"particelle\"."
#~ msgid "Import/Export Settings"
#~ msgstr "Impostazioni di importazione/esportazione"
@@ -654,8 +714,8 @@ msgstr ""
#~ msgid "This setting only affects \"levels\" and \"particles\" modes."
#~ msgstr ""
-#~ "Questa impostazione riguarda solo le modalità \"livelli\" e \"particelle"
-#~ "\"."
+#~ "Questa impostazione riguarda solo le modalità \"livelli\" e "
+#~ "\"particelle\"."
#~ msgid "Number of bars in CAVA config"
#~ msgstr "Numero di barre nella configurazione CAVA"
@@ -682,8 +742,8 @@ msgstr ""
#~ "This setting only affects \"levels\" and \"particles\" modes.\n"
#~ "0 - square, 1 - round"
#~ msgstr ""
-#~ "Questa impostazione riguarda solo le modalità \"livelli\" e \"particelle"
-#~ "\".\n"
+#~ "Questa impostazione riguarda solo le modalità \"livelli\" e "
+#~ "\"particelle\".\n"
#~ "0 - quadrato, 1 - rotondo"
#~ msgid "Import"
diff --git a/NickvisionCavalier.Shared/Resources/po/nl.po b/NickvisionCavalier.Shared/Resources/po/nl.po
index cd27cd6..1abcc01 100644
--- a/NickvisionCavalier.Shared/Resources/po/nl.po
+++ b/NickvisionCavalier.Shared/Resources/po/nl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-07-31 13:53+0000\n"
"Last-Translator: Philip Goto \n"
"Language-Team: Dutch \n"
"Language-Team: Brazilian Portuguese \n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Gtranslator 42.0\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Adicione"
@@ -28,17 +28,17 @@ msgstr "Adicione"
msgid "Add New Profile"
msgstr "Adicione um novo perfil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, fuzzy, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Têm certeza que deseja remover esse perfil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Cancelar"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "Cancelar"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr ""
@@ -58,22 +58,22 @@ msgstr ""
msgid "Default"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, fuzzy
msgid "Delete Profile"
msgstr "Remover perfil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr ""
@@ -81,15 +81,15 @@ msgstr ""
msgid "GitHub Repo"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr ""
@@ -97,19 +97,19 @@ msgstr ""
msgid "New color profile will be a copy of the current active profile."
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Desligado"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
#, fuzzy
msgid "On"
msgstr "Abrir"
@@ -119,21 +119,21 @@ msgstr "Abrir"
msgid "Profile Name"
msgstr "Perfil:"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr ""
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
#, fuzzy
msgid "Split Channels"
msgstr "Canais"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr ""
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
#, fuzzy
@@ -155,7 +155,7 @@ msgid ""
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Preferencias"
@@ -417,23 +417,58 @@ msgstr "Escuro"
msgid "Foreground Colors"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Adicionar cor"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Adicionar cor"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+msgid "Images"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Fundo"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+msgid "Foreground"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+msgid "No Images"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr ""
@@ -532,30 +567,46 @@ msgid "Change Background Image"
msgstr ""
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+msgid "Change Background Image Scale"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+msgid "Change Background Image Alpha"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+msgid "Change Foreground Image"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+msgid "Change Foreground Image Scale"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+msgid "Change Foreground Image Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr ""
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Atalhos de teclado"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
#, fuzzy
msgid "About Cavalier"
msgstr "Cavalier"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Sair"
@@ -582,7 +633,7 @@ msgid "11 drawing modes!"
msgstr "4 desenhos de ondas!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
@@ -624,18 +675,12 @@ msgstr ""
#~ msgid "Remove"
#~ msgstr "Remover"
-#~ msgid "Background"
-#~ msgstr "Fundo"
-
#~ msgid "Select color"
#~ msgstr "Selecione a cor"
#~ msgid "Remove color"
#~ msgstr "Remover cor"
-#~ msgid "Add color"
-#~ msgstr "Adicionar cor"
-
#~ msgid "This name is already in use."
#~ msgstr "Este nome já esta em uso"
diff --git a/NickvisionCavalier.Shared/Resources/po/ru.po b/NickvisionCavalier.Shared/Resources/po/ru.po
index 5cdef68..320e9dd 100644
--- a/NickvisionCavalier.Shared/Resources/po/ru.po
+++ b/NickvisionCavalier.Shared/Resources/po/ru.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: cavalier\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-10 15:59+0000\n"
"Last-Translator: Fyodor Sobolev \n"
-"Language-Team: Russian \n"
+"Language-Team: Russian \n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Добавить"
@@ -29,17 +29,17 @@ msgstr "Добавить"
msgid "Add New Profile"
msgstr "Добавить новый профиль"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "Вы уверены, что хотите удалить профиль \"{0}\"?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "Отмена"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -47,11 +47,11 @@ msgstr "Отмена"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "Соавторы на GitHub ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "Давид Лапшин"
@@ -59,21 +59,21 @@ msgstr "Давид Лапшин"
msgid "Default"
msgstr "По умолчанию"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Удалить"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Удалить профиль"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Полное"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Фёдор Соболев"
@@ -81,15 +81,15 @@ msgstr "Фёдор Соболев"
msgid "GitHub Repo"
msgstr "Репозиторий GitHub"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Сердечки"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "Изображения JPEG и PNG"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Чат Matrix"
@@ -97,19 +97,19 @@ msgstr "Чат Matrix"
msgid "New color profile will be a copy of the current active profile."
msgstr "Новый цветовой профиль будет копией текущего активного профиля."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Выключено"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Включено"
@@ -117,20 +117,20 @@ msgstr "Включено"
msgid "Profile Name"
msgstr "Имя профиля"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Выбрать изображение"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Разделить каналы"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Фёдор Соболев https://github.com/fsobolev"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -153,7 +153,7 @@ msgstr ""
"и наблюдайте, как звук оживает!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Настройки"
@@ -417,23 +417,61 @@ msgstr "Тёмная"
msgid "Foreground Colors"
msgstr "Цвета переднего плана"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Цвета переднего плана"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Цвета фона"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Цвета фона"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Изображение"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Цвета фона"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Цвета переднего плана"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Добавить изображение"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Масштаб"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Без изображения"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Без изображения"
@@ -522,29 +560,50 @@ msgid "Change Background Image"
msgstr "Изменить фоновое изображение"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Изменить фоновое изображение"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Изменить фоновое изображение"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Изменить фоновое изображение"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Изменить масштаб изображения"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Изменить фоновое изображение"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Приложение"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Переключить полный экран"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Комбинации клавиш"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "О приложении"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Выход"
@@ -569,7 +628,8 @@ msgid "11 drawing modes!"
msgstr "11 режимов отрисовки!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr "Установите любой цвет или градиент для фона или переднего плана."
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:13
diff --git a/NickvisionCavalier.Shared/Resources/po/tr.po b/NickvisionCavalier.Shared/Resources/po/tr.po
index 8bba1d5..aaefe98 100644
--- a/NickvisionCavalier.Shared/Resources/po/tr.po
+++ b/NickvisionCavalier.Shared/Resources/po/tr.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-08 10:00+0000\n"
"Last-Translator: Sabri Ünal \n"
-"Language-Team: Turkish \n"
+"Language-Team: Turkish \n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1091
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1210
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:44
msgid "Add"
msgstr "Ekle"
@@ -28,17 +28,17 @@ msgstr "Ekle"
msgid "Add New Profile"
msgstr "Yeni Profil Ekle"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
#, csharp-format
msgid "Are you sure you want to delete profile \"{0}\"?"
msgstr "“{0}” profilini silmek istediğinizden emin misiniz?"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:964
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1083
#: ../../../../NickvisionCavalier.GNOME/Controls/AddProfileDialog.cs:41
msgid "Cancel"
msgstr "İptal"
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:62
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:13
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:13
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:4
@@ -46,11 +46,11 @@ msgstr "İptal"
msgid "Cavalier"
msgstr "Cavalier"
-#: ../../../Controllers/MainWindowController.cs:70
+#: ../../../Controllers/MainWindowController.cs:71
msgid "Contributors on GitHub ❤️"
msgstr "GitHub Katkıcıları ❤️"
-#: ../../../Controllers/MainWindowController.cs:72
+#: ../../../Controllers/MainWindowController.cs:73
msgid "David Lapshin"
msgstr "David Lapshin"
@@ -58,21 +58,21 @@ msgstr "David Lapshin"
msgid "Default"
msgstr "Öntanımlı"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:967
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1086
msgid "Delete"
msgstr "Sil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:962
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1081
msgid "Delete Profile"
msgstr "Profil Sil"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Full"
msgstr "Tam"
-#: ../../../Controllers/MainWindowController.cs:68
-#: ../../../Controllers/MainWindowController.cs:71
+#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:72
msgid "Fyodor Sobolev"
msgstr "Fyodor Sobolev"
@@ -80,15 +80,15 @@ msgstr "Fyodor Sobolev"
msgid "GitHub Repo"
msgstr "GitHub Deposu"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:878
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:997
msgid "Hearts"
msgstr "Kalpler"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1093
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1212
msgid "JPEG and PNG images"
msgstr "JPEG ve PNG resimler"
-#: ../../../Controllers/MainWindowController.cs:67
+#: ../../../Controllers/MainWindowController.cs:68
msgid "Matrix Chat"
msgstr "Matrix Sohbet"
@@ -96,19 +96,19 @@ msgstr "Matrix Sohbet"
msgid "New color profile will be a copy of the current active profile."
msgstr "Yeni renk profili, geçerli etkin profilin bir kopyası olacaktır."
-#: ../../../Controllers/MainWindowController.cs:69
+#: ../../../Controllers/MainWindowController.cs:70
msgid "Nicholas Logozzo"
msgstr "Nicholas Logozzo"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "Off"
msgstr "Kapalı"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:734
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:847
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:818
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:965
msgid "On"
msgstr "Açık"
@@ -116,20 +116,20 @@ msgstr "Açık"
msgid "Profile Name"
msgstr "Profil Adı"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1090
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:1209
msgid "Select an image"
msgstr "Resim seç"
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:729
-#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:842
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:813
+#: ../../../../NickvisionCavalier.GNOME/Views/PreferencesDialog.cs:960
msgid "Split Channels"
msgstr "Kanalları Ayır"
-#: ../../../Controllers/MainWindowController.cs:73
+#: ../../../Controllers/MainWindowController.cs:74
msgid "translator-credits"
msgstr "Sabri Ünal "
-#: ../../../Controllers/MainWindowController.cs:61
+#: ../../../Controllers/MainWindowController.cs:63
#: NickvisionCavalier.Shared/org.nickvision.cavalier.desktop.in:5
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:7
msgid "Visualize audio with CAVA"
@@ -152,7 +152,7 @@ msgstr ""
"sesinizin canlandığını görün!"
#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:10
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:138
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:158
#: NickvisionCavalier.GNOME/Blueprints/window.blp:5
msgid "Preferences"
msgstr "Tercihler"
@@ -415,23 +415,61 @@ msgstr "Kyu"
msgid "Foreground Colors"
msgstr "Ön Plan Rengi"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:545
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:531
+#, fuzzy
+msgid "Add foreground color"
+msgstr "Ön Plan Rengi"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:546
msgid "Background Colors"
msgstr "Arka Plan Rengi"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:565
-msgid "Image"
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:553
+#, fuzzy
+msgid "Add background color"
+msgstr "Arka Plan Rengi"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:567
+#, fuzzy
+msgid "Images"
msgstr "Resim"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:582
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:581
+#, fuzzy
+msgid "Background"
+msgstr "Arka Plan Rengi"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:586
+#, fuzzy
+msgid "Foreground"
+msgstr "Ön Plan Rengi"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:601
msgid "Add Image"
msgstr "Resim Ekle"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:593
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:612
msgid "Scale"
msgstr "Ölçekle"
-#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:642
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:635
+msgid "Alpha"
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:656
+msgid "Foreground image is only shown with Box drawing modes."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:668
+#, fuzzy
+msgid "No Images"
+msgstr "Resim Yok"
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:669
+msgid "Add an image to use it in Cavalier."
+msgstr ""
+
+#: NickvisionCavalier.GNOME/Blueprints/preferences_dialog.blp:687
msgid "No Image"
msgstr "Resim Yok"
@@ -520,29 +558,50 @@ msgid "Change Background Image"
msgstr "Arka Plan Resmini Değiştir"
#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:124
-msgid "Change Image Scale"
+#, fuzzy
+msgid "Change Background Image Scale"
+msgstr "Arka Plan Resmini Değiştir"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:129
+#, fuzzy
+msgid "Change Background Image Alpha"
+msgstr "Arka Plan Resmini Değiştir"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:134
+#, fuzzy
+msgid "Change Foreground Image"
+msgstr "Arka Plan Resmini Değiştir"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:139
+#, fuzzy
+msgid "Change Foreground Image Scale"
msgstr "Resim Ölçeğini Değiştir"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:130
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:144
+#, fuzzy
+msgid "Change Foreground Image Alpha"
+msgstr "Arka Plan Resmini Değiştir"
+
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:150
msgctxt "Shortcut"
msgid "Application"
msgstr "Uygulama"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:133
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
msgid "Toggle Fullscreen"
msgstr "Tam Ekranı Aç/Kapat"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:143
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:163
#: NickvisionCavalier.GNOME/Blueprints/window.blp:6
msgid "Keyboard Shortcuts"
msgstr "Klavye Kısayolları"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:148
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:168
#: NickvisionCavalier.GNOME/Blueprints/window.blp:7
msgid "About Cavalier"
msgstr "Cavalier Hakkında"
-#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:153
+#: NickvisionCavalier.GNOME/Blueprints/shortcuts_dialog.blp:173
#: NickvisionCavalier.GNOME/Blueprints/window.blp:8
msgid "Quit"
msgstr "Çık"
@@ -567,7 +626,8 @@ msgid "11 drawing modes!"
msgstr "11 çizim kipi!"
#: NickvisionCavalier.Shared/org.nickvision.cavalier.metainfo.xml.in:12
-msgid "Set any color or a gradient for background and foreground."
+#, fuzzy
+msgid "Set any color, a gradient or an image for background and foreground."
msgstr ""
"Arka plan ve ön plan için herhangi bir renk veya renk geçiçi ayarlayın."
diff --git a/NickvisionCavalier.Shared/Resources/po/zh_Hant.po b/NickvisionCavalier.Shared/Resources/po/zh_Hant.po
index 5dc73b5..febb5d0 100644
--- a/NickvisionCavalier.Shared/Resources/po/zh_Hant.po
+++ b/NickvisionCavalier.Shared/Resources/po/zh_Hant.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-07 20:04+0300\n"
+"POT-Creation-Date: 2023-09-12 00:15+0300\n"
"PO-Revision-Date: 2023-08-12 17:18+0000\n"
"Last-Translator: Wolf yuan \n"
"Language-Team: Chinese (Traditional) Cavalier is an audio visualizer based on CAVA with customizable interface.
- 11 drawing modes!
- - Set any color or a gradient for background and foreground.
+ - Set any color, a gradient or an image for background and foreground.
- Configure smoothing, noise reduction and a few other CAVA settings.
@@ -41,10 +41,13 @@
-
+
Changes compared to 2023.8.1:
+ - Added ability to set foreground image for Box modes
+ - Transparency can now be set both for background and foreground image
+ - Cavalier switched back to using PulseAudio by default. You can still switch audio backend to whatever is supported by CAVA using CAVALIER_INPUT_METHOD environment variable
- Updated translations (Thanks everyone on Weblate!)
diff --git a/README.md b/README.md
index 173fefb..24cf7c6 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,8 @@
# Features
-* 6 drawing modes!
-* Set any single color or a gradient for background and foreground.
+* 11 drawing modes!
+* Set any single color, a gradient or an image for background and foreground.
* Configure smoothing, noise reduction and a few other CAVA settings.
# Installation
@@ -36,7 +36,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how can you help the proje
# Dependencies
- [.NET 7](https://dotnet.microsoft.com/en-us/)
-- [CAVA](https://github.com/karlstav/cava/)
+- [CAVA](https://github.com/karlstav/cava/) >= 0.9.0
# Code of Conduct
diff --git a/flatpak/build.sh b/flatpak/build.sh
old mode 100644
new mode 100755
diff --git a/flatpak/org.nickvision.cavalier.json b/flatpak/org.nickvision.cavalier.json
index 83204fd..3fd01d4 100644
--- a/flatpak/org.nickvision.cavalier.json
+++ b/flatpak/org.nickvision.cavalier.json
@@ -17,8 +17,7 @@
"--socket=wayland",
"--socket=pulseaudio",
"--device=dri",
- "--share=ipc",
- "--filesystem=xdg-run/pipewire-0"
+ "--share=ipc"
],
"cleanup":[
"/include",
@@ -52,15 +51,17 @@
{
"type" : "git",
"url" : "https://github.com/karlstav/cava.git",
- "tag" : "0.9.0",
- "commit" : "83b4cda8177c780c7895ae67384c2679e84cc0d9"
+ "tag" : "0.9.1",
+ "commit" : "81211e9e16302312ee4322a99840c110bce0e13d"
}
]
},
{
"name": "blueprint-compiler",
"buildsystem": "meson",
- "cleanup": [ "*" ],
+ "cleanup": [
+ "*"
+ ],
"sources": [
{
"type": "git",
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 0047246..65aa97c 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -18,7 +18,7 @@ parts:
cava:
#after: [ fftw3f ]
source: https://github.com/karlstav/cava.git
- source-tag: '0.9.0'
+ source-tag: '0.9.1'
source-depth: 1
build-environment:
- CFLAGS: -I/snap/gnome-42-2204-sdk/current/usr/include