GJS / GTK Почему я не могу заменить модель дерева просмотра gtk (столбцы)? - PullRequest
1 голос
/ 16 марта 2019

Я начинаю с пустой таблицы (хранилище списков с одним столбцом)

beginning state with empty table

Я хочу, чтобы пользователи могли импортировать файл CSV ипоказать содержимое.Импорт файла работает, и данные CSV действительно отображаются, но исходный столбец (с именем «Нет данных») остается.Как мне избавиться от этого?

Table with retained

Я попытался удалить элемент дерева и даже контейнеры (но когда я это сделаю, я смогу 'чтобы они снова отображались ...

Я видел в документации gtk, что замена treeView.set_model (listStore) должна полностью заменить существующую модель и столбцы, но, похоже, это не так ...

что я сейчас делаю, это:

this._listStore = new Gtk.ListStore();

let coltypes = [GObject.TYPE_STRING];
this._listStore.set_column_types(coltypes);

// Create the treeview
this._treeView = new Gtk.TreeView({
  expand: true
});

this._treeView.set_model(this._listStore);
// Create a cell renderer for when bold text is needed
let bold = new Gtk.CellRendererText({
  weight: Pango.Weight.BOLD
});

// Create a cell renderer for normal text
let normal = new Gtk.CellRendererText();

// Create the columns for the address book
let defCol = new Gtk.TreeViewColumn({
  title: "No Data"
});

// Pack the cell renderers into the columns
defCol.pack_start(bold, true);

// Set each column to pull text from the TreeView's model
defCol.add_attribute(bold, "text", 0);

// Insert the columns into the treeview
this._treeView.insert_column(defCol, 0);

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

this._listStore = new Gtk.ListStore();
// this._treeView.add(this._listStore);

let coltypes = [];
this.data.headers.forEach((h) => {

  coltypes.push(GObject.TYPE_STRING);

});

print(coltypes);
this._listStore.set_column_types(coltypes);

// Replace the treeview

this._treeView.set_model(this._listStore);
/*
this._treeView = new Gtk.TreeView ({
    expand: true,
    model: this._listStore });
   */
// Create cell renderers
let normal = new Gtk.CellRendererText();
let bold = new Gtk.CellRendererText({
  weight: Pango.Weight.BOLD
});

// Create the columns for the address book

for (k = 0; k < this.data.headers.length; k++) {
  print('***key is : ' + k + ', val is : ' + this.data.headers[k] + ' of type : ' + typeof(this.data.headers[k]));

  // let col=k;
  this[`col_${k}`] = new Gtk.TreeViewColumn({
    title: this.data.headers[k]
  });
  this[`col_${k}`].pack_start(normal, true);
  if (k == 0) {
    this[`col_${k}`].add_attribute(normal, "text", k);
  } else {
    this[`col_${k}`].add_attribute(normal, "text", k);
  }
  try {
    this._treeView.insert_column(this[`col_${k}`], k);
  } catch (err) {
    print(err);
  }

}

// Put the data in the table
let i;
for (i = 0; i < this.data.csva.length; i++) {

  let row = this.data.csva[i];
  print('trying to push : ' + row[0].toString());
  print('... the data is of type : ' + typeof(row[1]));
  let iter = this._listStore.append();

  // this._listStore.set (iter, [0, 1, 2],
  // [contact[0].toString(), contact[1].toString(), contact[2].toString()]);

  this._listStore.set(iter, Object.keys(this.data.headers), row);

}

Почему этот начальный столбец все еще там? Как мне от него избавиться?

Заранее спасибо за любую помощь или указатели.

1 Ответ

0 голосов
/ 17 марта 2019

Что вам нужно, это Gtk.TreeView.remove_column () . В Python это будет:

for column in this._treeView.get_columns():
    this._treeView.remove_column(column)

Конечно, вы должны делать это каждый раз, когда вам нужно удалить все столбцы в древовидной структуре перед добавлением столбцов из CSV.

...