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)
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 *
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;
}
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;
}
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;
}
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);
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;
tbo->vbox = vbox;
tbo->comic = comic;
tbo->toolarea = toolarea;
+ tbo->notebook = notebook;
tbo->path = NULL;
return tbo;
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)
{
GtkWidget *darea;
GtkWidget *status;
GtkWidget *hpaned;
+ GtkWidget *notebook;
GtkUIManager *manager;
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);
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
GtkWidget *window;
GtkWidget *dw_scroll;
GtkWidget *toolarea;
+ GtkWidget *notebook;
GtkWidget *drawing;
GtkWidget *status;
GtkWidget *vbox;
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);
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
}
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);
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,
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);
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)
{
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;
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;
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);
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);
GtkWidget *generate_toolbar (TboWindow *window);
+gboolean notebook_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, TboWindow *tbo);
+
#endif