tbo-drawing, tbo-toolbar and tbo-tools as gobject gobject
authordanigm <dani@danigm.net>
Thu, 19 Aug 2010 14:03:28 +0000 (16:03 +0200)
committerdanigm <dani@danigm.net>
Thu, 19 Aug 2010 14:03:28 +0000 (16:03 +0200)
 * Simpler tbo-tool system using gobject inheritance.
 * tbo-drawing as gtklayout

43 files changed:
po/POTFILES.in
src/Makefile.am
src/comic-load.c
src/comic-open-dialog.c
src/comic.c
src/dnd.c
src/doodle-tool.c [deleted file]
src/doodle-tool.h [deleted file]
src/doodle-treeview.c
src/export.c
src/frame-tool.c [deleted file]
src/frame-tool.h [deleted file]
src/selector-tool.c [deleted file]
src/selector-tool.h [deleted file]
src/tbo-drawing.c [new file with mode: 0644]
src/tbo-drawing.h [new file with mode: 0644]
src/tbo-object-base.c
src/tbo-object-base.h
src/tbo-tool-base.c [new file with mode: 0644]
src/tbo-tool-base.h [new file with mode: 0644]
src/tbo-tool-bubble.c [new file with mode: 0644]
src/tbo-tool-bubble.h [new file with mode: 0644]
src/tbo-tool-doodle.c [new file with mode: 0644]
src/tbo-tool-doodle.h [new file with mode: 0644]
src/tbo-tool-frame.c [new file with mode: 0644]
src/tbo-tool-frame.h [new file with mode: 0644]
src/tbo-tool-selector.c [new file with mode: 0644]
src/tbo-tool-selector.h [new file with mode: 0644]
src/tbo-tool-text.c [new file with mode: 0644]
src/tbo-tool-text.h [new file with mode: 0644]
src/tbo-toolbar.c [new file with mode: 0644]
src/tbo-toolbar.h [new file with mode: 0644]
src/tbo-tooltip.c
src/tbo-types.h
src/tbo-window.c
src/tbo-window.h
src/text-tool.c [deleted file]
src/text-tool.h [deleted file]
src/ui-drawing.c [deleted file]
src/ui-drawing.h [deleted file]
src/ui-menu.c
src/ui-toolbar.c [deleted file]
src/ui-toolbar.h [deleted file]

index b029a0d..a796f0e 100644 (file)
@@ -6,24 +6,30 @@ src/comic-open-dialog.c
 src/comic-saveas-dialog.c
 src/custom-stock.c
 src/dnd.c
-src/doodle-tool.c
 src/doodle-treeview.c
 src/export.c
 src/frame.c
-src/frame-tool.c
 src/page.c
-src/selector-tool.c
-src/svgimage.c
-src/piximage.c
 src/tbo.c
-src/tbo-object.c
+src/tbo-drawing.c
+src/tbo-files.c
+src/tbo-object-base.c
+src/tbo-object-pixmap.c
+src/tbo-object-svg.c
+src/tbo-object-text.c
+src/tbo-toolbar.c
+src/tbo-tool-base.c
+src/tbo-tool-bubble.c
+src/tbo-tool-doodle.c
+src/tbo-tool-frame.c
+src/tbo-tool-selector.c
+src/tbo-tool-text.c
+src/tbo-tooltip.c
+src/tbo-ui-utils.c
 src/tbo-utils.c
 src/tbo-window.c
-src/textobj.c
-src/text-tool.c
-src/ui-drawing.c
+src/typestest.c
 src/ui-menu.c
-src/ui-toolbar.c
 src/comic.h
 src/comic-load.h
 src/comic-new-dialog.h
@@ -31,20 +37,26 @@ src/comic-open-dialog.h
 src/comic-saveas-dialog.h
 src/custom-stock.h
 src/dnd.h
-src/doodle-tool.h
 src/doodle-treeview.h
 src/export.h
 src/frame.h
-src/frame-tool.h
 src/page.h
-src/selector-tool.h
-src/piximage.h
-src/tbo-object.h
+src/tbo-drawing.h
+src/tbo-files.h
+src/tbo-object-base.h
+src/tbo-object-pixmap.h
+src/tbo-object-svg.h
+src/tbo-object-text.h
+src/tbo-toolbar.h
+src/tbo-tool-base.h
+src/tbo-tool-bubble.h
+src/tbo-tool-doodle.h
+src/tbo-tool-frame.h
+src/tbo-tool-selector.h
+src/tbo-tool-text.h
+src/tbo-tooltip.h
 src/tbo-types.h
+src/tbo-ui-utils.h
 src/tbo-utils.h
 src/tbo-window.h
-src/textobj.h
-src/text-tool.h
-src/ui-drawing.h
 src/ui-menu.h
-src/ui-toolbar.h
index 6cda7ae..e004c7c 100644 (file)
@@ -15,16 +15,10 @@ SOURCES = \
        comic-open-dialog.c \
        frame.c \
        page.c \
-       ui-drawing.c \
        ui-menu.c \
-       ui-toolbar.c \
-       frame-tool.c \
-       selector-tool.c \
-       doodle-tool.c \
        custom-stock.c \
        doodle-treeview.c \
        tbo-tooltip.c \
-       text-tool.c \
        export.c \
        dnd.c \
        comic-load.c \
@@ -40,14 +34,8 @@ SOURCES = \
        frame.h \
        page.h \
        tbo-types.h \
-       ui-drawing.h \
        ui-menu.h \
-       ui-toolbar.h \
-       frame-tool.h \
-       selector-tool.h \
-       doodle-tool.h \
        doodle-treeview.h \
-       text-tool.h \
        tbo-tooltip.h \
        dnd.h \
        comic-load.h \
@@ -62,6 +50,22 @@ SOURCES = \
        tbo-object-text.c \
        tbo-object-pixmap.h \
        tbo-object-pixmap.c \
+       tbo-tool-base.h \
+       tbo-tool-base.c \
+       tbo-tool-selector.h \
+       tbo-tool-selector.c \
+       tbo-tool-frame.h \
+       tbo-tool-frame.c \
+       tbo-tool-doodle.h \
+       tbo-tool-doodle.c \
+       tbo-tool-bubble.h \
+       tbo-tool-bubble.c \
+       tbo-tool-text.h \
+       tbo-tool-text.c \
+       tbo-toolbar.h \
+       tbo-toolbar.c \
+       tbo-drawing.h \
+       tbo-drawing.c \
        custom-stock.h
 
 AM_CFLAGS = @GTK_CFLAGS@ \
index 07a1432..057e251 100644 (file)
@@ -210,11 +210,10 @@ create_tbo_text (const gchar **attribute_names, const gchar **attribute_values)
         {"b", "%f", &b},
     };
 
+    parse_attrs (attrs, G_N_ELEMENTS (attrs), attribute_names, attribute_values);
     color.red = (int)(r * COLORMAX);
     color.green = (int)(g * COLORMAX);
     color.blue = (int)(b * COLORMAX);
-
-    parse_attrs (attrs, G_N_ELEMENTS (attrs), attribute_names, attribute_values);
     textobj = TBO_OBJECT_TEXT (tbo_object_text_new_with_params (x, y, width, height, "text", font, &color));
     obj = TBO_OBJECT_BASE (textobj);
     obj->angle = angle;
@@ -241,8 +240,7 @@ start_element (GMarkupParseContext *context,
     }
     else if (strcmp (element_name, "page") == 0)
     {
-        CURRENT_PAGE = tbo_page_new (COMIC);
-        COMIC->pages = g_list_append (COMIC->pages, CURRENT_PAGE);
+        CURRENT_PAGE = tbo_comic_new_page (COMIC);
     }
     else if (strcmp (element_name, "frame") == 0)
     {
@@ -336,5 +334,6 @@ tbo_comic_load (char *filename)
 
     g_free(text);
     g_markup_parse_context_free (context);
+
     return COMIC;
 }
index f626689..f5a778b 100644 (file)
@@ -21,7 +21,7 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include "comic-open-dialog.h"
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "tbo-window.h"
 #include "comic.h"
 
@@ -59,7 +59,7 @@ tbo_comic_open_dialog (GtkWidget *widget, TboWindow *window)
         filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
         tbo_comic_open (window, filename);
         tbo_window_set_path (window, filename);
-        update_drawing (window);
+        tbo_drawing_update (TBO_DRAWING (window->drawing));
         tbo_window_update_status (window, 0, 0);
     }
 
index dda3738..4ded367 100644 (file)
@@ -65,7 +65,7 @@ tbo_comic_new_page (Comic *comic){
     Page *page;
 
     page = tbo_page_new (comic);
-    comic->pages = g_list_append (comic->pages, page);
+    comic->pages = g_list_append (g_list_first (comic->pages), page);
 
     return page;
 }
@@ -222,12 +222,12 @@ tbo_comic_open (TboWindow *window, char *filename)
         window->comic = newcomic;
         gtk_window_set_title (GTK_WINDOW (window->window), window->comic->title);
 
-        for (nth=gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)); nth>0; nth--)
+        for (nth=gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)); nth>=0; nth--)
         {
             gtk_notebook_remove_page (GTK_NOTEBOOK (window->notebook), nth);
         }
 
-        for (nth=1; nth<tbo_comic_len (window->comic); nth++)
+        for (nth=0; nth<tbo_comic_len (window->comic); nth++)
         {
             gtk_notebook_insert_page (GTK_NOTEBOOK (window->notebook),
                                       create_darea (window),
@@ -235,4 +235,6 @@ tbo_comic_open (TboWindow *window, char *filename)
                                       nth);
         }
     }
+    tbo_toolbar_set_selected_tool (window->toolbar, TBO_TOOLBAR_NONE);
+    tbo_toolbar_set_selected_tool (window->toolbar, TBO_TOOLBAR_SELECTOR);
 }
index ab035c7..1d556c3 100644 (file)
--- a/src/dnd.c
+++ b/src/dnd.c
@@ -20,7 +20,7 @@
 #include <string.h>
 #include <gtk/gtk.h>
 #include "dnd.h"
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "frame.h"
 #include "tbo-object-svg.h"
 #include "tbo-window.h"
@@ -37,7 +37,7 @@ drag_data_received_handl (GtkWidget *widget,
                           TboWindow *tbo)
 {
     GtkAdjustment *adj;
-    float zoom = tbo_drawing_get_zoom ();
+    float zoom = tbo_drawing_get_zoom (TBO_DRAWING (tbo->drawing));
     glong   *_idata;
     gchar   *_sdata;
 
@@ -63,14 +63,14 @@ drag_data_received_handl (GtkWidget *widget,
             case TARGET_STRING:
                 _sdata = (gchar*)selection_data->data;
 
-                Frame *frame = get_frame_view ();
+                Frame *frame = tbo_drawing_get_current_frame (TBO_DRAWING (tbo->drawing));
                 adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->dw_scroll));
                 int rx = tbo_frame_get_base_x ((x + gtk_adjustment_get_value(adj)) / zoom);
                 adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->dw_scroll));
                 int ry = tbo_frame_get_base_y ((y + gtk_adjustment_get_value(adj)) / zoom);
 
                 TboObjectSvg *svgimage = TBO_OBJECT_SVG (tbo_object_svg_new_with_params (rx, ry, 0, 0, _sdata));
-                update_drawing (tbo);
+                tbo_drawing_update (TBO_DRAWING (tbo->drawing));
                 tbo_frame_add_obj (frame, TBO_OBJECT_BASE (svgimage));
 
                 dnd_success = TRUE;
diff --git a/src/doodle-tool.c b/src/doodle-tool.c
deleted file mode 100644 (file)
index 48e36fd..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <cairo.h>
-#include "selector-tool.h"
-#include "tbo-window.h"
-#include "page.h"
-#include "frame.h"
-#include "comic.h"
-#include "ui-drawing.h"
-#include "doodle-treeview.h"
-#include "doodle-tool.h"
-
-static gboolean BUBBLE_MODE = FALSE;
-static GtkWidget *BUBBLE_TREE = NULL;
-static GtkWidget *DOODLE_TREE = NULL;
-static GtkWidget *TREE = NULL;
-static gdouble HADJUSTD, HADJUSTB = 0;
-static gdouble VADJUSTD, VADJUSTB = 0;
-
-void
-doodle_tool_bubble_on_select (TboWindow *tbo)
-{
-    BUBBLE_MODE = TRUE;
-    TREE = BUBBLE_TREE;
-    doodle_tool_on_select (tbo);
-}
-
-void
-doodle_tool_bubble_on_unselect (TboWindow *tbo)
-{
-    doodle_tool_on_unselect (tbo);
-    BUBBLE_MODE = FALSE;
-    BUBBLE_TREE = TREE;
-}
-
-gboolean
-update_scroll_cb (gpointer p)
-{
-    GtkAdjustment *adjust;
-    gdouble hadjust, vadjust;
-    TboWindow *tbo = (TboWindow *)p;
-    if (BUBBLE_MODE)
-    {
-        hadjust = HADJUSTB;
-        vadjust = VADJUSTB;
-    }
-    else
-    {
-        hadjust = HADJUSTD;
-        vadjust = VADJUSTD;
-    }
-    adjust = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
-    gtk_adjustment_set_value (adjust, hadjust);
-    adjust = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
-    gtk_adjustment_set_value (adjust, vadjust);
-    return FALSE;
-}
-
-void
-doodle_tool_on_select (TboWindow *tbo)
-{
-    if (!BUBBLE_MODE)
-        TREE = DOODLE_TREE;
-    if (!TREE)
-    {
-        TREE = doodle_setup_tree (tbo, BUBBLE_MODE);
-        gtk_widget_show_all (TREE);
-        TREE = g_object_ref (TREE);
-    }
-
-    tbo_empty_tool_area (tbo);
-    gtk_container_add (GTK_CONTAINER (tbo->toolarea), TREE);
-
-
-    g_timeout_add (5, update_scroll_cb, tbo);
-}
-
-void
-doodle_tool_on_unselect (TboWindow *tbo)
-{
-    GtkAdjustment *adjust;
-    gdouble hadjust, vadjust;
-    if (GTK_IS_WIDGET (TREE) && TREE->parent == GTK_WIDGET (tbo->toolarea))
-    {
-        adjust = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
-        hadjust = gtk_adjustment_get_value (adjust);
-        adjust = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
-        vadjust = gtk_adjustment_get_value (adjust);
-
-        if (!BUBBLE_MODE)
-        {
-            DOODLE_TREE = TREE;
-            HADJUSTD = hadjust;
-            VADJUSTD = vadjust;
-        }
-        else
-        {
-            HADJUSTB = hadjust;
-            VADJUSTB = vadjust;
-        }
-
-        gtk_container_remove (GTK_CONTAINER (tbo->toolarea), TREE);
-    }
-
-    tbo_empty_tool_area (tbo);
-}
-
-void doodle_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo){}
-void doodle_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo){}
-void doodle_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo){}
-void doodle_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo){}
-void doodle_tool_drawing (cairo_t *cr){}
diff --git a/src/doodle-tool.h b/src/doodle-tool.h
deleted file mode 100644 (file)
index ef7264d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __TBO_DOODLE_TOOL__
-#define __TBO_DOODLE_TOOL__
-
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "tbo-window.h"
-
-void doodle_tool_on_select (TboWindow *tbo);
-void doodle_tool_on_unselect (TboWindow *tbo);
-void doodle_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void doodle_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void doodle_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void doodle_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void doodle_tool_drawing (cairo_t *cr);
-
-void doodle_tool_bubble_on_select (TboWindow *tbo);
-void doodle_tool_bubble_on_unselect (TboWindow *tbo);
-
-#endif
index 892a09c..1b3e5fc 100644 (file)
@@ -22,7 +22,7 @@
 #include <sys/stat.h>
 #include <gtk/gtk.h>
 #include "tbo-object-svg.h"
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "frame.h"
 #include "doodle-treeview.h"
 #include "dnd.h"
@@ -60,10 +60,10 @@ on_doodle_click_cb (GtkWidget      *widget,
                     GdkEventButton *event,
                     gpointer       *data)
 {
-    Frame *frame = get_frame_view ();
-    TboObjectSvg *svgimage = tbo_object_svg_new_with_params (0, 0, 0, 0, (char*)data);
+    Frame *frame = tbo_drawing_get_current_frame (TBO_DRAWING (TBO->drawing));
+    TboObjectSvg *svgimage = TBO_OBJECT_SVG (tbo_object_svg_new_with_params (0, 0, 0, 0, (gchar*)data));
     tbo_frame_add_obj (frame, TBO_OBJECT_BASE (svgimage));
-    update_drawing (TBO);
+    tbo_drawing_update (TBO_DRAWING (TBO->drawing));
 }
 
 void
index f0b155a..efe9549 100644 (file)
@@ -25,7 +25,7 @@
 #include <string.h>
 
 #include "export.h"
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "tbo-ui-utils.h"
 #include "tbo-types.h"
 
@@ -244,7 +244,7 @@ tbo_export (TboWindow *tbo)
             cairo_scale (cr, scale, scale);
 
             // drawing the stuff
-            tbo_drawing_draw_page (cr, (Page *)page_list->data, width/scale, height/scale);
+            tbo_drawing_draw_page (TBO_DRAWING (tbo->drawing), cr, (Page *)page_list->data, width/scale, height/scale);
 
             if (strcmp (export_to, "pdf") == 0)
                 cairo_show_page (cr);
diff --git a/src/frame-tool.c b/src/frame-tool.c
deleted file mode 100644 (file)
index 2e404ed..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <math.h>
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "frame-tool.h"
-#include "tbo-window.h"
-#include "frame.h"
-
-static int N_FRAME_X = -1;
-static int N_FRAME_Y = -1;
-Frame *TMP_FRAME = NULL;
-
-int
-min (int x, int y)
-{
-    if (x < y)
-        return x;
-    else
-        return y;
-}
-
-void
-frame_tool_on_select (TboWindow *tbo)
-{}
-
-void
-frame_tool_on_unselect (TboWindow *tbo)
-{}
-
-void
-frame_tool_on_move (GtkWidget *widget,
-        GdkEventMotion *event,
-        TboWindow *tbo)
-{
-    int x, y;
-
-    if (N_FRAME_X >= 0)
-    {
-        if (TMP_FRAME == NULL)
-        {
-            TMP_FRAME = tbo_frame_new (
-                    N_FRAME_X,
-                    N_FRAME_Y,
-                    (int)fabs ((int)event->x - N_FRAME_X),
-                    (int)fabs ((int)event->y - N_FRAME_Y));
-        }
-        else
-        {
-            x = (int)event->x;
-            y = (int)event->y;
-            TMP_FRAME->width = (int)fabs (x - N_FRAME_X);
-            TMP_FRAME->height = (int)fabs (y - N_FRAME_Y);
-            TMP_FRAME->x = min (N_FRAME_X, x);
-            TMP_FRAME->y = min (N_FRAME_Y, y);
-        }
-    }
-    update_drawing (tbo);
-}
-
-void
-frame_tool_on_click (GtkWidget *widget,
-        GdkEventButton *event,
-        TboWindow *tbo)
-{
-    N_FRAME_X = (int)event->x;
-    N_FRAME_Y = (int)event->y;
-}
-
-void
-frame_tool_on_release (GtkWidget *widget,
-        GdkEventButton *event,
-        TboWindow *tbo)
-{
-    int w, h;
-
-    w = (int)fabs (event->x - N_FRAME_X);
-    h = (int)fabs (event->y - N_FRAME_Y);
-
-    if (w != 0 && h != 0)
-    {
-        tbo_page_new_frame (tbo_comic_get_current_page (tbo->comic),
-                min (N_FRAME_X, event->x), min (N_FRAME_Y, event->y),
-                w, h);
-    }
-
-    N_FRAME_X = -1;
-    N_FRAME_Y = -1;
-    if (TMP_FRAME) tbo_frame_free (TMP_FRAME);
-    TMP_FRAME = NULL;
-}
-
-void
-frame_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
-{}
-
-Frame *
-get_tmp_frame (){
-    return TMP_FRAME;
-}
-
-void
-frame_tool_drawing (cairo_t *cr)
-{
-    if (TMP_FRAME != NULL)
-    {
-        tbo_frame_draw_complete (TMP_FRAME, cr, 
-                1, 1, 1,
-                1, 0, 0,
-                2);
-    }
-}
-
diff --git a/src/frame-tool.h b/src/frame-tool.h
deleted file mode 100644 (file)
index b4f6ff9..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __TBO_FRAME_TOOL__
-#define __TBO_FRAME_TOOL__
-
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "tbo-window.h"
-#include "frame.h"
-
-void frame_tool_on_select (TboWindow *tbo);
-void frame_tool_on_unselect (TboWindow *tbo);
-void frame_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void frame_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void frame_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void frame_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void frame_tool_drawing (cairo_t *cr);
-Frame * get_tmp_frame ();
-
-#endif
diff --git a/src/selector-tool.c b/src/selector-tool.c
deleted file mode 100644 (file)
index 04ae32a..0000000
+++ /dev/null
@@ -1,796 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <cairo.h>
-#include <math.h>
-#include "selector-tool.h"
-#include "tbo-window.h"
-#include "tbo-types.h"
-#include "tbo-object-base.h"
-#include "page.h"
-#include "frame.h"
-#include "comic.h"
-#include "ui-drawing.h"
-#include "tbo-tooltip.h"
-#include "tbo-ui-utils.h"
-
-#define R_SIZE 10
-
-static Frame *SELECTED = NULL;
-static TboObjectBase *OBJ = NULL;
-static int START_X=0, START_Y=0;
-static int START_M_X=0, START_M_Y=0;
-static int START_M_W=0, START_M_H=0;
-static int X=0, Y=0;
-gboolean CLICKED = FALSE;
-gboolean OVER_RESIZER = FALSE;
-gboolean OVER_ROTATER = FALSE;
-gboolean RESIZING = FALSE;
-gboolean ROTATING = FALSE;
-GtkWidget *SPIN_W = NULL;
-GtkWidget *SPIN_H = NULL;
-GtkWidget *SPIN_X = NULL;
-GtkWidget *SPIN_Y = NULL;
-
-
-gboolean
-update_selected_cb (GtkSpinButton *widget, TboWindow *tbo)
-{
-    if (RESIZING || CLICKED || SELECTED == NULL || SPIN_X == NULL)
-        return FALSE;
-
-    SELECTED->x = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (SPIN_X));
-    SELECTED->y = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (SPIN_Y));
-    SELECTED->width = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (SPIN_W));
-    SELECTED->height = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (SPIN_H));
-
-    update_drawing (tbo);
-    return FALSE;
-}
-
-gboolean
-update_color_cb (GtkColorButton *button, TboWindow *tbo)
-{
-    if (RESIZING || CLICKED || SELECTED == NULL)
-        return FALSE;
-
-    GdkColor color = {0,0,0};
-    gtk_color_button_get_color (button, &color);
-    tbo_frame_set_color (SELECTED, &color);
-    update_drawing (tbo);
-    return FALSE;
-}
-
-gboolean
-update_border_cb (GtkToggleButton *button, TboWindow *tbo)
-{
-    if (RESIZING || CLICKED || SELECTED == NULL)
-        return FALSE;
-
-    SELECTED->border = !SELECTED->border;
-    update_drawing (tbo);
-    return FALSE;
-}
-
-void
-empty_tool_area (TboWindow *tbo)
-{
-    tbo_empty_tool_area (tbo);
-    SPIN_X = NULL;
-    SPIN_Y = NULL;
-    SPIN_H = NULL;
-    SPIN_W = NULL;
-}
-
-void
-update_tool_area (TboWindow *tbo)
-{
-    GtkWidget *toolarea = tbo->toolarea;
-    GtkWidget *hpanel;
-    GtkWidget *label;
-    GtkWidget *color;
-    GtkWidget *border;
-    GdkColor gdk_color = {0, 0, 0};
-
-    if (!SPIN_X)
-    {
-        empty_tool_area (tbo);
-        SPIN_X = add_spin_with_label (toolarea, "x: ", SELECTED->x);
-        SPIN_Y = add_spin_with_label (toolarea, "y: ", SELECTED->y);
-        SPIN_W = add_spin_with_label (toolarea, "w: ", SELECTED->width);
-        SPIN_H = add_spin_with_label (toolarea, "h: ", SELECTED->height);
-
-        g_signal_connect (SPIN_X, "value-changed", G_CALLBACK (update_selected_cb), tbo);
-        g_signal_connect (SPIN_Y, "value-changed", G_CALLBACK (update_selected_cb), tbo);
-        g_signal_connect (SPIN_W, "value-changed", G_CALLBACK (update_selected_cb), tbo);
-        g_signal_connect (SPIN_H, "value-changed", G_CALLBACK (update_selected_cb), tbo);
-
-        hpanel = gtk_hbox_new (FALSE, 0);
-        label = gtk_label_new (_("Background color: "));
-        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
-        color = gtk_color_button_new ();
-        gdk_color.red = SELECTED->color->r * 65535;
-        gdk_color.green = SELECTED->color->g * 65535;
-        gdk_color.blue = SELECTED->color->b * 65535;
-        gtk_color_button_set_color (GTK_COLOR_BUTTON (color), &gdk_color);
-
-        gtk_box_pack_start (GTK_BOX (hpanel), label, TRUE, TRUE, 5);
-        gtk_box_pack_start (GTK_BOX (hpanel), color, TRUE, TRUE, 5);
-        gtk_box_pack_start (GTK_BOX (toolarea), hpanel, FALSE, FALSE, 5);
-        g_signal_connect (color, "color-set", G_CALLBACK (update_color_cb), tbo);
-
-        border = gtk_check_button_new_with_label (_("border"));
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (border), SELECTED->border);
-        gtk_box_pack_start (GTK_BOX (toolarea), border, FALSE, FALSE, 5);
-        g_signal_connect (border, "toggled", G_CALLBACK (update_border_cb), tbo);
-
-        gtk_widget_show_all (toolarea);
-    }
-
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (SPIN_X), SELECTED->x);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (SPIN_Y), SELECTED->y);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (SPIN_W), SELECTED->width);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (SPIN_H), SELECTED->height);
-}
-
-void
-set_selected (Frame *frame, TboWindow *tbo)
-{
-    SELECTED = frame;
-    empty_tool_area (tbo);
-    if (SELECTED != NULL)
-        update_tool_area (tbo);
-    update_menubar (tbo);
-}
-
-void
-set_selected_obj (TboObjectBase *obj, TboWindow *tbo)
-{
-    OBJ = obj;
-    update_menubar (tbo);
-}
-
-gboolean
-over_resizer (Frame *frame, int x, int y)
-{
-    int rx, ry;
-    rx = frame->x + frame->width;
-    ry = frame->y + frame->height;
-
-    float r_size;
-    r_size = R_SIZE / tbo_drawing_get_zoom ();
-
-    if (((rx-r_size) < x) &&
-        ((rx+r_size) > x) &&
-        ((ry-r_size) < y) &&
-        ((ry+r_size) > y))
-    {
-        return TRUE;
-    }
-    else
-    {
-        return FALSE;
-    }
-}
-
-gboolean
-over_resizer_obj (TboObjectBase *obj, int x, int y)
-{
-    int rx, ry;
-    int ox, oy, ow, oh;
-    tbo_frame_get_obj_relative (OBJ, &ox, &oy, &ow, &oh);
-    rx = ox + (ow * cos(obj->angle) - oh * sin(obj->angle));
-    ry = oy + (oh * cos(obj->angle) + ow * sin(obj->angle));
-
-    float r_size;
-    r_size = R_SIZE / tbo_drawing_get_zoom ();
-
-    if (((rx-r_size) < x) &&
-        ((rx+r_size) > x) &&
-        ((ry-r_size) < y) &&
-        ((ry+r_size) > y))
-    {
-        return TRUE;
-    }
-    else
-    {
-        return FALSE;
-    }
-}
-
-gboolean
-over_rotater_obj (TboObjectBase *obj, int x, int y)
-{
-    int rx, ry;
-    int ox, oy, ow, oh;
-    tbo_frame_get_obj_relative (OBJ, &ox, &oy, &ow, &oh);
-    rx = ox;
-    ry = oy;
-
-    float r_size;
-    r_size = R_SIZE / tbo_drawing_get_zoom ();
-
-    if (((rx-r_size/2.0) < x) &&
-        ((rx+r_size/2.0) > x) &&
-        ((ry-r_size/2.0) < y) &&
-        ((ry+r_size/2.0) > y))
-    {
-        return TRUE;
-    }
-    else
-    {
-        return FALSE;
-    }
-}
-
-void
-selector_tool_on_select (TboWindow *tbo)
-{}
-
-void
-selector_tool_on_unselect (TboWindow *tbo)
-{}
-
-void
-selector_tool_on_move (GtkWidget *widget,
-        GdkEventMotion *event,
-        TboWindow *tbo)
-{
-    if (get_frame_view ())
-        frame_view_on_move (widget, event, tbo);
-    else
-        page_view_on_move (widget, event, tbo);
-
-    update_drawing (tbo);
-}
-
-void
-frame_view_on_move (GtkWidget *widget,
-        GdkEventMotion *event,
-        TboWindow *tbo)
-{
-    int x, y, offset_x, offset_y;
-
-    x = (int)event->x;
-    y = (int)event->y;
-
-    X = x;
-    Y = y;
-
-    if (OBJ != NULL)
-    {
-        if (CLICKED)
-        {
-            offset_x = (START_X - x) / tbo_frame_get_scale_factor ();
-            offset_y = (START_Y - y) / tbo_frame_get_scale_factor ();
-
-            // resizing object
-            if (RESIZING)
-            {
-                OBJ->width = abs (START_M_W - offset_x);
-                OBJ->height = abs (START_M_H - offset_y);
-            }
-            else if (ROTATING)
-            {
-                OBJ->angle = atan2 (offset_y, offset_x);
-            }
-            // moving object
-            else
-            {
-                OBJ->x = START_M_X - offset_x;
-                OBJ->y = START_M_Y - offset_y;
-            }
-        }
-
-        // over resizer
-        if (over_resizer_obj (OBJ, x, y))
-        {
-            OVER_RESIZER = TRUE;
-        }
-        else
-        {
-            OVER_RESIZER = FALSE;
-        }
-        // over rotater
-        if (over_rotater_obj (OBJ, x, y))
-        {
-            OVER_ROTATER = TRUE;
-        }
-        else
-        {
-            OVER_ROTATER = FALSE;
-        }
-    }
-}
-
-void
-frame_view_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
-{
-    int x, y;
-    GList *obj_list;
-    Frame *frame;
-    TboObjectBase *obj;
-    gboolean found = FALSE;
-
-    x = (int)event->x;
-    y = (int)event->y;
-
-    // resizing
-    if (OBJ && over_resizer_obj (OBJ, x, y))
-    {
-        RESIZING = TRUE;
-    }
-    else if (OBJ && over_rotater_obj (OBJ, x, y))
-    {
-        ROTATING = TRUE;
-    }
-    else
-    {
-        frame = get_frame_view ();
-        for (obj_list = g_list_first (frame->objects); obj_list; obj_list = obj_list->next)
-        {
-            obj = (TboObjectBase *)obj_list->data;
-            if (tbo_frame_point_inside_obj (obj, x, y))
-            {
-                // Selecting last occurrence.
-                set_selected_obj (obj, tbo);
-                found = TRUE;
-            }
-        }
-        if (!found)
-            set_selected_obj (NULL, tbo);
-    }
-
-    START_X = x;
-    START_Y = y;
-
-    if (OBJ != NULL)
-    {
-        START_M_X = OBJ->x;
-        START_M_Y = OBJ->y;
-        START_M_W = OBJ->width;
-        START_M_H = OBJ->height;
-    }
-    CLICKED = TRUE;
-}
-
-void
-frame_view_drawing (cairo_t *cr)
-{
-    const double dashes[] = {5, 5};
-    Color border = {0.9, 0.9, 0};
-    Color white = {1, 1, 1};
-    Color black = {0, 0, 0};
-    Color *resizer_border;
-    Color *resizer_fill;
-    Color *rotater_border;
-    Color *rotater_fill;
-    int x, y;
-    float r_size;
-
-    if (OBJ != NULL)
-    {
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-        cairo_set_line_width (cr, 1);
-        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
-        cairo_set_source_rgb (cr, border.r, border.g, border.b);
-        int ox, oy, ow, oh;
-        tbo_frame_get_obj_relative (OBJ, &ox, &oy, &ow, &oh);
-
-        cairo_translate (cr, ox, oy);
-        cairo_rotate (cr, OBJ->angle);
-        cairo_rectangle (cr, 0, 0, ow, oh);
-        cairo_stroke (cr);
-
-        // resizer
-        if (OVER_RESIZER)
-        {
-            resizer_fill = &black;
-            resizer_border = &white;
-        }
-        else
-        {
-            resizer_fill = &white;
-            resizer_border = &black;
-        }
-
-        // rotater
-        if (OVER_ROTATER)
-        {
-            rotater_fill = &black;
-            rotater_border = &white;
-        }
-        else
-        {
-            rotater_fill = &white;
-            rotater_border = &black;
-        }
-
-        cairo_set_line_width (cr, 1);
-        cairo_set_dash (cr, dashes, 0, 0);
-
-        x = ow;
-        y = oh;
-
-        r_size = R_SIZE / tbo_drawing_get_zoom ();
-        cairo_set_line_width (cr, 1/tbo_drawing_get_zoom ());
-
-        cairo_rectangle (cr, x, y, r_size, r_size);
-        cairo_set_source_rgb(cr, resizer_fill->r, resizer_fill->g, resizer_fill->b);
-        cairo_fill (cr);
-
-        cairo_set_source_rgb(cr, resizer_border->r, resizer_border->g, resizer_border->b);
-        cairo_rectangle (cr, x, y, r_size, r_size);
-        cairo_stroke (cr);
-
-        // object rotate zone
-        cairo_set_source_rgb(cr, rotater_fill->r, rotater_fill->g, rotater_fill->b);
-        cairo_arc (cr, 0, 0, r_size / 2., 0, 2 * M_PI);
-        cairo_fill (cr);
-        cairo_set_source_rgb(cr, rotater_border->r, rotater_border->g, rotater_border->b);
-        cairo_arc (cr, 0, 0, r_size / 2., 0, 2 * M_PI);
-        cairo_stroke (cr);
-        cairo_set_line_width (cr, tbo_drawing_get_zoom ());
-
-        cairo_rotate (cr, -OBJ->angle);
-        cairo_translate (cr, -ox, -oy);
-
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
-
-        if (ROTATING)
-        {
-            cairo_set_source_rgb(cr, 1, 0, 0);
-            cairo_move_to (cr, ox, oy);
-            cairo_line_to (cr, X, Y);
-            cairo_stroke (cr);
-        }
-    }
-}
-
-void
-frame_view_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
-{
-    if (SELECTED != NULL && event->keyval == GDK_Escape)
-    {
-        set_frame_view (NULL);
-    }
-
-    if (OBJ != NULL)
-    {
-        switch (event->keyval)
-        {
-            case GDK_Delete:
-                tbo_frame_del_obj (SELECTED, OBJ);
-                set_selected_obj (NULL, tbo);
-                break;
-            case GDK_v:
-                tbo_object_base_flipv (OBJ);
-                break;
-            case GDK_h:
-                tbo_object_base_fliph (OBJ);
-                break;
-            case GDK_Page_Up:
-                tbo_object_base_order_up (OBJ);
-                break;
-            case GDK_Page_Down:
-                tbo_object_base_order_down (OBJ);
-                break;
-            case GDK_Up:
-                tbo_object_base_move (OBJ, MOVE_UP);
-                break;
-            case GDK_less:
-                tbo_object_base_resize (OBJ, RESIZE_LESS);
-                break;
-            case GDK_greater:
-                tbo_object_base_resize (OBJ, RESIZE_GREATER);
-                break;
-            case GDK_Down:
-                tbo_object_base_move (OBJ, MOVE_DOWN);
-                break;
-            case GDK_Left:
-                tbo_object_base_move (OBJ, MOVE_LEFT);
-                break;
-            case GDK_Right:
-                tbo_object_base_move (OBJ, MOVE_RIGHT);
-                break;
-            case GDK_d:
-                if (event->state & GDK_CONTROL_MASK)
-                {
-                    TboObjectBase *cloned_obj = OBJ->clone (OBJ);
-                    cloned_obj->x += 10;
-                    cloned_obj->y -= 10;
-                    tbo_frame_add_obj (SELECTED, cloned_obj);
-                    set_selected_obj (cloned_obj, tbo);
-                }
-                break;
-            default:
-                break;
-        }
-    }
-    update_drawing (tbo);
-}
-
-void
-page_view_on_move (GtkWidget *widget,
-        GdkEventMotion *event,
-        TboWindow *tbo)
-{
-    int x, y, offset_x, offset_y;
-
-    x = (int)event->x;
-    y = (int)event->y;
-
-    if (SELECTED != NULL)
-    {
-        if (CLICKED)
-        {
-            offset_x = (START_X - x);
-            offset_y = (START_Y - y);
-
-            // resizing frame
-            if (RESIZING)
-            {
-                SELECTED->width = abs (START_M_W - offset_x);
-                SELECTED->height = abs (START_M_H - offset_y);
-
-                update_tool_area (tbo);
-            }
-            // moving frame
-            else
-            {
-                SELECTED->x = START_M_X - offset_x;
-                SELECTED->y = START_M_Y - offset_y;
-
-                update_tool_area (tbo);
-            }
-        }
-
-        // over resizer
-        if (over_resizer (SELECTED, x, y))
-        {
-            OVER_RESIZER = TRUE;
-        }
-        else
-        {
-            OVER_RESIZER = FALSE;
-        }
-    }
-
-    GList *frame_list;
-    Frame *frame;
-    Page *page = tbo_comic_get_current_page (tbo->comic);
-    gboolean found = FALSE;
-    int x1, y1;
-
-    for (frame_list = tbo_page_get_frames (page); frame_list && !found; frame_list = frame_list->next)
-    {
-        if (tbo_frame_point_inside ((Frame*)frame_list->data, x, y))
-        {
-            frame = (Frame*)frame_list->data;
-            x1 = frame->x + (frame->width / 2);
-            y1 = frame->y + (frame->height / 2);
-            tbo_tooltip_set (_("double click here"), x1, y1, tbo);
-            found = TRUE;
-        }
-    }
-    if (!found)
-        tbo_tooltip_set(NULL, 0, 0, tbo);
-}
-
-void
-page_view_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
-{
-    int x, y;
-    GList *frame_list;
-    Page *page;
-    Frame *frame;
-    gboolean found = FALSE;
-
-    x = (int)event->x;
-    y = (int)event->y;
-
-
-    page = tbo_comic_get_current_page (tbo->comic);
-    for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
-    {
-        frame = (Frame *)frame_list->data;
-        if (tbo_frame_point_inside (frame, x, y))
-        {
-            // Selecting last occurrence.
-            set_selected (frame, tbo);
-            found = TRUE;
-        }
-    }
-
-    // resizing
-    if (SELECTED && over_resizer (SELECTED, x, y))
-    {
-        RESIZING = TRUE;
-    }
-    else if (!found)
-        set_selected (NULL, tbo);
-
-    // double click, frame view
-    if (SELECTED && event->type == GDK_2BUTTON_PRESS)
-    {
-        set_frame_view (SELECTED);
-        empty_tool_area (tbo);
-        tbo_tooltip_set (NULL, 0, 0, tbo);
-        // TODO add tooltip_notify
-        tbo_tooltip_set_center_timeout (_("press esc to go back"), 3000, tbo);
-    }
-
-    START_X = x;
-    START_Y = y;
-
-    if (SELECTED != NULL)
-    {
-        START_M_X = SELECTED->x;
-        START_M_Y = SELECTED->y;
-        START_M_W = SELECTED->width;
-        START_M_H = SELECTED->height;
-        tbo_page_set_current_frame (page, SELECTED);
-    }
-    CLICKED = TRUE;
-}
-
-void
-page_view_drawing (cairo_t *cr)
-{
-    const double dashes[] = {5, 5};
-    Color border = {0.9, 0.9, 0};
-    Color white = {1, 1, 1};
-    Color black = {0, 0, 0};
-    Color *resizer_border;
-    Color *resizer_fill;
-    int x, y;
-    float r_size;
-
-    if (SELECTED != NULL)
-    {
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-        cairo_set_line_width (cr, 1);
-        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
-        cairo_set_source_rgb (cr, border.r, border.g, border.b);
-        cairo_rectangle (cr, SELECTED->x, SELECTED->y,
-                SELECTED->width, SELECTED->height);
-        cairo_stroke (cr);
-
-        // resizer
-        if (OVER_RESIZER)
-        {
-            resizer_fill = &black;
-            resizer_border = &white;
-        }
-        else
-        {
-            resizer_fill = &white;
-            resizer_border = &black;
-        }
-
-        cairo_set_line_width (cr, 1);
-        cairo_set_dash (cr, dashes, 0, 0);
-
-        x = SELECTED->x + SELECTED->width;
-        y = SELECTED->y + SELECTED->height;
-
-        r_size = R_SIZE / tbo_drawing_get_zoom ();
-        cairo_set_line_width (cr, 1 / tbo_drawing_get_zoom ());
-        cairo_rectangle (cr, x, y, r_size, r_size);
-        cairo_set_source_rgb(cr, resizer_fill->r, resizer_fill->g, resizer_fill->b);
-        cairo_fill (cr);
-
-        cairo_set_source_rgb(cr, resizer_border->r, resizer_border->g, resizer_border->b);
-        cairo_rectangle (cr, x, y, r_size, r_size);
-        cairo_stroke (cr);
-        cairo_set_line_width (cr, tbo_drawing_get_zoom ());
-
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
-
-    }
-}
-
-void
-page_view_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
-{
-    Page *page;
-
-    page = tbo_comic_get_current_page (tbo->comic);
-
-    if (SELECTED != NULL && event->keyval == GDK_Delete)
-    {
-        tbo_page_del_frame (page, SELECTED);
-        set_selected (NULL, tbo);
-    }
-
-    switch (event->keyval)
-    {
-        case GDK_d:
-            if ((event->state & GDK_CONTROL_MASK) && SELECTED)
-            {
-                Frame *cloned_frame = tbo_frame_clone (SELECTED);
-                cloned_frame->x += 10;
-                cloned_frame->y -= 10;
-                tbo_page_add_frame (page, cloned_frame);
-                set_selected (cloned_frame, tbo);
-            }
-            break;
-        default:
-            break;
-    }
-}
-
-void
-selector_tool_on_click (GtkWidget *widget,
-        GdkEventButton *event,
-        TboWindow *tbo)
-{
-    if (get_frame_view ())
-        frame_view_on_click (widget, event, tbo);
-    else
-        page_view_on_click (widget, event, tbo);
-
-    update_drawing (tbo);
-}
-
-void
-selector_tool_on_release (GtkWidget *widget,
-        GdkEventButton *event,
-        TboWindow *tbo)
-{
-    START_X = 0;
-    START_Y = 0;
-    CLICKED = FALSE;
-    RESIZING = FALSE;
-    ROTATING = FALSE;
-}
-
-void
-selector_tool_drawing (cairo_t *cr)
-{
-    if (get_frame_view ())
-        frame_view_drawing (cr);
-    else
-        page_view_drawing (cr);
-}
-
-void
-selector_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
-{
-    if (get_frame_view ())
-        frame_view_on_key (widget, event, tbo);
-    else
-        page_view_on_key (widget, event, tbo);
-}
-
-Frame *
-selector_tool_get_selected_frame ()
-{
-    return SELECTED;
-}
-
-
-TboObjectBase *
-selector_tool_get_selected_obj ()
-{
-    return OBJ;
-}
diff --git a/src/selector-tool.h b/src/selector-tool.h
deleted file mode 100644 (file)
index faf2f4e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __TBO_SELECTOR_TOOL__
-#define __TBO_SELECTOR_TOOL__
-
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "tbo-window.h"
-#include "tbo-object-base.h"
-
-void selector_tool_on_select (TboWindow *tbo);
-void selector_tool_on_unselect (TboWindow *tbo);
-void selector_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void selector_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void selector_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void selector_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void selector_tool_drawing (cairo_t *cr);
-
-Frame *selector_tool_get_selected_frame ();
-TboObjectBase *selector_tool_get_selected_obj ();
-void frame_view_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void page_view_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void frame_view_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void page_view_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void frame_view_drawing (cairo_t *cr);
-void page_view_drawing (cairo_t *cr);
-void frame_view_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void page_view_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-
-#endif
diff --git a/src/tbo-drawing.c b/src/tbo-drawing.c
new file mode 100644 (file)
index 0000000..1e9bb8f
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <glib.h>
+#include <cairo.h>
+#include <stdio.h>
+#include <math.h>
+#include "tbo-types.h"
+#include "tbo-drawing.h"
+#include "dnd.h"
+#include "comic.h"
+#include "frame.h"
+#include "page.h"
+#include "tbo-tool-bubble.h"
+#include "tbo-tool-doodle.h"
+
+G_DEFINE_TYPE (TboDrawing, tbo_drawing, GTK_TYPE_LAYOUT);
+
+/* private methods */
+static gboolean
+expose_event (GtkWidget *widget, GdkEventExpose *event)
+{
+    cairo_t *cr;
+    GdkWindow *window;
+    gint w, h;
+    TboDrawing *self = TBO_DRAWING (widget);
+
+    cr = gdk_cairo_create(GTK_LAYOUT (widget)->bin_window);
+    gdk_drawable_get_size (GDK_DRAWABLE (GTK_LAYOUT (widget)->bin_window), &w, &h);
+
+    cairo_set_source_rgb (cr, 0, 0, 0);
+    cairo_rectangle (cr, 0, 0, w, h);
+    cairo_fill (cr);
+
+    tbo_drawing_draw (TBO_DRAWING (widget), cr);
+
+    tbo_tooltip_draw (cr);
+
+    // Update drawing helpers
+    if (self->tool)
+        self->tool->drawing (self->tool, cr);
+
+    cairo_destroy(cr);
+
+    return FALSE;
+}
+
+static gboolean
+motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
+{
+    TboDrawing *self = TBO_DRAWING (widget);
+    event->x = event->x / self->zoom;
+    event->y = event->y / self->zoom;
+
+    if (self->tool)
+        self->tool->on_move (self->tool, widget, event);
+
+    return FALSE;
+}
+
+static gboolean
+button_press_event (GtkWidget *widget, GdkEventButton *event)
+{
+    TboDrawing *self = TBO_DRAWING (widget);
+    event->x = event->x / self->zoom;
+    event->y = event->y / self->zoom;
+
+    if (self->tool) {
+        if (TBO_IS_TOOL_BUBBLE (self->tool) || TBO_IS_TOOL_DOODLE (self->tool))
+        {
+            tbo_toolbar_set_selected_tool (self->tool->tbo->toolbar, TBO_TOOLBAR_SELECTOR);
+        }
+        self->tool->on_click (self->tool, widget, event);
+    }
+
+    return FALSE;
+}
+
+static gboolean
+button_release_event (GtkWidget *widget, GdkEventButton *event)
+{
+    TboDrawing *self = TBO_DRAWING (widget);
+    event->x = event->x / self->zoom;
+    event->y = event->y / self->zoom;
+
+    if (self->tool)
+        self->tool->on_release (self->tool, widget, event);
+
+    return FALSE;
+}
+
+/* init methods */
+
+static void
+tbo_drawing_init (TboDrawing *self)
+{
+    self->current_frame = NULL;
+    self->zoom = 1;
+    self->comic = NULL;
+    self->tool = NULL;
+}
+
+static void
+tbo_drawing_realize (GtkWidget *widget)
+{
+    GdkWindow *bin_window;
+
+    if (GTK_WIDGET_CLASS (tbo_drawing_parent_class)->realize)
+            (* GTK_WIDGET_CLASS (tbo_drawing_parent_class)->realize) (widget);
+
+    bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (widget));
+    gdk_window_set_events (bin_window,
+                           (gdk_window_get_events (bin_window) |
+                            GDK_BUTTON_PRESS_MASK |
+                            GDK_BUTTON_RELEASE_MASK |
+                            GDK_POINTER_MOTION_MASK));
+}
+
+static void
+tbo_drawing_finalize (GObject *self)
+{
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (tbo_drawing_parent_class)->finalize (self);
+}
+
+static void
+tbo_drawing_class_init (TboDrawingClass *klass)
+{
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+    widget_class->expose_event = expose_event;
+    widget_class->motion_notify_event = motion_notify_event;
+    widget_class->button_press_event = button_press_event;
+    widget_class->button_release_event = button_release_event;
+    widget_class->realize = tbo_drawing_realize;
+    gobject_class->finalize = tbo_drawing_finalize;
+}
+
+/* object functions */
+
+GtkWidget *
+tbo_drawing_new ()
+{
+    GtkWidget *drawing;
+    drawing = g_object_new (TBO_TYPE_DRAWING, NULL);
+    return drawing;
+}
+
+GtkWidget *
+tbo_drawing_new_with_params (Comic *comic)
+{
+    GtkWidget *drawing = tbo_drawing_new ();
+    TBO_DRAWING (drawing)->comic = comic;
+    gtk_layout_set_size (GTK_LAYOUT (drawing), comic->width+2, comic->height+2);
+
+    return drawing;
+}
+
+void
+tbo_drawing_update (TboDrawing *self)
+{
+    gtk_widget_queue_draw_area (GTK_WIDGET (self),
+            0, 0,
+            GTK_WIDGET (self)->allocation.width,
+            GTK_WIDGET (self)->allocation.height);
+}
+
+void
+tbo_drawing_set_current_frame (TboDrawing *self, Frame *frame)
+{
+    self->current_frame = frame;
+}
+
+Frame *
+tbo_drawing_get_current_frame (TboDrawing *self)
+{
+    return self->current_frame;
+}
+
+void
+tbo_drawing_draw (TboDrawing *self, cairo_t *cr)
+{
+    Frame *frame;
+    GList *frame_list;
+    Page *page;
+
+    int w, h;
+
+    w = self->comic->width;
+    h = self->comic->height;
+    // white background
+    if (tbo_drawing_get_current_frame (self))
+        cairo_set_source_rgb(cr, 0, 0, 0);
+    else
+        cairo_set_source_rgb(cr, 1, 1, 1);
+    cairo_rectangle(cr, 0, 0, w*self->zoom, h*self->zoom);
+    cairo_fill(cr);
+
+    cairo_scale (cr, self->zoom, self->zoom);
+
+    page = tbo_comic_get_current_page (self->comic);
+
+    if (!self->current_frame)
+    {
+        for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
+        {
+            // draw each frame
+            frame = (Frame *)frame_list->data;
+            tbo_frame_draw (frame, cr);
+        }
+    }
+    else
+    {
+        tbo_frame_draw_scaled (self->current_frame, cr, w, h);
+    }
+}
+
+/* TODO this method should be in TboPage */
+void
+tbo_drawing_draw_page (TboDrawing *self, cairo_t *cr, Page *page, gint w, gint h)
+{
+    Frame *frame;
+    GList *frame_list;
+
+    // white background
+    cairo_set_source_rgb(cr, 1, 1, 1);
+    cairo_rectangle(cr, 0, 0, w, h);
+    cairo_fill(cr);
+
+    for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
+    {
+        // draw each frame
+        frame = (Frame *)frame_list->data;
+        tbo_frame_draw (frame, cr);
+    }
+}
+
+void
+tbo_drawing_zoom_in (TboDrawing *self)
+{
+    self->zoom += ZOOM_STEP;
+    tbo_drawing_adjust_scroll (self);
+}
+
+void
+tbo_drawing_zoom_out (TboDrawing *self)
+{
+    self->zoom -= ZOOM_STEP;
+    tbo_drawing_adjust_scroll (self);
+}
+
+void
+tbo_drawing_zoom_100 (TboDrawing *self)
+{
+    self->zoom = 1;
+    tbo_drawing_adjust_scroll (self);
+}
+
+void
+tbo_drawing_zoom_fit (TboDrawing *self)
+{
+    float z1, z2;
+    int w, h;
+    w = GTK_WIDGET (self)->allocation.width;
+    h = GTK_WIDGET (self)->allocation.height;
+
+    z1 = fabs ((float)w / (float)self->comic->width);
+    z2 = fabs ((float)h / (float)self->comic->height);
+    self->zoom = z1 < z2 ? z1 : z2;
+    tbo_drawing_adjust_scroll (self);
+}
+
+gdouble
+tbo_drawing_get_zoom (TboDrawing *self)
+{
+    return self->zoom;
+}
+
+void
+tbo_drawing_adjust_scroll (TboDrawing *self)
+{
+    if (!self->comic)
+        return;
+    gtk_layout_set_size (GTK_LAYOUT (self), self->comic->width*self->zoom, self->comic->height*self->zoom);
+    tbo_drawing_update (self);
+}
+
+void
+tbo_drawing_init_dnd (TboDrawing *self, TboWindow *tbo)
+{
+    gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_ALL, TARGET_LIST, N_TARGETS, GDK_ACTION_COPY);
+    g_signal_connect (self, "drag-data-received", G_CALLBACK(drag_data_received_handl), tbo);
+}
diff --git a/src/tbo-drawing.h b/src/tbo-drawing.h
new file mode 100644 (file)
index 0000000..47a029d
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_DRAWING_H__
+#define __TBO_DRAWING_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <cairo.h>
+#include "tbo-types.h"
+#include "tbo-tool-base.h"
+
+#define TBO_TYPE_DRAWING            (tbo_drawing_get_type ())
+#define TBO_DRAWING(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_DRAWING, TboDrawing))
+#define TBO_IS_DRAWING(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_DRAWING))
+#define TBO_DRAWING_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_DRAWING, TboDrawingClass))
+#define TBO_IS_DRAWING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_DRAWING))
+#define TBO_DRAWING_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_DRAWING, TboDrawingClass))
+
+#define ZOOM_STEP 0.05
+
+typedef struct _TboDrawing      TboDrawing;
+typedef struct _TboDrawingClass TboDrawingClass;
+
+struct _TboDrawing
+{
+    GtkLayout parent_instance;
+
+    /* instance members */
+    TboToolBase *tool;
+    Frame *current_frame;
+    gdouble zoom;
+    Comic *comic;
+};
+
+struct _TboDrawingClass
+{
+    GtkLayoutClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_DRAWING */
+GType tbo_drawing_get_type (void);
+
+/*
+ * Method definitions.
+ */
+
+GtkWidget * tbo_drawing_new ();
+GtkWidget * tbo_drawing_new_with_params (Comic *comic);
+void tbo_drawing_update (TboDrawing *self);
+void tbo_drawing_set_current_frame (TboDrawing *self, Frame *frame);
+Frame * tbo_drawing_get_current_frame (TboDrawing *self);
+void tbo_drawing_draw (TboDrawing *self, cairo_t *cr);
+void tbo_drawing_draw_page (TboDrawing *self, cairo_t *cr, Page *page, gint w, gint h);
+void tbo_drawing_zoom_in (TboDrawing *self);
+void tbo_drawing_zoom_out (TboDrawing *self);
+void tbo_drawing_zoom_100 (TboDrawing *self);
+void tbo_drawing_zoom_fit (TboDrawing *self);
+gdouble tbo_drawing_get_zoom (TboDrawing *self);
+void tbo_drawing_adjust_scroll (TboDrawing *self);
+void tbo_drawing_init_dnd (TboDrawing *self, TboWindow *tbo);
+
+#endif /* __TBO_DRAWING_H__ */
+
index b4706a1..b8e3d27 100644 (file)
@@ -20,7 +20,6 @@
 #include <glib.h>
 #include <cairo.h>
 #include <stdio.h>
-#include <ui-drawing.h>
 #include "tbo-types.h"
 #include "tbo-object-base.h"
 
@@ -116,9 +115,8 @@ tbo_object_base_get_flip_matrix (TboObjectBase *self, cairo_matrix_t *mx)
 }
 
 void
-tbo_object_base_order_down (TboObjectBase *self)
+tbo_object_base_order_down (TboObjectBase *self, Frame *frame)
 {
-    Frame *frame = get_frame_view ();
     GList *list = g_list_find (frame->objects, self);
     GList *prev = g_list_previous (list);
     TboObjectBase *tmp;
@@ -131,9 +129,8 @@ tbo_object_base_order_down (TboObjectBase *self)
 }
 
 void
-tbo_object_base_order_up (TboObjectBase *self)
+tbo_object_base_order_up (TboObjectBase *self, Frame *frame)
 {
-    Frame *frame = get_frame_view ();
     GList *list = g_list_find (frame->objects, self);
     GList *next = g_list_next (list);
     TboObjectBase *tmp;
index 5ab0e19..c877cef 100644 (file)
@@ -87,8 +87,8 @@ GObject * tbo_object_base_new ();
 void tbo_object_base_flipv (TboObjectBase *self);
 void tbo_object_base_fliph (TboObjectBase *self);
 void tbo_object_base_get_flip_matrix (TboObjectBase *self, cairo_matrix_t *mx);
-void tbo_object_base_order_down (TboObjectBase *self);
-void tbo_object_base_order_up (TboObjectBase *self);
+void tbo_object_base_order_down (TboObjectBase *self, Frame *frame);
+void tbo_object_base_order_up (TboObjectBase *self, Frame *frame);
 void tbo_object_base_move (TboObjectBase *self, enum MOVE_OPT type);
 void tbo_object_base_resize (TboObjectBase *self, enum RESIZE_OPT type);
 
diff --git a/src/tbo-tool-base.c b/src/tbo-tool-base.c
new file mode 100644 (file)
index 0000000..ee6e7bb
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "tbo-tool-base.h"
+
+G_DEFINE_TYPE (TboToolBase, tbo_tool_base, G_TYPE_OBJECT);
+
+static void on_select (TboToolBase *tool) {}
+static void on_unselect (TboToolBase *tool) {}
+static void on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event) {}
+static void on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event) {}
+static void on_release (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event) {}
+static void on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event) {}
+static void drawing (TboToolBase *tool, cairo_t *cr) {}
+
+/* init methods */
+
+static void
+tbo_tool_base_init (TboToolBase *self)
+{
+    self->tbo = NULL;
+
+    self->on_select = on_select;
+    self->on_unselect = on_unselect;
+    self->on_move = on_move;
+    self->on_click = on_click;
+    self->on_release = on_release;
+    self->on_key = on_key;
+    self->drawing = drawing;
+}
+
+static void
+tbo_tool_base_finalize (GObject *self)
+{
+    if (TBO_TOOL_BASE (self)->action)
+        g_free (TBO_TOOL_BASE (self)->action);
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (tbo_tool_base_parent_class)->finalize (self);
+}
+
+static void
+tbo_tool_base_class_init (TboToolBaseClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+    gobject_class->finalize = tbo_tool_base_finalize;
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_base_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_BASE, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_base_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_BASE, NULL);
+    TBO_TOOL_BASE (tbo_tool)->tbo = tbo;
+    return tbo_tool;
+}
+
+void
+tbo_tool_base_set_action (TboToolBase *self, gchar *action)
+{
+    if (self->action)
+        g_free (self->action);
+    if (action)
+        self->action = g_strdup (action);
+}
+
diff --git a/src/tbo-tool-base.h b/src/tbo-tool-base.h
new file mode 100644 (file)
index 0000000..ed57cd1
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_BASE_H__
+#define __TBO_TOOL_BASE_H__
+
+#include <glib-object.h>
+#include <cairo.h>
+#include <gtk/gtk.h>
+#include "tbo-types.h"
+
+#define TBO_TYPE_TOOL_BASE            (tbo_tool_base_get_type ())
+#define TBO_TOOL_BASE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_BASE, TboToolBase))
+#define TBO_IS_TOOL_BASE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_BASE))
+#define TBO_TOOL_BASE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_BASE, TboToolBaseClass))
+#define TBO_IS_TOOL_BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_BASE))
+#define TBO_TOOL_BASE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_BASE, TboToolBaseClass))
+
+typedef struct _TboToolBase      TboToolBase;
+typedef struct _TboToolBaseClass TboToolBaseClass;
+
+struct _TboToolBase
+{
+    GObject parent_instance;
+
+    /* instance members */
+    TboWindow *tbo;
+    gchar *action;
+
+    void (*on_select) (TboToolBase *tool);
+    void (*on_unselect) (TboToolBase *tool);
+    void (*on_move) (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event);
+    void (*on_click) (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+    void (*on_release) (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+    void (*on_key) (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event);
+    void (*drawing) (TboToolBase *tool, cairo_t *cr);
+};
+
+struct _TboToolBaseClass
+{
+    GObjectClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_BASE */
+GType tbo_tool_base_get_type (void);
+
+/*
+ * Method definitions.
+ */
+GObject * tbo_tool_base_new ();
+GObject * tbo_tool_base_new_with_params (TboWindow *tbo);
+void tbo_tool_base_set_action (TboToolBase *self, gchar *action);
+
+#endif /* __TBO_TOOL_BASE_H__ */
+
diff --git a/src/tbo-tool-bubble.c b/src/tbo-tool-bubble.c
new file mode 100644 (file)
index 0000000..4d65ac6
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "doodle-treeview.h"
+#include "tbo-tool-bubble.h"
+
+G_DEFINE_TYPE (TboToolBubble, tbo_tool_bubble, TBO_TYPE_TOOL_DOODLE);
+
+/* aux */
+static void
+setup_tree (TboToolDoodle *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    self->tree = doodle_setup_tree (tbo, TRUE);
+    gtk_widget_show_all (self->tree);
+    self->tree = g_object_ref (self->tree);
+}
+
+/* init methods */
+
+static void
+tbo_tool_bubble_init (TboToolBubble *self)
+{
+    self->parent_instance.setup_tree = setup_tree;
+}
+
+static void
+tbo_tool_bubble_class_init (TboToolBubbleClass *klass)
+{
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_bubble_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_BUBBLE, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_bubble_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    TboToolBase *tbo_tool_base;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_BUBBLE, NULL);
+    tbo_tool_base = TBO_TOOL_BASE (tbo_tool);
+    tbo_tool_base->tbo = tbo;
+    return tbo_tool;
+}
+
diff --git a/src/tbo-tool-bubble.h b/src/tbo-tool-bubble.h
new file mode 100644 (file)
index 0000000..4dbaeba
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_BUBBLE_H__
+#define __TBO_TOOL_BUBBLE_H__
+
+#include <glib-object.h>
+#include "tbo-tool-doodle.h"
+#include "tbo-window.h"
+
+#define TBO_TYPE_TOOL_BUBBLE            (tbo_tool_bubble_get_type ())
+#define TBO_TOOL_BUBBLE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_BUBBLE, TboToolBubble))
+#define TBO_IS_TOOL_BUBBLE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_BUBBLE))
+#define TBO_TOOL_BUBBLE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_BUBBLE, TboToolBubbleClass))
+#define TBO_IS_TOOL_BUBBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_BUBBLE))
+#define TBO_TOOL_BUBBLE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_BUBBLE, TboToolBubbleClass))
+
+typedef struct _TboToolBubble      TboToolBubble;
+typedef struct _TboToolBubbleClass TboToolBubbleClass;
+
+struct _TboToolBubble
+{
+    TboToolDoodle parent_instance;
+
+    /* instance members */
+};
+
+struct _TboToolBubbleClass
+{
+    TboToolDoodleClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_BUBBLE */
+GType tbo_tool_bubble_get_type (void);
+
+/*
+ * Method definitions.
+ */
+GObject * tbo_tool_bubble_new ();
+GObject * tbo_tool_bubble_new_with_params (TboWindow *tbo);
+
+#endif /* __TBO_TOOL_BUBBLE_H__ */
+
diff --git a/src/tbo-tool-doodle.c b/src/tbo-tool-doodle.c
new file mode 100644 (file)
index 0000000..1afbf10
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "doodle-treeview.h"
+#include "tbo-tool-doodle.h"
+
+G_DEFINE_TYPE (TboToolDoodle, tbo_tool_doodle, TBO_TYPE_TOOL_BASE);
+
+/* Headers */
+
+static void on_select (TboToolBase *tool);
+static void on_unselect (TboToolBase *tool);
+
+/* Definitions */
+
+/* aux */
+static gboolean
+update_scroll_cb (gpointer data)
+{
+    TboToolDoodle *self = TBO_TOOL_DOODLE (data);
+    GtkAdjustment *adjust;
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    adjust = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
+    gtk_adjustment_set_value (adjust, self->hadjust);
+    adjust = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
+    gtk_adjustment_set_value (adjust, self->vadjust);
+    return FALSE;
+}
+
+static void
+setup_tree (TboToolDoodle *self)
+{
+    self->tree = doodle_setup_tree (TBO_TOOL_BASE (self)->tbo, FALSE);
+    gtk_widget_show_all (self->tree);
+    self->tree = g_object_ref (self->tree);
+}
+
+/* tool signal */
+static void
+on_select (TboToolBase *tool)
+{
+    TboToolDoodle *self = TBO_TOOL_DOODLE (tool);
+    TboWindow *tbo = tool->tbo;
+    if (!self->tree)
+    {
+        self->setup_tree (self);
+    }
+
+    tbo_empty_tool_area (tbo);
+    gtk_container_add (GTK_CONTAINER (tbo->toolarea), self->tree);
+
+
+    g_timeout_add (5, update_scroll_cb, self);
+}
+
+static void
+on_unselect (TboToolBase *tool)
+{
+    GtkAdjustment *adjust;
+    TboToolDoodle *self = TBO_TOOL_DOODLE (tool);
+    TboWindow *tbo = tool->tbo;
+
+    if (GTK_IS_WIDGET (self->tree) && self->tree->parent == GTK_WIDGET (tbo->toolarea))
+    {
+        adjust = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
+        self->hadjust = gtk_adjustment_get_value (adjust);
+        adjust = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->scroll2));
+        self->vadjust = gtk_adjustment_get_value (adjust);
+
+        gtk_container_remove (GTK_CONTAINER (tbo->toolarea), self->tree);
+    }
+
+    tbo_empty_tool_area (tbo);
+}
+
+/* init methods */
+
+static void
+tbo_tool_doodle_init (TboToolDoodle *self)
+{
+    self->tree = NULL;
+    self->hadjust = 0.0;
+    self->vadjust = 0.0;
+    self->setup_tree = setup_tree;
+
+    self->parent_instance.on_select = on_select;
+    self->parent_instance.on_unselect = on_unselect;
+}
+
+static void
+tbo_tool_doodle_class_init (TboToolDoodleClass *klass)
+{
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_doodle_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_DOODLE, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_doodle_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    TboToolBase *tbo_tool_base;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_DOODLE, NULL);
+    tbo_tool_base = TBO_TOOL_BASE (tbo_tool);
+    tbo_tool_base->tbo = tbo;
+    return tbo_tool;
+}
+
diff --git a/src/tbo-tool-doodle.h b/src/tbo-tool-doodle.h
new file mode 100644 (file)
index 0000000..1be8de2
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_DOODLE_H__
+#define __TBO_TOOL_DOODLE_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include "tbo-tool-base.h"
+#include "tbo-window.h"
+
+#define TBO_TYPE_TOOL_DOODLE            (tbo_tool_doodle_get_type ())
+#define TBO_TOOL_DOODLE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_DOODLE, TboToolDoodle))
+#define TBO_IS_TOOL_DOODLE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_DOODLE))
+#define TBO_TOOL_DOODLE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_DOODLE, TboToolDoodleClass))
+#define TBO_IS_TOOL_DOODLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_DOODLE))
+#define TBO_TOOL_DOODLE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_DOODLE, TboToolDoodleClass))
+
+typedef struct _TboToolDoodle      TboToolDoodle;
+typedef struct _TboToolDoodleClass TboToolDoodleClass;
+
+struct _TboToolDoodle
+{
+    TboToolBase parent_instance;
+
+    /* instance members */
+    GtkWidget *tree;
+    gdouble hadjust;
+    gdouble vadjust;
+    void (*setup_tree) (TboToolDoodle *self);
+};
+
+struct _TboToolDoodleClass
+{
+    TboToolBaseClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_DOODLE */
+GType tbo_tool_doodle_get_type (void);
+
+/*
+ * Method definitions.
+ */
+GObject * tbo_tool_doodle_new ();
+GObject * tbo_tool_doodle_new_with_params (TboWindow *tbo);
+
+#endif /* __TBO_TOOL_DOODLE_H__ */
+
diff --git a/src/tbo-tool-frame.c b/src/tbo-tool-frame.c
new file mode 100644 (file)
index 0000000..c83d1c4
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <math.h>
+#include "frame.h"
+#include "tbo-tool-frame.h"
+#include "tbo-drawing.h"
+
+G_DEFINE_TYPE (TboToolFrame, tbo_tool_frame, TBO_TYPE_TOOL_BASE);
+
+#define MINIMUM(x, y) x < y ? (int)x : (int)y
+
+/* Headers */
+static void on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event);
+static void on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void on_release (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void drawing (TboToolBase *tool, cairo_t *cr);
+
+/* Definitions */
+
+/* tool signal */
+static void
+on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event)
+{
+    int x, y;
+    TboToolFrame *self = TBO_TOOL_FRAME (tool);
+
+    if (self->n_frame_x >= 0)
+    {
+        if (!self->tmp_frame)
+        {
+            self->tmp_frame = tbo_frame_new (
+                    self->n_frame_x,
+                    self->n_frame_y,
+                    (int)fabs ((int)event->x - self->n_frame_x),
+                    (int)fabs ((int)event->y - self->n_frame_y));
+        }
+        else
+        {
+            x = (int)event->x;
+            y = (int)event->y;
+            self->tmp_frame->width = (int)fabs (x - self->n_frame_x);
+            self->tmp_frame->height = (int)fabs (y - self->n_frame_y);
+            self->tmp_frame->x = MINIMUM (self->n_frame_x, x);
+            self->tmp_frame->y = MINIMUM (self->n_frame_y, y);
+        }
+    }
+    tbo_drawing_update (TBO_DRAWING (tool->tbo->drawing));
+}
+
+static void
+on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    TboToolFrame *self = TBO_TOOL_FRAME (tool);
+    self->n_frame_x = (int)event->x;
+    self->n_frame_y = (int)event->y;
+}
+
+static void
+on_release (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    int w, h;
+    TboWindow *tbo = tool->tbo;
+    TboToolFrame *self = TBO_TOOL_FRAME (tool);
+
+    w = (int)fabs (event->x - self->n_frame_x);
+    h = (int)fabs (event->y - self->n_frame_y);
+
+    if (w != 0 && h != 0)
+    {
+        tbo_page_new_frame (tbo_comic_get_current_page (tbo->comic),
+                MINIMUM (self->n_frame_x, event->x), MINIMUM (self->n_frame_y, event->y),
+                w, h);
+    }
+
+    self->n_frame_x = -1;
+    self->n_frame_y = -1;
+    if (self->tmp_frame) tbo_frame_free (self->tmp_frame);
+    self->tmp_frame = NULL;
+    tbo_drawing_update (TBO_DRAWING (tool->tbo->drawing));
+}
+
+static void
+drawing (TboToolBase *tool, cairo_t *cr)
+{
+    TboToolFrame *self = TBO_TOOL_FRAME (tool);
+    if (self->tmp_frame != NULL)
+    {
+        tbo_frame_draw_complete (self->tmp_frame, cr, 
+                1, 1, 1,
+                1, 0, 0,
+                2);
+    }
+}
+
+/* init methods */
+
+static void
+tbo_tool_frame_init (TboToolFrame *self)
+{
+    self->n_frame_x = -1;
+    self->n_frame_y = -1;
+    self->tmp_frame = NULL;
+
+    self->parent_instance.on_move = on_move;
+    self->parent_instance.on_click = on_click;
+    self->parent_instance.on_release = on_release;
+    self->parent_instance.drawing = drawing;
+}
+
+static void
+tbo_tool_frame_class_init (TboToolFrameClass *klass)
+{
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_frame_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_FRAME, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_frame_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    TboToolBase *tbo_tool_base;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_FRAME, NULL);
+    tbo_tool_base = TBO_TOOL_BASE (tbo_tool);
+    tbo_tool_base->tbo = tbo;
+    return tbo_tool;
+}
+
diff --git a/src/tbo-tool-frame.h b/src/tbo-tool-frame.h
new file mode 100644 (file)
index 0000000..0703424
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_FRAME_H__
+#define __TBO_TOOL_FRAME_H__
+
+#include <glib-object.h>
+#include <cairo.h>
+#include <gtk/gtk.h>
+#include "tbo-object-base.h"
+#include "tbo-tool-base.h"
+#include "tbo-window.h"
+
+#define TBO_TYPE_TOOL_FRAME            (tbo_tool_frame_get_type ())
+#define TBO_TOOL_FRAME(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_FRAME, TboToolFrame))
+#define TBO_IS_TOOL_FRAME(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_FRAME))
+#define TBO_TOOL_FRAME_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_FRAME, TboToolFrameClass))
+#define TBO_IS_TOOL_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_FRAME))
+#define TBO_TOOL_FRAME_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_FRAME, TboToolFrameClass))
+
+typedef struct _TboToolFrame      TboToolFrame;
+typedef struct _TboToolFrameClass TboToolFrameClass;
+
+struct _TboToolFrame
+{
+    TboToolBase parent_instance;
+
+    /* instance members */
+    gint n_frame_x;
+    gint n_frame_y;
+    Frame *tmp_frame;
+};
+
+struct _TboToolFrameClass
+{
+    TboToolBaseClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_FRAME */
+GType tbo_tool_frame_get_type (void);
+
+/*
+ * Method definitions.
+ */
+GObject * tbo_tool_frame_new ();
+GObject * tbo_tool_frame_new_with_params (TboWindow *tbo);
+
+#endif /* __TBO_TOOL_FRAME_H__ */
+
diff --git a/src/tbo-tool-selector.c b/src/tbo-tool-selector.c
new file mode 100644 (file)
index 0000000..5329e00
--- /dev/null
@@ -0,0 +1,879 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <math.h>
+#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+#include "comic.h"
+#include "frame.h"
+#include "page.h"
+#include "tbo-ui-utils.h"
+#include "tbo-tool-selector.h"
+#include "tbo-drawing.h"
+
+G_DEFINE_TYPE (TboToolSelector, tbo_tool_selector, TBO_TYPE_TOOL_BASE);
+
+/* Headers */
+static void on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event);
+static void on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void on_release (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event);
+static void drawing (TboToolBase *tool, cairo_t *cr);
+
+static void frame_view_on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event);
+static void page_view_on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event);
+static void frame_view_on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void page_view_on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void frame_view_drawing (TboToolBase *tool, cairo_t *cr);
+static void page_view_drawing (TboToolBase *tool, cairo_t *cr);
+static void frame_view_on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event);
+static void page_view_on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event);
+
+/* Definitions */
+
+/* aux */
+static gboolean
+update_selected_cb (GtkSpinButton *widget, TboToolSelector *tool)
+{
+    TboDrawing *drawing = TBO_DRAWING (TBO_TOOL_BASE (tool)->tbo->drawing);
+    if (tool->resizing || tool->clicked || tool->selected_frame == NULL || tool->spin_x == NULL)
+        return FALSE;
+
+    tool->selected_frame->x = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (tool->spin_x));
+    tool->selected_frame->y = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (tool->spin_y));
+    tool->selected_frame->width = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (tool->spin_w));
+    tool->selected_frame->height = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (tool->spin_h));
+
+    tbo_drawing_update (drawing);
+    return FALSE;
+}
+
+static gboolean
+update_color_cb (GtkColorButton *button, TboToolSelector *tool)
+{
+    TboDrawing *drawing = TBO_DRAWING (TBO_TOOL_BASE (tool)->tbo->drawing);
+    if (tool->resizing || tool->clicked || tool->selected_frame == NULL)
+        return FALSE;
+
+    GdkColor color = { 0, 0, 0, 0 };
+    gtk_color_button_get_color (button, &color);
+    tbo_frame_set_color (tool->selected_frame, &color);
+    tbo_drawing_update (drawing);
+    return FALSE;
+}
+
+static gboolean
+update_border_cb (GtkToggleButton *button, TboToolSelector *tool)
+{
+    TboDrawing *drawing = TBO_DRAWING (TBO_TOOL_BASE (tool)->tbo->drawing);
+    if (tool->resizing || tool->clicked || tool->selected_frame == NULL)
+        return FALSE;
+
+    tool->selected_frame->border = !tool->selected_frame->border;
+    tbo_drawing_update (drawing);
+    return FALSE;
+}
+
+static void
+empty_tool_area (TboToolSelector *self)
+{
+    tbo_empty_tool_area (TBO_TOOL_BASE (self)->tbo);
+    self->spin_x = NULL;
+    self->spin_y = NULL;
+    self->spin_h = NULL;
+    self->spin_w = NULL;
+}
+
+static void
+update_tool_area (TboToolSelector *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    GtkWidget *toolarea = tbo->toolarea;
+    GtkWidget *hpanel;
+    GtkWidget *label;
+    GtkWidget *color;
+    GtkWidget *border;
+    GdkColor gdk_color = { 0, 0, 0, 0 };
+
+    if (!self->spin_x)
+    {
+        empty_tool_area (self);
+        self->spin_x = add_spin_with_label (toolarea, "x: ", self->selected_frame->x);
+        self->spin_y = add_spin_with_label (toolarea, "y: ", self->selected_frame->y);
+        self->spin_w = add_spin_with_label (toolarea, "w: ", self->selected_frame->width);
+        self->spin_h = add_spin_with_label (toolarea, "h: ", self->selected_frame->height);
+
+        g_signal_connect (self->spin_x, "value-changed", G_CALLBACK (update_selected_cb), self);
+        g_signal_connect (self->spin_y, "value-changed", G_CALLBACK (update_selected_cb), self);
+        g_signal_connect (self->spin_w, "value-changed", G_CALLBACK (update_selected_cb), self);
+        g_signal_connect (self->spin_h, "value-changed", G_CALLBACK (update_selected_cb), self);
+
+        hpanel = gtk_hbox_new (FALSE, 0);
+        label = gtk_label_new (_("Background color: "));
+        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
+        color = gtk_color_button_new ();
+        gdk_color.red = self->selected_frame->color->r * 65535;
+        gdk_color.green = self->selected_frame->color->g * 65535;
+        gdk_color.blue = self->selected_frame->color->b * 65535;
+        gtk_color_button_set_color (GTK_COLOR_BUTTON (color), &gdk_color);
+
+        gtk_box_pack_start (GTK_BOX (hpanel), label, TRUE, TRUE, 5);
+        gtk_box_pack_start (GTK_BOX (hpanel), color, TRUE, TRUE, 5);
+        gtk_box_pack_start (GTK_BOX (toolarea), hpanel, FALSE, FALSE, 5);
+        g_signal_connect (color, "color-set", G_CALLBACK (update_color_cb), self);
+
+        border = gtk_check_button_new_with_label (_("border"));
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (border), self->selected_frame->border);
+        gtk_box_pack_start (GTK_BOX (toolarea), border, FALSE, FALSE, 5);
+        g_signal_connect (border, "toggled", G_CALLBACK (update_border_cb), self);
+
+        gtk_widget_show_all (toolarea);
+    }
+
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->spin_x), self->selected_frame->x);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->spin_y), self->selected_frame->y);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->spin_w), self->selected_frame->width);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->spin_h), self->selected_frame->height);
+}
+
+static gboolean
+over_resizer (TboToolSelector *self, Frame *frame, int x, int y)
+{
+    int rx, ry;
+    rx = frame->x + frame->width;
+    ry = frame->y + frame->height;
+
+    float r_size;
+    r_size = R_SIZE / tbo_drawing_get_zoom (TBO_DRAWING (TBO_TOOL_BASE (self)->tbo->drawing));
+
+    if (((rx-r_size) < x) &&
+        ((rx+r_size) > x) &&
+        ((ry-r_size) < y) &&
+        ((ry+r_size) > y))
+    {
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+static gboolean
+over_resizer_obj (TboToolSelector *self, TboObjectBase *obj, int x, int y)
+{
+    int rx, ry;
+    int ox, oy, ow, oh;
+    tbo_frame_get_obj_relative (obj, &ox, &oy, &ow, &oh);
+    rx = ox + (ow * cos(obj->angle) - oh * sin(obj->angle));
+    ry = oy + (oh * cos(obj->angle) + ow * sin(obj->angle));
+
+    float r_size;
+    r_size = R_SIZE / tbo_drawing_get_zoom (TBO_DRAWING (TBO_TOOL_BASE (self)->tbo->drawing));
+
+    if (((rx-r_size) < x) &&
+        ((rx+r_size) > x) &&
+        ((ry-r_size) < y) &&
+        ((ry+r_size) > y))
+    {
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+static gboolean
+over_rotater_obj (TboToolSelector *self, TboObjectBase *obj, int x, int y)
+{
+    int rx, ry;
+    int ox, oy, ow, oh;
+    tbo_frame_get_obj_relative (obj, &ox, &oy, &ow, &oh);
+    rx = ox;
+    ry = oy;
+
+    float r_size;
+    r_size = R_SIZE / tbo_drawing_get_zoom (TBO_DRAWING (TBO_TOOL_BASE (self)->tbo->drawing));
+
+    if (((rx-r_size/2.0) < x) &&
+        ((rx+r_size/2.0) > x) &&
+        ((ry-r_size/2.0) < y) &&
+        ((ry+r_size/2.0) > y))
+    {
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+/* tool signal */
+static void
+on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event)
+{
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+    Frame *frame = tbo_drawing_get_current_frame (drawing);
+    if (frame)
+        frame_view_on_move (tool, widget, event);
+    else
+        page_view_on_move (tool, widget, event);
+
+    tbo_drawing_update (drawing);
+}
+
+static void
+on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+    Frame *frame = tbo_drawing_get_current_frame (drawing);
+    if (frame)
+        frame_view_on_click (tool, widget, event);
+    else
+        page_view_on_click (tool, widget, event);
+
+    tbo_drawing_update (drawing);
+}
+
+static void
+on_release (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    self->start_x = 0;
+    self->start_y = 0;
+    self->clicked = FALSE;
+    self->resizing = FALSE;
+    self->rotating = FALSE;
+}
+
+static void
+on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event)
+{
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+    Frame *frame = tbo_drawing_get_current_frame (drawing);
+    if (frame)
+        frame_view_on_key (tool, widget, event);
+    else
+        page_view_on_key (tool, widget, event);
+}
+
+static void
+drawing (TboToolBase *tool, cairo_t *cr)
+{
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+    Frame *frame = tbo_drawing_get_current_frame (drawing);
+    if (frame)
+        frame_view_drawing (tool, cr);
+    else
+        page_view_drawing (tool, cr);
+}
+
+/* frame view */
+static void
+frame_view_on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event)
+{
+    int x, y, offset_x, offset_y;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+
+    x = (int)event->x;
+    y = (int)event->y;
+
+    self->x = x;
+    self->y = y;
+
+    if (self->selected_object != NULL)
+    {
+        if (self->clicked)
+        {
+            offset_x = (self->start_x - x) / tbo_frame_get_scale_factor ();
+            offset_y = (self->start_y - y) / tbo_frame_get_scale_factor ();
+
+            // resizing object
+            if (self->resizing)
+            {
+                self->selected_object->width = abs (self->start_m_w - offset_x);
+                self->selected_object->height = abs (self->start_m_h - offset_y);
+            }
+            else if (self->rotating)
+            {
+                self->selected_object->angle = atan2 (offset_y, offset_x);
+            }
+            // moving object
+            else
+            {
+                self->selected_object->x = self->start_m_x - offset_x;
+                self->selected_object->y = self->start_m_y - offset_y;
+            }
+        }
+
+        // over resizer
+        if (over_resizer_obj (self, self->selected_object, x, y))
+        {
+            self->over_resizer = TRUE;
+        }
+        else
+        {
+            self->over_resizer = FALSE;
+        }
+        // over rotater
+        if (over_rotater_obj (self, self->selected_object, x, y))
+        {
+            self->over_rotater = TRUE;
+        }
+        else
+        {
+            self->over_rotater = FALSE;
+        }
+    }
+}
+
+static void
+frame_view_on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    int x, y;
+    GList *obj_list;
+    Frame *frame;
+    TboObjectBase *obj;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+    gboolean found = FALSE;
+
+    x = (int)event->x;
+    y = (int)event->y;
+
+    // resizing
+    if (self->selected_object && over_resizer_obj (self, self->selected_object, x, y))
+    {
+        self->resizing = TRUE;
+    }
+    else if (self->selected_object && over_rotater_obj (self, self->selected_object, x, y))
+    {
+        self->rotating = TRUE;
+    }
+    else
+    {
+        frame = tbo_drawing_get_current_frame (drawing);
+        for (obj_list = g_list_first (frame->objects); obj_list; obj_list = obj_list->next)
+        {
+            obj = TBO_OBJECT_BASE (obj_list->data);
+            if (tbo_frame_point_inside_obj (obj, x, y))
+            {
+                // Selecting last occurrence.
+                tbo_tool_selector_set_selected_obj (self, obj);
+                found = TRUE;
+            }
+        }
+        if (!found)
+            tbo_tool_selector_set_selected_obj (self, NULL);
+    }
+
+    self->start_x = x;
+    self->start_y = y;
+
+    if (self->selected_object)
+    {
+        self->start_m_x = self->selected_object->x;
+        self->start_m_y = self->selected_object->y;
+        self->start_m_w = self->selected_object->width;
+        self->start_m_h = self->selected_object->height;
+    }
+    self->clicked = TRUE;
+}
+
+static void
+frame_view_drawing (TboToolBase *tool, cairo_t *cr)
+{
+    const double dashes[] = {5, 5};
+    Color border = {0.9, 0.9, 0};
+    Color white = {1, 1, 1};
+    Color black = {0, 0, 0};
+    Color *resizer_border;
+    Color *resizer_fill;
+    Color *rotater_border;
+    Color *rotater_fill;
+    int x, y;
+    float r_size;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    TboObjectBase *current_obj = self->selected_object;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+
+    if (current_obj != NULL)
+    {
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+        cairo_set_line_width (cr, 1);
+        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
+        cairo_set_source_rgb (cr, border.r, border.g, border.b);
+        int ox, oy, ow, oh;
+        tbo_frame_get_obj_relative (current_obj, &ox, &oy, &ow, &oh);
+
+        cairo_translate (cr, ox, oy);
+        cairo_rotate (cr, current_obj->angle);
+        cairo_rectangle (cr, 0, 0, ow, oh);
+        cairo_stroke (cr);
+
+        // resizer
+        if (self->over_resizer)
+        {
+            resizer_fill = &black;
+            resizer_border = &white;
+        }
+        else
+        {
+            resizer_fill = &white;
+            resizer_border = &black;
+        }
+
+        // rotater
+        if (self->over_rotater)
+        {
+            rotater_fill = &black;
+            rotater_border = &white;
+        }
+        else
+        {
+            rotater_fill = &white;
+            rotater_border = &black;
+        }
+
+        cairo_set_line_width (cr, 1);
+        cairo_set_dash (cr, dashes, 0, 0);
+
+        x = ow;
+        y = oh;
+
+        r_size = R_SIZE / tbo_drawing_get_zoom (drawing);
+        cairo_set_line_width (cr, 1/tbo_drawing_get_zoom (drawing));
+
+        cairo_rectangle (cr, x, y, r_size, r_size);
+        cairo_set_source_rgb(cr, resizer_fill->r, resizer_fill->g, resizer_fill->b);
+        cairo_fill (cr);
+
+        cairo_set_source_rgb(cr, resizer_border->r, resizer_border->g, resizer_border->b);
+        cairo_rectangle (cr, x, y, r_size, r_size);
+        cairo_stroke (cr);
+
+        // object rotate zone
+        cairo_set_source_rgb(cr, rotater_fill->r, rotater_fill->g, rotater_fill->b);
+        cairo_arc (cr, 0, 0, r_size / 2., 0, 2 * M_PI);
+        cairo_fill (cr);
+        cairo_set_source_rgb(cr, rotater_border->r, rotater_border->g, rotater_border->b);
+        cairo_arc (cr, 0, 0, r_size / 2., 0, 2 * M_PI);
+        cairo_stroke (cr);
+        cairo_set_line_width (cr, tbo_drawing_get_zoom (drawing));
+
+        cairo_rotate (cr, -current_obj->angle);
+        cairo_translate (cr, -ox, -oy);
+
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
+
+        if (self->rotating)
+        {
+            cairo_set_source_rgb(cr, 1, 0, 0);
+            cairo_move_to (cr, ox, oy);
+            cairo_line_to (cr, self->x, self->y);
+            cairo_stroke (cr);
+        }
+    }
+}
+
+static void
+frame_view_on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event)
+{
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    TboObjectBase *current_obj = self->selected_object;
+    Frame *current_frame = self->selected_frame;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+
+    if (self->selected_frame != NULL && event->keyval == GDK_Escape)
+    {
+        tbo_tool_selector_set_selected (self, NULL);
+        tbo_drawing_set_current_frame (drawing, NULL);
+        update_menubar (tool->tbo);
+        tbo_toolbar_update (tool->tbo->toolbar);
+    }
+
+    if (current_obj != NULL)
+    {
+        switch (event->keyval)
+        {
+            case GDK_Delete:
+                tbo_frame_del_obj (self->selected_frame, current_obj);
+                tbo_tool_selector_set_selected_obj (self, NULL);
+                break;
+            case GDK_v:
+                tbo_object_base_flipv (current_obj);
+                break;
+            case GDK_h:
+                tbo_object_base_fliph (current_obj);
+                break;
+            case GDK_Page_Up:
+                tbo_object_base_order_up (current_obj, current_frame);
+                break;
+            case GDK_Page_Down:
+                tbo_object_base_order_down (current_obj, current_frame);
+                break;
+            case GDK_Up:
+                tbo_object_base_move (current_obj, MOVE_UP);
+                break;
+            case GDK_less:
+                tbo_object_base_resize (current_obj, RESIZE_LESS);
+                break;
+            case GDK_greater:
+                tbo_object_base_resize (current_obj, RESIZE_GREATER);
+                break;
+            case GDK_Down:
+                tbo_object_base_move (current_obj, MOVE_DOWN);
+                break;
+            case GDK_Left:
+                tbo_object_base_move (current_obj, MOVE_LEFT);
+                break;
+            case GDK_Right:
+                tbo_object_base_move (current_obj, MOVE_RIGHT);
+                break;
+            case GDK_d:
+                if (event->state & GDK_CONTROL_MASK)
+                {
+                    TboObjectBase *cloned_obj = current_obj->clone (current_obj);
+                    cloned_obj->x += 10;
+                    cloned_obj->y -= 10;
+                    tbo_frame_add_obj (self->selected_frame, cloned_obj);
+                    tbo_tool_selector_set_selected_obj (self, cloned_obj);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+    tbo_drawing_update (drawing);
+}
+
+/* page view */
+static void
+page_view_on_key (TboToolBase *tool, GtkWidget *widget, GdkEventKey *event)
+{
+    Page *page;
+
+    TboWindow *tbo = tool->tbo;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    page = tbo_comic_get_current_page (tbo->comic);
+    Frame *selected = self->selected_frame;
+
+    if (selected != NULL && event->keyval == GDK_Delete)
+    {
+        tbo_page_del_frame (page, selected);
+        tbo_tool_selector_set_selected (self, NULL);
+    }
+
+    switch (event->keyval)
+    {
+        case GDK_d:
+            if ((event->state & GDK_CONTROL_MASK) && selected)
+            {
+                Frame *cloned_frame = tbo_frame_clone (selected);
+                cloned_frame->x += 10;
+                cloned_frame->y -= 10;
+                tbo_page_add_frame (page, cloned_frame);
+                tbo_tool_selector_set_selected (self, cloned_frame);
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+static void
+page_view_drawing (TboToolBase *tool, cairo_t *cr)
+{
+    const double dashes[] = {5, 5};
+    Color border = {0.9, 0.9, 0};
+    Color white = {1, 1, 1};
+    Color black = {0, 0, 0};
+    Color *resizer_border;
+    Color *resizer_fill;
+    int x, y;
+    float r_size;
+
+    TboWindow *tbo = tool->tbo;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    Frame *selected = self->selected_frame;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+
+    if (selected != NULL)
+    {
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+        cairo_set_line_width (cr, 1);
+        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
+        cairo_set_source_rgb (cr, border.r, border.g, border.b);
+        cairo_rectangle (cr, selected->x, selected->y,
+                selected->width, selected->height);
+        cairo_stroke (cr);
+
+        // resizer
+        if (self->over_resizer)
+        {
+            resizer_fill = &black;
+            resizer_border = &white;
+        }
+        else
+        {
+            resizer_fill = &white;
+            resizer_border = &black;
+        }
+
+        cairo_set_line_width (cr, 1);
+        cairo_set_dash (cr, dashes, 0, 0);
+
+        x = selected->x + selected->width;
+        y = selected->y + selected->height;
+
+        r_size = R_SIZE / tbo_drawing_get_zoom (drawing);
+        cairo_set_line_width (cr, 1 / tbo_drawing_get_zoom (drawing));
+        cairo_rectangle (cr, x, y, r_size, r_size);
+        cairo_set_source_rgb(cr, resizer_fill->r, resizer_fill->g, resizer_fill->b);
+        cairo_fill (cr);
+
+        cairo_set_source_rgb(cr, resizer_border->r, resizer_border->g, resizer_border->b);
+        cairo_rectangle (cr, x, y, r_size, r_size);
+        cairo_stroke (cr);
+        cairo_set_line_width (cr, tbo_drawing_get_zoom (drawing));
+
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
+    }
+}
+
+static void
+page_view_on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    int x, y;
+    GList *frame_list;
+    Page *page;
+    Frame *frame;
+    gboolean found = FALSE;
+
+    TboWindow *tbo = tool->tbo;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    Frame *selected;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+
+    x = (int)event->x;
+    y = (int)event->y;
+
+
+    page = tbo_comic_get_current_page (tbo->comic);
+    for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
+    {
+        frame = (Frame *)frame_list->data;
+        if (tbo_frame_point_inside (frame, x, y))
+        {
+            // Selecting last occurrence.
+            tbo_tool_selector_set_selected (self, frame);
+            found = TRUE;
+        }
+    }
+    selected = self->selected_frame;
+
+    // resizing
+    if (selected && over_resizer (self, selected, x, y))
+    {
+        self->resizing = TRUE;
+    }
+    else if (!found)
+        tbo_tool_selector_set_selected (self, NULL);
+
+    // double click, frame view
+    if (selected && event->type == GDK_2BUTTON_PRESS)
+    {
+        tbo_drawing_set_current_frame (drawing, selected);
+        empty_tool_area (self);
+        tbo_tooltip_set (NULL, 0, 0, tbo);
+        // TODO add tooltip_notify
+        tbo_tooltip_set_center_timeout (_("press esc to go back"), 3000, tbo);
+        update_menubar (tbo);
+        tbo_toolbar_update (tbo->toolbar);
+    }
+
+    self->start_x = x;
+    self->start_y = y;
+
+    if (selected)
+    {
+        self->start_m_x = selected->x;
+        self->start_m_y = selected->y;
+        self->start_m_w = selected->width;
+        self->start_m_h = selected->height;
+        tbo_page_set_current_frame (page, selected);
+    }
+    self->clicked = TRUE;
+}
+
+static void
+page_view_on_move (TboToolBase *tool, GtkWidget *widget, GdkEventMotion *event)
+{
+    int x, y, offset_x, offset_y;
+    TboWindow *tbo = tool->tbo;
+    TboToolSelector *self = TBO_TOOL_SELECTOR (tool);
+    Frame *selected = self->selected_frame;
+    TboDrawing *drawing = TBO_DRAWING (tool->tbo->drawing);
+
+    x = (int)event->x;
+    y = (int)event->y;
+
+    if (selected != NULL)
+    {
+        if (self->clicked)
+        {
+            offset_x = (self->start_x - x);
+            offset_y = (self->start_y - y);
+
+            // resizing frame
+            if (self->resizing)
+            {
+                selected->width = abs (self->start_m_w - offset_x);
+                selected->height = abs (self->start_m_h - offset_y);
+
+                update_tool_area (self);
+            }
+            // moving frame
+            else
+            {
+                selected->x = self->start_m_x - offset_x;
+                selected->y = self->start_m_y - offset_y;
+
+                update_tool_area (self);
+            }
+        }
+
+        // over resizer
+        if (over_resizer (self, selected, x, y))
+        {
+            self->over_resizer = TRUE;
+        }
+        else
+        {
+            self->over_resizer = FALSE;
+        }
+    }
+
+    GList *frame_list;
+    Frame *frame;
+    Page *page = tbo_comic_get_current_page (tbo->comic);
+    gboolean found = FALSE;
+    int x1, y1;
+
+    for (frame_list = tbo_page_get_frames (page); frame_list && !found; frame_list = frame_list->next)
+    {
+        if (tbo_frame_point_inside ((Frame*)frame_list->data, x, y))
+        {
+            frame = (Frame*)frame_list->data;
+            x1 = frame->x + (frame->width / 2);
+            y1 = frame->y + (frame->height / 2);
+            tbo_tooltip_set (_("double click here"), x1, y1, tbo);
+            found = TRUE;
+        }
+    }
+    if (!found)
+        tbo_tooltip_set(NULL, 0, 0, tbo);
+}
+
+/* init methods */
+
+static void
+tbo_tool_selector_init (TboToolSelector *self)
+{
+    self->x = 0;
+    self->y = 0;
+    self->start_x = 0;
+    self->start_y = 0;
+    self->start_m_x = 0;
+    self->start_m_y = 0;
+    self->start_m_w = 0;
+    self->start_m_h = 0;
+    self->clicked = FALSE;
+    self->over_resizer = FALSE;
+    self->over_rotater = FALSE;
+    self->resizing = FALSE;
+    self->rotating = FALSE;
+    self->spin_w = NULL;
+    self->spin_h = NULL;
+    self->spin_x = NULL;
+    self->spin_y = NULL;
+
+    self->parent_instance.on_move = on_move;
+    self->parent_instance.on_click = on_click;
+    self->parent_instance.on_release = on_release;
+    self->parent_instance.on_key = on_key;
+    self->parent_instance.drawing = drawing;
+}
+
+static void
+tbo_tool_selector_class_init (TboToolSelectorClass *klass)
+{
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_selector_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_SELECTOR, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_selector_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    TboToolBase *tbo_tool_base;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_SELECTOR, NULL);
+    tbo_tool_base = TBO_TOOL_BASE (tbo_tool);
+    tbo_tool_base->tbo = tbo;
+    return tbo_tool;
+}
+
+Frame *
+tbo_tool_selector_get_selected_frame (TboToolSelector *self)
+{
+    return self->selected_frame;
+}
+
+TboObjectBase *
+tbo_tool_selector_get_selected_obj (TboToolSelector *self)
+{
+    return self->selected_object;
+}
+
+void
+tbo_tool_selector_set_selected (TboToolSelector *self, Frame *frame)
+{
+    self->selected_frame = frame;
+    empty_tool_area (self);
+    if (self->selected_frame != NULL)
+        update_tool_area (self);
+    update_menubar (TBO_TOOL_BASE (self)->tbo);
+}
+
+void
+tbo_tool_selector_set_selected_obj (TboToolSelector *self, TboObjectBase *obj)
+{
+    self->selected_object = obj;
+    update_menubar (TBO_TOOL_BASE (self)->tbo);
+}
+
diff --git a/src/tbo-tool-selector.h b/src/tbo-tool-selector.h
new file mode 100644 (file)
index 0000000..367905f
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_SELECTOR_H__
+#define __TBO_TOOL_SELECTOR_H__
+
+#include <glib-object.h>
+#include <cairo.h>
+#include <gtk/gtk.h>
+#include "tbo-object-base.h"
+#include "tbo-tool-base.h"
+#include "tbo-types.h"
+
+#define TBO_TYPE_TOOL_SELECTOR            (tbo_tool_selector_get_type ())
+#define TBO_TOOL_SELECTOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_SELECTOR, TboToolSelector))
+#define TBO_IS_TOOL_SELECTOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_SELECTOR))
+#define TBO_TOOL_SELECTOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_SELECTOR, TboToolSelectorClass))
+#define TBO_IS_TOOL_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_SELECTOR))
+#define TBO_TOOL_SELECTOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_SELECTOR, TboToolSelectorClass))
+
+#define R_SIZE 10
+
+typedef struct _TboToolSelector      TboToolSelector;
+typedef struct _TboToolSelectorClass TboToolSelectorClass;
+
+struct _TboToolSelector
+{
+    TboToolBase parent_instance;
+
+    /* instance members */
+    Frame *selected_frame;
+    TboObjectBase *selected_object;
+    gint x;
+    gint y;
+    gint start_x;
+    gint start_y;
+    gint start_m_x;
+    gint start_m_y;
+    gint start_m_w;
+    gint start_m_h;
+    gboolean clicked;
+    gboolean over_resizer;
+    gboolean over_rotater;
+    gboolean resizing;
+    gboolean rotating;
+    GtkWidget *spin_w;
+    GtkWidget *spin_h;
+    GtkWidget *spin_x;
+    GtkWidget *spin_y;
+};
+
+struct _TboToolSelectorClass
+{
+    TboToolBaseClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_SELECTOR */
+GType tbo_tool_selector_get_type (void);
+
+/*
+ * Method definitions.
+ */
+Frame * tbo_tool_selector_get_selected_frame (TboToolSelector *self);
+TboObjectBase * tbo_tool_selector_get_selected_obj (TboToolSelector *self);
+void tbo_tool_selector_set_selected (TboToolSelector *self, Frame *frame);
+void tbo_tool_selector_set_selected_obj (TboToolSelector *self, TboObjectBase *obj);
+GObject * tbo_tool_selector_new ();
+GObject * tbo_tool_selector_new_with_params (TboWindow *tbo);
+
+#endif /* __TBO_TOOL_SELECTOR_H__ */
+
diff --git a/src/tbo-tool-text.c b/src/tbo-tool-text.c
new file mode 100644 (file)
index 0000000..ea9be4f
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+#include "tbo-drawing.h"
+#include "tbo-object-base.h"
+#include "tbo-tool-text.h"
+
+G_DEFINE_TYPE (TboToolText, tbo_tool_text, TBO_TYPE_TOOL_BASE);
+
+#define DEFAULT_PANGO_FONT "Sans Normal 27"
+
+/* Headers */
+static void on_select (TboToolBase *tool);
+static void on_unselect (TboToolBase *tool);
+static void on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event);
+static void drawing (TboToolBase *tool, cairo_t *cr);
+
+/* Definitions */
+
+/* aux */
+static gboolean
+on_tview_focus_in (GtkWidget *view, GdkEventFocus *event, TboToolText *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    tbo_window_set_key_binder (tbo, FALSE);
+    return FALSE;
+}
+
+static gboolean
+on_tview_focus_out (GtkWidget *view, GdkEventFocus *event, TboToolText *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    tbo_window_set_key_binder (tbo, TRUE);
+    return FALSE;
+}
+
+
+static gboolean
+on_text_change (GtkTextBuffer *buf, TboToolText *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    GtkTextIter start, end;
+    gtk_text_buffer_get_start_iter (buf, &start);
+    gtk_text_buffer_get_end_iter (buf, &end);
+
+    if (self->text_selected)
+    {
+        tbo_object_text_set_text (self->text_selected, gtk_text_buffer_get_text (buf, &start, &end, FALSE));
+        tbo_drawing_update (TBO_DRAWING (tbo->drawing));
+    }
+    return FALSE;
+}
+
+static gboolean
+on_font_change (GtkFontButton *fbutton, TboToolText *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    if (self->text_selected)
+    {
+        tbo_object_text_change_font (self->text_selected, tbo_tool_text_get_pango_font (self));
+        tbo_drawing_update (TBO_DRAWING (tbo->drawing));
+    }
+    return FALSE;
+}
+
+static gboolean
+on_color_change (GtkColorButton *cbutton, TboToolText *self)
+{
+    TboWindow *tbo = TBO_TOOL_BASE (self)->tbo;
+    if (self->text_selected)
+    {
+        GdkColor color;
+        gtk_color_button_get_color (GTK_COLOR_BUTTON (self->font_color), &color);
+        tbo_object_text_change_color (self->text_selected, &color);
+        tbo_drawing_update (TBO_DRAWING (tbo->drawing));
+    }
+    return FALSE;
+}
+
+GtkWidget *
+setup_toolarea (TboToolText *self)
+{
+    GtkWidget *vbox;
+    GtkWidget *hbox;
+    GtkWidget *font_color_label = gtk_label_new (_("Text color:"));
+    GtkWidget *font_label = gtk_label_new (_("Font:"));
+    GtkWidget *scroll;
+    GtkWidget *view;
+
+    gtk_misc_set_alignment (GTK_MISC (font_label), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (font_color_label), 0, 0);
+
+    self->font = gtk_font_button_new ();
+    g_signal_connect (self->font, "font-set", G_CALLBACK (on_font_change), self);
+    self->font_color = gtk_color_button_new ();
+    g_signal_connect (self->font_color, "color-set", G_CALLBACK (on_color_change), self);
+
+    vbox = gtk_vbox_new (FALSE, 5);
+
+    hbox = gtk_hbox_new (FALSE, 5);
+    gtk_box_pack_start (GTK_BOX (hbox), font_label, TRUE, TRUE, 5);
+    gtk_box_pack_start (GTK_BOX (hbox), self->font, TRUE, TRUE, 5);
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
+
+    hbox = gtk_hbox_new (FALSE, 5);
+    gtk_box_pack_start (GTK_BOX (hbox), font_color_label, TRUE, TRUE, 5);
+    gtk_box_pack_start (GTK_BOX (hbox), self->font_color, TRUE, TRUE, 5);
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
+
+    scroll = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    view = gtk_text_view_new ();
+    gtk_widget_add_events (view, GDK_FOCUS_CHANGE_MASK);
+    g_signal_connect (view, "focus-in-event", G_CALLBACK (on_tview_focus_in), self);
+    g_signal_connect (view, "focus-out-event", G_CALLBACK (on_tview_focus_out), self);
+
+    gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
+    self->text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+    gtk_text_buffer_set_text (self->text_buffer, "", -1);
+    g_signal_connect (self->text_buffer, "changed", G_CALLBACK (on_text_change), self);
+    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), view);
+    gtk_box_pack_start (GTK_BOX (vbox), scroll, FALSE, FALSE, 5);
+
+    return vbox;
+}
+
+/* tool signal */
+static void
+on_select (TboToolBase *tool)
+{
+    GtkWidget *toolarea = setup_toolarea (TBO_TOOL_TEXT (tool));
+    gtk_widget_show_all (GTK_WIDGET (toolarea));
+    tbo_empty_tool_area (tool->tbo);
+    gtk_container_add (GTK_CONTAINER (tool->tbo->toolarea), toolarea);
+}
+
+static void
+on_unselect (TboToolBase *tool)
+{
+    /* TODO remove widgets from toolarea to not destroy it */
+    tbo_empty_tool_area (tool->tbo);
+    tbo_window_set_key_binder (tool->tbo, TRUE);
+}
+
+static void
+on_click (TboToolBase *tool, GtkWidget *widget, GdkEventButton *event)
+{
+    double r, g, b;
+    int x = (int)event->x;
+    int y = (int)event->y;
+    gboolean found = FALSE;
+    GList *obj_list;
+    TboObjectBase *obj;
+    TboObjectText *text;
+    GdkColor color;
+    TboToolText *self = TBO_TOOL_TEXT (tool);
+    Frame *frame = tbo_drawing_get_current_frame (TBO_DRAWING (tool->tbo->drawing));
+
+    for (obj_list = g_list_first (frame->objects); obj_list; obj_list = obj_list->next)
+    {
+        obj = TBO_OBJECT_BASE (obj_list->data);
+        if (TBO_IS_OBJECT_TEXT (obj) && tbo_frame_point_inside_obj (obj, x, y))
+        {
+            text = TBO_OBJECT_TEXT (obj);
+            found = TRUE;
+        }
+    }
+    if (!found)
+    {
+        x = tbo_frame_get_base_x (x);
+        y = tbo_frame_get_base_y (y);
+        gtk_color_button_get_color (GTK_COLOR_BUTTON (self->font_color), &color);
+        text = TBO_OBJECT_TEXT (tbo_object_text_new_with_params (x, y, 100, 0,
+                                                _("Text"),
+                                                tbo_tool_text_get_pango_font (self),
+                                                &color));
+        tbo_frame_add_obj (frame, TBO_OBJECT_BASE (text));
+    }
+    tbo_tool_text_set_selected (self, text);
+    tbo_drawing_update (TBO_DRAWING (tool->tbo->drawing));
+}
+
+static void
+drawing (TboToolBase *tool, cairo_t *cr)
+{
+    const double dashes[] = {5, 5};
+    int x, y;
+    TboToolText *self = TBO_TOOL_TEXT (tool);
+
+    if (self->text_selected)
+    {
+        TboObjectBase *obj = TBO_OBJECT_BASE (self->text_selected);
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+        cairo_set_line_width (cr, 1);
+        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
+        cairo_set_source_rgb (cr, 0.9, 0, 0);
+        int ox, oy, ow, oh;
+        tbo_frame_get_obj_relative (obj, &ox, &oy, &ow, &oh);
+
+        cairo_translate (cr, ox, oy);
+        cairo_rotate (cr, obj->angle);
+        cairo_rectangle (cr, 0, 0, ow, oh);
+        cairo_stroke (cr);
+
+        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
+    }
+}
+
+/* init methods */
+
+static void
+tbo_tool_text_init (TboToolText *self)
+{
+    self->font = NULL;
+    self->font_color = NULL;
+    self->text_selected = NULL;
+    self->text_buffer = NULL;
+
+    self->parent_instance.on_select = on_select;
+    self->parent_instance.on_unselect = on_unselect;
+    self->parent_instance.on_click = on_click;
+    self->parent_instance.drawing = drawing;
+}
+
+static void
+tbo_tool_text_class_init (TboToolTextClass *klass)
+{
+}
+
+/* object functions */
+
+GObject *
+tbo_tool_text_new ()
+{
+    GObject *tbo_tool;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_TEXT, NULL);
+    return tbo_tool;
+}
+
+GObject *
+tbo_tool_text_new_with_params (TboWindow *tbo)
+{
+    GObject *tbo_tool;
+    TboToolBase *tbo_tool_base;
+    tbo_tool = g_object_new (TBO_TYPE_TOOL_TEXT, NULL);
+    tbo_tool_base = TBO_TOOL_BASE (tbo_tool);
+    tbo_tool_base->tbo = tbo;
+    return tbo_tool;
+}
+
+gchar *
+tbo_tool_text_get_pango_font (TboToolText *self)
+{
+    if (self->font)
+    {
+        return (gchar *)gtk_font_button_get_font_name (GTK_FONT_BUTTON (self->font));
+    }
+
+    return DEFAULT_PANGO_FONT;
+}
+gchar *
+tbo_tool_text_get_font_name (TboToolText *self)
+{
+    PangoFontDescription *pango_font = NULL;
+
+    if (self->font)
+    {
+        pango_font = pango_font_description_from_string (
+                gtk_font_button_get_font_name (GTK_FONT_BUTTON (self->font)));
+        return (gchar *)pango_font_description_get_family (pango_font);
+    }
+
+    return NULL;
+}
+
+void
+tbo_tool_text_set_selected (TboToolText *self, TboObjectText *text)
+{
+    char *str = tbo_object_text_get_text (text);
+    self->text_selected = NULL;
+    gtk_font_button_set_font_name (GTK_FONT_BUTTON (self->font), tbo_object_text_get_string (text));
+    gtk_color_button_set_color (GTK_COLOR_BUTTON (self->font_color), text->font_color);
+    gtk_text_buffer_set_text (self->text_buffer, str, -1);
+    self->text_selected = text;
+}
+
diff --git a/src/tbo-tool-text.h b/src/tbo-tool-text.h
new file mode 100644 (file)
index 0000000..caef357
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOL_TEXT_H__
+#define __TBO_TOOL_TEXT_H__
+
+#include <glib-object.h>
+#include <cairo.h>
+#include <gtk/gtk.h>
+#include "tbo-tool-base.h"
+#include "tbo-window.h"
+#include "tbo-object-text.h"
+
+#define TBO_TYPE_TOOL_TEXT            (tbo_tool_text_get_type ())
+#define TBO_TOOL_TEXT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOL_TEXT, TboToolText))
+#define TBO_IS_TOOL_TEXT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOL_TEXT))
+#define TBO_TOOL_TEXT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOL_TEXT, TboToolTextClass))
+#define TBO_IS_TOOL_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOL_TEXT))
+#define TBO_TOOL_TEXT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOL_TEXT, TboToolTextClass))
+
+typedef struct _TboToolText      TboToolText;
+typedef struct _TboToolTextClass TboToolTextClass;
+
+struct _TboToolText
+{
+    TboToolBase parent_instance;
+
+    /* instance members */
+    GtkWidget *font;
+    GtkWidget *font_color;
+    TboObjectText *text_selected;
+    GtkTextBuffer *text_buffer;
+};
+
+struct _TboToolTextClass
+{
+    TboToolBaseClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOL_TEXT */
+GType tbo_tool_text_get_type (void);
+
+/*
+ * Method definitions.
+ */
+GObject * tbo_tool_text_new ();
+GObject * tbo_tool_text_new_with_params (TboWindow *tbo);
+gchar * tbo_tool_text_get_pango_font (TboToolText *self);
+gchar * tbo_tool_text_get_font_name (TboToolText *self);
+void tbo_tool_text_set_selected (TboToolText *self, TboObjectText *text);
+
+#endif /* __TBO_TOOL_TEXT_H__ */
+
diff --git a/src/tbo-toolbar.c b/src/tbo-toolbar.c
new file mode 100644 (file)
index 0000000..37e447f
--- /dev/null
@@ -0,0 +1,496 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <glib/gi18n.h>
+#include "tbo-window.h"
+#include "tbo-toolbar.h"
+#include "comic.h"
+#include "tbo-object-pixmap.h"
+#include "comic-new-dialog.h"
+#include "comic-open-dialog.h"
+#include "comic-saveas-dialog.h"
+#include "custom-stock.h"
+#include "tbo-drawing.h"
+
+G_DEFINE_TYPE (TboToolbar, tbo_toolbar, G_TYPE_OBJECT);
+
+
+static gboolean select_tool (GtkAction *action, TboToolbar *toolbar);
+
+/* callbacks */
+
+static gboolean
+add_new_page (GtkAction *action, TboWindow *tbo)
+{
+    Page *page = tbo_comic_new_page (tbo->comic);
+    int nth = tbo_comic_page_nth (tbo->comic, page);
+    gtk_notebook_insert_page (GTK_NOTEBOOK (tbo->notebook),
+                              create_darea (tbo),
+                              NULL,
+                              nth);
+    tbo_window_update_status (tbo, 0, 0);
+    tbo_toolbar_update (tbo->toolbar);
+    return FALSE;
+}
+
+static gboolean
+del_current_page (GtkAction *action, TboWindow *tbo)
+{
+    int nth = tbo_comic_page_index (tbo->comic);
+    tbo_comic_del_current_page (tbo->comic);
+    tbo_window_set_current_tab_page (tbo, TRUE);
+    gtk_notebook_remove_page (GTK_NOTEBOOK (tbo->notebook), nth);
+    tbo_window_update_status (tbo, 0, 0);
+    tbo_toolbar_update (tbo->toolbar);
+    return FALSE;
+}
+
+static gboolean
+next_page (GtkAction *action, TboWindow *tbo)
+{
+    tbo_comic_next_page (tbo->comic);
+    tbo_window_set_current_tab_page (tbo, TRUE);
+    tbo_toolbar_update (tbo->toolbar);
+    tbo_window_update_status (tbo, 0, 0);
+    tbo_drawing_adjust_scroll (TBO_DRAWING (tbo->drawing));
+
+    return FALSE;
+}
+
+static gboolean
+prev_page (GtkAction *action, TboWindow *tbo)
+{
+    tbo_comic_prev_page (tbo->comic);
+    tbo_window_set_current_tab_page (tbo, TRUE);
+    tbo_toolbar_update (tbo->toolbar);
+    tbo_window_update_status (tbo, 0, 0);
+    tbo_drawing_adjust_scroll (TBO_DRAWING (tbo->drawing));
+
+    return FALSE;
+}
+
+static gboolean
+zoom_100 (GtkAction *action, TboWindow *tbo)
+{
+    tbo_drawing_zoom_100 (TBO_DRAWING (tbo->drawing));
+    return FALSE;
+}
+
+static gboolean
+zoom_fit (GtkAction *action, TboWindow *tbo)
+{
+    tbo_drawing_zoom_fit (TBO_DRAWING (tbo->drawing));
+    return FALSE;
+}
+
+static gboolean
+zoom_in (GtkAction *action, TboWindow *tbo)
+{
+    tbo_drawing_zoom_in (TBO_DRAWING (tbo->drawing));
+    return FALSE;
+}
+
+static gboolean
+zoom_out (GtkAction *action, TboWindow *tbo)
+{
+    tbo_drawing_zoom_out (TBO_DRAWING (tbo->drawing));
+    return FALSE;
+}
+
+static gboolean
+add_pix (GtkAction *action, TboWindow *tbo)
+{
+    GtkWidget *dialog;
+    GtkFileFilter *filter;
+
+    dialog = gtk_file_chooser_dialog_new (_("Add an Image"),
+                     GTK_WINDOW (tbo->window),
+                     GTK_FILE_CHOOSER_ACTION_OPEN,
+                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                     NULL);
+
+    filter = gtk_file_filter_new ();
+    gtk_file_filter_set_name (filter, _("png"));
+    gtk_file_filter_add_pattern (filter, "*.png");
+    gtk_file_filter_add_pattern (filter, "*.PNG");
+    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+    filter = gtk_file_filter_new ();
+    gtk_file_filter_set_name (filter, _("All files"));
+    gtk_file_filter_add_pattern (filter, "*");
+    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        gchar *filename;
+        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+        TboObjectPixmap *piximage = TBO_OBJECT_PIXMAP (tbo_object_pixmap_new_with_params (0, 0, 0, 0, filename));
+        tbo_frame_add_obj (tbo_drawing_get_current_frame (TBO_DRAWING (tbo->drawing)), TBO_OBJECT_BASE (piximage));
+        tbo_drawing_update (TBO_DRAWING (tbo->drawing));
+        g_free (filename);
+    }
+
+    gtk_widget_destroy (dialog);
+    return FALSE;
+}
+
+/* actions */
+
+static const GtkActionEntry tbo_tools_entries [] = {
+    { "NewFileTool", GTK_STOCK_NEW, N_("_New"), "<control>N",
+      N_("New Comic"),
+      G_CALLBACK (tbo_comic_new_dialog) },
+
+    { "OpenFileTool", GTK_STOCK_OPEN, N_("_Open"), "<control>O",
+      N_("Open comic"),
+      G_CALLBACK (tbo_comic_open_dialog) },
+
+    { "SaveFileTool", GTK_STOCK_SAVE, N_("_Save"), "<control>S",
+      N_("Save current document"),
+      G_CALLBACK (tbo_comic_save_dialog) },
+
+    // Page tools
+    { "NewPage", GTK_STOCK_ADD, N_("New Page"), "<control>P",
+      N_("New page"),
+      G_CALLBACK (add_new_page) },
+
+    { "DelPage", GTK_STOCK_DELETE, N_("Delete Page"), "",
+      N_("Delete current page"),
+      G_CALLBACK (del_current_page) },
+
+    { "PrevPage", GTK_STOCK_GO_BACK, N_("Prev Page"), "",
+      N_("Prev page"),
+      G_CALLBACK (prev_page) },
+
+    { "NextPage", GTK_STOCK_GO_FORWARD, N_("Next Page"), "",
+      N_("Next page"),
+      G_CALLBACK (next_page) },
+
+    // Zoom tools
+    { "Zoomin", GTK_STOCK_ZOOM_IN, N_("Zoom in"), "",
+      N_("Zoom in"),
+      G_CALLBACK (zoom_in) },
+    { "Zoom100", GTK_STOCK_ZOOM_100, N_("Zoom 1:1"), "",
+      N_("Zoom 1:1"),
+      G_CALLBACK (zoom_100) },
+    { "Zoomfit", GTK_STOCK_ZOOM_FIT, N_("Zoom fit"), "",
+      N_("Zoom fit"),
+      G_CALLBACK (zoom_fit) },
+    { "Zoomout", GTK_STOCK_ZOOM_OUT, N_("Zoom out"), "",
+      N_("Zoom out"),
+      G_CALLBACK (zoom_out) },
+
+    // Png image tool
+    { "Pix", TBO_STOCK_PIX, N_("Image"), "",
+      N_("Image"),
+      G_CALLBACK (add_pix) },
+};
+
+/* toggle actions */
+static const GtkToggleActionEntry tbo_tools_toggle_entries [] = {
+    // Page view tools
+    { "NewFrame", TBO_STOCK_FRAME, N_("New _Frame"), "f",
+      N_("New Frame"),
+      G_CALLBACK (select_tool), FALSE },
+
+    { "Selector", TBO_STOCK_SELECTOR, N_("Selector"), "s",
+      N_("Selector"),
+      G_CALLBACK (select_tool), FALSE },
+
+    // Frame view tools
+    { "Doodle", TBO_STOCK_DOODLE, N_("Doodle"), "d",
+      N_("Doodle"),
+      G_CALLBACK (select_tool), FALSE },
+    { "Bubble", TBO_STOCK_BUBBLE, N_("Booble"), "b",
+      N_("Bubble"),
+      G_CALLBACK (select_tool), FALSE },
+    { "Text", TBO_STOCK_TEXT, N_("Text"), "t",
+      N_("Text"),
+      G_CALLBACK (select_tool), FALSE },
+};
+
+/* aux */
+
+static void
+unselect_tool (TboToolbar *self)
+{
+    int i;
+    GtkToggleAction *action;
+
+    if (!self->selected_tool)
+        return;
+
+    self->selected_tool->on_unselect (self->selected_tool);
+    action = (GtkToggleAction *) gtk_action_group_get_action (self->action_group,
+                                                    self->selected_tool->action);
+    gtk_toggle_action_set_active (action, FALSE);
+}
+
+static gboolean
+select_tool (GtkAction *action, TboToolbar *toolbar)
+{
+    GtkToggleAction *toggle_action;
+    int i;
+    const gchar *name;
+    TboWindow *tbo = toolbar->tbo;
+    TboToolBase *tool;
+
+    toggle_action = (GtkToggleAction *) action;
+    name = gtk_action_get_name (action);
+
+    /* starting at 1 because 0 is NULL, TBO_TOOLBAR_NONE */
+    for (i=1; i < TBO_TOOLBAR_N_TOOLS; i++)
+    {
+        tool = toolbar->tools[i];
+        if (strcmp (tool->action, name) == 0)
+            break;
+    }
+
+    if (gtk_toggle_action_get_active (toggle_action))
+        tbo_toolbar_set_selected_tool (toolbar, i);
+    else
+        tbo_toolbar_set_selected_tool (toolbar, TBO_TOOLBAR_NONE);
+    tbo_window_update_status (tbo, 0, 0);
+    return FALSE;
+}
+
+static GtkWidget *
+generate_toolbar (TboToolbar *self)
+{
+    GtkWidget *toolbar;
+    GtkUIManager *manager;
+    GError *error = NULL;
+
+    manager = gtk_ui_manager_new ();
+    gtk_ui_manager_add_ui_from_file (manager, DATA_DIR "/ui/tbo-toolbar-ui.xml", &error);
+    if (error != NULL)
+    {
+        g_warning ("Could not merge tbo-toolbar-ui.xml: %s", error->message);
+        g_error_free (error);
+    }
+
+    self->action_group = gtk_action_group_new ("ToolsActions");
+    gtk_action_group_set_translation_domain (self->action_group, NULL);
+    gtk_action_group_add_actions (self->action_group, tbo_tools_entries,
+                        G_N_ELEMENTS (tbo_tools_entries), self->tbo);
+    gtk_action_group_add_toggle_actions (self->action_group, tbo_tools_toggle_entries,
+                        G_N_ELEMENTS (tbo_tools_toggle_entries), self);
+
+    gtk_ui_manager_insert_action_group (manager, self->action_group, 0);
+
+    toolbar = gtk_ui_manager_get_widget (manager, "/toolbar");
+    return toolbar;
+}
+
+
+/* init methods */
+
+static void
+tbo_toolbar_init (TboToolbar *self)
+{
+    self->tbo = NULL;
+    self->selected_tool = NULL;
+    self->action_group = NULL;
+    self->tools = NULL;
+}
+
+static void
+tbo_toolbar_finalize (GObject *self)
+{
+    if (TBO_TOOLBAR (self)->tools)
+    {
+        int i;
+        for (i=1; i < TBO_TOOLBAR_N_TOOLS; i++)
+        {
+            g_object_unref (G_OBJECT (TBO_TOOLBAR (self)->tools[i]));
+        }
+        g_free (TBO_TOOLBAR (self)->tools);
+    }
+
+    if (TBO_TOOLBAR (self)->toolbar)
+        g_object_unref (G_OBJECT (TBO_TOOLBAR (self)->toolbar));
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (tbo_toolbar_parent_class)->finalize (self);
+}
+
+static void
+tbo_toolbar_class_init (TboToolbarClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+    gobject_class->finalize = tbo_toolbar_finalize;
+}
+
+/* object functions */
+
+GObject *
+tbo_toolbar_new ()
+{
+    GObject *toolbar;
+    toolbar = g_object_new (TBO_TYPE_TOOLBAR, NULL);
+    return toolbar;
+}
+
+GObject *
+tbo_toolbar_new_with_params (TboWindow *tbo)
+{
+    GObject *obj;
+    TboToolbar *toolbar;
+    TboToolBase *tool;
+    obj = tbo_toolbar_new ();
+    
+    toolbar = TBO_TOOLBAR (obj);
+    toolbar->tbo = tbo;
+    /* Adding tools */
+
+    toolbar->tools = g_new (TboToolBase*, TBO_TOOLBAR_N_TOOLS);
+    toolbar->tools[TBO_TOOLBAR_NONE] = NULL;
+
+    /* selector */
+    tool = TBO_TOOL_BASE (tbo_tool_selector_new_with_params (tbo));
+    tbo_tool_base_set_action (tool, "Selector");
+    toolbar->tools[TBO_TOOLBAR_SELECTOR] = tool;
+
+    /* frame */
+    tool = TBO_TOOL_BASE (tbo_tool_frame_new_with_params (tbo));
+    tbo_tool_base_set_action (tool, "NewFrame");
+    toolbar->tools[TBO_TOOLBAR_FRAME] = tool;
+
+    /* doodle */
+    tool = TBO_TOOL_BASE (tbo_tool_doodle_new_with_params (tbo));
+    tbo_tool_base_set_action (tool, "Doodle");
+    toolbar->tools[TBO_TOOLBAR_DOODLE] = tool;
+
+    /* bubble */
+    tool = TBO_TOOL_BASE (tbo_tool_bubble_new_with_params (tbo));
+    tbo_tool_base_set_action (tool, "Bubble");
+    toolbar->tools[TBO_TOOLBAR_BUBBLE] = tool;
+
+    /* text */
+    tool = TBO_TOOL_BASE (tbo_tool_text_new_with_params (tbo));
+    tbo_tool_base_set_action (tool, "Text");
+    toolbar->tools[TBO_TOOLBAR_TEXT] = tool;
+
+    toolbar->toolbar = generate_toolbar (toolbar);
+
+    return obj;
+}
+
+TboToolBase *
+tbo_toolbar_get_selected_tool (TboToolbar *self)
+{
+    return self->selected_tool;
+}
+
+void
+tbo_toolbar_set_selected_tool (TboToolbar *self, enum Tool tool)
+{
+    GtkToggleAction *action;
+    TboToolBase *t;
+
+    if (self->selected_tool == self->tools[tool])
+        return;
+
+    unselect_tool (self);
+    self->selected_tool = NULL;
+    if (self->tools[tool])
+    {
+        t = self->tools[tool];
+        action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (self->action_group, t->action));
+
+        if (gtk_action_is_sensitive (GTK_ACTION (action)))
+        {
+            self->selected_tool = t;
+            self->selected_tool->on_select (self->selected_tool);
+            gtk_toggle_action_set_active (action, TRUE);
+        }
+    }
+    TBO_DRAWING (self->tbo->drawing)->tool = self->selected_tool;
+    tbo_toolbar_update (self);
+}
+
+GtkWidget *
+tbo_toolbar_get_toolbar (TboToolbar *self)
+{
+    return self->toolbar;
+}
+
+void
+tbo_toolbar_update (TboToolbar *self)
+{
+    GtkAction *prev;
+    GtkAction *next;
+    GtkAction *delete;
+
+    GtkAction *doodle;
+    GtkAction *bubble;
+    GtkAction *text;
+    GtkAction *new_frame;
+    GtkAction *pix;
+    if (!self)
+        return;
+
+    TboWindow *tbo = self->tbo;
+
+    if (!self->action_group)
+        return;
+
+    // Page next, prev and delete button sensitive
+    prev = gtk_action_group_get_action (self->action_group, "PrevPage");
+    next = gtk_action_group_get_action (self->action_group, "NextPage");
+    delete = gtk_action_group_get_action (self->action_group, "DelPage");
+
+    if (tbo_comic_page_first (tbo->comic))
+        gtk_action_set_sensitive (prev, FALSE);
+    else
+        gtk_action_set_sensitive (prev, TRUE);
+
+    if (tbo_comic_page_last (tbo->comic))
+        gtk_action_set_sensitive (next, FALSE);
+    else
+        gtk_action_set_sensitive (next, TRUE);
+    if (tbo_comic_len (tbo->comic) > 1)
+        gtk_action_set_sensitive (delete, TRUE);
+    else
+        gtk_action_set_sensitive (delete, FALSE);
+
+    // Frame view disabled in page view
+    doodle = gtk_action_group_get_action (self->action_group, "Doodle");
+    bubble = gtk_action_group_get_action (self->action_group, "Bubble");
+    text = gtk_action_group_get_action (self->action_group, "Text");
+    new_frame = gtk_action_group_get_action (self->action_group, "NewFrame");
+    pix = gtk_action_group_get_action (self->action_group, "Pix");
+
+    if (!tbo_drawing_get_current_frame (TBO_DRAWING (tbo->drawing)))
+    {
+        gtk_action_set_sensitive (doodle, FALSE);
+        gtk_action_set_sensitive (bubble, FALSE);
+        gtk_action_set_sensitive (text, FALSE);
+        gtk_action_set_sensitive (pix, FALSE);
+        gtk_action_set_sensitive (new_frame, TRUE);
+    }
+    else
+    {
+        gtk_action_set_sensitive (doodle, TRUE);
+        gtk_action_set_sensitive (bubble, TRUE);
+        gtk_action_set_sensitive (text, TRUE);
+        gtk_action_set_sensitive (pix, TRUE);
+        gtk_action_set_sensitive (new_frame, FALSE);
+    }
+    update_menubar (tbo);
+}
diff --git a/src/tbo-toolbar.h b/src/tbo-toolbar.h
new file mode 100644 (file)
index 0000000..cdafd8b
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * This file is part of TBO, a gnome comic editor
+ * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __TBO_TOOLBAR_H__
+#define __TBO_TOOLBAR_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include "tbo-tool-base.h"
+#include "tbo-types.h"
+
+#define TBO_TYPE_TOOLBAR            (tbo_toolbar_get_type ())
+#define TBO_TOOLBAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TBO_TYPE_TOOLBAR, TboToolbar))
+#define TBO_IS_TOOLBAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TBO_TYPE_TOOLBAR))
+#define TBO_TOOLBAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TBO_TYPE_TOOLBAR, TboToolbarClass))
+#define TBO_IS_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TBO_TYPE_TOOLBAR))
+#define TBO_TOOLBAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TBO_TYPE_TOOLBAR, TboToolbarClass))
+
+typedef struct _TboToolbar      TboToolbar;
+typedef struct _TboToolbarClass TboToolbarClass;
+
+struct _TboToolbar
+{
+    GObject parent_instance;
+
+    /* instance members */
+    TboWindow *tbo;
+
+    TboToolBase *selected_tool;
+    GtkActionGroup *action_group;
+    GtkWidget *toolbar;
+    TboToolBase **tools;
+};
+
+struct _TboToolbarClass
+{
+    GObjectClass parent_class;
+
+    /* class members */
+};
+
+/* used by TBO_TYPE_TOOLBAR */
+GType tbo_toolbar_get_type (void);
+
+/*
+ * Method definitions.
+ */
+
+enum Tool
+{
+    TBO_TOOLBAR_NONE,
+    TBO_TOOLBAR_SELECTOR,
+    TBO_TOOLBAR_FRAME,
+    TBO_TOOLBAR_DOODLE,
+    TBO_TOOLBAR_BUBBLE,
+    TBO_TOOLBAR_TEXT,
+    TBO_TOOLBAR_N_TOOLS
+};
+
+GObject * tbo_toolbar_new ();
+GObject * tbo_toolbar_new_with_params (TboWindow *tbo);
+
+TboToolBase * tbo_toolbar_get_selected_tool (TboToolbar *self);
+void tbo_toolbar_set_selected_tool (TboToolbar *self, enum Tool tool);
+GtkWidget * tbo_toolbar_get_toolbar (TboToolbar *self);
+void tbo_toolbar_update (TboToolbar *self);
+
+#endif /* __TBO_TOOLBAR_H__ */
+
index 843565c..06467cd 100644 (file)
@@ -22,7 +22,7 @@
 #include <gtk/gtk.h>
 #include <glib.h>
 #include <cairo.h>
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "tbo-tooltip.h"
 #include "tbo-window.h"
 
@@ -108,7 +108,7 @@ tbo_tooltip_set (const char *tooltip, int x, int y, TboWindow *tbo)
         }
     }
 
-    update_drawing (tbo);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
 }
 
 GString *
index bee464d..9681e1a 100644 (file)
@@ -59,5 +59,8 @@ typedef struct
 
 } Frame;
 
+struct _TboWindow;
+typedef struct _TboWindow TboWindow;
+
 #endif
 
index 8fac587..6216bc8 100644 (file)
 #include <malloc.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+#include "tbo-types.h"
 #include "tbo-window.h"
 #include "comic.h"
 #include "ui-menu.h"
-#include "ui-toolbar.h"
-#include "ui-drawing.h"
-#include "tbo-types.h"
+#include "tbo-toolbar.h"
+#include "tbo-drawing.h"
+#include "tbo-tool-selector.h"
 
 static int NWINDOWS = 0;
+static gboolean KEY_BINDER = TRUE;
+
+static gboolean
+notebook_switch_page_cb (GtkNotebook     *notebook,
+                         GtkNotebookPage *page,
+                         guint            page_num,
+                         TboWindow        *tbo)
+{
+    tbo_comic_set_current_page_nth (tbo->comic, page_num);
+    tbo_window_set_current_tab_page (tbo, FALSE);
+    tbo_toolbar_update (tbo->toolbar);
+    tbo_window_update_status (tbo, 0, 0);
+    tbo_drawing_adjust_scroll (TBO_DRAWING (tbo->drawing));
+    return FALSE;
+}
+
+static gboolean
+on_key_cb (GtkWidget    *widget,
+           GdkEventKey  *event,
+           TboWindow    *tbo)
+{
+    TboToolBase *tool;
+    TboDrawing *drawing = TBO_DRAWING (tbo->drawing);
+
+    tool = tbo_toolbar_get_selected_tool (tbo->toolbar);
+    if (tool)
+        tool->on_key (tool, widget, event);
+
+    tbo_window_update_status (tbo, 0, 0);
+
+    if (KEY_BINDER)
+    {
+        switch (event->keyval)
+        {
+            case GDK_plus:
+                tbo_drawing_zoom_in (drawing);
+                break;
+            case GDK_minus:
+                tbo_drawing_zoom_out (drawing);
+                break;
+            case GDK_1:
+                tbo_drawing_zoom_100 (drawing);
+                break;
+            case GDK_2:
+                tbo_drawing_zoom_fit (drawing);
+                break;
+            case GDK_s:
+                tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_SELECTOR);
+                break;
+            case GDK_t:
+                tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_TEXT);
+                break;
+            case GDK_d:
+                tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_DOODLE);
+                break;
+            case GDK_b:
+                tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_BUBBLE);
+                break;
+            case GDK_f:
+                tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_FRAME);
+                break;
+            default:
+                break;
+        }
+    }
+    return FALSE;
+}
+
+static gboolean
+on_move_cb (GtkWidget     *widget,
+           GdkEventMotion *event,
+           TboWindow      *tbo)
+{
+    tbo_window_update_status (tbo, (int)event->x, (int)event->y);
+    return FALSE;
+}
 
 TboWindow *
 tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll,
@@ -107,9 +185,11 @@ create_darea (TboWindow *tbo)
 
     scrolled = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    darea = get_drawing_area (width, height);
+    darea = tbo_drawing_new_with_params (tbo->comic);
     gtk_container_add (GTK_CONTAINER (scrolled), darea);
-    darea_connect_signals (tbo, darea);
+    tbo_drawing_init_dnd (TBO_DRAWING (darea), tbo);
+
+    g_signal_connect_after (darea, "motion_notify_event", G_CALLBACK (on_move_cb), tbo);
     gtk_widget_show_all (scrolled);
 
     return scrolled;
@@ -124,7 +204,7 @@ tbo_new_tbo (int width, int height)
     GtkWidget *container;
     GtkWidget *tool_paned;
     GtkWidget *menu;
-    GtkWidget *toolbar;
+    TboToolbar *toolbar;
     GtkWidget *scrolled;
     GtkWidget *scrolled2;
     GtkWidget *darea;
@@ -148,7 +228,7 @@ tbo_new_tbo (int width, int height)
     gtk_window_set_title (GTK_WINDOW (window), comic->title);
     scrolled = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    darea = get_drawing_area (width, height);
+    darea = tbo_drawing_new_with_params (comic);
     gtk_container_add (GTK_CONTAINER (scrolled), darea);
     notebook = gtk_notebook_new ();
     gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
@@ -167,32 +247,33 @@ tbo_new_tbo (int width, int height)
     status = gtk_statusbar_new ();
 
     tbo = tbo_window_new (window, scrolled, scrolled2, notebook, tool_paned, status, container, comic);
-    tbo_window_update_status (tbo, 0, 0);
 
-    // ui-drawing.c (expose, motion and click)
-    darea_connect_signals (tbo, darea);
+    // Generando la barra de herramientas de la aplicacion
+    toolbar = TBO_TOOLBAR (tbo_toolbar_new_with_params (tbo));
+    tbo->toolbar = toolbar;
+
+    // drag & drop
+    tbo_drawing_init_dnd (TBO_DRAWING (darea), tbo);
 
     // key press event
     g_signal_connect (tbo->notebook, "switch-page", G_CALLBACK (notebook_switch_page_cb), tbo);
     g_signal_connect (tbo->window, "key_press_event", G_CALLBACK (on_key_cb), tbo);
     g_signal_connect (window, "delete-event", G_CALLBACK (tbo_window_free_cb), tbo);
 
-    // Generando la barra de herramientas de la aplicacion
-    toolbar = generate_toolbar (tbo);
-
     // Generando el menu de la aplicacion
     menu = generate_menu (tbo);
 
     gtk_box_pack_start (GTK_BOX (container), menu, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (container), toolbar, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (container), toolbar->toolbar, FALSE, FALSE, 0);
 
     gtk_container_add (GTK_CONTAINER (container), hpaned);
 
     gtk_box_pack_start (GTK_BOX (container), status, FALSE, FALSE, 0);
 
     gtk_widget_show_all (window);
-    set_selected_tool_and_action (SELECTOR, tbo);
+    tbo_toolbar_set_selected_tool (toolbar, TBO_TOOLBAR_SELECTOR);
 
+    tbo_window_update_status (tbo, 0, 0);
     return tbo;
 }
 
@@ -206,7 +287,7 @@ tbo_window_update_status (TboWindow *tbo, int x, int y)
                     x, y,
                     tbo_page_len (tbo_comic_get_current_page (tbo->comic)));
     gtk_statusbar_push (GTK_STATUSBAR (tbo->status), 0, buffer);
-    update_toolbar (tbo);
+    tbo_toolbar_update (tbo->toolbar);
 }
 
 gboolean
@@ -221,3 +302,25 @@ tbo_empty_tool_area (TboWindow *tbo)
 {
     gtk_container_foreach (GTK_CONTAINER (tbo->toolarea), (GtkCallback)remove_cb, NULL);
 }
+
+void
+tbo_window_set_key_binder (TboWindow *tbo, gboolean keyb)
+{
+    KEY_BINDER = keyb;
+}
+
+void
+tbo_window_set_current_tab_page (TboWindow *tbo, gboolean setit)
+{
+    int nth;
+
+    nth = tbo_comic_page_index (tbo->comic);
+    if (setit)
+        gtk_notebook_set_current_page (GTK_NOTEBOOK (tbo->notebook), nth);
+    tbo->dw_scroll = gtk_notebook_get_nth_page (GTK_NOTEBOOK (tbo->notebook), nth);
+    tbo->drawing = gtk_bin_get_child (GTK_BIN (tbo->dw_scroll));
+
+    tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_SELECTOR);
+    tbo_tool_selector_set_selected (TBO_TOOL_SELECTOR (tbo->toolbar->selected_tool), NULL);
+    tbo_tool_selector_set_selected_obj (TBO_TOOL_SELECTOR (tbo->toolbar->selected_tool), NULL);
+}
index 8527c75..6b3d82a 100644 (file)
 #define __TBO_WINDOW__
 
 #include <gtk/gtk.h>
+#include "tbo-toolbar.h"
 #include "tbo-types.h"
 
-typedef struct
+struct _TboWindow
 {
     GtkWidget *window;
     GtkWidget *dw_scroll;
@@ -33,9 +34,10 @@ typedef struct
     GtkWidget *drawing;
     GtkWidget *status;
     GtkWidget *vbox;
+    TboToolbar *toolbar;
     Comic *comic;
     char *path;
-} TboWindow;
+};
 
 TboWindow *tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll, GtkWidget *scroll2, GtkWidget *notebook, GtkWidget *toolarea, GtkWidget *status, GtkWidget *vbox, Comic *comic);
 void tbo_window_free (TboWindow *tbo);
@@ -45,6 +47,7 @@ TboWindow * tbo_new_tbo (int width, int height);
 void tbo_window_update_status (TboWindow *tbo, int x, int y);
 void tbo_empty_tool_area (TboWindow *tbo);
 void tbo_window_set_path (TboWindow *tbo, const char *path);
+void tbo_window_set_current_tab_page (TboWindow *tbo, gboolean setit);
 GtkWidget *create_darea (TboWindow *tbo);
 
 #endif
diff --git a/src/text-tool.c b/src/text-tool.c
deleted file mode 100644 (file)
index a082d8d..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <cairo.h>
-#include "tbo-window.h"
-#include "tbo-object-text.h"
-#include "text-tool.h"
-#include "frame.h"
-#include "ui-drawing.h"
-
-static GtkWidget *FONT = NULL;
-static GtkWidget *FONT_COLOR = NULL;
-static TboObjectText *TEXT_SELECTED = NULL;
-static GtkTextBuffer *TEXT_BUFFER = NULL;
-
-gboolean
-on_tview_focus_in (GtkWidget *view, GdkEventFocus *event, gpointer data)
-{
-    set_key_binder (FALSE);
-    return FALSE;
-}
-
-gboolean
-on_tview_focus_out (GtkWidget *view, GdkEventFocus *event, gpointer data)
-{
-    set_key_binder (TRUE);
-    return FALSE;
-}
-
-
-gboolean
-on_text_change (GtkTextBuffer *buf, TboWindow *tbo)
-{
-    GtkTextIter start, end;
-    gtk_text_buffer_get_start_iter (buf, &start);
-    gtk_text_buffer_get_end_iter (buf, &end);
-
-    if (TEXT_SELECTED)
-    {
-        tbo_object_text_set_text (TEXT_SELECTED, gtk_text_buffer_get_text (buf, &start, &end, FALSE));
-        update_drawing (tbo);
-    }
-    return FALSE;
-}
-
-gboolean
-on_font_change (GtkFontButton *fbutton, TboWindow *tbo)
-{
-    if (TEXT_SELECTED)
-    {
-        tbo_object_text_change_font (TEXT_SELECTED, text_tool_get_pango_font ());
-        update_drawing (tbo);
-    }
-    return FALSE;
-}
-
-gboolean
-on_color_change (GtkColorButton *cbutton, TboWindow *tbo)
-{
-    if (TEXT_SELECTED)
-    {
-        GdkColor color;
-        gtk_color_button_get_color (GTK_COLOR_BUTTON (FONT_COLOR), &color);
-        tbo_object_text_change_color (TEXT_SELECTED, &color);
-        update_drawing (tbo);
-    }
-    return FALSE;
-}
-
-GtkWidget *
-setup_toolarea (TboWindow *tbo)
-{
-    GtkWidget *vbox;
-    GtkWidget *hbox;
-    GtkWidget *font_color_label = gtk_label_new (_("Text color:"));
-    GtkWidget *font_label = gtk_label_new (_("Font:"));
-    GtkWidget *scroll;
-    GtkWidget *view;
-
-    gtk_misc_set_alignment (GTK_MISC (font_label), 0, 0);
-    gtk_misc_set_alignment (GTK_MISC (font_color_label), 0, 0);
-
-    FONT = gtk_font_button_new ();
-    g_signal_connect (FONT, "font-set", G_CALLBACK (on_font_change), tbo);
-    FONT_COLOR = gtk_color_button_new ();
-    g_signal_connect (FONT_COLOR, "color-set", G_CALLBACK (on_color_change), tbo);
-
-    vbox = gtk_vbox_new (FALSE, 5);
-
-    hbox = gtk_hbox_new (FALSE, 5);
-    gtk_box_pack_start (GTK_BOX (hbox), font_label, TRUE, TRUE, 5);
-    gtk_box_pack_start (GTK_BOX (hbox), FONT, TRUE, TRUE, 5);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
-
-    hbox = gtk_hbox_new (FALSE, 5);
-    gtk_box_pack_start (GTK_BOX (hbox), font_color_label, TRUE, TRUE, 5);
-    gtk_box_pack_start (GTK_BOX (hbox), FONT_COLOR, TRUE, TRUE, 5);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
-
-    scroll = gtk_scrolled_window_new (NULL, NULL);
-    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    view = gtk_text_view_new ();
-    gtk_widget_add_events (view, GDK_FOCUS_CHANGE_MASK);
-    g_signal_connect (view, "focus-in-event", G_CALLBACK (on_tview_focus_in), tbo);
-    g_signal_connect (view, "focus-out-event", G_CALLBACK (on_tview_focus_out), tbo);
-
-    gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
-    TEXT_BUFFER = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
-    gtk_text_buffer_set_text (TEXT_BUFFER, "", -1);
-    g_signal_connect (TEXT_BUFFER, "changed", G_CALLBACK (on_text_change), tbo);
-    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), view);
-    gtk_box_pack_start (GTK_BOX (vbox), scroll, FALSE, FALSE, 5);
-
-    return vbox;
-}
-
-void text_tool_on_select (TboWindow *tbo)
-{
-    GtkWidget *toolarea = setup_toolarea (tbo);
-    gtk_widget_show_all (GTK_WIDGET (toolarea));
-    tbo_empty_tool_area (tbo);
-    gtk_container_add (GTK_CONTAINER (tbo->toolarea), toolarea);
-}
-
-void text_tool_on_unselect (TboWindow *tbo)
-{
-    /*
-    if (FONT)
-        gtk_widget_destroy (GTK_WIDGET (FONT));
-    if (FONT_COLOR)
-        gtk_widget_destroy (GTK_WIDGET (FONT_COLOR));
-    */
-    tbo_empty_tool_area (tbo);
-    set_key_binder (TRUE);
-}
-
-void text_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo)
-{}
-
-void text_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
-{
-    Frame *frame = get_frame_view ();
-    double r, g, b;
-    int x = (int)event->x;
-    int y = (int)event->y;
-    gboolean found = FALSE;
-    GList *obj_list;
-    TboObjectBase *obj;
-    TboObjectText *text;
-    GdkColor color;
-
-    for (obj_list = g_list_first (frame->objects); obj_list; obj_list = obj_list->next)
-    {
-        obj = TBO_OBJECT_BASE (obj_list->data);
-        if (TBO_IS_OBJECT_TEXT (obj) && tbo_frame_point_inside_obj (obj, x, y))
-        {
-            text = TBO_OBJECT_TEXT (obj);
-            found = TRUE;
-        }
-    }
-    if (!found)
-    {
-        x = tbo_frame_get_base_x (x);
-        y = tbo_frame_get_base_y (y);
-        gtk_color_button_get_color (GTK_COLOR_BUTTON (FONT_COLOR), &color);
-        text = TBO_OBJECT_TEXT (tbo_object_text_new_with_params (x, y, 100, 0,
-                                                _("Text"),
-                                                (gchar *)text_tool_get_pango_font (),
-                                                &color));
-        tbo_frame_add_obj (frame, TBO_OBJECT_BASE (text));
-    }
-    text_tool_set_selected (text);
-    update_drawing (tbo);
-}
-
-void text_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
-{}
-
-void text_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
-{}
-
-void text_tool_drawing (cairo_t *cr)
-{
-    const double dashes[] = {5, 5};
-    int x, y;
-
-    if (TEXT_SELECTED)
-    {
-        TboObjectBase *OBJ = TBO_OBJECT_BASE (TEXT_SELECTED);
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-        cairo_set_line_width (cr, 1);
-        cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
-        cairo_set_source_rgb (cr, 0.9, 0, 0);
-        int ox, oy, ow, oh;
-        tbo_frame_get_obj_relative (OBJ, &ox, &oy, &ow, &oh);
-
-        cairo_translate (cr, ox, oy);
-        cairo_rotate (cr, OBJ->angle);
-        cairo_rectangle (cr, 0, 0, ow, oh);
-        cairo_stroke (cr);
-
-        cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
-    }
-}
-
-const gchar *
-text_tool_get_font_name ()
-{
-    PangoFontDescription *pango_font = NULL;
-
-    if (FONT)
-    {
-        pango_font = pango_font_description_from_string (
-                gtk_font_button_get_font_name (GTK_FONT_BUTTON (FONT)));
-        return pango_font_description_get_family (pango_font);
-    }
-
-    return NULL;
-}
-
-char *
-text_tool_get_pango_font ()
-{
-    if (FONT)
-    {
-        return (char *)gtk_font_button_get_font_name (GTK_FONT_BUTTON (FONT));
-    }
-
-    return "Sans Normal 27";
-}
-
-void
-text_tool_set_selected (TboObjectText *text)
-{
-    char *str = tbo_object_text_get_text (text);
-    TEXT_SELECTED = NULL;
-    gtk_font_button_set_font_name (GTK_FONT_BUTTON (FONT), tbo_object_text_get_string (text));
-    gtk_color_button_set_color (GTK_COLOR_BUTTON (FONT_COLOR), text->font_color);
-    gtk_text_buffer_set_text (TEXT_BUFFER, str, -1);
-    TEXT_SELECTED = text;
-}
diff --git a/src/text-tool.h b/src/text-tool.h
deleted file mode 100644 (file)
index 93b02e3..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __TBO_TEXT_TOOL__
-#define __TBO_TEXT_TOOL__
-
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "tbo-object-text.h"
-#include "tbo-window.h"
-
-void text_tool_on_select (TboWindow *tbo);
-void text_tool_on_unselect (TboWindow *tbo);
-void text_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-void text_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void text_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-void text_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void text_tool_drawing (cairo_t *cr);
-char * text_tool_get_pango_font ();
-const gchar * text_tool_get_font_name ();
-void text_tool_set_selected (TboObjectText *text);
-
-#endif
diff --git a/src/ui-drawing.c b/src/ui-drawing.c
deleted file mode 100644 (file)
index a23a847..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <stdio.h>
-#include <cairo.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <stdlib.h>
-#include <glib/gi18n.h>
-#include <math.h>
-
-#include "ui-toolbar.h"
-
-#include "tbo-window.h"
-#include "ui-drawing.h"
-
-#include "comic.h"
-#include "page.h"
-#include "frame.h"
-
-#include "frame-tool.h"
-#include "selector-tool.h"
-#include "doodle-tool.h"
-#include "dnd.h"
-
-#include "tbo-tooltip.h"
-
-
-Frame *FRAME_VIEW = NULL;
-float ZOOM_STEP = 0.05;
-float ZOOM = 1;
-gboolean KEY_BINDER = TRUE;
-
-void
-tbo_drawing_draw_page (cairo_t *cr, Page *page, int w, int h)
-{
-    Frame *frame;
-    GList *frame_list;
-
-    // white background
-    cairo_set_source_rgb(cr, 1, 1, 1);
-    cairo_rectangle(cr, 0, 0, w, h);
-    cairo_fill(cr);
-
-    for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
-    {
-        // draw each frame
-        frame = (Frame *)frame_list->data;
-        tbo_frame_draw (frame, cr);
-    }
-}
-
-void
-tbo_drawing_draw (cairo_t *cr, TboWindow *tbo)
-{
-    Frame *frame;
-    GList *frame_list;
-    Page *page;
-
-    int w, h;
-
-    w = tbo->comic->width;
-    h = tbo->comic->height;
-    // white background
-    if (get_frame_view ())
-        cairo_set_source_rgb(cr, 0, 0, 0);
-    else
-        cairo_set_source_rgb(cr, 1, 1, 1);
-    cairo_rectangle(cr, 0, 0, w*ZOOM, h*ZOOM);
-    cairo_fill(cr);
-
-    cairo_scale (cr, ZOOM, ZOOM);
-
-    page = tbo_comic_get_current_page (tbo->comic);
-
-    if (!FRAME_VIEW)
-    {
-        for (frame_list = tbo_page_get_frames (page); frame_list; frame_list = frame_list->next)
-        {
-            // draw each frame
-            frame = (Frame *)frame_list->data;
-            tbo_frame_draw (frame, cr);
-        }
-    }
-    else
-    {
-        tbo_frame_draw_scaled (FRAME_VIEW, cr, w, h);
-    }
-}
-
-gboolean
-on_key_cb (GtkWidget    *widget,
-           GdkEventKey  *event,
-           TboWindow    *tbo)
-{
-    enum Tool tool;
-    void **data = malloc (sizeof(void *)*3);
-    data[0] = widget;
-    data[1] = event;
-    data[2] = tbo;
-
-    tool = get_selected_tool ();
-    tool_signal (tool, TOOL_KEY, data);
-    free (data);
-
-    tbo_window_update_status (tbo, 0, 0);
-
-    if (KEY_BINDER)
-    {
-        switch (event->keyval)
-        {
-            case GDK_plus:
-                tbo_drawing_zoom_in (tbo);
-                break;
-            case GDK_minus:
-                tbo_drawing_zoom_out (tbo);
-                break;
-            case GDK_1:
-                tbo_drawing_zoom_100 (tbo);
-                break;
-            case GDK_2:
-                tbo_drawing_zoom_fit (tbo);
-                break;
-            case GDK_s:
-                set_selected_tool_and_action (SELECTOR, tbo);
-                break;
-            case GDK_t:
-                set_selected_tool_and_action (TEXT, tbo);
-                break;
-            case GDK_d:
-                set_selected_tool_and_action (DOODLE, tbo);
-                break;
-            case GDK_b:
-                set_selected_tool_and_action (BUBBLE, tbo);
-                break;
-            case GDK_f:
-                set_selected_tool_and_action (FRAME, tbo);
-                break;
-            default:
-                break;
-        }
-    }
-    return FALSE;
-}
-
-gboolean
-on_expose_cb (GtkWidget      *widget,
-              GdkEventExpose *event,
-              TboWindow       *tbo)
-{
-    cairo_t *cr;
-    enum Tool tool;
-    GdkWindow *window;
-    gint w, h;
-
-    cr = gdk_cairo_create(GTK_LAYOUT (widget)->bin_window);
-    gdk_drawable_get_size (GDK_DRAWABLE (GTK_LAYOUT (widget)->bin_window), &w, &h);
-
-    cairo_set_source_rgb (cr, 0, 0, 0);
-    cairo_rectangle (cr, 0, 0, w, h);
-    cairo_fill (cr);
-
-    tbo_drawing_draw (cr, tbo);
-
-    tbo_tooltip_draw (cr);
-
-    // Update drawing helpers
-    tool = get_selected_tool ();
-    tool_signal (tool, TOOL_DRAWING, cr);
-
-    cairo_destroy(cr);
-
-    return FALSE;
-}
-
-gboolean
-on_move_cb (GtkWidget     *widget,
-           GdkEventMotion *event,
-           TboWindow      *tbo)
-{
-
-    enum Tool tool;
-    void **data = malloc (sizeof(void *)*3);
-    data[0] = widget;
-    event->x = event->x / ZOOM;
-    event->y = event->y / ZOOM;
-    data[1] = event;
-    data[2] = tbo;
-
-    tool = get_selected_tool ();
-    tool_signal (tool, TOOL_MOVE, data);
-    free (data);
-
-    tbo_window_update_status (tbo, (int)event->x, (int)event->y);
-
-    return FALSE;
-}
-
-gboolean
-on_click_cb (GtkWidget    *widget,
-           GdkEventButton *event,
-           TboWindow      *tbo)
-{
-    enum Tool tool;
-    void **data = malloc (sizeof(void *)*3);
-    data[0] = widget;
-    event->x = event->x / ZOOM;
-    event->y = event->y / ZOOM;
-    data[1] = event;
-    data[2] = tbo;
-
-    tool = get_selected_tool ();
-    switch (tool)
-    {
-        case BUBBLE:
-        case DOODLE:
-            set_selected_tool_and_action (SELECTOR, tbo);
-            tool = SELECTOR;
-        default:
-            tool_signal (tool, TOOL_CLICK, data);
-    }
-    free (data);
-
-    tbo_window_update_status (tbo, (int)event->x, (int)event->y);
-    return FALSE;
-}
-
-gboolean
-on_release_cb (GtkWidget    *widget,
-           GdkEventButton   *event,
-           TboWindow        *tbo)
-{
-    enum Tool tool;
-    void **data = malloc (sizeof(void *)*3);
-    data[0] = widget;
-    event->x = event->x / ZOOM;
-    event->y = event->y / ZOOM;
-
-    data[1] = event;
-    data[2] = tbo;
-
-    tool = get_selected_tool ();
-    tool_signal (tool, TOOL_RELEASE, data);
-    free (data);
-
-    tbo_window_update_status (tbo, (int)event->x, (int)event->y);
-    return FALSE;
-}
-
-GtkWidget *
-get_drawing_area (int width, int height)
-{
-
-    GtkWidget *drawing;
-
-    drawing = gtk_layout_new(NULL, NULL);
-    gtk_layout_set_size (GTK_LAYOUT (drawing), width+2, height+2);
-
-    return drawing;
-}
-
-void
-darea_connect_signals (TboWindow *tbo, GtkWidget *drawing)
-{
-    gtk_widget_add_events (drawing, GDK_BUTTON_PRESS_MASK |
-                                    GDK_BUTTON_RELEASE_MASK |
-                                    GDK_POINTER_MOTION_MASK);
-
-    g_signal_connect(drawing, "expose-event",
-            G_CALLBACK (on_expose_cb), tbo);
-
-    g_signal_connect (drawing, "button_press_event",
-            G_CALLBACK (on_click_cb), tbo);
-
-    g_signal_connect (drawing, "button_release_event",
-            G_CALLBACK (on_release_cb), tbo);
-
-    g_signal_connect (drawing, "motion_notify_event",
-            G_CALLBACK (on_move_cb), tbo);
-
-    // drag & drop
-    gtk_drag_dest_set (drawing, GTK_DEST_DEFAULT_ALL, TARGET_LIST, N_TARGETS, GDK_ACTION_COPY);
-    g_signal_connect (drawing, "drag-data-received", G_CALLBACK(drag_data_received_handl), tbo);
-}
-
-void
-darea_disconnect_signals (TboWindow *tbo, GtkWidget *drawing)
-{
-    g_signal_handlers_disconnect_by_func (drawing, G_CALLBACK (on_expose_cb), tbo);
-    g_signal_handlers_disconnect_by_func (drawing, G_CALLBACK (on_click_cb), tbo);
-    g_signal_handlers_disconnect_by_func (drawing, G_CALLBACK (on_release_cb), tbo);
-    g_signal_handlers_disconnect_by_func (drawing, G_CALLBACK (on_move_cb), tbo);
-    g_signal_handlers_disconnect_by_func (drawing, G_CALLBACK(drag_data_received_handl), tbo);
-}
-
-void
-update_drawing (TboWindow *tbo)
-{
-    gtk_widget_queue_draw_area (tbo->drawing,
-            0, 0,
-            tbo->drawing->allocation.width,
-            tbo->drawing->allocation.height);
-}
-
-void
-set_frame_view (Frame *frame)
-{
-    FRAME_VIEW = frame;
-}
-
-Frame *
-get_frame_view ()
-{
-    return FRAME_VIEW;
-}
-
-void tbo_drawing_zoom_in (TboWindow *tbo)
-{
-    ZOOM += ZOOM_STEP;
-    gtk_layout_set_size (GTK_LAYOUT (tbo->drawing), tbo->comic->width*ZOOM, tbo->comic->height*ZOOM);
-    update_drawing (tbo);
-}
-
-void tbo_drawing_zoom_out (TboWindow *tbo)
-{
-    ZOOM -= ZOOM_STEP;
-    gtk_layout_set_size (GTK_LAYOUT (tbo->drawing), tbo->comic->width*ZOOM, tbo->comic->height*ZOOM);
-    update_drawing (tbo);
-}
-
-void tbo_drawing_zoom_100 (TboWindow *tbo)
-{
-    ZOOM = 1;
-    gtk_layout_set_size (GTK_LAYOUT (tbo->drawing), tbo->comic->width*ZOOM, tbo->comic->height*ZOOM);
-    update_drawing (tbo);
-}
-
-void tbo_drawing_zoom_fit (TboWindow *tbo)
-{
-    float z1, z2;
-    int w, h;
-    w = tbo->drawing->allocation.width;
-    h = tbo->drawing->allocation.height;
-
-    z1 = fabs ((float)w / (float)tbo->comic->width);
-    z2 = fabs ((float)h / (float)tbo->comic->height);
-    ZOOM = z1 < z2 ? z1 : z2;
-
-    gtk_layout_set_size (GTK_LAYOUT (tbo->drawing), tbo->comic->width*ZOOM, tbo->comic->height*ZOOM);
-    update_drawing (tbo);
-}
-
-float
-tbo_drawing_get_zoom ()
-{
-    return ZOOM;
-}
-
-void
-set_key_binder (gboolean binder)
-{
-    KEY_BINDER = binder;
-}
-
-void
-tbo_drawing_adjust_scroll (TboWindow *tbo)
-{
-    gtk_layout_set_size (GTK_LAYOUT (tbo->drawing), tbo->comic->width*ZOOM, tbo->comic->height*ZOOM);
-    update_drawing (tbo);
-}
diff --git a/src/ui-drawing.h b/src/ui-drawing.h
deleted file mode 100644 (file)
index 28e46f0..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __UI_DRAWING__
-#define __UI_DRAWING__
-
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include "tbo-window.h"
-
-
-gboolean on_expose_cb(GtkWidget *widget, GdkEventExpose *event, TboWindow *tbo);
-gboolean on_move_cb(GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
-gboolean on_click_cb(GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-gboolean on_release_cb(GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
-gboolean on_key_cb(GtkWidget *widget, GdkEventKey *event, TboWindow *tbo);
-void darea_connect_signals (TboWindow *tbo, GtkWidget *drawing);
-void darea_disconnect_signals (TboWindow *tbo, GtkWidget *drawing);
-GtkWidget * get_drawing_area (int width, int height);
-void update_drawing (TboWindow *tbo);
-void set_frame_view (Frame *frame);
-Frame *get_frame_view ();
-void tbo_drawing_draw (cairo_t *cr, TboWindow *tbo);
-void tbo_drawing_draw_page (cairo_t *cr, Page *page, int w, int h);
-void tbo_drawing_zoom_in (TboWindow *tbo);
-void tbo_drawing_zoom_out (TboWindow *tbo);
-void tbo_drawing_zoom_100 (TboWindow *tbo);
-void tbo_drawing_zoom_fit (TboWindow *tbo);
-float tbo_drawing_get_zoom ();
-void set_key_binder (gboolean binder);
-void tbo_drawing_adjust_scroll (TboWindow *tbo);
-
-#endif
index b33e032..3755732 100644 (file)
@@ -27,9 +27,9 @@
 #include "comic-saveas-dialog.h"
 #include "comic-open-dialog.h"
 #include "tbo-window.h"
-#include "ui-drawing.h"
+#include "tbo-drawing.h"
 #include "export.h"
-#include "selector-tool.h"
+#include "tbo-tool-selector.h"
 #include "comic.h"
 #include "frame.h"
 #include "page.h"
@@ -47,13 +47,18 @@ update_menubar (TboWindow *tbo)
     int obj_n_elements = 4;
     gboolean activated = FALSE;
 
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
-    Frame *frame = selector_tool_get_selected_frame ();
+    if (!tbo->toolbar)
+        return;
+
+    TboDrawing *drawing = TBO_DRAWING (tbo->drawing);
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
+    Frame *frame = selector->selected_frame;
 
     if (!MENU_ACTION_GROUP)
         return;
 
-    if (get_frame_view () && obj)
+    if (tbo_drawing_get_current_frame (drawing) && obj)
     {
         for (i=0; i<elements; i++)
         {
@@ -61,7 +66,7 @@ update_menubar (TboWindow *tbo)
             gtk_action_set_sensitive (action, TRUE);
         }
     }
-    else if (!get_frame_view () && frame)
+    else if (!tbo_drawing_get_current_frame (drawing) && frame)
     {
         for (i=obj_n_elements; i<elements; i++)
         {
@@ -79,104 +84,107 @@ update_menubar (TboWindow *tbo)
     }
 }
 
-gboolean menu_handler (GtkWidget *widget, gpointer data){
-    printf ("Menu :%s\n", ((TboWindow *) data)->comic->title);
-    return FALSE;
-}
-
 gboolean
-clone_obj_cb (GtkWidget *widget, gpointer data)
+clone_obj_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
-    Frame *frame = selector_tool_get_selected_frame ();
-    Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
+    Frame *frame = selector->selected_frame;
+    Page *page = tbo_comic_get_current_page (tbo->comic);
+    TboDrawing *drawing = TBO_DRAWING (tbo->drawing);
 
-    if (!get_frame_view () && frame)
+    if (!tbo_drawing_get_current_frame (drawing) && frame)
     {
         Frame *cloned_frame = tbo_frame_clone (frame);
         cloned_frame->x += 10;
         cloned_frame->y -= 10;
         tbo_page_add_frame (page, cloned_frame);
-        set_selected (cloned_frame, (TboWindow*)data);
+        tbo_tool_selector_set_selected (selector, cloned_frame);
     }
-    else if (obj && get_frame_view ())
+    else if (obj && tbo_drawing_get_current_frame (drawing))
     {
         TboObjectBase *cloned_obj = obj->clone (obj);
         cloned_obj->x += 10;
         cloned_obj->y -= 10;
         tbo_frame_add_obj (frame, cloned_obj);
-        set_selected_obj (cloned_obj, (TboWindow*)data);
+        tbo_tool_selector_set_selected_obj (selector, cloned_obj);
     }
-    update_drawing ((TboWindow *)data);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
 gboolean
-delete_obj_cb (GtkWidget *widget, gpointer data)
+delete_obj_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboWindow *tbo = (TboWindow *)data;
-
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
-    Frame *frame = selector_tool_get_selected_frame ();
-    Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
+    Frame *frame = selector->selected_frame;
+    Page *page = tbo_comic_get_current_page (tbo->comic);
+    TboDrawing *drawing = TBO_DRAWING (tbo->drawing);
 
-    if (obj && get_frame_view ())
+    if (obj && tbo_drawing_get_current_frame (drawing))
     {
         tbo_frame_del_obj (frame, obj);
-        set_selected_obj (NULL, tbo);
+        tbo_tool_selector_set_selected_obj (selector, NULL);
     }
-    else if (!get_frame_view () && frame)
+    else if (!tbo_drawing_get_current_frame (drawing) && frame)
     {
         tbo_page_del_frame (page, frame);
-        set_selected (NULL, tbo);
+        tbo_tool_selector_set_selected (selector, NULL);
     }
-    update_drawing ((TboWindow *)data);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
 gboolean
-flip_v_cb (GtkWidget *widget, gpointer data)
+flip_v_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
     if (obj)
         tbo_object_base_flipv (obj);
-    update_drawing ((TboWindow *)data);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
 gboolean
-flip_h_cb (GtkWidget *widget, gpointer data)
+flip_h_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
     if (obj)
         tbo_object_base_fliph (obj);
-    update_drawing ((TboWindow *)data);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
 gboolean
-order_up_cb (GtkWidget *widget, gpointer data)
+order_up_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
+    Frame *current_frame = selector->selected_frame;
     if (obj)
-        tbo_object_base_order_up (obj);
-    update_drawing ((TboWindow *)data);
+        tbo_object_base_order_up (obj, current_frame);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
 gboolean
-order_down_cb (GtkWidget *widget, gpointer data)
+order_down_cb (GtkWidget *widget, TboWindow *tbo)
 {
-    TboObjectBase *obj = selector_tool_get_selected_obj ();
+    TboToolSelector *selector = TBO_TOOL_SELECTOR (tbo->toolbar->tools[TBO_TOOLBAR_SELECTOR]);
+    TboObjectBase *obj = selector->selected_object;
+    Frame *current_frame = selector->selected_frame;
     if (obj)
-        tbo_object_base_order_down (obj);
-    update_drawing ((TboWindow *)data);
+        tbo_object_base_order_down (obj, current_frame);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     return FALSE;
 }
 
-gboolean close_cb (GtkWidget *widget, gpointer data){
-    printf ("Ventana cerrada\n");
-    tbo_window_free_cb (widget, NULL, ((TboWindow *) data));
+gboolean close_cb (GtkWidget *widget, TboWindow *tbo)
+{
+    tbo_window_free_cb (widget, NULL, tbo);
     return FALSE;
 }
 
@@ -185,7 +193,7 @@ tutorial_cb (GtkWidget *widget, TboWindow *tbo){
     char *filename = DATA_DIR "/tut.tbo";
     tbo_comic_open (tbo, filename);
     tbo_window_set_path (tbo, filename);
-    update_drawing (tbo);
+    tbo_drawing_update (TBO_DRAWING (tbo->drawing));
     tbo_window_update_status (tbo, 0, 0);
     return FALSE;
 }
diff --git a/src/ui-toolbar.c b/src/ui-toolbar.c
deleted file mode 100644 (file)
index c372fad..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include "ui-menu.h"
-#include "ui-toolbar.h"
-#include "config.h"
-#include "comic-new-dialog.h"
-#include "comic-saveas-dialog.h"
-#include "comic-open-dialog.h"
-#include "tbo-window.h"
-#include "comic.h"
-#include "custom-stock.h"
-#include "ui-drawing.h"
-
-#include "frame-tool.h"
-#include "selector-tool.h"
-#include "doodle-tool.h"
-#include "text-tool.h"
-#include "tbo-object-pixmap.h"
-
-static int SELECTED_TOOL = NONE;
-static GtkActionGroup *ACTION_GROUP = NULL;
-
-static ToolStruct TOOLS[] =
-{
-    {FRAME,
-     frame_tool_on_select,
-     frame_tool_on_unselect,
-     frame_tool_on_move,
-     frame_tool_on_click,
-     frame_tool_on_release,
-     frame_tool_on_key,
-     frame_tool_drawing},
-
-    {SELECTOR,
-     selector_tool_on_select,
-     selector_tool_on_unselect,
-     selector_tool_on_move,
-     selector_tool_on_click,
-     selector_tool_on_release,
-     selector_tool_on_key,
-     selector_tool_drawing},
-
-    {DOODLE,
-     doodle_tool_on_select,
-     doodle_tool_on_unselect,
-     doodle_tool_on_move,
-     doodle_tool_on_click,
-     doodle_tool_on_release,
-     doodle_tool_on_key,
-     doodle_tool_drawing},
-
-    {BUBBLE,
-     doodle_tool_bubble_on_select,
-     doodle_tool_bubble_on_unselect,
-     doodle_tool_on_move,
-     doodle_tool_on_click,
-     doodle_tool_on_release,
-     doodle_tool_on_key,
-     doodle_tool_drawing},
-
-    {TEXT,
-     text_tool_on_select,
-     text_tool_on_unselect,
-     text_tool_on_move,
-     text_tool_on_click,
-     text_tool_on_release,
-     text_tool_on_key,
-     text_tool_drawing},
-};
-
-typedef struct
-{
-    enum Tool tool;
-    char *action;
-
-} tool_and_action;
-
-void unselect (enum Tool tool, TboWindow *tbo);
-gboolean select_tool (GtkAction *action, TboWindow *tbo);
-void update_toolbar (TboWindow *tbo);
-
-enum Tool
-get_selected_tool ()
-{
-    return SELECTED_TOOL;
-}
-
-
-void
-set_current_tab_page (TboWindow *tbo, gboolean setit)
-{
-    int nth;
-
-    nth = tbo_comic_page_index (tbo->comic);
-    if (setit)
-        gtk_notebook_set_current_page (GTK_NOTEBOOK (tbo->notebook), nth);
-    tbo->dw_scroll = gtk_notebook_get_nth_page (GTK_NOTEBOOK (tbo->notebook), nth);
-    tbo->drawing = gtk_bin_get_child (GTK_BIN (tbo->dw_scroll));
-    set_frame_view (NULL);
-    set_selected_tool (NONE, tbo);
-}
-
-gboolean
-notebook_switch_page_cb (GtkNotebook     *notebook,
-                         GtkNotebookPage *page,
-                         guint            page_num,
-                         TboWindow        *tbo)
-{
-    tbo_comic_set_current_page_nth (tbo->comic, page_num);
-    set_current_tab_page (tbo, FALSE);
-    update_toolbar (tbo);
-    tbo_window_update_status (tbo, 0, 0);
-    tbo_drawing_adjust_scroll (tbo);
-    return FALSE;
-}
-
-void
-set_selected_tool (enum Tool tool, TboWindow *tbo)
-{
-    unselect (SELECTED_TOOL, tbo);
-    SELECTED_TOOL = tool;
-
-    tool_signal (tool, TOOL_SELECT, tbo);
-    update_toolbar (tbo);
-}
-
-void
-update_toolbar (TboWindow *tbo)
-{
-    GtkAction *prev;
-    GtkAction *next;
-    GtkAction *delete;
-
-    GtkAction *doodle;
-    GtkAction *bubble;
-    GtkAction *text;
-    GtkAction *new_frame;
-    GtkAction *pix;
-
-    if (!ACTION_GROUP)
-        return;
-
-    // Page next, prev and delete button sensitive
-    prev = gtk_action_group_get_action (ACTION_GROUP, "PrevPage");
-    next = gtk_action_group_get_action (ACTION_GROUP, "NextPage");
-    delete = gtk_action_group_get_action (ACTION_GROUP, "DelPage");
-
-    if (tbo_comic_page_first (tbo->comic))
-        gtk_action_set_sensitive (prev, FALSE);
-    else
-        gtk_action_set_sensitive (prev, TRUE);
-
-    if (tbo_comic_page_last (tbo->comic))
-        gtk_action_set_sensitive (next, FALSE);
-    else
-        gtk_action_set_sensitive (next, TRUE);
-    if (tbo_comic_len (tbo->comic) > 1)
-        gtk_action_set_sensitive (delete, TRUE);
-    else
-        gtk_action_set_sensitive (delete, FALSE);
-
-    // Frame view disabled in page view
-    doodle = gtk_action_group_get_action (ACTION_GROUP, "Doodle");
-    bubble = gtk_action_group_get_action (ACTION_GROUP, "Bubble");
-    text = gtk_action_group_get_action (ACTION_GROUP, "Text");
-    new_frame = gtk_action_group_get_action (ACTION_GROUP, "NewFrame");
-    pix = gtk_action_group_get_action (ACTION_GROUP, "Pix");
-
-    if (get_frame_view() == NULL)
-    {
-        gtk_action_set_sensitive (doodle, FALSE);
-        gtk_action_set_sensitive (bubble, FALSE);
-        gtk_action_set_sensitive (text, FALSE);
-        gtk_action_set_sensitive (pix, FALSE);
-        gtk_action_set_sensitive (new_frame, TRUE);
-    }
-    else
-    {
-        gtk_action_set_sensitive (doodle, TRUE);
-        gtk_action_set_sensitive (bubble, TRUE);
-        gtk_action_set_sensitive (text, TRUE);
-        gtk_action_set_sensitive (pix, TRUE);
-        gtk_action_set_sensitive (new_frame, FALSE);
-    }
-    update_menubar (tbo);
-}
-
-gboolean
-toolbar_handler (GtkWidget *widget, gpointer data)
-{
-    return FALSE;
-}
-
-gboolean
-add_new_page (GtkAction *action, TboWindow *tbo)
-{
-    Page *page = tbo_comic_new_page (tbo->comic);
-    int nth = tbo_comic_page_nth (tbo->comic, page);
-    gtk_notebook_insert_page (GTK_NOTEBOOK (tbo->notebook),
-                              create_darea (tbo),
-                              NULL,
-                              nth);
-    tbo_window_update_status (tbo, 0, 0);
-    update_toolbar (tbo);
-    return FALSE;
-}
-
-gboolean
-del_current_page (GtkAction *action, TboWindow *tbo)
-{
-    int nth = tbo_comic_page_index (tbo->comic);
-    tbo_comic_del_current_page (tbo->comic);
-    set_current_tab_page (tbo, TRUE);
-    gtk_notebook_remove_page (GTK_NOTEBOOK (tbo->notebook), nth);
-    tbo_window_update_status (tbo, 0, 0);
-    update_toolbar (tbo);
-    return FALSE;
-}
-
-gboolean
-next_page (GtkAction *action, TboWindow *tbo)
-{
-    tbo_comic_next_page (tbo->comic);
-    set_current_tab_page (tbo, TRUE);
-    update_toolbar (tbo);
-    tbo_window_update_status (tbo, 0, 0);
-    tbo_drawing_adjust_scroll (tbo);
-
-    return FALSE;
-}
-
-gboolean
-prev_page (GtkAction *action, TboWindow *tbo)
-{
-    tbo_comic_prev_page (tbo->comic);
-    set_current_tab_page (tbo, TRUE);
-    update_toolbar (tbo);
-    tbo_window_update_status (tbo, 0, 0);
-    tbo_drawing_adjust_scroll (tbo);
-
-    return FALSE;
-}
-
-gboolean
-zoom_100 (GtkAction *action, TboWindow *tbo)
-{
-    tbo_drawing_zoom_100 (tbo);
-    return FALSE;
-}
-
-gboolean
-zoom_fit (GtkAction *action, TboWindow *tbo)
-{
-    tbo_drawing_zoom_fit (tbo);
-    return FALSE;
-}
-
-gboolean
-zoom_in (GtkAction *action, TboWindow *tbo)
-{
-    tbo_drawing_zoom_in (tbo);
-    return FALSE;
-}
-
-gboolean
-zoom_out (GtkAction *action, TboWindow *tbo)
-{
-    tbo_drawing_zoom_out (tbo);
-    return FALSE;
-}
-
-gboolean
-add_pix (GtkAction *action, TboWindow *tbo)
-{
-    GtkWidget *dialog;
-    GtkFileFilter *filter;
-
-    dialog = gtk_file_chooser_dialog_new (_("Add an Image"),
-                     GTK_WINDOW (tbo->window),
-                     GTK_FILE_CHOOSER_ACTION_OPEN,
-                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                     NULL);
-
-    filter = gtk_file_filter_new ();
-    gtk_file_filter_set_name (filter, _("png"));
-    gtk_file_filter_add_pattern (filter, "*.png");
-    gtk_file_filter_add_pattern (filter, "*.PNG");
-    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
-    filter = gtk_file_filter_new ();
-    gtk_file_filter_set_name (filter, _("All files"));
-    gtk_file_filter_add_pattern (filter, "*");
-    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
-
-    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
-    {
-        char *filename;
-        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-        TboObjectPixmap *piximage = TBO_OBJECT_PIXMAP (tbo_object_pixmap_new_with_params (0, 0, 0, 0, filename));
-        tbo_frame_add_obj (get_frame_view(), TBO_OBJECT_BASE (piximage));
-        update_drawing (tbo);
-        g_free (filename);
-    }
-
-    gtk_widget_destroy (dialog);
-    return FALSE;
-}
-
-static const GtkActionEntry tbo_tools_entries [] = {
-    { "NewFileTool", GTK_STOCK_NEW, N_("_New"), "<control>N",
-      N_("New Comic"),
-      G_CALLBACK (tbo_comic_new_dialog) },
-
-    { "OpenFileTool", GTK_STOCK_OPEN, N_("_Open"), "<control>O",
-      N_("Open comic"),
-      G_CALLBACK (tbo_comic_open_dialog) },
-
-    { "SaveFileTool", GTK_STOCK_SAVE, N_("_Save"), "<control>S",
-      N_("Save current document"),
-      G_CALLBACK (tbo_comic_save_dialog) },
-
-    // Page tools
-    { "NewPage", GTK_STOCK_ADD, N_("New Page"), "<control>P",
-      N_("New page"),
-      G_CALLBACK (add_new_page) },
-
-    { "DelPage", GTK_STOCK_DELETE, N_("Delete Page"), "",
-      N_("Delete current page"),
-      G_CALLBACK (del_current_page) },
-
-    { "PrevPage", GTK_STOCK_GO_BACK, N_("Prev Page"), "",
-      N_("Prev page"),
-      G_CALLBACK (prev_page) },
-
-    { "NextPage", GTK_STOCK_GO_FORWARD, N_("Next Page"), "",
-      N_("Next page"),
-      G_CALLBACK (next_page) },
-
-    // Zoom tools
-    { "Zoomin", GTK_STOCK_ZOOM_IN, N_("Zoom in"), "",
-      N_("Zoom in"),
-      G_CALLBACK (zoom_in) },
-    { "Zoom100", GTK_STOCK_ZOOM_100, N_("Zoom 1:1"), "",
-      N_("Zoom 1:1"),
-      G_CALLBACK (zoom_100) },
-    { "Zoomfit", GTK_STOCK_ZOOM_FIT, N_("Zoom fit"), "",
-      N_("Zoom fit"),
-      G_CALLBACK (zoom_fit) },
-    { "Zoomout", GTK_STOCK_ZOOM_OUT, N_("Zoom out"), "",
-      N_("Zoom out"),
-      G_CALLBACK (zoom_out) },
-
-    // Png image tool
-    { "Pix", TBO_STOCK_PIX, N_("Image"), "",
-      N_("Image"),
-      G_CALLBACK (add_pix) },
-};
-
-static const GtkToggleActionEntry tbo_tools_toogle_entries [] = {
-    // Page view tools
-    { "NewFrame", TBO_STOCK_FRAME, N_("New _Frame"), "f",
-      N_("New Frame"),
-      G_CALLBACK (select_tool), FALSE },
-
-    { "Selector", TBO_STOCK_SELECTOR, N_("Selector"), "s",
-      N_("Selector"),
-      G_CALLBACK (select_tool), FALSE },
-
-    // Frame view tools
-    { "Doodle", TBO_STOCK_DOODLE, N_("Doodle"), "d",
-      N_("Doodle"),
-      G_CALLBACK (select_tool), FALSE },
-    { "Bubble", TBO_STOCK_BUBBLE, N_("Booble"), "b",
-      N_("Bubble"),
-      G_CALLBACK (select_tool), FALSE },
-    { "Text", TBO_STOCK_TEXT, N_("Text"), "t",
-      N_("Text"),
-      G_CALLBACK (select_tool), FALSE },
-};
-
-static const tool_and_action tools_actions [] = {
-    {FRAME, "NewFrame"},
-    {SELECTOR, "Selector"},
-    {DOODLE, "Doodle"},
-    {BUBBLE, "Bubble"},
-    {TEXT, "Text"},
-};
-
-void
-set_selected_tool_and_action (enum Tool tool, TboWindow *tbo)
-{
-    GtkToggleAction *action;
-    enum Tool action_tool;
-    gchar *name;
-
-    int i;
-    GtkToggleActionEntry entry;
-
-    for (i=0; i<G_N_ELEMENTS (tools_actions); i++)
-    {
-        if (tool == tools_actions[i].tool)
-        {
-            name = (gchar *) tools_actions[i].action;
-            break;
-        }
-    }
-
-    action = (GtkToggleAction *) gtk_action_group_get_action (ACTION_GROUP, name);
-    if (gtk_action_is_sensitive (GTK_ACTION (action)))
-        gtk_toggle_action_set_active (action, TRUE);
-}
-
-void
-unselect (enum Tool tool, TboWindow *tbo)
-{
-    int i;
-    GtkToggleAction *action;
-
-    for (i=0; i<G_N_ELEMENTS (tools_actions); i++)
-    {
-        if (tools_actions[i].tool == tool)
-        {
-            action = (GtkToggleAction *) gtk_action_group_get_action (ACTION_GROUP,
-                    tools_actions[i].action);
-
-            gtk_toggle_action_set_active (action, FALSE);
-            break;
-        }
-    }
-    tool_signal (tool, TOOL_UNSELECT, tbo);
-}
-
-gboolean
-select_tool (GtkAction *action, TboWindow *tbo)
-{
-    GtkToggleAction *toggle_action;
-    int i;
-    const gchar *name;
-    enum Tool tool;
-
-    toggle_action = (GtkToggleAction *) action;
-    name = gtk_action_get_name (action);
-
-
-    for (i=0; i<G_N_ELEMENTS (tools_actions); i++)
-    {
-        if (strcmp (tools_actions[i].action, name) == 0)
-        {
-            tool = tools_actions[i].tool;
-            break;
-        }
-    }
-
-    if (gtk_toggle_action_get_active (toggle_action))
-        set_selected_tool (tool, tbo);
-    else
-        set_selected_tool (NONE, tbo);
-    tbo_window_update_status (tbo, 0, 0);
-    return FALSE;
-}
-
-GtkWidget *generate_toolbar (TboWindow *window){
-    GtkWidget *toolbar;
-    GtkUIManager *manager;
-    GError *error = NULL;
-
-    manager = gtk_ui_manager_new ();
-    gtk_ui_manager_add_ui_from_file (manager, DATA_DIR "/ui/tbo-toolbar-ui.xml", &error);
-    if (error != NULL)
-    {
-        g_warning ("Could not merge tbo-toolbar-ui.xml: %s", error->message);
-        g_error_free (error);
-    }
-
-    ACTION_GROUP = gtk_action_group_new ("ToolsActions");
-    gtk_action_group_set_translation_domain (ACTION_GROUP, NULL);
-    gtk_action_group_add_actions (ACTION_GROUP, tbo_tools_entries,
-                        G_N_ELEMENTS (tbo_tools_entries), window);
-    gtk_action_group_add_toggle_actions (ACTION_GROUP, tbo_tools_toogle_entries,
-                        G_N_ELEMENTS (tbo_tools_toogle_entries), window);
-
-    gtk_ui_manager_insert_action_group (manager, ACTION_GROUP, 0);
-
-    toolbar = gtk_ui_manager_get_widget (manager, "/toolbar");
-
-    update_toolbar (window);
-
-    return toolbar;
-}
-
-void
-tool_signal (enum Tool tool, enum ToolSignal signal, gpointer data)
-{
-    int i;
-    ToolStruct *toolstruct = NULL;
-    void **pdata;
-
-    for (i=0; i<G_N_ELEMENTS (TOOLS); i++)
-    {
-        if (tool == TOOLS[i].tool)
-        {
-            toolstruct = &TOOLS[i];
-            break;
-        }
-    }
-
-    if (toolstruct)
-    {
-        switch (signal)
-        {
-            case TOOL_SELECT:
-                toolstruct->tool_on_select(data);
-                break;
-            case TOOL_UNSELECT:
-                toolstruct->tool_on_unselect(data);
-                break;
-            case TOOL_MOVE:
-                pdata = data;
-                toolstruct->tool_on_move (pdata[0], pdata[1], pdata[2]);
-                break;
-            case TOOL_CLICK:
-                pdata = data;
-                toolstruct->tool_on_click (pdata[0], pdata[1], pdata[2]);
-                break;
-            case TOOL_RELEASE:
-                pdata = data;
-                toolstruct->tool_on_release (pdata[0], pdata[1], pdata[2]);
-                break;
-            case TOOL_KEY:
-                pdata = data;
-                toolstruct->tool_on_key (pdata[0], pdata[1], pdata[2]);
-                break;
-            case TOOL_DRAWING:
-                toolstruct->tool_drawing (data);
-                break;
-            default:
-                break;
-        }
-    }
-}
diff --git a/src/ui-toolbar.h b/src/ui-toolbar.h
deleted file mode 100644 (file)
index 5089cbf..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * This file is part of TBO, a gnome comic editor
- * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __UI_TOOLBAR__
-#define __UI_TOOLBAR__
-
-#include <gtk/gtk.h>
-#include "tbo-window.h"
-
-enum ToolSignal
-{
-    TOOL_SELECT,
-    TOOL_UNSELECT,
-    TOOL_MOVE,
-    TOOL_CLICK,
-    TOOL_RELEASE,
-    TOOL_KEY,
-    TOOL_DRAWING,
-};
-
-enum Tool
-{
-    NONE,
-    SELECTOR,
-    FRAME,
-    DOODLE,
-    BUBBLE,
-    TEXT,
-};
-
-typedef struct
-{
-    enum Tool tool;
-    void (*tool_on_select) (TboWindow *);
-    void (*tool_on_unselect) (TboWindow *);
-    void (*tool_on_move) (GtkWidget *, GdkEventMotion *, TboWindow *);
-    void (*tool_on_click) (GtkWidget *, GdkEventButton *, TboWindow *);
-    void (*tool_on_release) (GtkWidget *, GdkEventButton *, TboWindow *);
-    void (*tool_on_key) (GtkWidget *, GdkEventKey *, TboWindow *);
-    void (*tool_drawing) (cairo_t *cr);
-} ToolStruct;
-
-void tool_signal (enum Tool tool, enum ToolSignal signal, gpointer data);
-
-enum Tool get_selected_tool ();
-void set_selected_tool (enum Tool tool, TboWindow *tbo);
-void set_selected_tool_and_action (enum Tool tool, TboWindow *tbo);
-
-GtkWidget *generate_toolbar (TboWindow *window);
-
-gboolean notebook_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, TboWindow *tbo);
-
-#endif
-