Daniel Brötzmann pushed to branch mainwindow at gajim / gajim


Commits:
72f6f03c by wurstsalat at 2021-03-06T14:16:39+01:00
Roster: Implement drag and drop

- - - - -


1 changed file:

- gajim/gtk/roster.py


Changes:

=====================================
gajim/gtk/roster.py
=====================================
@@ -67,6 +67,19 @@ def __init__(self, account):
 
         self._roster = self._ui.roster_treeview
 
+        # Drag and Drop
+        entries = [Gtk.TargetEntry.new(
+            'ROSTER_ITEM',
+            Gtk.TargetFlags.SAME_APP,
+            0)]
+        self._roster.enable_model_drag_source(
+            Gdk.ModifierType.BUTTON1_MASK,
+            entries,
+            Gdk.DragAction.MOVE)
+        self._roster.enable_model_drag_dest(entries, Gdk.DragAction.DEFAULT)
+        self._roster.connect('drag-drop', self._on_drag_drop)
+        self._roster.connect('drag-data-received', self._on_drag_data_received)
+
         self._ui.contact_column.set_cell_data_func(self._ui.text_renderer,
                                                    self._text_cell_data_func)
         self.connect('destroy', self._on_destroy)
@@ -142,6 +155,74 @@ def _on_account_state(self, _event):
     def _on_theme_update(self, _event):
         self.redraw()
 
+    @staticmethod
+    def _on_drag_drop(treeview, drag_context, _x_coord, _y_coord,
+                      timestamp):
+        treeview.stop_emission_by_name('drag-drop')
+        target_list = treeview.drag_dest_get_target_list()
+        target = treeview.drag_dest_find_target(drag_context, target_list)
+        treeview.drag_get_data(drag_context, target, timestamp)
+        return True
+
+    def _on_drag_data_received(self, treeview, _drag_context, x_coord,
+                               y_coord, _selection_data, _info, _timestamp):
+        treeview.stop_emission_by_name('drag-data-received')
+        if treeview.get_selection().count_selected_rows() == 0:
+            # No selections, nothing dragged from treeview
+            return
+
+        drop_info = treeview.get_dest_row_at_pos(x_coord, y_coord)
+        if not drop_info:
+            return
+
+        model = treeview.get_model()
+        path_dest, _position = drop_info
+
+        # Source: the row being dragged
+        path_source = treeview.get_selection().get_selected_rows()[1][0]
+        iter_source = model.get_iter(path_source)
+        iter_source_parent = model.iter_parent(iter_source)
+        if iter_source_parent is None:
+            # Dragged a group
+            return
+
+        source_group = model[iter_source_parent][Column.JID_OR_GROUP]
+        delimiter = self._client.get_module('Delimiter').delimiter
+        source_groups = source_group.split(delimiter)
+        if DEFAULT_GROUP in source_groups:
+            source_groups = []
+        jid = model[iter_source][Column.JID_OR_GROUP]
+        name = model[iter_source][Column.TEXT]
+
+        # Destination: the row receiving the drop
+        iter_dest = model.get_iter(path_dest)
+        iter_dest_parent = model.iter_parent(iter_dest)
+        if iter_dest_parent is None:
+            # Dropped on a group
+            dest_group = model[iter_dest][Column.JID_OR_GROUP]
+        else:
+            dest_group = model[iter_dest_parent][Column.JID_OR_GROUP]
+
+        dest_groups = dest_group.split(delimiter)
+        if DEFAULT_GROUP in dest_groups:
+            # Dropped into DEFAULT_GROUP, remove all groups
+            print('remoing all groups')
+            # self._client.get_module('Roster').update_contact(jid, name, [])
+            return
+
+        print('source groups')
+        print(source_groups)
+        print('dest groups')
+        print(dest_groups)
+        if source_groups == dest_groups:
+            # Dropped into source group
+            return
+        groups = list(set(dest_groups) - set(source_groups))
+        print('final groups')
+        print(groups)
+        print('setting new groups')
+        # self._client.get_module('Roster').update_contact(jid, name, groups)
+
     def _on_show_offline(self, action, param):
         action.set_state(param)
         app.settings.set('showoffline', param.get_boolean())



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/72f6f03c50d470f7373a58a127d3f84ad22c0701

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/72f6f03c50d470f7373a58a127d3f84ad22c0701
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list
[email protected]
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to