как выделить позицию курсора в gtk_treeview и иметь редактируемые ячейки - PullRequest
0 голосов
/ 22 января 2020

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

Я написал короткий пример того, что я испытываю в python:

#!/usr/bin/env python

import gi
gi.require_version('Gtk', '3.0')

import signal
import sys
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GObject

AW = 2000   # active weight (weight used when cursor is on a given cell)
IW = 400    # inactive weight (weight used when cursor is NOT on a given cell)

class TreeViewExample:

    def check_sigint(self):
        return True

    def quit(self):
          Gtk.main_quit()

    def delete_event(self, widget, data=None):
        print "delete_event signal occurred"
        self.quit()
        return True

    def destroy(self, widget, data=None):
        print "destroy signal occurred"
        self.quit()

    def signal_handler(self, signal, frame):
        print '\nYou pressed Ctrl+C!, exiting'
        Gtk.main_quit()

    def clear_selected(self, button):
        selection = self.treeview.get_selection()
        model, iter = selection.get_selected()
        if iter:
            model.remove(iter)
        return

    def window_key_press(self, widget, event):
        keyname = Gdk.keyval_name(event.keyval)

# # #  ( q )
        if keyname == 'q':  
#           if event.state & Gdk.ModifierType.CONTROL_MASK:
#             print 'entered ctrl+q'
            self.quit()

    def treeview_key_press(self, widget, event):
        keyname = Gdk.keyval_name(event.keyval)

# # #  ( return )
        if keyname == 'Return': 
#           if event.state & Gdk.ModifierType.CONTROL_MASK:
#             print 'entered ctrl+q'
          selection = self.treeview.get_selection()
          model, iter = selection.get_selected()
          path = model.get_path(iter)
          if self.treeview.row_expanded(path):
            self.treeview.collapse_row(path)
          else:
            self.treeview.expand_row(path,False)

    def cell_edited(self,renderer,path,text,column):
        print 'entered cell edited, column: %s, text: %s' % (column,text)
        iter = self.treestore.get_iter(path)
        self.treestore[iter][column] = text

    def cursor_changed(self,widget):
        print 'entered cursor changed'
        selection = self.treeview.get_selection()
        (model, iter) = selection.get_selected()
        path,col = widget.get_cursor()
        if col and iter:
          try:
            col_num = int(col.get_title())
          except:
            return

          for i in range(2,4):
            model.set(iter,i,IW)
          model.set(iter,col_num+2,AW)

    def __init__(self):
        # Create a new window
        self.window = Gtk.Window(Gtk.WindowType.TOPLEVEL)

        self.window.set_title("Lists")

        self.window.set_size_request(200, 200)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.connect('key_press_event', self.window_key_press)

        choices = Gtk.ListStore(int,str)
        for i in range(4):
          choices.append([i,('test %s' % i)])

        self.treestore = Gtk.TreeStore(str,str,int,int)
        for parent in range(4):
            piter = self.treestore.append(None, ['parent %i' % parent,('blah %s' % i),IW,IW])

        self.treeview = Gtk.TreeView(self.treestore)
        self.treeview.connect('key_press_event', self.treeview_key_press)
        self.treeview.connect("cursor-changed", self.cursor_changed)

        cell = Gtk.CellRendererText()
        cell.set_property('editable', True) 
        cell.connect('edited', self.cell_edited,0)
        self.tvcolumn = Gtk.TreeViewColumn('0', cell, text=0, weight=2)
        self.treeview.append_column(self.tvcolumn)

        cell = Gtk.CellRendererCombo()
        cell.set_property('editable', True) 
        cell.set_property('has-entry', False) 
        cell.set_property('text-column', 1) 
        cell.set_property('model', choices) 
        cell.connect('edited', self.cell_edited,1)
        self.tvcolumn = Gtk.TreeViewColumn('1', cell, text=1, weight=3)
        self.treeview.append_column(self.tvcolumn)

        self.window.add(self.treeview)
        self.window.show_all()

        GObject.timeout_add_seconds(1, self.check_sigint)

def main():
    Gtk.main()

if __name__ == "__main__":
    example = TreeViewExample()
    main()

С учетом вышеизложенного, при перемещении курсора вокруг изменяется вес шрифта, но если вы попытайтесь отредактировать ячейку, операция редактирования не может быть завершена (функции выпадающего списка не исчезают). Однако, если вы прокомментируете соединение сигнала с измененным курсором в строке 108, редактирование будет завершено. Итак, еще раз, как я могу иметь оба? Это ошибка?

...