2015-01-21 2 views
0

Я пытаюсь создать программу с Gtk2Hs и Haskell, и я задаюсь вопросом, можно ли обмениваться разными виджетами друг с другом.Gtk2Hs: взаимодействие с Widget

У меня есть текстовая запись, которая используется для написания команд, область рисования, которая рисует что-то, когда текст вводится. Эти два виджета прекрасно работают вместе.

Однако я хотел бы добавить «необязательное» древовидное представление в другое окно, которое будет обновляться при выполнении всех команд в текстовой записи (это может занять много времени).

Поскольку treeview является «необязательным» и создается только после этого, я не могу определить обратные вызовы для его обновления в определении текстового ввода (например, в области рисования).

Я хотел бы создать сигнал (событие?), Который будет излучаться, когда все операции будут выполнены и пойманы деревом для обновления его данных.

Мои вопросы:

  • Есть ли способ сделать это с Gtk2Hs и Glib?
  • Есть ли модуль, который может быть использован для его создания (переносимый в Linux/Windows, если это возможно)?
  • Есть ли правильный способ заставить виджет перехватывать/общаться с другими?

Я использую GHC 7.4.1 и Gtk2Hs 0.12.3

+0

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

ответ

0

я найти решение моей проблемы:

  1. В основной программе я создать IORef из списка действия для выполнения:

    actionsIO <- newIORef [action_to_do_1,action_to_do_2] 
    
  2. Я создаю мой собственный комбинированный виджет для ввода текста

    ent <- textEntry window canvas state modele parser info actionsIO 
    

    Внутри я выполнить список действий, которые так:

    actions <- readIORef actionsIO 
    sequence_ actions 
    
  3. я создаю мой TreeView

    arwin <- arrayWin modele window canvas state info actionsIO 
    

    Внутри я изменять/удалять/добавлять действия в список, как это:

    let newactions = [new_action_to_do_1,new_action_to_do_2] 
    writeIORef actionsIO newactions 
    

    Эти новые действия выполняются каждый раз, когда команда проверяется с помощью специального виджета ввода.

Возможно, существует «более чистый» способ, но этот метод хорошо работает и полностью разрешил мою проблему.

Смежные вопросы