1 #include <dazzle.h>
2 
3 static GtkWidget *
create_child_func(gpointer item,gpointer user_data)4 create_child_func (gpointer item,
5                    gpointer user_data)
6 {
7   GFileInfo *file_info = G_FILE_INFO (item);
8   g_autofree gchar *display_name = NULL;
9   GObject *icon = NULL;
10   GtkListBoxRow *row;
11   GtkWidget *label;
12   GFile *parent = user_data;
13   GtkBox *box;
14   GtkImage *image;
15 
16   g_assert (!file_info || G_IS_FILE_INFO (file_info));
17   g_assert (!parent || G_IS_FILE (parent));
18 
19   if (file_info == NULL)
20     {
21       if (parent == NULL)
22         display_name = g_strdup ("Computer");
23       else
24         display_name = g_file_get_basename (parent);
25     }
26   else
27     {
28       display_name = g_strdup (g_file_info_get_display_name (file_info));
29       icon = g_file_info_get_attribute_object (file_info, G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON);
30     }
31 
32 
33   box = g_object_new (GTK_TYPE_BOX,
34                       "visible", TRUE,
35                       NULL);
36 
37   image = g_object_new (GTK_TYPE_IMAGE,
38                         "visible", TRUE,
39                         "gicon", icon,
40                         NULL);
41   gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (image));
42 
43   label = g_object_new (GTK_TYPE_LABEL,
44                         "label", display_name,
45                         "halign", GTK_ALIGN_START,
46                         "hexpand", TRUE,
47                         "visible", TRUE,
48                         NULL);
49   gtk_container_add (GTK_CONTAINER (box), label);
50 
51   row = g_object_new (GTK_TYPE_LIST_BOX_ROW,
52                       "visible", TRUE,
53                       "child", box,
54                       NULL);
55 
56   if (parent != NULL)
57     g_object_set_data_full (G_OBJECT (row), "FILE",
58                             g_file_get_child (parent, g_file_info_get_name (file_info)),
59                             g_object_unref);
60 
61   return GTK_WIDGET (row);
62 }
63 
64 static void
row_activated(DzlStackList * stack_list,GtkListBoxRow * row,gpointer user_data)65 row_activated (DzlStackList  *stack_list,
66                GtkListBoxRow *row,
67                gpointer       user_data)
68 {
69   GFile *file = G_FILE (g_object_get_data (G_OBJECT (row), "FILE"));
70   GFile *parent = g_file_get_parent (file);
71   g_autoptr(GListModel) model = dzl_directory_model_new (file);
72   g_autofree gchar *name = g_file_get_basename (file);
73   g_autoptr(GFileInfo) file_info = g_file_info_new ();
74 
75   g_file_info_set_name (file_info, name);
76   g_file_info_set_display_name (file_info, name);
77 
78   dzl_stack_list_push (stack_list,
79                        create_child_func (file_info, parent),
80                        model,
81                        create_child_func,
82                        g_object_ref (file),
83                        g_object_unref);
84 }
85 
86 static void
load_css(void)87 load_css (void)
88 {
89   g_autoptr(GtkCssProvider) provider = NULL;
90 
91   provider = dzl_css_provider_new ("resource:///org/gnome/dazzle/themes");
92   gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
93                                              GTK_STYLE_PROVIDER (provider),
94                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
95 }
96 
97 gint
main(gint argc,gchar * argv[])98 main (gint   argc,
99       gchar *argv[])
100 {
101   g_autoptr(GListModel) file_system_model = NULL;
102   g_autoptr(GFile) root = NULL;
103   DzlStackList *stack_list;
104   GtkWidget *window;
105   GtkWidget *header;
106 
107   gtk_init (&argc, &argv);
108 
109   load_css ();
110 
111   root = g_file_new_for_path ("/");
112   file_system_model = dzl_directory_model_new (root);
113 
114   window = g_object_new (GTK_TYPE_WINDOW,
115                          "default-width", 250,
116                          "default-height", 600,
117                          NULL);
118 
119   header = g_object_new (GTK_TYPE_HEADER_BAR,
120                          "title", "Stack List Test",
121                          "show-close-button", TRUE,
122                          "visible", TRUE,
123 			 NULL);
124   gtk_window_set_titlebar (GTK_WINDOW (window), header);
125 
126   stack_list = g_object_new (DZL_TYPE_STACK_LIST,
127                              "visible", TRUE,
128                              NULL);
129   gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (stack_list));
130 
131   dzl_stack_list_push (stack_list,
132                        create_child_func (NULL, root),
133                        file_system_model,
134                        create_child_func,
135                        g_steal_pointer (&root),
136                        g_object_unref);
137 
138   g_signal_connect (stack_list,
139                     "row-activated",
140                     G_CALLBACK (row_activated),
141                     NULL);
142 
143   g_signal_connect (window, "delete-event", gtk_main_quit, NULL);
144   gtk_window_present (GTK_WINDOW (window));
145 
146   gtk_main ();
147 
148   return 0;
149 }
150