Gtk.Stack не изменит видимого потомка внутри функции обратного вызова события - PullRequest
0 голосов
/ 01 мая 2018

Итак, я сейчас работаю над приложением для элементарных ОС и столкнулся с проблемой. У меня есть окно, которое имеет вид Granite.Sourcelistview слева и стек, содержащий различные виды справа. Моя проблема заключается в том, что при нажатии кнопки на одном из экранов (экран настроек проекта, который я создал), стек должен изменить текущий вид на другой, но это не так. Текущий вид остается и не изменяется.

Это окно:

public class MainWindow : Gtk.Window {

private SourceListStackView srcl_view {get; set;}

construct {

    var header = new Gtk.HeaderBar ();
    header.show_close_button = true;

    //this is the source list view
    srcl_view = new SourceListStackView ();

    var paned = new Gtk.Paned (Gtk.Orientation.HORIZONTAL);
    paned.position = 130;
    paned.pack1 (srcl_view, false, false);
    paned.add2 (srcl_view.stack);

    add(paned);

    set_titlebar (header);
}

public static int main(string[] args) {
    Gtk.init (ref args);

    MainWindow app = new MainWindow ();
    app.show_all ();
    Gtk.main ();
    return 0;
}
}

Это класс sourcelistview, который я создал:

    public class SourceListStackView : Granite.Widgets.SourceList {

    public Gtk.Stack stack {get; set;}

public SourceListStackView () {
    var project_page = new ProjectSettings ();
    stack = new Gtk.Stack ();

    var project = new Granite.Widgets.SourceList.ExpandableItem("Root");

    this.root.add(project);

    stack.add_named(project_page, "hello");

    //here depending on what item of the sourcelist is created,
    //the view with the same name as the item 
    //should be displayed (not the best mechanism but works)

    this.item_selected.connect ((item) => {
        if(item != null){
            stack.visible_child_name = item.name;
        }  
    });

    //problematic part is here: This won't change the current view..why? 
    //The button should add another item to the
    // source list view and change the current view
    // to the newly created Welcome Screen but it doesn't do that..
    project_page.button.clicked.connect(() => {
        project.add(new Granite.Widgets.SourceList.Item ("Welcome"));
        stack.add_named(new Granite.Widgets.Welcome("bla bli blu", "bla"), "Welcome");
        stack.set_visible_child_name("Welcome"); 
    });

}
}

Это вид с кнопкой, которая должна вызвать изменение вида:

public class ProjectSettings : Granite.SimpleSettingsPage {
public Gtk.Button button {get; set;}
public ProjectSettings () {
    Object (
        activatable: false,
        description: "This is a screen",
        header: "",
        icon_name: "preferences-system",
        title: "Screen"
    );
}

construct {
    var project_name_label = new Gtk.Label ("Name");
    project_name_label.xalign = 1;

    var project_name_entry = new Gtk.Entry ();
    project_name_entry.hexpand = true;
    project_name_entry.placeholder_text = "Peter";

    content_area.attach (project_name_label, 0, 0, 1, 1);
    content_area.attach (project_name_entry, 1, 0, 1, 1);

    button = new Gtk.Button.with_label ("Save Settings");

    action_area.add (button);
}
}

Вот часть, которая не работает:

//problematic part is here: This won't change the current view.. why?
project_page.button.clicked.connect(() => {
    project.add(new Granite.Widgets.SourceList.Item ("Welcome"));
    stack.add_named(new Granite.Widgets.Welcome("bla bli blu", "bla"), "Welcome");
    stack.set_visible_child_name("Welcome");
});

Я не знаю, почему это не изменит вид. Я специально говорю ему, чтобы установить видимый дочерний элемент «Добро пожаловать» (и именно так я назвал его на одну строку выше), но он просто не появится. Может кто-нибудь объяснить мне, почему? Я легко могу изменить видимого потомка стека вне сигнала / события, но внутри него не получится ...

Большое спасибо

Обновление: проблема была решена с помощью комментария Жозе Фонте, приведенного ниже: Я создал экземпляр представления, вызвал для него метод show_all () , а затем добавил его в стек и установил для него видимого потомка.

...