打开文件

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

在这后面,我们为我们的应用程序的窗口子类增加了一个私有的结构体,结构体内是一个指向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