• 打开文件

    打开文件

    在这节,我们使我们的应用程序展示命令行传来的文件的正文。

    在这后面,我们为我们的应用程序的窗口子类增加了一个私有的结构体,结构体内是一个指向GtkStack的指针。gtk_widget_class_bind_template_child_private()函数使得在实例化模板后,私有结构体中的stack成员会指向模板中的同名部件。

    1. ...
    2. struct _ExampleAppWindowPrivate
    3. {
    4. GtkWidget *stack;
    5. };
    6. G_DEFINE_TYPE_WITH_PRIVATE(ExampleAppWindow, example_app_window, GTK_TYPE_APPLICATION_WINDOW);
    7. ...
    8. static void
    9. example_app_window_class_init (ExampleAppWindowClass *class)
    10. {
    11. gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
    12. "/org/gtk/exampleapp/window.ui");
    13. gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (class), ExampleAppWindow, stack);
    14. }
    15. ...

    (full source)

    现在我们重新看一下在每个命令行参数中都会被调用的example_app_window_open()函数,然后构建GtkTextView,它在后来的stack中作为一页被添加。

    1. ...
    2. void
    3. example_app_window_open (ExampleAppWindow *win,
    4. GFile *file)
    5. {
    6. ExampleAppWindowPrivate *priv;
    7. gchar *basename;
    8. GtkWidget *scrolled, *view;
    9. gchar *contents;
    10. gsize length;
    11. priv = example_app_window_get_instance_private (win);
    12. basename = g_file_get_basename (file);
    13. scrolled = gtk_scrolled_window_new (NULL, NULL);
    14. gtk_widget_show (scrolled);
    15. gtk_widget_set_hexpand (scrolled, TRUE);
    16. gtk_widget_set_vexpand (scrolled, TRUE);
    17. view = gtk_text_view_new ();
    18. gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
    19. gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
    20. gtk_widget_show (view);
    21. gtk_container_add (GTK_CONTAINER (scrolled), view);
    22. gtk_stack_add_titled (GTK_STACK (priv->stack), scrolled, basename, basename);
    23. if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL))
    24. {
    25. GtkTextBuffer *buffer;
    26. buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
    27. gtk_text_buffer_set_text (buffer, contents, length);
    28. g_free (contents);
    29. }
    30. g_free (basename);
    31. }
    32. ...

    (full source)

    注意我们不一定非要接触stack switcher。它从它属于的stack得到了自己所有的信息。在这里,我们传递gtk_stack_add_titled()函数的最后一个参数来显示每个文件的标签。

    我们的程序打开后就像这样:

    getting-started-app3.png