6 #include "ui-drawing.h"
8 #include "doodle-treeview.h"
10 #include "tbo-utils.h"
11 #include "tbo-files.h"
13 void free_gstring_array (GArray *arr);
15 static GArray *TO_FREE = NULL;
16 static TboWindow *TBO = NULL;
23 for (i=0; i<TO_FREE->len; i++)
25 free_gstring_array (g_array_index (TO_FREE, GArray*, i));
27 g_array_free (TO_FREE, TRUE);
31 void doodle_add_to_free (GArray *arr)
34 TO_FREE = g_array_new (FALSE, FALSE, sizeof(GArray*));
36 g_array_append_val (TO_FREE, arr);
40 on_doodle_click_cb (GtkWidget *widget,
41 GdkEventButton *event,
44 Frame *frame = get_frame_view ();
45 SVGImage *svgimage = tbo_svgimage_new_with_params (0, 0, 0, 0, (char*)data);
47 tbo_frame_add_obj (frame, svgimage);
51 free_gstring_array (GArray *arr)
56 for (i=0; i<arr->len; i++)
58 mystr = g_array_index (arr, GString*, i);
59 g_string_free (mystr, TRUE);
61 g_array_free (arr, TRUE);
65 get_files (gchar *base_dir, gboolean isdir)
68 gchar complete_dir[255];
69 const gchar *filename;
72 GArray *array = g_array_new (FALSE, FALSE, sizeof(GString*));
74 st = stat (base_dir, &filestat);
78 GDir *dir = g_dir_open (base_dir, 0, &error);
80 while (filename = g_dir_read_name (dir))
82 size_t strsize = sizeof (char) * (strlen (base_dir) + strlen (filename) + 2);
83 snprintf (complete_dir, strsize, "%s/%s", base_dir, filename);
84 st = stat (complete_dir, &filestat);
86 if (isdir && S_ISDIR (filestat.st_mode))
88 GString *dirname_to_append = g_string_new (complete_dir);
89 g_array_append_val (array, dirname_to_append);
91 else if (!isdir && !S_ISDIR (filestat.st_mode))
93 GString *filename_to_append = g_string_new (complete_dir);
94 g_array_append_val (array, filename_to_append);
104 doodle_add_images (gchar *dir)
118 GArray *arr = get_files (dirname, FALSE);
120 r = (arr->len / c) + 1;
121 table = gtk_table_new (r, c, TRUE);
124 for (i=0; i<arr->len; i++)
129 mystr = g_array_index (arr, GString*, i);
130 image = gtk_image_new_from_file (mystr->str);
131 pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (image));
133 h = gdk_pixbuf_get_height (pixbuf) * 50 / (float)gdk_pixbuf_get_width (pixbuf);
134 pixbuf = gdk_pixbuf_scale_simple (pixbuf, w, h, GDK_INTERP_BILINEAR);
136 gtk_widget_destroy (GTK_WIDGET (image));
137 image = gtk_image_new_from_pixbuf (pixbuf);
138 ebox = gtk_event_box_new ();
139 gtk_widget_add_events (ebox, GDK_BUTTON_PRESS_MASK |
140 GDK_BUTTON_RELEASE_MASK |
141 GDK_POINTER_MOTION_MASK);
143 //g_signal_connect (ebox, "button_press_event", G_CALLBACK (on_doodle_click_cb), mystr->str);
146 gtk_drag_source_set (ebox,
151 g_signal_connect (ebox, "drag-data-get", G_CALLBACK (drag_data_get_handl),
152 mystr->str + tbo_files_prefix_len (mystr->str));
153 g_signal_connect (ebox, "drag-begin", G_CALLBACK (drag_begin_handl), mystr->str);
154 g_signal_connect (ebox, "drag-end", G_CALLBACK (drag_end_handl), mystr->str);
156 gtk_container_add (GTK_CONTAINER (ebox), image);
157 gtk_table_attach_defaults (GTK_TABLE (table), ebox, left, left + 1, top, top + 1);
160 doodle_add_to_free (arr);
162 gtk_widget_show_all (GTK_WIDGET (table));
167 doodle_add_dir_images (gchar *dir, GtkWidget *box)
170 get_base_name (dir, base_name, 255);
171 GtkWidget *expander = gtk_expander_new (base_name);
172 GtkWidget *table = doodle_add_images (dir);
173 gtk_container_add (GTK_CONTAINER (expander), table);
174 gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE);
175 gtk_container_add (GTK_CONTAINER (box), expander);
179 on_expand_cb (GtkExpander *expander, GString *str)
183 GtkWidget *vbox = g_list_first (gtk_container_get_children (GTK_CONTAINER (expander)))->data;
184 int numofchilds = g_list_length (gtk_container_get_children (GTK_CONTAINER (vbox)));
185 if (numofchilds == 0)
187 GArray *subdir = get_files (str->str, TRUE);
188 for (i=0; i<subdir->len; i++)
190 mystr2 = g_array_index (subdir, GString*, i);
191 doodle_add_dir_images (mystr2->str, vbox);
193 free_gstring_array (subdir);
194 g_string_free (str, TRUE);
196 gtk_widget_show_all (GTK_WIDGET (vbox));
200 doodle_setup_tree (TboWindow *tbo)
209 dirname = malloc (255*sizeof(char));
210 char label_format[255];
213 vbox = gtk_vbox_new (FALSE, 5);
216 GString *mystr, *mystr2;
218 char **possible_dirs = tbo_files_get_dirs ();
219 for (k=0; possible_dirs[k]; k++)
221 arr = get_files (possible_dirs[k], TRUE);
224 for (i=0; i<arr->len; i++)
226 mystr = g_array_index (arr, GString*, i);
228 vbox2 = gtk_vbox_new (FALSE, 5);
229 get_base_name (mystr->str, dirname, 255);
230 snprintf (label_format, 255, "<span underline=\"single\" size=\"large\" weight=\"ultrabold\">%s</span>", dirname);
231 expander = gtk_expander_new (label_format);
232 gtk_expander_set_use_markup (GTK_EXPANDER (expander), TRUE);
233 gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 5);
234 gtk_container_add (GTK_CONTAINER (expander), vbox2);
236 mystr2 = g_string_new (mystr->str);
237 g_signal_connect (GTK_EXPANDER (expander), "activate", G_CALLBACK (on_expand_cb), mystr2);
239 free_gstring_array (arr);
241 tbo_files_free (possible_dirs);