From 209c6510fa61de8e381b6b0091e93a0f9d85b41d Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:14:02 +0200 Subject: [PATCH 01/37] Implement DnD reordering --- src/Launcher.vala | 39 +++++++++++++++++++++++++++++++++++++++ src/MainWindow.vala | 4 ++++ 2 files changed, 43 insertions(+) diff --git a/src/Launcher.vala b/src/Launcher.vala index 042a8d0d..06109f1f 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -36,6 +36,21 @@ public class Dock.Launcher : Gtk.Button { child = image; tooltip_text = app_info.get_display_name (); + var drag_source = new Gtk.DragSource () { + actions = MOVE + }; + add_controller (drag_source); + drag_source.prepare.connect (() => { + var val = Value (typeof (Launcher)); + val.set_object (this); + var content_provider = new Gdk.ContentProvider.for_value (val); + return content_provider; + }); + + var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE); + add_controller (drop_target); + drop_target.drop.connect (on_drop); + clicked.connect (() => { try { add_css_class ("bounce"); @@ -82,4 +97,28 @@ public class Dock.Launcher : Gtk.Button { return null; } } + + private bool on_drop (Value val, double x, double y) { + Launcher source; + Launcher? target = this; + + var obj = val.get_object (); + if (obj == null || !(obj is Launcher)) { + return false; + } else { + source = (Launcher)obj; + } + + if (source == this) { + return false; + } + + if (x < get_allocated_width () / 2) { + target = (Launcher)get_prev_sibling (); + } + + ((MainWindow)get_root ()).move_launcher (source, target); + + return true; + } } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 44200d8d..468544d6 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -120,4 +120,8 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { return false; }); } + + public void move_launcher (Launcher source, Launcher? target) { + box.reorder_child_after (source, target); + } } From 4c63baca9dede02df0297a03960a6b2c9109ef4f Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:37:19 +0200 Subject: [PATCH 02/37] Remove app by dragging into nothing + remember modifications --- src/Launcher.vala | 5 +++++ src/MainWindow.vala | 51 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 06109f1f..3cd56863 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -46,6 +46,11 @@ public class Dock.Launcher : Gtk.Button { var content_provider = new Gdk.ContentProvider.for_value (val); return content_provider; }); + drag_source.drag_cancel.connect ((drag, reason) => { + if (reason == NO_TARGET) { + ((MainWindow)get_root ()).remove_launcher (this); + } + }); var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE); add_controller (drop_target); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 468544d6..6312ca1a 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -6,6 +6,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { private static Gtk.CssProvider css_provider; + private Settings settings; private Gtk.Box box; private Dock.DesktopIntegration desktop_integration; private GLib.HashTable app_to_launcher; @@ -34,7 +35,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { resizable = false; set_titlebar (empty_title); - var settings = new Settings ("io.elementary.dock"); + settings = new Settings ("io.elementary.dock"); GLib.Bus.get_proxy.begin ( GLib.BusType.SESSION, @@ -121,7 +122,55 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { }); } + public void remove_launcher (Launcher launcher) { + box.remove (launcher); + if (launcher.pinned) { + var old_pinned_ids = settings.get_strv ("launchers"); + var to_remove_id = launcher.app_info.get_id (); + string[] new_pinned_ids = {}; + foreach (string app_id in old_pinned_ids) { + if (app_id != to_remove_id) { + new_pinned_ids += app_id; + } + } + settings.set_strv ("launchers", new_pinned_ids); + } + } + public void move_launcher (Launcher source, Launcher? target) { box.reorder_child_after (source, target); + + if (!source.pinned) { + return; + } + + var old_pinned_ids = settings.get_strv ("launchers"); + string[] new_pinned_ids = {}; + + string source_id = source.app_info.get_id (); + string? target_id = null; + + if (target == null) { + new_pinned_ids += source_id; + } else { + target_id = target.app_info.get_id (); + } + + foreach (string app_id in old_pinned_ids) { + if (app_id != source_id) { + new_pinned_ids += app_id; + print (app_id + "\n"); + + if (target_id != null && app_id == target_id) { + new_pinned_ids += source_id; + } + } + } + + if (target != null && !target.pinned) { + new_pinned_ids += source_id; + } + + settings.set_strv ("launchers", new_pinned_ids); } } From f9382c67c00841a8c8feae9317334bcb3354be29 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:39:43 +0200 Subject: [PATCH 03/37] Formatting --- src/Launcher.vala | 2 ++ src/MainWindow.vala | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 3cd56863..e0f66ec6 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -40,12 +40,14 @@ public class Dock.Launcher : Gtk.Button { actions = MOVE }; add_controller (drag_source); + drag_source.prepare.connect (() => { var val = Value (typeof (Launcher)); val.set_object (this); var content_provider = new Gdk.ContentProvider.for_value (val); return content_provider; }); + drag_source.drag_cancel.connect ((drag, reason) => { if (reason == NO_TARGET) { ((MainWindow)get_root ()).remove_launcher (this); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 6312ca1a..16d13065 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -124,15 +124,18 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { public void remove_launcher (Launcher launcher) { box.remove (launcher); + if (launcher.pinned) { var old_pinned_ids = settings.get_strv ("launchers"); - var to_remove_id = launcher.app_info.get_id (); string[] new_pinned_ids = {}; + + var to_remove_id = launcher.app_info.get_id (); foreach (string app_id in old_pinned_ids) { if (app_id != to_remove_id) { new_pinned_ids += app_id; } } + settings.set_strv ("launchers", new_pinned_ids); } } From 25ea032344a27e37d23cdacb707852c892e4868f Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:40:11 +0200 Subject: [PATCH 04/37] Naming --- src/Launcher.vala | 2 +- src/MainWindow.vala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index e0f66ec6..b2030944 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -124,7 +124,7 @@ public class Dock.Launcher : Gtk.Button { target = (Launcher)get_prev_sibling (); } - ((MainWindow)get_root ()).move_launcher (source, target); + ((MainWindow)get_root ()).move_launcher_after (source, target); return true; } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 16d13065..25de49a6 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -140,7 +140,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { } } - public void move_launcher (Launcher source, Launcher? target) { + public void move_launcher_after (Launcher source, Launcher? target) { box.reorder_child_after (source, target); if (!source.pinned) { From 2a8dc4db5d93b7500cf0f2866b1cb8312526100f Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:42:13 +0200 Subject: [PATCH 05/37] Remove leftover --- src/MainWindow.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 25de49a6..262b96d6 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -162,7 +162,6 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { foreach (string app_id in old_pinned_ids) { if (app_id != source_id) { new_pinned_ids += app_id; - print (app_id + "\n"); if (target_id != null && app_id == target_id) { new_pinned_ids += source_id; From 46c8d8ccd51b39ade952d320ec85db3655b11e10 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 26 Jul 2023 20:56:16 +0200 Subject: [PATCH 06/37] Work around bug --- src/Launcher.vala | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index b2030944..97c62156 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -33,13 +33,18 @@ public class Dock.Launcher : Gtk.Button { }; image.get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - child = image; + // Needed to work around DnD bug where it + // would stop working once the button got clicked + var box = new Gtk.Box (VERTICAL, 0); + box.append (image); + + child = box; tooltip_text = app_info.get_display_name (); var drag_source = new Gtk.DragSource () { actions = MOVE }; - add_controller (drag_source); + box.add_controller (drag_source); drag_source.prepare.connect (() => { var val = Value (typeof (Launcher)); @@ -55,7 +60,7 @@ public class Dock.Launcher : Gtk.Button { }); var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE); - add_controller (drop_target); + box.add_controller (drop_target); drop_target.drop.connect (on_drop); clicked.connect (() => { From 85b1503e7237cde272420df7097cdd4e3eb61d8a Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 15:11:42 +0200 Subject: [PATCH 07/37] Animate reordering fix issues --- src/Launcher.vala | 72 ++++++++++++++++++++++++++++----------------- src/MainWindow.vala | 26 ++++------------ 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 97c62156..c729d7f1 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -11,6 +11,8 @@ public class Dock.Launcher : Gtk.Button { private static Gtk.CssProvider css_provider; + private Gtk.Image image; + public Launcher (GLib.DesktopAppInfo app_info) { Object (app_info: app_info); } @@ -25,10 +27,13 @@ public class Dock.Launcher : Gtk.Button { } construct { + height_request = 60; + width_request = 60; + windows = new GLib.List (); get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - var image = new Gtk.Image () { + image = new Gtk.Image () { gicon = app_info.get_icon () }; image.get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -46,22 +51,38 @@ public class Dock.Launcher : Gtk.Button { }; box.add_controller (drag_source); - drag_source.prepare.connect (() => { + int drag_offset_x = 0; + int drag_offset_y = 0; + drag_source.prepare.connect ((x, y) => { + drag_offset_x = (int) x; + drag_offset_y = (int) y; + var val = Value (typeof (Launcher)); val.set_object (this); - var content_provider = new Gdk.ContentProvider.for_value (val); - return content_provider; + return new Gdk.ContentProvider.for_value (val); + }); + + drag_source.drag_begin.connect ((drag) => { + var paintable = new Gtk.WidgetPaintable (image); //TODO How TF can I get a paintable from a gicon?!?!? + drag_source.set_icon (paintable.get_current_image (), drag_offset_x, drag_offset_y); + image.clear (); }); drag_source.drag_cancel.connect ((drag, reason) => { - if (reason == NO_TARGET) { + if (pinned && reason == NO_TARGET) { ((MainWindow)get_root ()).remove_launcher (this); + } else { + image.gicon = app_info.get_icon (); } }); - var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE); + drag_source.drag_end.connect (() => image.gicon = app_info.get_icon ()); + + var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE) { + preload = true + }; box.add_controller (drop_target); - drop_target.drop.connect (on_drop); + drop_target.enter.connect (on_drop_enter); clicked.connect (() => { try { @@ -110,27 +131,24 @@ public class Dock.Launcher : Gtk.Button { } } - private bool on_drop (Value val, double x, double y) { - Launcher source; - Launcher? target = this; - - var obj = val.get_object (); - if (obj == null || !(obj is Launcher)) { - return false; - } else { - source = (Launcher)obj; - } - - if (source == this) { - return false; - } - - if (x < get_allocated_width () / 2) { - target = (Launcher)get_prev_sibling (); + private Gdk.DragAction on_drop_enter (Gtk.DropTarget drop_target, double x, double y) { + var val = drop_target.get_value (); + if (val != null) { + var object = val.get_object (); + + if (object != null && object is Launcher) { + Launcher source = (Launcher)object; + Launcher target = this; + + if (source != target) { + if (x > get_allocated_width () / 2) { + target = (Launcher)get_prev_sibling (); + } + ((MainWindow)get_root ()).move_launcher_after (source, target); + } + } } - ((MainWindow)get_root ()).move_launcher_after (source, target); - - return true; + return MOVE; } } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 262b96d6..7a043f8d 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -147,30 +147,14 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { return; } - var old_pinned_ids = settings.get_strv ("launchers"); string[] new_pinned_ids = {}; - string source_id = source.app_info.get_id (); - string? target_id = null; - - if (target == null) { - new_pinned_ids += source_id; - } else { - target_id = target.app_info.get_id (); - } - - foreach (string app_id in old_pinned_ids) { - if (app_id != source_id) { - new_pinned_ids += app_id; - - if (target_id != null && app_id == target_id) { - new_pinned_ids += source_id; - } + Launcher child = (Launcher)box.get_first_child (); + while (child != null) { + if (child.pinned) { + new_pinned_ids += child.app_info.get_id (); } - } - - if (target != null && !target.pinned) { - new_pinned_ids += source_id; + child = (Launcher)child.get_next_sibling (); } settings.set_strv ("launchers", new_pinned_ids); From 2ea006f12a3fc38c6a8a821950190f52f8a88032 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 16:31:33 +0200 Subject: [PATCH 08/37] Make a popover to prepare for poof animation --- data/dock.gresource.xml | 2 + data/poof.mp4 | Bin 0 -> 70039 bytes data/poof.svg | 114 ++++++++++++++++++++++++++++++++++++++++ src/Launcher.vala | 32 +++++++++-- src/PoofPopover.vala | 26 +++++++++ src/meson.build | 3 +- 6 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 data/poof.mp4 create mode 100644 data/poof.svg create mode 100644 src/PoofPopover.vala diff --git a/data/dock.gresource.xml b/data/dock.gresource.xml index 853ec9fa..ca8a9227 100644 --- a/data/dock.gresource.xml +++ b/data/dock.gresource.xml @@ -3,5 +3,7 @@ MainWindow.css Launcher.css + poof.svg + poof.mp4 diff --git a/data/poof.mp4 b/data/poof.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b9837f6bbc9557cfc6530184708c38a5cbb5148f GIT binary patch literal 70039 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 literal 0 HcmV?d00001 diff --git a/data/poof.svg b/data/poof.svg new file mode 100644 index 00000000..d16bdf5e --- /dev/null +++ b/data/poof.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Launcher.vala b/src/Launcher.vala index c729d7f1..31a9177d 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -4,6 +4,10 @@ */ public class Dock.Launcher : Gtk.Button { + // Matches icon size and padding in Launcher.css + public const int ICON_SIZE = 48; + public const int PADDING = 6; + public GLib.DesktopAppInfo app_info { get; construct; } public bool pinned { get; set; } @@ -27,9 +31,6 @@ public class Dock.Launcher : Gtk.Button { } construct { - height_request = 60; - width_request = 60; - windows = new GLib.List (); get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -71,8 +72,33 @@ public class Dock.Launcher : Gtk.Button { drag_source.drag_cancel.connect ((drag, reason) => { if (pinned && reason == NO_TARGET) { ((MainWindow)get_root ()).remove_launcher (this); + + var popover = new PoofPopover (); + // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. + // The drag_offset is also measured from the top left corner but works + // the other way round (i.e it moves the cursor not the surface) + // than set_offset so we put a - in front. + popover.set_offset (ICON_SIZE / 4 - drag_offset_x, -(ICON_SIZE / 4) - drag_offset_y); + + var window = (Gtk.Window)get_root (); + popover.set_parent (window); + var surface = window.get_surface (); + + double x, y; + Gdk.ModifierType mask; + surface.get_device_position (drag.device, out x, out y, out mask); + + var rect = Gdk.Rectangle (); + rect.x = (int)x; + rect.y = (int)y; + + popover.set_pointing_to (rect); + popover.popup (); + + return true; } else { image.gicon = app_info.get_icon (); + return false; } }); diff --git a/src/PoofPopover.vala b/src/PoofPopover.vala new file mode 100644 index 00000000..ba56aaa2 --- /dev/null +++ b/src/PoofPopover.vala @@ -0,0 +1,26 @@ +public class Dock.PoofPopover : Gtk.Popover { + construct { + var animation = Gtk.MediaFile.for_resource ("/io/elementary/dock/poof.mp4"); + animation.loop = true; + + var picture = new Gtk.Picture.for_paintable (animation) { + height_request = 48, + width_request = 48 + }; + + height_request = Launcher.ICON_SIZE; + width_request = Launcher.ICON_SIZE; + halign = CENTER; + valign = CENTER; + has_arrow = false; + remove_css_class ("background"); + child = new Gtk.Label ("test"); + + animation.play_now (); + + Timeout.add (2000, () => { + popdown (); + return Source.REMOVE; + }); + } +} diff --git a/src/meson.build b/src/meson.build index 30b4b390..82306818 100644 --- a/src/meson.build +++ b/src/meson.build @@ -3,7 +3,8 @@ sources = [ 'AppWindow.vala', 'DesktopIntegration.vala', 'Launcher.vala', - 'MainWindow.vala' + 'MainWindow.vala', + 'PoofPopover.vala' ] executable( From 89d8ae9f7ce8e8f316d467c31518c53e36cc74be Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 19:35:27 +0200 Subject: [PATCH 09/37] Add poof animation --- src/Launcher.vala | 13 ++++++------ src/PoofPopover.vala | 48 ++++++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 31a9177d..bedb7565 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -70,8 +70,8 @@ public class Dock.Launcher : Gtk.Button { }); drag_source.drag_cancel.connect ((drag, reason) => { - if (pinned && reason == NO_TARGET) { - ((MainWindow)get_root ()).remove_launcher (this); + // if (pinned && reason == NO_TARGET) { + // ((MainWindow)get_root ()).remove_launcher (this); var popover = new PoofPopover (); // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. @@ -94,12 +94,13 @@ public class Dock.Launcher : Gtk.Button { popover.set_pointing_to (rect); popover.popup (); + popover.start_animation (); return true; - } else { - image.gicon = app_info.get_icon (); - return false; - } + // } else { + // image.gicon = app_info.get_icon (); + // return false; + // } }); drag_source.drag_end.connect (() => image.gicon = app_info.get_icon ()); diff --git a/src/PoofPopover.vala b/src/PoofPopover.vala index ba56aaa2..d0c6d487 100644 --- a/src/PoofPopover.vala +++ b/src/PoofPopover.vala @@ -1,26 +1,48 @@ public class Dock.PoofPopover : Gtk.Popover { + private Gtk.Adjustment vadjustment; + private int poof_frames; + construct { - var animation = Gtk.MediaFile.for_resource ("/io/elementary/dock/poof.mp4"); - animation.loop = true; + var texture = Gdk.Texture.from_resource ("/io/elementary/dock/poof.svg"); + + var poof_size = texture.width; + poof_frames = (int) Math.floor (texture.height / poof_size); + + var picture = new Gtk.Picture.for_paintable (texture) { + width_request = Launcher.ICON_SIZE, + height_request = Launcher.ICON_SIZE * poof_frames, + keep_aspect_ratio = true + }; - var picture = new Gtk.Picture.for_paintable (animation) { - height_request = 48, - width_request = 48 + var scrolled_window = new Gtk.ScrolledWindow () { + hexpand = true, + vexpand = true, + child = picture, + vscrollbar_policy = EXTERNAL }; + vadjustment = scrolled_window.get_vadjustment (); + height_request = Launcher.ICON_SIZE; width_request = Launcher.ICON_SIZE; - halign = CENTER; - valign = CENTER; has_arrow = false; remove_css_class ("background"); - child = new Gtk.Label ("test"); - - animation.play_now (); + child = scrolled_window; + } - Timeout.add (2000, () => { - popdown (); - return Source.REMOVE; + public void start_animation () { + var frame = 1; + Timeout.add (30, () => { + var adjustment_step = (int) vadjustment.get_upper () / poof_frames; + vadjustment.value = vadjustment.value + adjustment_step; + if (frame <= poof_frames) { + frame++; + return Source.CONTINUE; + } else { + popdown (); + unparent (); + return Source.REMOVE; + } }); } } From d34fa9844d10f0aa4aec3099204150fdc1cc9f9a Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 19:36:33 +0200 Subject: [PATCH 10/37] Remove test mp4 --- data/dock.gresource.xml | 1 - data/poof.mp4 | Bin 70039 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 data/poof.mp4 diff --git a/data/dock.gresource.xml b/data/dock.gresource.xml index ca8a9227..b98c1a89 100644 --- a/data/dock.gresource.xml +++ b/data/dock.gresource.xml @@ -4,6 +4,5 @@ MainWindow.css Launcher.css poof.svg - poof.mp4 diff --git a/data/poof.mp4 b/data/poof.mp4 deleted file mode 100644 index b9837f6bbc9557cfc6530184708c38a5cbb5148f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70039 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 From 65a61e7013c81b6779b7ea04a8b7b1c8cbc312fb Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 19:41:17 +0200 Subject: [PATCH 11/37] Cleanup --- src/Launcher.vala | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index bedb7565..4bbcef38 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -15,8 +15,6 @@ public class Dock.Launcher : Gtk.Button { private static Gtk.CssProvider css_provider; - private Gtk.Image image; - public Launcher (GLib.DesktopAppInfo app_info) { Object (app_info: app_info); } @@ -34,7 +32,7 @@ public class Dock.Launcher : Gtk.Button { windows = new GLib.List (); get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - image = new Gtk.Image () { + var image = new Gtk.Image () { gicon = app_info.get_icon () }; image.get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -64,14 +62,14 @@ public class Dock.Launcher : Gtk.Button { }); drag_source.drag_begin.connect ((drag) => { - var paintable = new Gtk.WidgetPaintable (image); //TODO How TF can I get a paintable from a gicon?!?!? + var paintable = new Gtk.WidgetPaintable (image); //Maybe TODO How TF can I get a paintable from a gicon?!?!? drag_source.set_icon (paintable.get_current_image (), drag_offset_x, drag_offset_y); image.clear (); }); drag_source.drag_cancel.connect ((drag, reason) => { - // if (pinned && reason == NO_TARGET) { - // ((MainWindow)get_root ()).remove_launcher (this); + if (pinned && reason == NO_TARGET) { + ((MainWindow)get_root ()).remove_launcher (this); var popover = new PoofPopover (); // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. @@ -97,10 +95,10 @@ public class Dock.Launcher : Gtk.Button { popover.start_animation (); return true; - // } else { - // image.gicon = app_info.get_icon (); - // return false; - // } + } else { + image.gicon = app_info.get_icon (); + return false; + } }); drag_source.drag_end.connect (() => image.gicon = app_info.get_icon ()); @@ -161,10 +159,10 @@ public class Dock.Launcher : Gtk.Button { private Gdk.DragAction on_drop_enter (Gtk.DropTarget drop_target, double x, double y) { var val = drop_target.get_value (); if (val != null) { - var object = val.get_object (); + var obj = val.get_object (); - if (object != null && object is Launcher) { - Launcher source = (Launcher)object; + if (obj != null && obj is Launcher) { + Launcher source = (Launcher)obj; Launcher target = this; if (source != target) { From 02d333304c629151d58cd891a720aae1b5398378 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 23:30:21 +0200 Subject: [PATCH 12/37] Fix some issues, add license, cleanup --- src/Launcher.vala | 18 +++++++++--------- src/PoofPopover.vala | 10 +++++++++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 4bbcef38..9b238559 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -69,16 +69,9 @@ public class Dock.Launcher : Gtk.Button { drag_source.drag_cancel.connect ((drag, reason) => { if (pinned && reason == NO_TARGET) { - ((MainWindow)get_root ()).remove_launcher (this); - var popover = new PoofPopover (); - // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. - // The drag_offset is also measured from the top left corner but works - // the other way round (i.e it moves the cursor not the surface) - // than set_offset so we put a - in front. - popover.set_offset (ICON_SIZE / 4 - drag_offset_x, -(ICON_SIZE / 4) - drag_offset_y); - var window = (Gtk.Window)get_root (); + var window = (MainWindow)get_root (); popover.set_parent (window); var surface = window.get_surface (); @@ -91,9 +84,16 @@ public class Dock.Launcher : Gtk.Button { rect.y = (int)y; popover.set_pointing_to (rect); + // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. + // The drag_offset is also measured from the top left corner but works + // the other way round (i.e it moves the cursor not the surface) + // than set_offset so we put a - in front. + popover.set_offset (ICON_SIZE / 4 - drag_offset_x, -(ICON_SIZE / 4) - drag_offset_y); popover.popup (); popover.start_animation (); + window.remove_launcher (this); + return true; } else { image.gicon = app_info.get_icon (); @@ -166,7 +166,7 @@ public class Dock.Launcher : Gtk.Button { Launcher target = this; if (source != target) { - if (x > get_allocated_width () / 2) { + if ((x > get_allocated_width () / 2) && get_next_sibling () != null) { target = (Launcher)get_prev_sibling (); } ((MainWindow)get_root ()).move_launcher_after (source, target); diff --git a/src/PoofPopover.vala b/src/PoofPopover.vala index d0c6d487..1b0fc430 100644 --- a/src/PoofPopover.vala +++ b/src/PoofPopover.vala @@ -1,3 +1,8 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * SPDX-FileCopyrightText: 2023 elementary, Inc. (https://elementary.io) + */ + public class Dock.PoofPopover : Gtk.Popover { private Gtk.Adjustment vadjustment; private int poof_frames; @@ -40,7 +45,10 @@ public class Dock.PoofPopover : Gtk.Popover { return Source.CONTINUE; } else { popdown (); - unparent (); + Idle.add (() => { + unparent (); + return Source.REMOVE; + }); return Source.REMOVE; } }); From 7f185d16a3c03f1bd3a4ae509e6aaf942edcb2b2 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 29 Jul 2023 23:45:30 +0200 Subject: [PATCH 13/37] Improve reordering behavior and fix lint --- src/Launcher.vala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 9b238559..5466efdb 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -88,7 +88,7 @@ public class Dock.Launcher : Gtk.Button { // The drag_offset is also measured from the top left corner but works // the other way round (i.e it moves the cursor not the surface) // than set_offset so we put a - in front. - popover.set_offset (ICON_SIZE / 4 - drag_offset_x, -(ICON_SIZE / 4) - drag_offset_y); + popover.set_offset (ICON_SIZE / 4 - drag_offset_x, - (ICON_SIZE / 4) - drag_offset_y); popover.popup (); popover.start_animation (); @@ -166,9 +166,12 @@ public class Dock.Launcher : Gtk.Button { Launcher target = this; if (source != target) { - if ((x > get_allocated_width () / 2) && get_next_sibling () != null) { + if ((x > get_allocated_width () / 2) && get_next_sibling () == source) { + target = (Launcher)get_prev_sibling (); + } else if ((x < get_allocated_width () / 2) && get_prev_sibling () != source) { target = (Launcher)get_prev_sibling (); } + ((MainWindow)get_root ()).move_launcher_after (source, target); } } From d2ec1e71a4ad79746020739abd05b520687b9427 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 15:32:11 +0200 Subject: [PATCH 14/37] Add some animations - prototype --- data/Launcher.css | 28 ++++++++++++++++++++++++++++ src/Launcher.vala | 25 +++++++++++++++++++++++++ src/MainWindow.vala | 31 +++++++++++++++++++++++++++---- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/data/Launcher.css b/data/Launcher.css index d049acb6..51be165f 100644 --- a/data/Launcher.css +++ b/data/Launcher.css @@ -24,3 +24,31 @@ launcher image { transform: translatey(-20px); } } + +.move-right { + animation: move-right 300ms; + animation-direction: normal; +} + +@keyframes move-right { + from { + transform: translatex(-60px); + } + to { + transform: translatex(0); + } +} + +.move-left { + animation: move-left 300ms; + animation-direction: normal; +} + +@keyframes move-left { + from { + transform: translatex(60px); + } + to { + transform: translatex(0); + } +} diff --git a/src/Launcher.vala b/src/Launcher.vala index 5466efdb..302e18ca 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -14,6 +14,8 @@ public class Dock.Launcher : Gtk.Button { public GLib.List windows { get; private owned set; } private static Gtk.CssProvider css_provider; + private string css_class_name = ""; + private uint animate_timeout_id = 0; public Launcher (GLib.DesktopAppInfo app_info) { Object (app_info: app_info); @@ -129,6 +131,29 @@ public class Dock.Launcher : Gtk.Button { }); } + public void animate_move (Gtk.DirectionType dir) { + if (animate_timeout_id != 0) { + Source.remove (animate_timeout_id); + remove_css_class (css_class_name); + } + foreach (var css_class in get_css_classes ()) { + print (css_class); + } + if (dir == LEFT) { + css_class_name = "move-left"; + } else if (dir == RIGHT) { + css_class_name = "move-right"; + } + + print (css_class_name); + add_css_class (css_class_name); + animate_timeout_id = Timeout.add (300, () => { + remove_css_class (css_class_name); + animate_timeout_id = 0; + return Source.REMOVE; + }); + } + public void update_windows (owned GLib.List? new_windows) { if (new_windows == null) { windows = new GLib.List (); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 7a043f8d..90daa3e0 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -141,19 +141,42 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { } public void move_launcher_after (Launcher source, Launcher? target) { + var before_source = source.get_prev_sibling (); box.reorder_child_after (source, target); - - if (!source.pinned) { - return; - } + print ("REORDER\n"); string[] new_pinned_ids = {}; + bool add = false; + Gtk.DirectionType dir = UP; Launcher child = (Launcher)box.get_first_child (); while (child != null) { if (child.pinned) { new_pinned_ids += child.app_info.get_id (); } + + if (child == source) { + add = !add; + if (add) { + dir = RIGHT; + // child.animate_move (dir); + print ("DIR SET\n"); + } + } + + if (add && child != source) { + child.animate_move (dir); + print (child.app_info.get_id () + dir.to_string () + "\n"); + } + + if (child == before_source) { + add = !add; + if (add) { + dir = LEFT; + print ("DIR SET\n"); + } + } + child = (Launcher)child.get_next_sibling (); } From f03e1ffc44f53b41d0cc8226fbb4442c81cc65da Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 15:53:51 +0200 Subject: [PATCH 15/37] Cleanup --- src/Launcher.vala | 8 ++++---- src/MainWindow.vala | 13 +++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 302e18ca..866285bf 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -136,16 +136,16 @@ public class Dock.Launcher : Gtk.Button { Source.remove (animate_timeout_id); remove_css_class (css_class_name); } - foreach (var css_class in get_css_classes ()) { - print (css_class); - } + if (dir == LEFT) { css_class_name = "move-left"; } else if (dir == RIGHT) { css_class_name = "move-right"; + } else { + warning ("Wrong direction type."); + return; } - print (css_class_name); add_css_class (css_class_name); animate_timeout_id = Timeout.add (300, () => { remove_css_class (css_class_name); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 90daa3e0..1d938da2 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -142,13 +142,18 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { public void move_launcher_after (Launcher source, Launcher? target) { var before_source = source.get_prev_sibling (); + box.reorder_child_after (source, target); - print ("REORDER\n"); string[] new_pinned_ids = {}; - bool add = false; Gtk.DirectionType dir = UP; + + if (before_source == null) { + add = true; + dir = LEFT; + } + Launcher child = (Launcher)box.get_first_child (); while (child != null) { if (child.pinned) { @@ -159,21 +164,17 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { add = !add; if (add) { dir = RIGHT; - // child.animate_move (dir); - print ("DIR SET\n"); } } if (add && child != source) { child.animate_move (dir); - print (child.app_info.get_id () + dir.to_string () + "\n"); } if (child == before_source) { add = !add; if (add) { dir = LEFT; - print ("DIR SET\n"); } } From eb21f7b975913f45bbf92c2b34ec0f0614db3807 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 16:15:36 +0200 Subject: [PATCH 16/37] Fix small line where drop could fail --- src/MainWindow.vala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 1d938da2..e85fe776 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -35,6 +35,9 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { resizable = false; set_titlebar (empty_title); + var drop_target_launcher = new Gtk.DropTarget (typeof (Launcher), MOVE); + box.add_controller (drop_target_launcher); + settings = new Settings ("io.elementary.dock"); GLib.Bus.get_proxy.begin ( From 6f66f819cde5b0a821662c73b6c0f36f0600b540 Mon Sep 17 00:00:00 2001 From: Leonhard <106322251+leolost2605@users.noreply.github.com> Date: Sun, 30 Jul 2023 16:57:28 +0200 Subject: [PATCH 17/37] Apply suggestions from code review Co-authored-by: Leo --- src/Launcher.vala | 22 +++++++++++----------- src/MainWindow.vala | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 866285bf..fa8dc0fa 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -73,17 +73,17 @@ public class Dock.Launcher : Gtk.Button { if (pinned && reason == NO_TARGET) { var popover = new PoofPopover (); - var window = (MainWindow)get_root (); + unowned var window = (MainWindow) get_root (); popover.set_parent (window); - var surface = window.get_surface (); + unowned var surface = window.get_surface (); double x, y; - Gdk.ModifierType mask; - surface.get_device_position (drag.device, out x, out y, out mask); + surface.get_device_position (drag.device, out x, out y, null); - var rect = Gdk.Rectangle (); - rect.x = (int)x; - rect.y = (int)y; + var rect = Gdk.Rectangle () { + x = (int) x, + y = (int) y + }; popover.set_pointing_to (rect); // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. @@ -187,17 +187,17 @@ public class Dock.Launcher : Gtk.Button { var obj = val.get_object (); if (obj != null && obj is Launcher) { - Launcher source = (Launcher)obj; + Launcher source = (Launcher) obj; Launcher target = this; if (source != target) { if ((x > get_allocated_width () / 2) && get_next_sibling () == source) { - target = (Launcher)get_prev_sibling (); + target = (Launcher) get_prev_sibling (); } else if ((x < get_allocated_width () / 2) && get_prev_sibling () != source) { - target = (Launcher)get_prev_sibling (); + target = (Launcher) get_prev_sibling (); } - ((MainWindow)get_root ()).move_launcher_after (source, target); + ((MainWindow) get_root ()).move_launcher_after (source, target); } } } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index e85fe776..03b8db6e 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -157,7 +157,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { dir = LEFT; } - Launcher child = (Launcher)box.get_first_child (); + Launcher child = (Launcher) box.get_first_child (); while (child != null) { if (child.pinned) { new_pinned_ids += child.app_info.get_id (); @@ -181,7 +181,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { } } - child = (Launcher)child.get_next_sibling (); + child = (Launcher) child.get_next_sibling (); } settings.set_strv ("launchers", new_pinned_ids); From 51849de83b443a904fa626266128b4e600cc9544 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:01:16 +0200 Subject: [PATCH 18/37] More suggestions from code review --- src/Launcher.vala | 1 + src/MainWindow.vala | 2 +- src/PoofPopover.vala | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index fa8dc0fa..7da08a69 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -134,6 +134,7 @@ public class Dock.Launcher : Gtk.Button { public void animate_move (Gtk.DirectionType dir) { if (animate_timeout_id != 0) { Source.remove (animate_timeout_id); + animate_timeout_id = 0; remove_css_class (css_class_name); } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 03b8db6e..15a14c63 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -150,7 +150,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { string[] new_pinned_ids = {}; bool add = false; - Gtk.DirectionType dir = UP; + Gtk.DirectionType dir = UP; // UP is an invalid value in this case if (before_source == null) { add = true; diff --git a/src/PoofPopover.vala b/src/PoofPopover.vala index 1b0fc430..bf8d8031 100644 --- a/src/PoofPopover.vala +++ b/src/PoofPopover.vala @@ -36,11 +36,11 @@ public class Dock.PoofPopover : Gtk.Popover { } public void start_animation () { - var frame = 1; + var frame = 0; Timeout.add (30, () => { var adjustment_step = (int) vadjustment.get_upper () / poof_frames; vadjustment.value = vadjustment.value + adjustment_step; - if (frame <= poof_frames) { + if (frame < poof_frames) { frame++; return Source.CONTINUE; } else { From b888a303f3aabeed8c24dedeced01c4cb55852bc Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:20:06 +0200 Subject: [PATCH 19/37] Increase poof size --- src/Launcher.vala | 11 ++++++++--- src/PoofPopover.vala | 8 ++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 7da08a69..e302351b 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -86,11 +86,16 @@ public class Dock.Launcher : Gtk.Button { }; popover.set_pointing_to (rect); - // ICON_SIZE / 4 and -(ICON_SIZE / 4) position the popover in a way that the cursor is in the top left corner. - // The drag_offset is also measured from the top left corner but works + // 50 and -13 position the popover in a way that the cursor is in the top left corner. + // (TODO: I got this with trial and error and I very much doubt that will be the same everywhere + // and at different scalings so it needs testing.) + // Although the drag_offset is also measured from the top left corner it works // the other way round (i.e it moves the cursor not the surface) // than set_offset so we put a - in front. - popover.set_offset (ICON_SIZE / 4 - drag_offset_x, - (ICON_SIZE / 4) - drag_offset_y); + popover.set_offset ( + 50 - drag_offset_x * (popover.width_request / ICON_SIZE), + - 13 - drag_offset_y * (popover.height_request / ICON_SIZE) + ); popover.popup (); popover.start_animation (); diff --git a/src/PoofPopover.vala b/src/PoofPopover.vala index bf8d8031..a5d457e6 100644 --- a/src/PoofPopover.vala +++ b/src/PoofPopover.vala @@ -14,8 +14,8 @@ public class Dock.PoofPopover : Gtk.Popover { poof_frames = (int) Math.floor (texture.height / poof_size); var picture = new Gtk.Picture.for_paintable (texture) { - width_request = Launcher.ICON_SIZE, - height_request = Launcher.ICON_SIZE * poof_frames, + width_request = poof_size, + height_request = poof_size * poof_frames, keep_aspect_ratio = true }; @@ -28,8 +28,8 @@ public class Dock.PoofPopover : Gtk.Popover { vadjustment = scrolled_window.get_vadjustment (); - height_request = Launcher.ICON_SIZE; - width_request = Launcher.ICON_SIZE; + height_request = poof_size; + width_request = poof_size; has_arrow = false; remove_css_class ("background"); child = scrolled_window; From 180872162a74451ee44af4eed7cec284676c7d2b Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:22:22 +0200 Subject: [PATCH 20/37] Add queue_resize --- src/MainWindow.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 15a14c63..659503f4 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -127,6 +127,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { public void remove_launcher (Launcher launcher) { box.remove (launcher); + box.queue_resize (); if (launcher.pinned) { var old_pinned_ids = settings.get_strv ("launchers"); From 49368900b6fc087c53d9300d8b71cd00cb3ff069 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:27:27 +0200 Subject: [PATCH 21/37] Fix poof alignment --- src/Launcher.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index e302351b..3f6267dc 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -93,8 +93,8 @@ public class Dock.Launcher : Gtk.Button { // the other way round (i.e it moves the cursor not the surface) // than set_offset so we put a - in front. popover.set_offset ( - 50 - drag_offset_x * (popover.width_request / ICON_SIZE), - - 13 - drag_offset_y * (popover.height_request / ICON_SIZE) + 50 - (drag_offset_x * (popover.width_request / ICON_SIZE)), + - 13 - (drag_offset_y * (popover.height_request / ICON_SIZE)) ); popover.popup (); popover.start_animation (); From c9eaeb185bbc24198b1315fb4fb8c93939e1597a Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:35:25 +0200 Subject: [PATCH 22/37] Remove queue_resize --- src/MainWindow.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 659503f4..15a14c63 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -127,7 +127,6 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { public void remove_launcher (Launcher launcher) { box.remove (launcher); - box.queue_resize (); if (launcher.pinned) { var old_pinned_ids = settings.get_strv ("launchers"); From bb8123d2be0fbc48163b3843bee126a3f77c9f8b Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:42:01 +0200 Subject: [PATCH 23/37] Remove whitespace --- src/Launcher.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 3f6267dc..39c3f127 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -94,7 +94,7 @@ public class Dock.Launcher : Gtk.Button { // than set_offset so we put a - in front. popover.set_offset ( 50 - (drag_offset_x * (popover.width_request / ICON_SIZE)), - - 13 - (drag_offset_y * (popover.height_request / ICON_SIZE)) + -13 - (drag_offset_y * (popover.height_request / ICON_SIZE)) ); popover.popup (); popover.start_animation (); From 26d5a9dd50db5826e78d3e8d60a6a3ab514d2b8e Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:45:39 +0200 Subject: [PATCH 24/37] Don't allow removing apps with windows --- src/MainWindow.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 15a14c63..2a55535f 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -126,7 +126,9 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { } public void remove_launcher (Launcher launcher) { - box.remove (launcher); + if (launcher.windows.is_empty ()) { + box.remove (launcher); + } if (launcher.pinned) { var old_pinned_ids = settings.get_strv ("launchers"); From a9f89a8fd0233610ad60d54d5d8f4950ad800a40 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:49:17 +0200 Subject: [PATCH 25/37] Unpin pinned launchers when removed --- src/MainWindow.vala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 2a55535f..81cb7a34 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -131,6 +131,8 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { } if (launcher.pinned) { + launcher.pinned = false; + var old_pinned_ids = settings.get_strv ("launchers"); string[] new_pinned_ids = {}; From 861d22123935b0ea273fdd76d5be62b3d4ae85d3 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 17:54:43 +0200 Subject: [PATCH 26/37] Maybe fix glitches --- src/MainWindow.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 81cb7a34..3ae45712 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -33,6 +33,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { child = box; overflow = Gtk.Overflow.VISIBLE; resizable = false; + decorated = false; set_titlebar (empty_title); var drop_target_launcher = new Gtk.DropTarget (typeof (Launcher), MOVE); From 29fa1adc11b8b81911abfc5c5707d73eabb66669 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 18:01:12 +0200 Subject: [PATCH 27/37] Add comment --- src/MainWindow.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 3ae45712..cc402f79 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -36,6 +36,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { decorated = false; set_titlebar (empty_title); + // Fixes DnD reordering of launchers failing on a very small line between two launchers var drop_target_launcher = new Gtk.DropTarget (typeof (Launcher), MOVE); box.add_controller (drop_target_launcher); From 40f5efd96766190cb0088476b0fb5ea3d5d3a46a Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 18:11:06 +0200 Subject: [PATCH 28/37] Remove launcher from hashmap when removing --- src/MainWindow.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index cc402f79..5d4bcc5b 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -130,6 +130,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { public void remove_launcher (Launcher launcher) { if (launcher.windows.is_empty ()) { box.remove (launcher); + app_to_launcher.remove (launcher.app_info.get_id ()); } if (launcher.pinned) { From f4dc073eba96da16e6de9fe6eb93d6619e5cafce Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 19:19:04 +0200 Subject: [PATCH 29/37] Move drag source signal handlers into their own methods --- src/Launcher.vala | 120 ++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 39c3f127..d6da1d38 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -14,6 +14,10 @@ public class Dock.Launcher : Gtk.Button { public GLib.List windows { get; private owned set; } private static Gtk.CssProvider css_provider; + + private Gtk.Image image; + private int drag_offset_x = 0; + private int drag_offset_y = 0; private string css_class_name = ""; private uint animate_timeout_id = 0; @@ -34,7 +38,7 @@ public class Dock.Launcher : Gtk.Button { windows = new GLib.List (); get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - var image = new Gtk.Image () { + image = new Gtk.Image () { gicon = app_info.get_icon () }; image.get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -51,63 +55,9 @@ public class Dock.Launcher : Gtk.Button { actions = MOVE }; box.add_controller (drag_source); - - int drag_offset_x = 0; - int drag_offset_y = 0; - drag_source.prepare.connect ((x, y) => { - drag_offset_x = (int) x; - drag_offset_y = (int) y; - - var val = Value (typeof (Launcher)); - val.set_object (this); - return new Gdk.ContentProvider.for_value (val); - }); - - drag_source.drag_begin.connect ((drag) => { - var paintable = new Gtk.WidgetPaintable (image); //Maybe TODO How TF can I get a paintable from a gicon?!?!? - drag_source.set_icon (paintable.get_current_image (), drag_offset_x, drag_offset_y); - image.clear (); - }); - - drag_source.drag_cancel.connect ((drag, reason) => { - if (pinned && reason == NO_TARGET) { - var popover = new PoofPopover (); - - unowned var window = (MainWindow) get_root (); - popover.set_parent (window); - unowned var surface = window.get_surface (); - - double x, y; - surface.get_device_position (drag.device, out x, out y, null); - - var rect = Gdk.Rectangle () { - x = (int) x, - y = (int) y - }; - - popover.set_pointing_to (rect); - // 50 and -13 position the popover in a way that the cursor is in the top left corner. - // (TODO: I got this with trial and error and I very much doubt that will be the same everywhere - // and at different scalings so it needs testing.) - // Although the drag_offset is also measured from the top left corner it works - // the other way round (i.e it moves the cursor not the surface) - // than set_offset so we put a - in front. - popover.set_offset ( - 50 - (drag_offset_x * (popover.width_request / ICON_SIZE)), - -13 - (drag_offset_y * (popover.height_request / ICON_SIZE)) - ); - popover.popup (); - popover.start_animation (); - - window.remove_launcher (this); - - return true; - } else { - image.gicon = app_info.get_icon (); - return false; - } - }); - + drag_source.prepare.connect (on_drag_prepare); + drag_source.drag_begin.connect (on_drag_begin); + drag_source.drag_cancel.connect (on_drag_cancel); drag_source.drag_end.connect (() => image.gicon = app_info.get_icon ()); var drop_target = new Gtk.DropTarget (typeof (Launcher), MOVE) { @@ -187,6 +137,60 @@ public class Dock.Launcher : Gtk.Button { } } + private Gdk.ContentProvider? on_drag_prepare (double x, double y) { + drag_offset_x = (int) x; + drag_offset_y = (int) y; + + var val = Value (typeof (Launcher)); + val.set_object (this); + return new Gdk.ContentProvider.for_value (val); + } + + private void on_drag_begin (Gtk.DragSource drag_source, Gdk.Drag drag) { + var paintable = new Gtk.WidgetPaintable (image); //Maybe TODO How TF can I get a paintable from a gicon?!?!? + drag_source.set_icon (paintable.get_current_image (), drag_offset_x, drag_offset_y); + image.clear (); + } + + private bool on_drag_cancel (Gdk.Drag drag, Gdk.DragCancelReason reason) { + if (pinned && reason == NO_TARGET) { + var popover = new PoofPopover (); + + unowned var window = (MainWindow) get_root (); + popover.set_parent (window); + unowned var surface = window.get_surface (); + + double x, y; + surface.get_device_position (drag.device, out x, out y, null); + + var rect = Gdk.Rectangle () { + x = (int) x, + y = (int) y + }; + + popover.set_pointing_to (rect); + // 50 and -13 position the popover in a way that the cursor is in the top left corner. + // (TODO: I got this with trial and error and I very much doubt that will be the same everywhere + // and at different scalings so it needs testing.) + // Although the drag_offset is also measured from the top left corner it works + // the other way round (i.e it moves the cursor not the surface) + // than set_offset so we put a - in front. + popover.set_offset ( + 50 - (drag_offset_x * (popover.width_request / ICON_SIZE)), + -13 - (drag_offset_y * (popover.height_request / ICON_SIZE)) + ); + popover.popup (); + popover.start_animation (); + + window.remove_launcher (this); + + return true; + } else { + image.gicon = app_info.get_icon (); + return false; + } + } + private Gdk.DragAction on_drop_enter (Gtk.DropTarget drop_target, double x, double y) { var val = drop_target.get_value (); if (val != null) { From 5aaf5375da6c550247ae4fe030f3b72a61e8a2f2 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 20:47:37 +0200 Subject: [PATCH 30/37] Cleanup --- src/Launcher.vala | 20 +++++++++++++++++++- src/MainWindow.vala | 25 +------------------------ 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index d6da1d38..ecfa4113 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -154,6 +154,22 @@ public class Dock.Launcher : Gtk.Button { private bool on_drag_cancel (Gdk.Drag drag, Gdk.DragCancelReason reason) { if (pinned && reason == NO_TARGET) { + pinned = false; + + var settings = new Settings ("io.elementary.dock"); + + string[] old_pinned_ids = settings.get_strv ("launchers"); + string[] new_pinned_ids = {}; + + unowned var to_remove_id = app_info.get_id (); + foreach (string app_id in old_pinned_ids) { + if (app_id != to_remove_id) { + new_pinned_ids += app_id; + } + } + + settings.set_strv ("launchers", new_pinned_ids); + var popover = new PoofPopover (); unowned var window = (MainWindow) get_root (); @@ -182,7 +198,9 @@ public class Dock.Launcher : Gtk.Button { popover.popup (); popover.start_animation (); - window.remove_launcher (this); + if (windows.is_empty ()) { + ((Gtk.Box) parent).remove (this); + } return true; } else { diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 5d4bcc5b..7cbac072 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -127,29 +127,6 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { }); } - public void remove_launcher (Launcher launcher) { - if (launcher.windows.is_empty ()) { - box.remove (launcher); - app_to_launcher.remove (launcher.app_info.get_id ()); - } - - if (launcher.pinned) { - launcher.pinned = false; - - var old_pinned_ids = settings.get_strv ("launchers"); - string[] new_pinned_ids = {}; - - var to_remove_id = launcher.app_info.get_id (); - foreach (string app_id in old_pinned_ids) { - if (app_id != to_remove_id) { - new_pinned_ids += app_id; - } - } - - settings.set_strv ("launchers", new_pinned_ids); - } - } - public void move_launcher_after (Launcher source, Launcher? target) { var before_source = source.get_prev_sibling (); @@ -157,7 +134,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { string[] new_pinned_ids = {}; bool add = false; - Gtk.DirectionType dir = UP; // UP is an invalid value in this case + Gtk.DirectionType dir = UP; // UP is an invalid placeholder value if (before_source == null) { add = true; From 52d391d86d0d24d89dd2840da1e3dce16520b756 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sun, 30 Jul 2023 20:50:34 +0200 Subject: [PATCH 31/37] When unpinning app with open windows move launcher to last position --- src/Launcher.vala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index ecfa4113..7882aea3 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -198,8 +198,11 @@ public class Dock.Launcher : Gtk.Button { popover.popup (); popover.start_animation (); + var box = (Gtk.Box) parent; if (windows.is_empty ()) { - ((Gtk.Box) parent).remove (this); + box.remove (this); + } else { + window.move_launcher_after (this, (Launcher)box.get_last_child ()); } return true; From 1d9bbf12208343675c72683e19fa724d9c7f5c92 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 1 Aug 2023 16:03:23 +0200 Subject: [PATCH 32/37] Improve naming --- src/Launcher.vala | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 7882aea3..8156a97c 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -18,7 +18,7 @@ public class Dock.Launcher : Gtk.Button { private Gtk.Image image; private int drag_offset_x = 0; private int drag_offset_y = 0; - private string css_class_name = ""; + private string animate_css_class_name = ""; private uint animate_timeout_id = 0; public Launcher (GLib.DesktopAppInfo app_info) { @@ -90,21 +90,21 @@ public class Dock.Launcher : Gtk.Button { if (animate_timeout_id != 0) { Source.remove (animate_timeout_id); animate_timeout_id = 0; - remove_css_class (css_class_name); + remove_css_class (animate_css_class_name); } if (dir == LEFT) { - css_class_name = "move-left"; + animate_css_class_name = "move-left"; } else if (dir == RIGHT) { - css_class_name = "move-right"; + animate_css_class_name = "move-right"; } else { - warning ("Wrong direction type."); + warning ("Invalid direction type."); return; } - add_css_class (css_class_name); + add_css_class (animate_css_class_name); animate_timeout_id = Timeout.add (300, () => { - remove_css_class (css_class_name); + remove_css_class (animate_css_class_name); animate_timeout_id = 0; return Source.REMOVE; }); From 8d4a735da41c07dac96a886e8051139f116dddc4 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Mon, 18 Sep 2023 18:59:11 +0200 Subject: [PATCH 33/37] Apply suggestions from code review --- src/MainWindow.vala | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 7cbac072..ae232bac 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -5,8 +5,8 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { private static Gtk.CssProvider css_provider; + private static Settings settings; - private Settings settings; private Gtk.Box box; private Dock.DesktopIntegration desktop_integration; private GLib.HashTable app_to_launcher; @@ -18,6 +18,8 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { static construct { css_provider = new Gtk.CssProvider (); css_provider.load_from_resource ("/io/elementary/dock/MainWindow.css"); + + settings = new Settings ("io.elementary.dock"); } construct { @@ -33,15 +35,12 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { child = box; overflow = Gtk.Overflow.VISIBLE; resizable = false; - decorated = false; set_titlebar (empty_title); // Fixes DnD reordering of launchers failing on a very small line between two launchers var drop_target_launcher = new Gtk.DropTarget (typeof (Launcher), MOVE); box.add_controller (drop_target_launcher); - settings = new Settings ("io.elementary.dock"); - GLib.Bus.get_proxy.begin ( GLib.BusType.SESSION, "org.pantheon.gala", From a2ffaa987fbca32cc7b68c682e148e5ca2c7265a Mon Sep 17 00:00:00 2001 From: Leonhard Date: Mon, 18 Sep 2023 20:43:42 +0200 Subject: [PATCH 34/37] Add comment --- src/Launcher.vala | 2 +- src/MainWindow.vala | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 8156a97c..5e32e593 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -202,7 +202,7 @@ public class Dock.Launcher : Gtk.Button { if (windows.is_empty ()) { box.remove (this); } else { - window.move_launcher_after (this, (Launcher)box.get_last_child ()); + window.move_launcher_after (this, (Launcher) box.get_last_child ()); } return true; diff --git a/src/MainWindow.vala b/src/MainWindow.vala index ae232bac..1f8af543 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -126,6 +126,10 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { }); } + /* + * Moves source behind target while animating children in between in + * the appropriate direction and saves the new positions + */ public void move_launcher_after (Launcher source, Launcher? target) { var before_source = source.get_prev_sibling (); From 17f99fe617f10dc15a7bf8bba8d0abb2d6e076a5 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 11 Nov 2023 11:59:57 +0100 Subject: [PATCH 35/37] Fix crash on dnd remove --- src/Launcher.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 793d659d..97d91c22 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -200,8 +200,6 @@ public class Dock.Launcher : Gtk.Button { private bool on_drag_cancel (Gdk.Drag drag, Gdk.DragCancelReason reason) { if (pinned && reason == NO_TARGET) { - pinned = false; - var popover = new PoofPopover (); unowned var window = (MainWindow) get_root (); @@ -235,6 +233,8 @@ public class Dock.Launcher : Gtk.Button { window.move_launcher_after (this, (Launcher) box.get_last_child ()); } + pinned = false; + return true; } else { image.gicon = app_info.get_icon (); From 211e1ccd90365fc948fcd260c7f505a747b4fa09 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 11 Nov 2023 14:48:49 +0100 Subject: [PATCH 36/37] Add comments + cleanup --- src/MainWindow.vala | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index d9e20936..1c9fcd17 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -147,44 +147,43 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { }); } - /* - * Moves source behind target while animating children in between in - * the appropriate direction and saves the new positions - */ public void move_launcher_after (Launcher source, Launcher? target) { var before_source = source.get_prev_sibling (); box.reorder_child_after (source, target); - string[] new_pinned_ids = {}; - bool add = false; + /* + * should_animate toggles to true once either the launcher before the one + * that was moved is reached or once the one that was moved is reached + * and goes false again once the other one is reached. While true + * all launchers that are iterated over are animated to move in the appropriate + * direction. + */ + bool should_animate = false; Gtk.DirectionType dir = UP; // UP is an invalid placeholder value + // source was the first launcher in the box so we start animating right away if (before_source == null) { - add = true; + should_animate = true; dir = LEFT; } Launcher child = (Launcher) box.get_first_child (); while (child != null) { - if (child.pinned) { - new_pinned_ids += child.app_info.get_id (); - } - if (child == source) { - add = !add; - if (add) { + should_animate = !should_animate; + if (should_animate) { dir = RIGHT; } } - if (add && child != source) { + if (should_animate && child != source) { child.animate_move (dir); } if (child == before_source) { - add = !add; - if (add) { + should_animate = !should_animate; + if (should_animate) { dir = LEFT; } } @@ -192,7 +191,7 @@ public class Dock.MainWindow : Gtk.ApplicationWindow { child = (Launcher) child.get_next_sibling (); } - settings.set_strv ("launchers", new_pinned_ids); + sync_pinned (); } public void remove_launcher (Launcher launcher, bool from_map = true) { From d6354aaa69fcb6fa414769d55c756634b1224bff Mon Sep 17 00:00:00 2001 From: Leonhard Date: Sat, 11 Nov 2023 14:59:44 +0100 Subject: [PATCH 37/37] Cleanup --- src/Launcher.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 97d91c22..d5528147 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -252,9 +252,9 @@ public class Dock.Launcher : Gtk.Button { Launcher target = this; if (source != target) { - if ((x > get_allocated_width () / 2) && get_next_sibling () == source) { - target = (Launcher) get_prev_sibling (); - } else if ((x < get_allocated_width () / 2) && get_prev_sibling () != source) { + if (((x > get_allocated_width () / 2) && get_next_sibling () == source) || + ((x < get_allocated_width () / 2) && get_prev_sibling () != source) + ) { target = (Launcher) get_prev_sibling (); }