Обтекание текста в виде дерева GTK3

У меня проблемы с получением TreeView в GTK3 для правильного переноса текста.

Я настроил это так:

    Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_mode().set_value(Pango::WRAP_WORD_CHAR);
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_width().set_value(200);

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

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

        Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
auto width = this->get_allocated_width()
- mTreeView.get_column(0)->get_width()
- mTreeView.get_column(1)->get_width();
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_width().set_value(width-100);
this->forceRecreateModel = true; //Needed to work

Но это позволяет мне только увеличить окно. Его нельзя сжать после изменения размера.

Вопрос в том, как это правильно сделать?

Я использую gtk3.20.3-1 и gtkmm3.20.1-1 на Arch Linux.

РЕДАКТИРОВАТЬ: исправлена ​​опечатка в заголовке …

4

Решение

В итоге я нашел как это сделать.

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

//Last Column setup
{
mTreeView.append_column("Translation", mColumns.mEnglish);
Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
pColumn->set_sizing(Gtk::TreeViewColumnSizing::TREE_VIEW_COLUMN_AUTOSIZE);
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_mode().set_value(Pango::WRAP_WORD_CHAR);
}

Также необходимо установить правильную ширину переноса при каждом изменении размера. Без этого высота строки была бы настолько большой, насколько это было бы необходимо для текущего установленного wrap_width без учета текущей ширины (что приводило к большому заполнению сверху, когда растягивалось больше и запрещало уменьшать окно).

Этот код был также в конструкторе.

this->signal_check_resize().connect([this]()
{
//calculate remaining size
Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
auto width = this->get_allocated_width()
- mTreeView.get_column(0)->get_width()
- mTreeView.get_column(1)->get_width()-30;

//minimum reasonable size for column
if(width < 150)
width = 150;

static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_width().set_value(width);

//debounce
static auto oldsize = 0;
{
oldsize = width;

//trigger redraw of mTreeView (by clearing and refilling Model,
//it is done in 100ms pulse)
this->mRedrawNeeded = true;
}
});

И, возможно, стоит отметить, что у меня есть mTreeView, инкапсулированный в Gtk :: ScrolledWindow. Так что это кусок, который идет до настройки столбца. 🙂

//in class is: Gtk::ScrolledWindow mScrollForResults;

//scrolling area
mGrid.attach(mScrollForResults, 0,2,10,1);
mScrollForResults.set_hexpand();
mScrollForResults.set_policy(Gtk::PolicyType::POLICY_AUTOMATIC,
Gtk::PolicyType::POLICY_ALWAYS);
mScrollForResults.set_margin_top(10);
mScrollForResults.set_min_content_width(400);
mScrollForResults.set_min_content_height(200);
mScrollForResults.add(mTreeView);

//results treeView
mRefListStore = Gtk::ListStore::create(mColumns);
mTreeView.set_model(mRefListStore);
mTreeView.set_hexpand();
mTreeView.set_vexpand();
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]