From bf784e2b2ee91aef113938dced836560b3f91315 Mon Sep 17 00:00:00 2001 From: danigm Date: Thu, 18 Mar 2010 23:15:09 +0000 Subject: [PATCH] Each page is a tab (GtkNotebook) From: danigm git-svn-id: https://forja.rediris.es/svn/cusl4-tbo@101 aa302d1f-72b1-406a-902b-8593ca2b2744 --- TODO | 3 --- src/comic.c | 20 ++++++++++++++++---- src/comic.h | 2 ++ src/tbo-window.c | 34 ++++++++++++++++++++++++++++++---- src/tbo-window.h | 4 +++- src/ui-drawing.c | 19 +++++++++++-------- src/ui-drawing.h | 3 ++- src/ui-toolbar.c | 40 ++++++++++++++++++++++++++++++++++++++-- src/ui-toolbar.h | 2 ++ 9 files changed, 104 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index 0dffb8a..f078892 100644 --- 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) diff --git a/src/comic.c b/src/comic.c index a21ec28..5661394 100644 --- a/src/comic.c +++ b/src/comic.c @@ -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; } diff --git a/src/comic.h b/src/comic.h index 2fe012e..5cf2bb4 100644 --- a/src/comic.h +++ b/src/comic.h @@ -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); diff --git a/src/tbo-window.c b/src/tbo-window.c index f0650c7..bb6feb7 100644 --- a/src/tbo-window.c +++ b/src/tbo-window.c @@ -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 diff --git a/src/tbo-window.h b/src/tbo-window.h index 1df77d2..4c9cbde 100644 --- a/src/tbo-window.h +++ b/src/tbo-window.h @@ -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 diff --git a/src/ui-drawing.c b/src/ui-drawing.c index e2bbdf7..ab55cb6 100644 --- a/src/ui-drawing.c +++ b/src/ui-drawing.c @@ -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, diff --git a/src/ui-drawing.h b/src/ui-drawing.h index 6e0f16a..c162f17 100644 --- a/src/ui-drawing.h +++ b/src/ui-drawing.h @@ -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); diff --git a/src/ui-toolbar.c b/src/ui-toolbar.c index cc5e564..2ac7539 100644 --- a/src/ui-toolbar.c +++ b/src/ui-toolbar.c @@ -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); diff --git a/src/ui-toolbar.h b/src/ui-toolbar.h index 04eaed4..8de0df7 100644 --- a/src/ui-toolbar.h +++ b/src/ui-toolbar.h @@ -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 -- 2.1.4