Вставка Gtk TreeView после и под выбранным элементом

Есть ли хороший способ вставки элементов после или под элементом в 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()

person tobias47n9e    schedule 16.04.2015    source источник


Ответы (1)


Есть ли хороший способ вставки элементов после или под элементом в Gtk TreeView. Возможно ли это сделать с помощью одной функции?

Не с одной функцией. Кроме того, это не работает, если у вас включен множественный выбор, потому что тогда вы обычно не хотите вставлять после первой из нескольких выбранных строк.

Есть ли способ отменить выбор TreeView, а затем вставить в конец, если ничего не выбрано?

«Поведение» программы на самом деле не вопрос лучших практик, а вопрос того, как вы хотите, чтобы программа вела себя. Чтобы принять несколько различных «стилей», функции подразделяются на несколько этапов. Я думаю, что интуитивные шаги будут такими:

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

Если get_selected возвращает itr == None, то вы можете просто использовать append(None...), чтобы новая строка была добавлена ​​в самый конец.

person jcoppens    schedule 22.05.2015