Подклассы GObject в Ruby для пользовательского CellRenderer в GtkTreeView

Я пытаюсь реализовать настроенный CellRenderer в Ruby/GTK, и я уже нашел это предложение:

Подкласс GObject в Ruby

Однако, когда я пытаюсь сделать следующее:

class CellRendererCustom < Gtk::CellRendererText
  type_register #register within gobject system?
  def initialize
    super
  end
  def get_size(widget, cell_area)
    puts "Never called :-("
    return 0,0,100,100
  end
  def signal_do_get_size(widget, cell_area)
    puts "Never called :-("
    return 0,0,100,100
  end
  def signal_do_on_get_size(widget, cell_area)
    puts "Never called :-("
    return 0,0,100,100
  end
  def on_get_size(widget, cell_area)
    puts "Never called :-("
    return 0,0,100,100
  end
end

Эти сигналы никогда не вызываются. Я предполагаю, что это как-то связано с тем, как Ruby связан с GObject API, но, честно говоря, я понятия не имею, как все это работает.

Что я хочу сделать, так это подкласс CellRendererText и перезаписать метод, в этом примере get_size, который вызывается TreeView. Однако я думаю, что поскольку CellRendererText является модулем C, а не рубиновым классом, я не могу перезаписать его методы, не сообщив об этом системе.

Также я CellRenderers должен быть назначен TreeViewColumn, который затем вызывает get_size и другие методы.

Насколько мне известно, аналогичная проблема существовала в PyGtk, где ее как-то обошли, добавив класс GenericCellRenderer:

http://faq.pygtk.org/index.py?req=show&file=faq13.045.htp


person genericus666    schedule 13.01.2010    source источник


Ответы (1)


Я подозреваю, что get_size делегирует width и height свойствам объекта, а родительский виджет использует свойства напрямую, вместо того, чтобы использовать ваш метод get_size. get_size не является сигналом, поэтому signal_do_get_size также не будет вызываться.

Пытаться:

set_property("width", 100)
person Tobu    schedule 13.01.2010
comment
Я добавил некоторые пояснения к вышеуказанному вопросу, я действительно хочу перезаписать метод get_size в моем подклассе. - person genericus666; 14.01.2010
comment
Я получил то, что вы пытались сделать, и моя точка зрения остается в силе. Я думаю, что get_signal не вызывается ни в вашей реализации, ни в реализации какого-либо родительского класса. Поэтому я рекомендую установить свойства ширины и высоты. - person Tobu; 14.01.2010