Each page is a tab (GtkNotebook)
authordanigm <dani@danigm.net>
Thu, 18 Mar 2010 23:15:09 +0000 (23:15 +0000)
committerdanigm <danigm@aa302d1f-72b1-406a-902b-8593ca2b2744>
Thu, 18 Mar 2010 23:15:09 +0000 (23:15 +0000)
From: danigm <dani@danigm.net>

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

TODO
src/comic.c
src/comic.h
src/tbo-window.c
src/tbo-window.h
src/ui-drawing.c
src/ui-drawing.h
src/ui-toolbar.c
src/ui-toolbar.h

diff --git a/TODO b/TODO
index 0dffb8a..f078892 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,9 +1,6 @@
 TBO TODO things:
 ----------------
 
- * Each page should be a tab (GtkNotebook) maybe sharing the same
- * content as child (the scrolled drawing area). (middle)
-
  * Undo/Redo tool. (hard)
 
  * Change between tools with keys: (middle)
index a21ec28..5661394 100644 (file)
@@ -70,7 +70,13 @@ tbo_comic_len (Comic *comic)
 int
 tbo_comic_page_index (Comic *comic)
 {
-    return g_list_position ( g_list_first (comic->pages), comic->pages) + 1;
+    return g_list_position ( g_list_first (comic->pages), comic->pages);
+}
+
+int
+tbo_comic_page_nth (Comic *comic, Page *page)
+{
+    return g_list_index (g_list_first (comic->pages), page);
 }
 
 Page *
@@ -107,10 +113,16 @@ tbo_comic_set_current_page (Comic *comic, Page *page)
     comic->pages = g_list_find (g_list_first (comic->pages), page);
 }
 
+void
+tbo_comic_set_current_page_nth (Comic *comic, int nth)
+{
+    comic->pages = g_list_nth (g_list_first (comic->pages), nth);
+}
+
 gboolean
 tbo_comic_page_first (Comic *comic)
 {
-    if (tbo_comic_page_index (comic) == 1)
+    if (tbo_comic_page_index (comic) == 0)
         return TRUE;
     return FALSE;
 }
@@ -118,7 +130,7 @@ tbo_comic_page_first (Comic *comic)
 gboolean
 tbo_comic_page_last (Comic *comic)
 {
-    if (tbo_comic_page_index (comic) == tbo_comic_len (comic))
+    if (tbo_comic_page_index (comic) == tbo_comic_len (comic) - 1)
         return TRUE;
     return FALSE;
 }
@@ -136,7 +148,7 @@ tbo_comic_del_current_page (Comic *comic)
     page = tbo_comic_next_page (comic);
     if (page == NULL)
         page = tbo_comic_prev_page (comic);
-    tbo_comic_del_page (comic, nth-1);
+    tbo_comic_del_page (comic, nth);
     tbo_comic_set_current_page (comic, page);
     return TRUE;
 }
index 2fe012e..5cf2bb4 100644 (file)
@@ -12,12 +12,14 @@ void tbo_comic_del_page (Comic *comic, int nth);
 gboolean tbo_comic_del_current_page (Comic *comic);
 int tbo_comic_len (Comic *comic);
 int tbo_comic_page_index (Comic *comic);
+int tbo_comic_page_nth (Comic *comic, Page *page);
 gboolean tbo_comic_page_first (Comic *comic);
 gboolean tbo_comic_page_last (Comic *comic);
 Page *tbo_comic_next_page (Comic *comic);
 Page *tbo_comic_prev_page (Comic *comic);
 Page *tbo_comic_get_current_page (Comic *comic);
 void tbo_comic_set_current_page (Comic *comic, Page *page);
+void tbo_comic_set_current_page_nth (Comic *comic, int nth);
 void tbo_comic_save (TboWindow *tbo, char *filename);
 void tbo_comic_open (TboWindow *window, char *filename);
 
index f0650c7..bb6feb7 100644 (file)
@@ -12,7 +12,8 @@
 static int NWINDOWS = 0;
 
 TboWindow *
-tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll, GtkWidget *toolarea,
+tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll,
+                GtkWidget *notebook, GtkWidget *toolarea,
                 GtkWidget *status, GtkWidget *vbox, Comic *comic)
 {
     TboWindow *tbo;
@@ -27,6 +28,7 @@ tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll, GtkWidget *toolarea,
     tbo->vbox = vbox;
     tbo->comic = comic;
     tbo->toolarea = toolarea;
+    tbo->notebook = notebook;
     tbo->path = NULL;
 
     return tbo;
@@ -75,6 +77,23 @@ GdkPixbuf *create_pixbuf (const gchar * filename)
    return pixbuf;
 }
 
+GtkWidget *
+create_darea (TboWindow *tbo)
+{
+    GtkWidget *scrolled;
+    GtkWidget *darea;
+    int width=tbo->comic->width, height=tbo->comic->height;
+
+    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);
+    gtk_container_add (GTK_CONTAINER (scrolled), darea);
+    darea_connect_signals (tbo, darea);
+    gtk_widget_show_all (scrolled);
+
+    return scrolled;
+}
+
 TboWindow *
 tbo_new_tbo (int width, int height)
 {
@@ -90,6 +109,7 @@ tbo_new_tbo (int width, int height)
     GtkWidget *darea;
     GtkWidget *status;
     GtkWidget *hpaned;
+    GtkWidget *notebook;
 
     GtkUIManager *manager;
 
@@ -109,6 +129,9 @@ tbo_new_tbo (int width, int height)
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
     darea = get_drawing_area (width, height);
     gtk_container_add (GTK_CONTAINER (scrolled), darea);
+    notebook = gtk_notebook_new ();
+    gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
+    gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled, NULL);
 
     hpaned = gtk_hpaned_new ();
     tool_paned = gtk_vbox_new (FALSE, 0);
@@ -117,17 +140,20 @@ tbo_new_tbo (int width, int height)
     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled2), tool_paned);
 
     gtk_paned_set_position (GTK_PANED (hpaned), width - 200);
-    gtk_paned_pack1 (GTK_PANED (hpaned), scrolled, TRUE, FALSE);
+    gtk_paned_pack1 (GTK_PANED (hpaned), notebook, TRUE, FALSE);
     gtk_paned_pack2 (GTK_PANED (hpaned), scrolled2, TRUE, FALSE);
 
     status = gtk_statusbar_new ();
 
-    tbo = tbo_window_new (window, scrolled, tool_paned, status, container, comic);
+    tbo = tbo_window_new (window, scrolled, 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_connect_signals (tbo, darea);
 
+    // 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
index 1df77d2..4c9cbde 100644 (file)
@@ -9,6 +9,7 @@ typedef struct
     GtkWidget *window;
     GtkWidget *dw_scroll;
     GtkWidget *toolarea;
+    GtkWidget *notebook;
     GtkWidget *drawing;
     GtkWidget *status;
     GtkWidget *vbox;
@@ -16,7 +17,7 @@ typedef struct
     char *path;
 } TboWindow;
 
-TboWindow *tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll, GtkWidget *toolarea, GtkWidget *status, GtkWidget *vbox, Comic *comic);
+TboWindow *tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll, GtkWidget *notebook, GtkWidget *toolarea, GtkWidget *status, GtkWidget *vbox, Comic *comic);
 void tbo_window_free (TboWindow *tbo);
 gboolean tbo_window_free_cb (GtkWidget *widget, GdkEventExpose *event, TboWindow *tbo);
 GdkPixbuf *create_pixbuf (const gchar * filename);
@@ -24,5 +25,6 @@ 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);
+GtkWidget *create_darea (TboWindow *tbo);
 
 #endif
index e2bbdf7..ab55cb6 100644 (file)
@@ -222,11 +222,8 @@ get_drawing_area (int width, int height)
 }
 
 void
-darea_connect_signals (TboWindow *tbo)
+darea_connect_signals (TboWindow *tbo, GtkWidget *drawing)
 {
-    GtkWidget *drawing;
-    drawing = tbo->drawing;
-
     gtk_widget_add_events (drawing, GDK_BUTTON_PRESS_MASK |
                                     GDK_BUTTON_RELEASE_MASK |
                                     GDK_POINTER_MOTION_MASK);
@@ -243,16 +240,22 @@ darea_connect_signals (TboWindow *tbo)
     g_signal_connect (drawing, "motion_notify_event",
             G_CALLBACK (on_move_cb), tbo);
 
-    // key press event
-    g_signal_connect (tbo->window, "key_press_event",
-            G_CALLBACK (on_key_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,
index 6e0f16a..c162f17 100644 (file)
@@ -11,7 +11,8 @@ 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);
+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);
index cc5e564..2ac7539 100644 (file)
@@ -77,6 +77,33 @@ 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->drawing = gtk_bin_get_child (GTK_BIN (gtk_notebook_get_nth_page (GTK_NOTEBOOK (tbo->notebook), nth)));
+    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);
+    return FALSE;
+}
+
 void
 set_selected_tool (enum Tool tool, TboWindow *tbo)
 {
@@ -142,14 +169,18 @@ update_toolbar (TboWindow *tbo)
 gboolean
 toolbar_handler (GtkWidget *widget, gpointer data)
 {
-    printf(_("toolbar: %s\n"), ((TboWindow *)data)->comic->title);
     return FALSE;
 }
 
 gboolean
 add_new_page (GtkAction *action, TboWindow *tbo)
 {
-    tbo_comic_new_page (tbo->comic);
+    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;
@@ -158,7 +189,10 @@ add_new_page (GtkAction *action, TboWindow *tbo)
 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;
@@ -168,6 +202,7 @@ 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);
 
@@ -178,6 +213,7 @@ 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);
 
index 04eaed4..8de0df7 100644 (file)
@@ -43,5 +43,7 @@ void set_selected_tool (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