From eaaa30c2b64bce79b755d54e8a679eb556eb5639 Mon Sep 17 00:00:00 2001 From: Costin Botescu Date: Fri, 12 Jun 2026 16:19:09 +0300 Subject: [PATCH 1/2] selection-animation --- Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs b/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs index 2b63469f2c..7748ab8299 100644 --- a/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs +++ b/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs @@ -71,7 +71,9 @@ public PintaCanvas ( document.SelectionChanged += (_, _) => QueueSelectionUpdate (); // Timer for selection outline animation - selection_animation_timer_id = GLib.Functions.TimeoutAdd (GLib.Constants.PRIORITY_DEFAULT, 80, SelectionAnimationTick); + bool selectionAnimation = PintaCore.Settings.GetSetting ( "selection-animation", true); + if (selectionAnimation) + selection_animation_timer_id = GLib.Functions.TimeoutAdd (GLib.Constants.PRIORITY_DEFAULT, 80, SelectionAnimationTick); // If there is additional space available, keep the image centered and prevent stretching. Hexpand = false; From 9ff256a66f36d1326fcc90c223caaa90ecf6bc1e Mon Sep 17 00:00:00 2001 From: Costin Botescu Date: Wed, 1 Jul 2026 15:05:49 +0300 Subject: [PATCH 2/2] UI setting --- Pinta.Core/Actions/FileActions.cs | 13 +++++ Pinta.Core/FriendAssemblies.cs | 2 + Pinta.Core/SettingNames.cs | 2 + .../Widgets/Canvas/PintaCanvas.cs | 2 +- Pinta/ActionHandlers.cs | 2 + Pinta/Actions/File/SelectionSettingsAction.cs | 37 ++++++++++++++ Pinta/Dialogs/SelectionSettingsDialog.cs | 48 +++++++++++++++++++ 7 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 Pinta/Actions/File/SelectionSettingsAction.cs create mode 100644 Pinta/Dialogs/SelectionSettingsDialog.cs diff --git a/Pinta.Core/Actions/FileActions.cs b/Pinta.Core/Actions/FileActions.cs index 27b3e229f9..f1a0701ff7 100644 --- a/Pinta.Core/Actions/FileActions.cs +++ b/Pinta.Core/Actions/FileActions.cs @@ -38,6 +38,7 @@ public sealed class FileActions public Command Close { get; } public Command Save { get; } public Command SaveAs { get; } + public Command SelectionSettings { get; } public Command Print { get; } public event EventHandler? ModifyCompression; @@ -97,6 +98,12 @@ public FileActions (SystemManager system, AppActions app) Resources.StandardIcons.DocumentSaveAs, shortcuts: ["S"]); + SelectionSettings = new Command ( + "selectionSettings", + Translations.GetString ("Selection Settings..."), + null, + null); + Print = new Command ( "print", Translations.GetString ("Print"), @@ -115,6 +122,9 @@ public void RegisterActions (Gtk.Application application, Gio.Menu menu) save_section.AppendItem (Save.CreateMenuItem ()); save_section.AppendItem (SaveAs.CreateMenuItem ()); + var selection_settings_section = Gio.Menu.New (); + selection_settings_section.AppendItem (SelectionSettings.CreateMenuItem ()); + Gio.Menu close_section = Gio.Menu.New (); close_section.AppendItem (Close.CreateMenuItem ()); if (!isMac) close_section.AppendItem (app.Exit.CreateMenuItem ()); // This is part of the application menu on macOS @@ -123,6 +133,7 @@ public void RegisterActions (Gtk.Application application, Gio.Menu menu) menu.AppendItem (NewScreenshot.CreateMenuItem ()); menu.AppendItem (Open.CreateMenuItem ()); menu.AppendSection (null, save_section); + menu.AppendSection (null, selection_settings_section); menu.AppendSection (null, close_section); #if false // Printing is disabled for now until it is fully functional. @@ -137,6 +148,8 @@ public void RegisterActions (Gtk.Application application, Gio.Menu menu) Save, SaveAs, + SelectionSettings, + Close]); if (!isMac) diff --git a/Pinta.Core/FriendAssemblies.cs b/Pinta.Core/FriendAssemblies.cs index 9bc5f6fbb4..25a079d814 100644 --- a/Pinta.Core/FriendAssemblies.cs +++ b/Pinta.Core/FriendAssemblies.cs @@ -3,3 +3,5 @@ [assembly: InternalsVisibleTo ("Pinta.Core.Tests")] [assembly: InternalsVisibleTo ("Pinta.Effects.Tests")] [assembly: InternalsVisibleTo ("PintaBenchmarks")] +[assembly: InternalsVisibleTo ("Pinta.Gui.Widgets")] +[assembly: InternalsVisibleTo ("Pinta")] diff --git a/Pinta.Core/SettingNames.cs b/Pinta.Core/SettingNames.cs index 176a5cda6d..57b41c2060 100644 --- a/Pinta.Core/SettingNames.cs +++ b/Pinta.Core/SettingNames.cs @@ -25,4 +25,6 @@ internal static string ToolAntialias (BaseTool tool) internal static string ToolAlphaBlend (BaseTool tool) => $"{tool.GetType ().Name.ToLowerInvariant ()}-alpha-blend"; + + internal const string SELECTION_ANIMATION = "selection-animation"; } diff --git a/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs b/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs index 7748ab8299..299abd9361 100644 --- a/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs +++ b/Pinta.Gui.Widgets/Widgets/Canvas/PintaCanvas.cs @@ -71,7 +71,7 @@ public PintaCanvas ( document.SelectionChanged += (_, _) => QueueSelectionUpdate (); // Timer for selection outline animation - bool selectionAnimation = PintaCore.Settings.GetSetting ( "selection-animation", true); + bool selectionAnimation = PintaCore.Settings.GetSetting ( SettingNames.SELECTION_ANIMATION, true); if (selectionAnimation) selection_animation_timer_id = GLib.Functions.TimeoutAdd (GLib.Constants.PRIORITY_DEFAULT, 80, SelectionAnimationTick); diff --git a/Pinta/ActionHandlers.cs b/Pinta/ActionHandlers.cs index d135435f5c..367a63946f 100644 --- a/Pinta/ActionHandlers.cs +++ b/Pinta/ActionHandlers.cs @@ -26,6 +26,7 @@ using System.Collections.Generic; using Pinta.Actions; +using Pinta.Actions.File; using Pinta.Core; namespace Pinta; @@ -58,6 +59,7 @@ public ActionHandlers () new SaveDocumentImplmentationAction (actions.File, actions.Image, chrome, imageFormats, recentFiles, tools), new ModifyCompressionAction (actions.File), //new PrintDocumentAction (); + new SelectionSettingsAction (chrome), new CloseDocumentAction (actions, chrome, workspace, tools), new ExitProgramAction (actions, chrome, workspace), diff --git a/Pinta/Actions/File/SelectionSettingsAction.cs b/Pinta/Actions/File/SelectionSettingsAction.cs new file mode 100644 index 0000000000..4720dc3202 --- /dev/null +++ b/Pinta/Actions/File/SelectionSettingsAction.cs @@ -0,0 +1,37 @@ + +using System; +using Pinta.Core; + +namespace Pinta.Actions.File; + +public sealed class SelectionSettingsAction : IActionHandler +{ + private readonly ChromeManager chrome; + + public SelectionSettingsAction ( + ChromeManager chrome) + { + this.chrome = chrome; + } + + public void Initialize () + { + PintaCore.Actions.File.SelectionSettings.Activated += OnActivated; + } + + public void Uninitialize () + { + PintaCore.Actions.File.SelectionSettings.Activated -= OnActivated; + } + + private void OnActivated (object? sender, EventArgs e) + { + var dialog = new SelectionSettingsDialog ( + PintaCore.Chrome, + PintaCore.Settings.GetSetting( + Pinta.Core.SettingNames.SELECTION_ANIMATION, + true)); + + dialog.Show (); + } +} diff --git a/Pinta/Dialogs/SelectionSettingsDialog.cs b/Pinta/Dialogs/SelectionSettingsDialog.cs new file mode 100644 index 0000000000..cb4cc55713 --- /dev/null +++ b/Pinta/Dialogs/SelectionSettingsDialog.cs @@ -0,0 +1,48 @@ +using Pinta.Core; +using Pinta.Gui.Widgets; + +namespace Pinta; + +public sealed class SelectionSettingsDialog : Gtk.Dialog +{ + public SelectionSettingsDialog ( + ChromeManager chrome, + bool selectionAnimation) + { + var checkbox = Gtk.CheckButton.NewWithLabel ( + Translations.GetString ("Marching Ants")); + + checkbox.Active = selectionAnimation; + + var label = Gtk.Label.New ( + Translations.GetString ( + "Restart Pinta to apply this setting.")); + + var box = this.GetContentAreaBox (); + box.SetAllMargins (12); + box.Append (checkbox); + box.Append (label); + + + Title = Translations.GetString ("Selection Settings"); + TransientFor = chrome.MainWindow; + Modal = true; + + + this.AddCancelOkButtons (); + this.SetDefaultResponse (Gtk.ResponseType.Ok); + + + OnResponse += (o,args) => + { + if (args.ResponseId == (int) Gtk.ResponseType.Ok) + { + PintaCore.Settings.PutSetting ( + Pinta.Core.SettingNames.SELECTION_ANIMATION, + checkbox.Active); + } + + Destroy(); + }; + } +}