gtk2hs - Возврат ListStore из TreeView

У меня есть дескриптор TreeView, у которого есть ListStore в качестве модели. Что я хочу сделать, так это вернуть дескриптор этого ListStore из моего дескриптора в TreeView.

Как указано здесь, геттер treeViewGetModel возвращает общий TreeModel, а не экземпляр TreeModelClass, например как, в частности здесь, ListStore. Я также не знаю ни одной функции приведения от TreeModel к ListStore...

Я также не хочу делать это (то есть просто сохраняйте дескриптор модели, когда я ее определяю, и передаю ее туда, где я хочу ее использовать).

Кто-нибудь знает хорошее решение этой проблемы?


person gameboo    schedule 26.01.2016    source источник


Ответы (1)


Проблема связана с тем, что древовидное представление может иметь другую модель. Функция TreeView a -> ListStore a будет частичной (не определена для древовидных представлений с разными моделями) и поэтому небезопасна для использования.

Эта проблема поднималась несколько раз на trac gtk2hs и Переполнение стека. Предлагаемые решения всегда похожи на то, что вы упомянули и хотите избежать.

Я не совсем уверен, но я думаю, что что-то вроде следующих строк реализует небезопасное приведение:

unsafeCastToListStore :: TreeView a -> ListStore a
unsafeCastToListStore = 
  unsafeCastGObject . toGObject . treeViewGetModel

Вы можете использовать функции для GObject в библиотеке glib, чтобы определить, действительно ли модель является ListStore, и сделать приведение безопасным, т.е. перенастройка Maybe (ListStore a).

В частности, я бы посоветовал взглянуть на isA :: GObjectClass o => o -> GType -> Bool. К сожалению, вам, возможно, придется использовать функцию C gtk_list_store_get_type через FFI, если никакая другая функция не может дать вам GType вместо ListStore.

В качестве альтернативы, если вы можете скомпилировать и связать свой собственный форк gtk2hs, вы можете просто реэкспортировать внутренние функции/модули, которые gtk экспортирует, но не gtk2hs (если это для проекта с закрытым исходным кодом или для внутреннего использования). ), хотя это повлечет за собой дополнительные расходы на обслуживание.

person Ivan Perez    schedule 24.04.2016