في GTK، عند استخدام السحب والإفلات في شجرة Treeview، كيف يمكنني الاحتفاظ بالانخفاض بين الصفوف؟
-
18-09-2019 - |
سؤال
أختبر نافذة تبدو مثل هذا:
سحب العلامة إلى بطاقة يربط العلامة إلى البطاقة. لذلك تسحب بطاقة إلى علامة.
لا معنى له انخفاض علامة بين بطاقتين، أو بطاقة بين علامتين. أستطيع أن أتجاهل هذه النتائج في Handle...DataReceived
وظيفة مثل هذا:
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
ومع ذلك، عند السحب، لا يزال المستخدم يرى خيار إدراج:
كيف يمكنني منع هذا من الحدوث؟
المحلول
تحتاج إلى الاتصال ب drag-motion
إشارة وتغيير السلوك الافتراضي لذلك لا يشير أبدا إلى قطرة قبل / بعد:
def _drag_motion(self, widget, context, x, y, etime):
drag_info = widget.get_dest_row_at_pos(x, y)
if not drag_info:
return False
path, pos = drag_info
if pos == gtk.TREE_VIEW_DROP_BEFORE:
widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
elif pos == gtk.TREE_VIEW_DROP_AFTER:
widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
context.drag_status(context.suggested_action, etime)
return True
نصائح أخرى
يمكنك تحديد أهداف مختلفة للعلامات والبطاقات، وعلى القطعة اليسرى تقبل فقط الهدف الذي يمثل العلامات. يستخدم Gtk.Drag.DestSet
طريقة. ربما شيء مثل:
Gtk.Drag.DestSet (widget, DestDefaults.All,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
حاولت أن أجعل الوجهة تنبعث من الأحداث الحركة مع:
Gtk.Drag.DestSet (widget, DestDefaults.Motion,
new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
DragAction.Default);
من الناحية النظرية، إذا فهمت ذلك بشكل صحيح، يجب أن تعمل. لكنني لم أستطع جعله أحداث الحركة النار :(
لا تنتمي إلى StackOverflow