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