✨ feat(applications-dock): add cross-section drag functionality for pinning and unpinning apps

This commit is contained in:
sankalp committed 2025-06-11 15:53:49 +05:45
1 parent bbff498013
commit 20dced51fb
1 file changed
+27 -14
+27 -14
View File
@@ -69,10 +69,10 @@ class Applications(Box):
super().__init__(
name="applications-dock", orientation=orientation_val, spacing=4, **kwargs
)
# Store reference to the dock instance
self.dock_instance = dock_instance
self.config = read_config()
self.conn = get_hyprland_connection()
self.icon_resolver = IconResolver()
@@ -426,7 +426,7 @@ class Applications(Box):
def on_drag_begin(self, widget, drag_context):
self._drag_in_progress = True
Gtk.drag_set_icon_surface(drag_context, createSurfaceFromWidget(widget))
# Prevent dock from hiding during drag
if self.dock_instance:
self.dock_instance.prevent_hiding(True)
@@ -454,17 +454,22 @@ class Applications(Box):
if child.get_name() == "dock-separator":
separator_index = i
break
# Check if we're dragging from unpinned to pinned section
cross_section_drag = separator_index != -1 and (
(source_index > separator_index and target_index < separator_index)
cross_section_drag_to_pin = separator_index != -1 and (
source_index > separator_index and target_index < separator_index
)
# Check if we're dragging from pinned to unpinned section
cross_section_drag_to_unpin = separator_index != -1 and (
source_index < separator_index and target_index > separator_index
)
# If dragging from unpinned to pinned, add to pinned apps
if cross_section_drag:
if cross_section_drag_to_pin:
source_widget = children[source_index]
app_identifier = source_widget.app_identifier
# Add to pinned apps if not already pinned
if hasattr(source_widget, "desktop_app") and source_widget.desktop_app:
app = source_widget.desktop_app
@@ -478,10 +483,18 @@ class Applications(Box):
self.pinned.insert(target_index, app_data_obj)
else:
self.pinned.insert(target_index, app_identifier)
self.config["pinned_apps"] = self.pinned
self.update_pinned_apps_file()
self.update_applications()
# If dragging from pinned to unpinned, remove from pinned apps
elif cross_section_drag_to_unpin:
# Remove from pinned apps
if source_index < len(self.pinned):
self.pinned.pop(source_index)
self.config["pinned_apps"] = self.pinned
self.update_pinned_apps_file()
self.update_applications()
else:
# Regular reordering within the same section
if source_index < separator_index and target_index < separator_index:
@@ -496,7 +509,7 @@ class Applications(Box):
# since unpinned apps aren't stored in config
child_to_move = children.pop(source_index)
children.insert(target_index, child_to_move)
# Update the UI
for child in self.get_children():
self.remove(child)
@@ -507,11 +520,11 @@ class Applications(Box):
def on_drag_end(self, widget, drag_context):
if not self._drag_in_progress:
return
# Process drag end...
self._drag_in_progress = False
# Allow dock to hide again
if self.dock_instance:
self.dock_instance.prevent_hiding(False)