Loads doodles from $HOME/doodle also
authordanigm <dani@danigm.net>
Tue, 27 Apr 2010 05:41:23 +0000 (05:41 +0000)
committerdanigm <danigm@aa302d1f-72b1-406a-902b-8593ca2b2744>
Tue, 27 Apr 2010 05:41:23 +0000 (05:41 +0000)
From: danigm <dani@danigm.net>

git-svn-id: https://forja.rediris.es/svn/cusl4-tbo@124 aa302d1f-72b1-406a-902b-8593ca2b2744

TODO
src/Makefile.am
src/doodle-treeview.c
src/svgimage.c
src/tbo-files.c [new file with mode: 0644]
src/tbo-files.h [new file with mode: 0644]

diff --git a/TODO b/TODO
index aa86212..6b92916 100644 (file)
--- a/TODO
+++ b/TODO
@@ -21,8 +21,6 @@ TBO TODO things:
     * more accesories
     * more doodle
 
- * Doodle libraries from ~/.tbo/doodle (middle)
-
 --
 note: Difficult is right each TODO and could be:
     * hard: Require much time and knowlegde of how all program works.
index 4ded119..ee41e0c 100644 (file)
@@ -34,6 +34,8 @@ tbo_SOURCES = \
        tbo-object.c \
        comic-load.c \
        tbo-utils.c \
+       tbo-files.c \
+       tbo-files.h \
        tbo-window.h \
        comic.h \
        comic-new-dialog.h \
index 46827af..4a556b6 100644 (file)
@@ -8,6 +8,7 @@
 #include "doodle-treeview.h"
 #include "dnd.h"
 #include "tbo-utils.h"
+#include "tbo-files.h"
 
 void free_gstring_array (GArray *arr);
 
@@ -64,17 +65,23 @@ GArray *
 get_files (gchar *base_dir, gboolean isdir)
 {
     GError *error = NULL;
-    GDir *dir = g_dir_open (base_dir, 0, &error);
     gchar complete_dir[255];
     const gchar *filename;
     struct stat filestat;
+    int st;
     GArray *array = g_array_new (FALSE, FALSE, sizeof(GString*));
 
+    st = stat (base_dir, &filestat);
+    if (st)
+        return NULL;
+
+    GDir *dir = g_dir_open (base_dir, 0, &error);
+
     while (filename = g_dir_read_name (dir))
     {
         size_t strsize = sizeof (char) * (strlen (base_dir) + strlen (filename) + 2);
         snprintf (complete_dir, strsize, "%s/%s", base_dir, filename);
-        stat (complete_dir, &filestat);
+        st = stat (complete_dir, &filestat);
 
         if (isdir && S_ISDIR (filestat.st_mode))
         {
@@ -142,7 +149,7 @@ doodle_add_images (gchar *dir)
                              N_TARGETS,
                              GDK_ACTION_COPY);
         g_signal_connect (ebox, "drag-data-get", G_CALLBACK (drag_data_get_handl),
-                                                mystr->str + strlen (DATA_DIR "/doodle/"));
+                                                mystr->str + tbo_files_prefix_len (mystr->str));
         g_signal_connect (ebox, "drag-begin", G_CALLBACK (drag_begin_handl), mystr->str);
         g_signal_connect (ebox, "drag-end", G_CALLBACK (drag_end_handl), mystr->str);
 
@@ -201,28 +208,37 @@ doodle_setup_tree (TboWindow *tbo)
 
     dirname = malloc (255*sizeof(char));
     char label_format[255];
+    int i, j, k;
 
     vbox = gtk_vbox_new (FALSE, 5);
 
-    GArray *arr = get_files (DATA_DIR "/doodle", TRUE);
-    int i, j;
+    GArray *arr = NULL;
     GString *mystr, *mystr2;
-    for (i=0; i<arr->len; i++)
-    {
-        mystr = g_array_index (arr, GString*, i);
 
-        vbox2 = gtk_vbox_new (FALSE, 5);
-        get_base_name (mystr->str, dirname, 255);
-        snprintf (label_format, 255, "<span underline=\"single\" size=\"large\" weight=\"ultrabold\">%s</span>", dirname);
-        expander = gtk_expander_new (label_format);
-        gtk_expander_set_use_markup (GTK_EXPANDER (expander), TRUE);
-        gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 5);
-        gtk_container_add (GTK_CONTAINER (expander), vbox2);
+    char **possible_dirs = tbo_files_get_dirs ();
+    for (k=0; possible_dirs[k]; k++)
+    {
+        arr = get_files (possible_dirs[k], TRUE);
+        if (!arr) continue;
 
-        mystr2 = g_string_new (mystr->str);
-        g_signal_connect (GTK_EXPANDER (expander), "activate", G_CALLBACK (on_expand_cb), mystr2);
+        for (i=0; i<arr->len; i++)
+        {
+            mystr = g_array_index (arr, GString*, i);
+
+            vbox2 = gtk_vbox_new (FALSE, 5);
+            get_base_name (mystr->str, dirname, 255);
+            snprintf (label_format, 255, "<span underline=\"single\" size=\"large\" weight=\"ultrabold\">%s</span>", dirname);
+            expander = gtk_expander_new (label_format);
+            gtk_expander_set_use_markup (GTK_EXPANDER (expander), TRUE);
+            gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 5);
+            gtk_container_add (GTK_CONTAINER (expander), vbox2);
+
+            mystr2 = g_string_new (mystr->str);
+            g_signal_connect (GTK_EXPANDER (expander), "activate", G_CALLBACK (on_expand_cb), mystr2);
+        }
+        free_gstring_array (arr);
     }
-    free_gstring_array (arr);
+    tbo_files_free (possible_dirs);
 
     free (dirname);
 
index 8fdb2a2..2dd4924 100644 (file)
@@ -8,8 +8,7 @@
 #include <librsvg/rsvg-cairo.h>
 #include "svgimage.h"
 #include "tbo-types.h"
-
-#define DOODLE_DIR DATA_DIR "/doodle/"
+#include "tbo-files.h"
 
 
 SVGImage *
@@ -62,7 +61,7 @@ tbo_svg_image_draw (SVGImage *self, Frame *frame, cairo_t *cr)
     RsvgHandle *rsvg_handle = NULL;
     RsvgDimensionData rsvg_dimension_data;
     char path[255];
-    snprintf (path, 255, DOODLE_DIR "%s", self->data);
+    tbo_files_expand_path (self->data, &path);
     rsvg_handle = rsvg_handle_new_from_file (path, &error);
     if (!rsvg_handle)
     {
diff --git a/src/tbo-files.c b/src/tbo-files.c
new file mode 100644 (file)
index 0000000..5dedfab
--- /dev/null
@@ -0,0 +1,68 @@
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "tbo-files.h"
+
+char **tbo_files_get_dirs ()
+{
+    // Possible doodle dirs
+    char **possible_dirs = malloc (3*sizeof(char*));
+    possible_dirs[0] = malloc (255*sizeof(char*));
+    possible_dirs[1] = malloc (255*sizeof(char*));
+    possible_dirs[2] = NULL;
+
+    strcat (strcpy (possible_dirs[0], getenv("HOME")), "/.tbo/doodle");
+    strcpy (possible_dirs[1], DATA_DIR "/doodle");
+
+    return possible_dirs;
+}
+
+int
+tbo_files_prefix_len (char *str)
+{
+    int n, i = 0;
+    char **possible_dirs = tbo_files_get_dirs ();
+    while (possible_dirs[i])
+    {
+        if (g_str_has_prefix (str, possible_dirs[i]))
+        {
+            n = strlen (possible_dirs[i]) + 1;
+            break;
+        }
+        i++;
+    }
+    tbo_files_free (possible_dirs);
+    return n;
+}
+
+void
+tbo_files_free (char **files)
+{
+    int i = 0;
+    while(files[i])
+    {
+        free (files[i]);
+        i++;
+    }
+    free (files);
+}
+
+void
+tbo_files_expand_path (char *source, char *dest)
+{
+    int st, i = 0;
+    char **possible_dirs = tbo_files_get_dirs ();
+    struct stat filestat;
+    while (possible_dirs[i])
+    {
+        snprintf (dest, 255, "%s/%s", possible_dirs[i], source);
+        st = stat (dest, &filestat);
+        if (!st)
+            break;
+
+        i++;
+    }
+
+    tbo_files_free (possible_dirs);
+}
diff --git a/src/tbo-files.h b/src/tbo-files.h
new file mode 100644 (file)
index 0000000..208e1d2
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __TBO_FILES__
+#define __TBO_FILES__
+
+char **tbo_files_get_dirs ();
+int tbo_files_prefix_len (char *str);
+void tbo_files_free (char **files);
+
+#endif