Найти - Пользователи
Полная версия: Реализация Drag&Drop для Gtk.Treeview
Начало » GUI » Реализация Drag&Drop для Gtk.Treeview
1
b_oss
Нужно в Treeview реализовать перетаскивание мышкой любой строки в другую позицию. Нашел пример для pygtk. Но в свою программу перенести не смог. Использую Python, GTK3, glade.
b_oss
Получилось. :) На основе примеров этого и этого написал простейший пример.
#!/usr/bin/python
from gi.repository import Gtk, Gdk
class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Drag and Drop Demo")
        self.set_size_request(200, 200)
        store = Gtk.ListStore(str)
        self.treeview = Gtk.TreeView(store)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Title", renderer, text=0)
        self.treeview.append_column(column)
        self.add(self.treeview)
        store.append(['Item 1'])
        store.append(['Item 2'])
        store.append(['Item 3'])
        store.append(['Item 4'])
        store.append(['Item 5'])
        self.treeview.enable_model_drag_source(
                                Gdk.ModifierType.BUTTON1_MASK,
                                [('text', Gtk.TargetFlags.SAME_WIDGET, 0)],
                                Gdk.DragAction.MOVE)
        self.treeview.enable_model_drag_dest([('text', Gtk.TargetFlags.SAME_WIDGET, 0)],
                                             Gdk.DragAction.MOVE)
        self.treeview.drag_source_add_text_targets()
        self.treeview.drag_dest_add_text_targets()
        self.treeview.connect("drag_data_get", self.drag_data_get_data)
        self.treeview.connect("drag_data_received",
                              self.drag_data_received_data)
    def drag_data_get_data(self, treeview, context, selection, target_id,
                           etime):
        treeselection = treeview.get_selection()
        model, iter = treeselection.get_selected()
        data = model.get_value(iter, 0)
        selection.set(selection.get_selection(), 8, data)
    def drag_data_received_data(self, treeview, context, x, y, selection,
                                info, etime):
        model = treeview.get_model()
        data = selection.get_data()
        drop_info = treeview.get_dest_row_at_pos(x, y)
        if drop_info:
            path, position = drop_info
            iter = model.get_iter(path)
            if (position == Gtk.TreeViewDropPosition.BEFORE
                or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
                model.insert_before(iter, [data])
            else:
                model.insert_after(iter, [data])
        else:
            model.append([data])
        if context.get_actions() == Gdk.DragAction.MOVE:
            context.finish(True, True, etime)
        return
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

Замечания, предложения?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB