LINUX.ORG.RU

[cl-gtk2]Сортировка в tree-view


0

1

Есть некая структура, по типу (defstruct tvi title value)

Я хочу отображать её слоты в столбцах tree-view и сортировать их

Для этого использую array-list-store. Точно так, как это делается в файле gtk.demo.lisp (функция test-treeview-list)

  (let* ((window (make-instance 'gtk-window :type :toplevel :title "Treeview (list)"))
           (model (make-instance 'array-list-store))
           ....
           (tv (make-instance 'tree-view :headers-visible t :width-request 100 :height-request 400 :rules-hint t))
           ....
           )
      (store-add-column model "gchararray" #'tvi-title)
      (store-add-column model "gint" #'tvi-value)
      (store-add-item model (make-tvi :title "Monday" :value 1))
      (store-add-item model (make-tvi :title "Tuesday" :value 2))
      (store-add-item model (make-tvi :title "Wednesday" :value 3))
      (store-add-item model (make-tvi :title "Thursday" :value 4))
      (store-add-item model (make-tvi :title "Friday" :value 5))
      (store-add-item model (make-tvi :title "Saturday" :value 6))
      (store-add-item model (make-tvi :title "Sunday" :value 7))
      (setf (tree-view-model tv) model)
      ....

Далее идет такой код

      (let ((column (make-instance 'tree-view-column :title "Title" :sort-column-id 0))
            (renderer (make-instance 'cell-renderer-text :text "A text")))
        (tree-view-column-pack-start column renderer)
        (tree-view-column-add-attribute column renderer "text" 0)
        (tree-view-append-column tv column)
        (print (tree-view-column-tree-view column))
        (print (tree-view-column-cell-renderers column)))
      (let ((column (make-instance 'tree-view-column :title "Value"))
            (renderer (make-instance 'cell-renderer-text :text "A text")))
        (tree-view-column-pack-start column renderer)
        (tree-view-column-add-attribute column renderer "text" 1)
        (tree-view-append-column tv column)
        (print (tree-view-column-tree-view column))
        (print (tree-view-column-cell-renderers column)))

Теперь при нажатии на столбец в tree-view получаю (у себя и в gtk-demo:test-treeview-list):

(<unknown>:4169): Gtk-CRITICAL **: IA__gtk_tree_sortable_get_sort_column_id: assertion `GTK_IS_TREE_SORTABLE (sortable)' failed

(<unknown>:4169): Gtk-CRITICAL **: IA__gtk_tree_sortable_has_default_sort_func: assertion `GTK_IS_TREE_SORTABLE (sortable)' failed

(<unknown>:4169): Gtk-CRITICAL **: IA__gtk_tree_sortable_set_sort_column_id: assertion `GTK_IS_TREE_SORTABLE (sortable)' failed

Вопрос: есть ли какой-то аналог gtk_tree_sortable_set_default_sort_func в cl-gtk2. Код пробовал смотреть, но там всё слишком заумно ;)

P.S. И да, есть ли какая-либо документация лучше http://common-lisp.net/project/cl-gtk2/doc/gtk/? Гугль дал только это + как написать hello-world на lisper.ru

Да, сортировать столбцы по возрастанию/убыванию в числовом ряду или по алфавиту.

different_thing ()

array-lisp-store не реализует интерфейс GtkTreeSortable. Используй GtkListStore.

k_andy ★★★ ()
Ответ на: комментарий от k_andy

А там единственный способ засунуть элемент - это list-store-insert-with-values? Т.е. структуру целиком туда не запихнуть, выходит. Ну впрочем, можно и обойтись без этого.

В примере это выглядит как-то так:

(let ((l (make-instance 'list-store :column-types '("gint" "gchararray"))))
        (iter (for i from 0 below 100)
              (for n = (random 10000000))
              (for s = (format nil "~R" n))
              (list-store-insert-with-values l i n s))

Может, покопаюсь, додумаюсь как свою собственную модель реализовать.

different_thing ()
Ответ на: комментарий от different_thing

Структуру по-другому не засунуть. А вот GObject можно.

k_andy ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.