Создаю TreeView со множеством столбцов, и не знаю что нужно сделать, чтобы при изменении размера столбца(мышью, как обычно) менялась и ширина самого дерева, т.е чтобы внизу появлялся горизонтальный скроллбар, т.к в некоторых ячейках может содержаться довольно длинный текст. При том что в GTK 3.4(более точно версию не помню), этот же код работает нормально.
Заметил, что и в nautilus и, к примеру, в file-roller, поведение столбцов(да и всего treeview) точно такое же как и у меня. Очередная новая фишка от разработчиков gnome, или что это?
Arch Linux, GNOME 3.10.2, GTK 3.10.7-1
class Window < Gtk::Window
include GetText
def initialize
super(Gtk::Window::Type::TOPLEVEL)
tree = create_tree
scrolled = Gtk::ScrolledWindow.new
scrolled.add_with_viewport(tree)
box = Gtk::Box.new(:vertical)
box.pack_start(scrolled, expand: true, fill: true)
self.add(box)
self.set_default_size(640, 480)
self.set_window_position(Gtk::Window::Position::CENTER)
self.show_all
self.signal_connect("delete_event") { Gtk.main_quit }
end
def create_tree
model = Gtk::ListStore.new(
String,
String,
String,
String,
String
)
tree = Gtk::TreeView.new(model)
add_col = Proc.new do |title, renderer, cell_data_func, attrs|
col = Gtk::TreeViewColumn.new(title, renderer, attrs)
col.sizing = Gtk::TreeViewColumn::Sizing::FIXED
col.resizable = true
col.expand = true
col.min_width = 50
col.fixed_width = 50
col.set_cell_data_func(renderer, &cell_data_func) unless cell_data_func.nil?
tree.append_column(col)
col
end
text_renderer = Gtk::CellRendererText.new
add_col.call(_("Col 1"), text_renderer, nil, text: 0)
add_col.call(_("Col 2"), text_renderer, nil, text: 1)
add_col.call(_("Col 3"), text_renderer, nil, text: 2)
add_col.call(_("Col 4"), text_renderer, nil, text: 3)
add_col.call(_("Col 5"), text_renderer, nil, text: 4)
tree
end
end
Gtk.init
Window.new
Gtk.main
Пока придумал только вот такой костыль:
# в блоке add_col
col.signal_connect("notify::width") do |_, _|
new_width = 0
tree.columns.each { |c| new_width += c.fixed_width }
tree.set_size_request(new_width, -1) if new_width > 0
end