Gtk TreeView粘贴在所选项目之后和之下

时间:2015-04-16 20:55:08

标签: treeview gtk pygtk pygobject

是否有一种在Gtk TreeView中粘贴项目之后或之下的项目的好方法。用一个功能甚至可以做到这一点吗?我做了这个自包含的例子,但我不确定这种行为的最佳实践应该是什么。有没有办法取消选择TreeView,然后如果没有选择任何内容则粘贴到最后?

from gi.repository import Gtk, Gdk
import json

class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView Drag and Drop")
        self.connect("delete-event", Gtk.main_quit)
        self.set_border_width(10)
        self.set_default_size(400, 300)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
        button = Gtk.Button("Cut")
        button.connect("clicked", self.on_cut_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button(stock=Gtk.STOCK_COPY)
        button.connect("clicked", self.on_copy_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button(stock=Gtk.STOCK_PASTE)
        button.connect("clicked", self.on_paste_clicked)
        hbox.pack_start(button, True, True, 0)
        vbox.add(hbox)

        self.store = Gtk.TreeStore(bool, str)
        self.view = Gtk.TreeView(model=self.store)
        vbox.add(self.view)

        renderer_toggle = Gtk.CellRendererToggle()
        column_toggle = Gtk.TreeViewColumn("", renderer_toggle, active=0)
        renderer_toggle.connect("toggled", self.on_toggled)
        self.view.append_column(column_toggle)

        renderer_name = Gtk.CellRendererText()
        column_name = Gtk.TreeViewColumn("Name", renderer_name, text=1)
        self.view.append_column(column_name)

        self.add_test_data()

    def add_test_data(self):
        parent = self.store.append(None, [True, "Item 1"])
        self.store.append(parent, [True, "Item 2"])
        self.store.append(None, [True, "Item 3"])
        self.store.append(None, [True, "Item 4"])

    def on_toggled(self, cellrenderer, path):
        self.store[path][0] = not self.store[path][0]

    def on_cut_clicked(self, button):
        """Ignores children of selection"""
        self.on_copy_clicked(None)
        selection = self.view.get_selection()
        model, row_list = selection.get_selected_rows()
        itr = model.get_iter(row_list[0])
        model.remove(itr)

    def on_copy_clicked(self, button):
        """Ignores children of selection"""
        selection = self.view.get_selection()
        model, row_list = selection.get_selected_rows()
        if len(row_list) == 0:
            return

        liste = []
        liste.append("TreeViewRow")
        for row in row_list:
            path = model[row]
            liste.append([path[0], path[1]])

        data = json.dumps(liste)
        self.clipboard.set_text(data, -1)

    def on_paste_clicked(self, button):
        """Ignores children of selection"""
        text = self.clipboard.wait_for_text()
        try:
            parse = json.loads(text)
            json_str = True
        except:
            print("Not JSON")
            json_str = False
        if text != None and json_str == True:

            if parse[0] == "TreeViewRow":
                selection = self.view.get_selection()
                model, row_list = selection.get_selected_rows()
                itr = model.get_iter(row_list[0])
                self.store.append(itr, parse[1])
        else:
            print("Could not paste.")

win = MainWindow()
win.show_all()
Gtk.main()

1 个答案:

答案 0 :(得分:1)

  

是否有一种很好的方法可以在Gtk中的项目之后或之下粘贴项目   树视图。用一个函数甚至可以做到这一点吗?

不是单一功能。此外,如果您启用了多个选择,它也无法正常工作,因为您通常不希望在多个选定行的第一个之后插入。

  

是否有办法取消选择TreeView然后粘贴到   如果没有选择任何结束?

'行为'一个程序并不是最佳实践的问题,而是你希望程序如何表现的问题。为了接受几种不同的风格,这些功能分为几个步骤。 我认为直观的步骤是:

  • self.view.get_selection()
  • selection.get_selected()
  • insert_after

如果get_selected返回itr == None,那么您可以使用append(None...),因此新行将附加在最后。