Как получить уведомление, когда выбрана строка древовидного списка (listtore)? - PullRequest
2 голосов
/ 25 августа 2011

Как я могу подключиться к сигналу Gtk.TreeView , чтобы получать уведомления о выборе строки?В настоящее время я подключаюсь к сигналу row_activation, но для этого требуется двойной щелчок по строке, и я хочу получать уведомление одним щелчком мыши.

Пример программы:

using Gtk;

public class MyListView : ScrolledWindow {
    ListStore list_store;
    TreeView tree_view;
    GLib.List<string> list;

    enum Columns {
        TEXT,
        N_COLUMNS
    }

    void make_list () {
        list = new GLib.List<string> ();
        list.append("Hello World");
        list.append("row 2");
        list.append("<b>bold</b>");
        list.append("<i>italic</i>");
        list.append("...");
        list.append("etc.");
    }

    public MyListView () {
        make_list();
        list_store = new ListStore(Columns.N_COLUMNS, typeof(string));
        tree_view = new TreeView.with_model(list_store);
        var text = new CellRendererText ();
        var column = new TreeViewColumn ();
        column.pack_start (text, true);
        column.add_attribute (text, "markup", Columns.TEXT);
        tree_view.append_column (column);
        tree_view.set_headers_visible (false);
        TreeIter iter;
        foreach (string item in list) {
            list_store.append(out iter);
            list_store.set(
                iter,
                Columns.TEXT, item
            );
        }
        this.add(tree_view);
        tree_view.row_activated.connect(change);
    }

    public void change (TreePath path, TreeViewColumn col) {
        var index = int.parse(path.to_string());
        var item = list.nth_data(index);
        print(index.to_string() + ". " + item + "\n");
    }
}

public static void main (string[] args) {

    Gtk.init(ref args);
    var win = new Window();
    win.add(new MyListView());
    win.show_all();
    win.destroy.connect(Gtk.main_quit);
    Gtk.main();

}

Эта программа работает точнокак я хочу, за исключением требования о двойном щелчке row_activation.

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Есть сигнал измененный TreeSelection (получите его, используя tree.get_selection()), который должен быть правильным путем по сравнению с cursor_changed.

0 голосов
/ 25 августа 2011

Чтобы получать уведомления одним щелчком мыши, подключитесь к сигналу cursor_changed .Это не предоставляет никаких переменных для функции обратного вызова, поэтому вам нужно определить отдельную функцию, которая получает индекс выбранного элемента:

Эта функция может использовать метод get_selection () объект TreeView для получения объекта TreeSelection.Установите режим выбора на одиночный выбор , используя метод set_mode .Затем вы можете получить TreeModel и TreeIter , используя параметры out метода get_selected .Вы должны проверить возвращаемое значение этой функции - true, если что-то выбрано, и false, если ничего не выбрано.Затем используйте метод get_path TreeModel, чтобы получить TreePath выбранного элемента.

Полный пример:

using Gtk;

public class MyListView : ScrolledWindow {
    ListStore list_store;
    TreeView tree_view;
    GLib.List<string> list;

    enum Columns {
        TEXT,
        N_COLUMNS
    }

    void make_list () {
        list = new GLib.List<string> ();
        list.append("Hello World");
        list.append("row 2");
        list.append("<b>bold</b>");
        list.append("<i>italic</i>");
        list.append("...");
        list.append("etc.");
    }

    public MyListView () {
        make_list();
        list_store = new ListStore(Columns.N_COLUMNS, typeof(string));
        tree_view = new TreeView.with_model(list_store);
        var text = new CellRendererText ();
        var column = new TreeViewColumn ();
        column.pack_start (text, true);
        column.add_attribute (text, "markup", Columns.TEXT);
        tree_view.append_column (column);
        tree_view.set_headers_visible (false);
        TreeIter iter;
        foreach (string item in list) {
            list_store.append(out iter);
            list_store.set(
                iter,
                Columns.TEXT, item
            );
        }
        this.add(tree_view);
        tree_view.cursor_changed.connect(change);
    }

    public int get_selected () {
        var selection = tree_view.get_selection();
        selection.set_mode(SelectionMode.SINGLE);
        TreeModel model;
        TreeIter iter;
        if (!selection.get_selected(out model, out iter)) {
            return -1;
        }
        TreePath path = model.get_path(iter);
        return int.parse(path.to_string());
    }

    public void change () {
        var index = this.get_selected();
        if (index >= 0) {
            var item = list.nth_data(index);
            print(index.to_string() + ". " + item + "\n");
        }
    }
}

public static void main (string[] args) {

    Gtk.init(ref args);
    var win = new Window();
    win.add(new MyListView());
    win.show_all();
    win.destroy.connect(Gtk.main_quit);
    Gtk.main();

}
...