Ticket #3999: treeview_dnd_test.py

File treeview_dnd_test.py, 4.2 KB (added by godiard, 11 years ago)

Treeview dnd example

Line 
1#!/usr/bin/env python
2
3# example treeviewdnd.py
4
5from gi.repository import Gtk, Gdk, Pango, GObject
6
7class TreeViewDnDExample:
8
9    TARGETS = [
10        ('MY_TREE_MODEL_ROW', Gtk.TargetFlags.SAME_WIDGET, 0),
11        ('text/plain', 0, 1),
12        ('TEXT', 0, 2),
13        ('STRING', 0, 3),
14        ]
15    # close the window and quit
16    def delete_event(self, widget, event, data=None):
17        Gtk.main_quit()
18        return False
19
20    def clear_selected(self, button):
21        selection = self.treeview.get_selection()
22        model, iter = selection.get_selected()
23        if iter:
24            model.remove(iter)
25        return
26
27    def __init__(self):
28        # Create a new window
29        self.window = Gtk.Window()
30
31        self.window.set_title("URL Cache")
32
33        self.window.set_size_request(200, 200)
34
35        self.window.connect("delete_event", self.delete_event)
36
37        self.scrolledwindow = Gtk.ScrolledWindow()
38        self.vbox = Gtk.VBox()
39        self.hbox = Gtk.HButtonBox()
40        self.vbox.pack_start(self.scrolledwindow, True, True, 0)
41        self.vbox.pack_start(self.hbox, False, True, 0)
42        self.b0 = Gtk.Button('Clear All')
43        self.b1 = Gtk.Button('Clear Selected')
44        self.hbox.pack_start(self.b0, True, True, 0)
45        self.hbox.pack_start(self.b1, True, True, 0)
46
47        # create a liststore with one string column to use as the model
48        self.liststore = Gtk.ListStore(str)
49
50        # create the TreeView using liststore
51        self.treeview = Gtk.TreeView(self.liststore)
52
53       # create a CellRenderer to render the data
54        self.cell = Gtk.CellRendererText()
55
56        # create the TreeViewColumns to display the data
57        self.tvcolumn = Gtk.TreeViewColumn('URL', self.cell, text=0)
58
59        # add columns to treeview
60        self.treeview.append_column(self.tvcolumn)
61        self.b0.connect_object('clicked', Gtk.ListStore.clear, self.liststore)
62        self.b1.connect('clicked', self.clear_selected)
63        # make treeview searchable
64        self.treeview.set_search_column(0)
65
66        # Allow sorting on the column
67        self.tvcolumn.set_sort_column_id(0)
68
69        # Allow enable drag and drop of rows including row move
70        self.treeview.enable_model_drag_source( Gdk.ModifierType.BUTTON1_MASK,
71                                                self.TARGETS,
72                                                Gdk.DragAction.DEFAULT|
73                                                Gdk.DragAction.MOVE)
74        self.treeview.enable_model_drag_dest(self.TARGETS,
75                                             Gdk.DragAction.DEFAULT)
76        self.treeview.drag_dest_add_text_targets()
77        self.treeview.drag_source_add_text_targets()
78
79        self.treeview.connect("drag_data_get", self.drag_data_get_data)
80        self.treeview.connect("drag_data_received",
81                              self.drag_data_received_data)
82
83        self.scrolledwindow.add(self.treeview)
84        self.window.add(self.vbox)
85        self.window.show_all()
86
87    def drag_data_get_data(self, treeview, context, selection, target_id,
88                           etime):
89        treeselection = treeview.get_selection()
90        model, iter = treeselection.get_selected()
91        print "model: %s, iter: %s" % (model, iter)
92        value = model.get_value(iter, 0)
93        print value
94        data = bytes(value)
95        selection.set(selection.get_target(), 8, data)
96
97    def drag_data_received_data(self, treeview, context, x, y, selection,
98                                info, etime):
99        model = treeview.get_model()
100        data = selection.get_data().decode("utf-8")
101        drop_info = treeview.get_dest_row_at_pos(x, y)
102        if drop_info:
103            path, position = drop_info
104            iter = model.get_iter(path)
105            if (position == Gtk.TreeViewDropPosition.BEFORE
106                or position == Gtk.TreeViewDropPosition.BEFORE):
107                model.insert_before(iter, [data])
108            else:
109                model.insert_after(iter, [data])
110        else:
111            model.append([data])
112        if context.get_actions() == Gdk.DragAction.MOVE:
113            context.finish(True, True, etime)
114        return
115
116def main():
117    Gtk.main()
118
119if __name__ == "__main__":
120    treeviewdndex = TreeViewDnDExample()
121    main()