Как я могу получить количество столбцов GTK TreeView, которые поместятся в данной области? - PullRequest
1 голос
/ 16 июня 2019

Я пишу GTK-программу, которая использует TreeView, который должен представлять очень большое количество элементов. Чтобы повысить производительность, я решил не хранить их все в резервном хранилище ListStore, а вместо этого просто показать достаточно элементов, чтобы уместить их на экране, и использовать «поддельную» полосу прокрутки для очистки и повторного заполнения резервного хранилища ListStore в зависимости от положения «поддельная» полоса прокрутки. Для правильной работы прокрутки, Мне нужно точно знать, сколько ячеек TreeView я могу разместить на экране .

Для начала я даже не могу понять, насколько велики заголовки TreeView. Я попробовал это, но, похоже, это не сработало (возможно, потому, что в его случае он вообще не использует никаких заголовков): Получить позицию элемента в пикселях или высоту ячейки в древовидном представлении

Кто-нибудь еще имел эту проблему?

1 Ответ

1 голос
/ 16 июня 2019

Я действительно нашел ответ во время написания вопроса, и я подумал, что я все равно опубликую его здесь.

Как правило, вам нужно установить режим фиксированной высоты, прежде чем вставлять столбцы . Затем вы можете вычислить ответ следующим образом:

// this is a hack to work around the fact that
// gtk_tree_view_get_effective_header_height() is a private function
// see: https://github.com/GNOME/gtk/blob/6033b6457b1cf6c9ce173f9b34d56431ab49256e/gtk/gtktreeview.c#L13954
private int get_header_height() {
  int h = 0;

  if (this.get_headers_visible())
    this.convert_bin_window_to_widget_coords(0, 0, null, out h);

  return h;
}

// according to the documentation, the sum of background areas covered by
// each node adds up to the area of the entire bin window
private int get_cell_height() {
  Gdk.Rectangle rect = new Gdk.Rectangle();
  this.get_background_area(new TreePath.first(), this.get_column(0), out rect);
  return rect.height;
}

public int get_visible_columns() {
  assert(this.get_realized());

  return (int)GLib.Math.ceil((double)(this.get_allocated_height() - this.get_header_height()) / (double)this.get_cell_height());
}

Я получал неправильные результаты, потому что не все мои строки были одинаковой высоты. Разница была слишком мала, чтобы сразу ее увидеть - я не заметил, пока не сделал скриншот своей программы и не открыл ее в GIMP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...