У меня проблемы с получением 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.
РЕДАКТИРОВАТЬ: исправлена опечатка в заголовке …
В итоге я нашел как это сделать.
При настройке окна (для меня конструктор производного от окна класса) необходимо было задать для столбца значение 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();
Других решений пока нет …