في GTK، عند استخدام السحب والإفلات في شجرة Treeview، كيف يمكنني الاحتفاظ بالانخفاض بين الصفوف؟

StackOverflow https://stackoverflow.com/questions/2209650

سؤال

أختبر نافذة تبدو مثل هذا:

alt text

سحب العلامة إلى بطاقة يربط العلامة إلى البطاقة. لذلك تسحب بطاقة إلى علامة.

لا معنى له انخفاض علامة بين بطاقتين، أو بطاقة بين علامتين. أستطيع أن أتجاهل هذه النتائج في Handle...DataReceived وظيفة مثل هذا:

if (dropPos != TreeViewDropPosition.IntoOrAfter &&
    dropPos != TreeViewDropPosition.IntoOrBefore)
    return;

ومع ذلك، عند السحب، لا يزال المستخدم يرى خيار إدراج:

alt text

كيف يمكنني منع هذا من الحدوث؟

هل كانت مفيدة؟

المحلول

تحتاج إلى الاتصال ب 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);

من الناحية النظرية، إذا فهمت ذلك بشكل صحيح، يجب أن تعمل. لكنني لم أستطع جعله أحداث الحركة النار :(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top