LINUX.ORG.RU

Ruby, GTK 3.10 и ширина TreeView

 , ,


0

2

Создаю 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
Ну бред же? Где стандартное поведение TreeView? Помогите, ибо сил уже нет.

Оффтопик: А какой гем ты используешь для гтк?

anonymous ()

Попробуй строчку добавить:

tree = create_tree
scrolled = Gtk::ScrolledWindow.new
scrolled.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC) #!!!
scrolled.add_with_viewport(tree)
Novator ★★★★ ()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

Оно там вроде бы по дефолту автоматик, пробовал, не помогает. Делал так:
scrolled.set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC)
(приведённые тобой константы deprecated, но суть не меняется)

На данный момент рабочий вариант:

      col.signal_connect("notify::width") do |c, _|
        c.min_width = c.fixed_width
      end

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

Печально. Поэтому с Gtk2 на Gtk3 не тянет переходить.

И Gstreamer1.0 по сравнению с 0.1 тоже поломали, а свободной альтернативы нет.

Novator ★★★★ ()

попробуй поиграться с gtk_widget_set_hexpand (хрен его знает, какой-там аналог/обертка в ruby) для GtkTreeView

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

Не нашёл аналог в Ruby =] Поигрался с Python'ом, ничего не меняется. Видимо, так задумано, потому что во всех остальных gtk3-приложениях TreeView ведёт себя так же - невозможно увиличить ширину колонки, если суммарная ширина всех колонок >= ширине дерева, а горизонтальный скроллбар появляется только если достигнут минимальный размер(суммарная минимальная ширина всех колонок).

#!/usr/bin/env python3

from gi.repository import Gtk


class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)

        tree = self.create_tree()
        scrolled = Gtk.ScrolledWindow()
        scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        scrolled.add_with_viewport(tree)

        box = Gtk.Box()
        box.pack_start(scrolled, True, True, 0)

        self.add(box)
        self.set_default_size(640, 480)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()

    def create_tree(self):
        model = Gtk.ListStore(str, str, str)
        tree = Gtk.TreeView(model)
        # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        tree.set_hexpand(True)
        # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        text_renderer = Gtk.CellRendererText()

        for i in range(5):
            col = Gtk.TreeViewColumn("Col {0}".format(i), text_renderer)
            col.set_resizable(True)
            col.set_expand(True)
            col.set_min_width(150)

            tree.append_column(col)

        return tree


Window()
Gtk.main()

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