From d988143e7637ff382b8f3ad7b5a0254ff35c807b Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Wed, 17 Nov 2021 23:34:46 +0100 Subject: [PATCH] Adding support for passing pages. --- src/view/chapter_view.c | 100 ++++++++++++++++++++++++++++++----- src/view/list_view_chapter.c | 1 + 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/src/view/chapter_view.c b/src/view/chapter_view.c index 595b759..cc5efa9 100644 --- a/src/view/chapter_view.c +++ b/src/view/chapter_view.c @@ -17,8 +17,27 @@ typedef struct { guint current_page; GListModel *pages; GtkPicture *current_picture; + AdwLeaflet *views_leaflet; + GtkScrolledWindow *zoomable_picture_container; } ChapterVisorData; +static void +set_image_zoomable_picture_container (ChapterVisorData *chapter_visor_data); +static void +set_zoomable_picture_container_properties ( + GtkScrolledWindow *zoomable_picture_container); +static void +append_chapter_view_leaflet (AdwLeaflet *views_leaflet, + GtkBox *chapter_view_container); +static void +add_controls_overlay (GtkOverlay *overlay, ChapterVisorData *chapter_visor_data); +static void +go_prev (GtkButton *prev, + gpointer user_data); +static void +go_next (GtkButton *next, + gpointer user_data); + static void image_page_show (GtkWidget *picture, gpointer user_data) { GtkWidget *views_leaflet = GTK_WIDGET (user_data); @@ -45,22 +64,71 @@ image_page_show (GtkWidget *picture, gpointer user_data) { void setup_chapter_view (MgMangaChapter *chapter, AdwLeaflet *views_leaflet) { MgBackendReadmng *readmng = mg_backend_readmng_new (); - MgUtilString *string_util = mg_util_string_new (); GtkBox *chapter_view_container = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); GtkScrolledWindow *zoomable_picture_container = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new ()); - GtkGesture *zoom_controller = gtk_gesture_zoom_new (); + GtkOverlay *overlay = GTK_OVERLAY (gtk_overlay_new ()); GListModel *pages = mg_backend_readmng_get_chapter_images (readmng, chapter); ChapterVisorData *chapter_visor_data = g_malloc (sizeof *chapter_visor_data); - GtkPicture *current_picture; + chapter_visor_data->current_page = 0; + chapter_visor_data->pages = pages; + chapter_visor_data->views_leaflet = views_leaflet; + chapter_visor_data->zoomable_picture_container = zoomable_picture_container; + set_zoomable_picture_container_properties (zoomable_picture_container); + set_image_zoomable_picture_container (chapter_visor_data); + + gtk_overlay_set_child (overlay, GTK_WIDGET (zoomable_picture_container)); + add_controls_overlay (overlay, chapter_visor_data); + gtk_box_append (chapter_view_container, GTK_WIDGET (overlay)); + append_chapter_view_leaflet (views_leaflet, chapter_view_container); +} + +static void +add_controls_overlay (GtkOverlay *overlay, ChapterVisorData *chapter_visor_data) { GtkButton *next_button = GTK_BUTTON (gtk_button_new_from_icon_name ("go-next-symbolic")); GtkButton *previous_button = GTK_BUTTON (gtk_button_new_from_icon_name ("go-previous-symbolic")); - chapter_visor_data->current_page = 0; - chapter_visor_data->pages = pages; + g_signal_connect (G_OBJECT (next_button), "clicked", G_CALLBACK (go_next), chapter_visor_data); + g_signal_connect (G_OBJECT (previous_button), "clicked", G_CALLBACK (go_prev), chapter_visor_data); + gtk_widget_set_valign (GTK_WIDGET (next_button), GTK_ALIGN_CENTER); + gtk_widget_set_halign (GTK_WIDGET (next_button), GTK_ALIGN_END); + gtk_widget_set_valign (GTK_WIDGET (previous_button), GTK_ALIGN_CENTER); + gtk_widget_set_halign (GTK_WIDGET (previous_button), GTK_ALIGN_START); + gtk_overlay_add_overlay (overlay, GTK_WIDGET (next_button)); + gtk_overlay_add_overlay (overlay, GTK_WIDGET (previous_button)); +} +static void +go_next (GtkButton *next, + gpointer user_data) { + ChapterVisorData *chapter_visor_data = (ChapterVisorData *) user_data; + GListModel *pages = chapter_visor_data->pages; + if (chapter_visor_data->current_page < g_list_model_get_n_items (pages) -1) { + chapter_visor_data->current_page = chapter_visor_data->current_page + 1; + set_image_zoomable_picture_container (chapter_visor_data); + } +} +static void +go_prev (GtkButton *prev, + gpointer user_data) { + ChapterVisorData *chapter_visor_data = (ChapterVisorData *) user_data; + if (chapter_visor_data->current_page > 0) { + chapter_visor_data->current_page = chapter_visor_data->current_page - 1; + set_image_zoomable_picture_container (chapter_visor_data); + } +} + + +static void +set_image_zoomable_picture_container (ChapterVisorData *chapter_visor_data) { + GtkScrolledWindow *zoomable_picture_container = chapter_visor_data->zoomable_picture_container; + MgUtilString *string_util = mg_util_string_new (); + GtkPicture *current_picture; + GListModel *pages = chapter_visor_data->pages; + guint current_page = chapter_visor_data->current_page; + AdwLeaflet *views_leaflet = chapter_visor_data->views_leaflet; const char *url_image_not_owned = gtk_string_list_get_string (GTK_STRING_LIST - (pages), 0); + (pages), current_page); char *url_image = mg_util_string_alloc_string (string_util, strlen (url_image_not_owned)); mg_util_string_copy_substring (string_util, url_image_not_owned, url_image, @@ -69,20 +137,27 @@ setup_chapter_view (MgMangaChapter *chapter, AdwLeaflet *views_leaflet) { current_picture = create_picture_from_url (url_image, -1); + chapter_visor_data->current_picture = current_picture; g_signal_connect (G_OBJECT (current_picture), "map", G_CALLBACK (image_page_show), views_leaflet); + gtk_scrolled_window_set_child (zoomable_picture_container, GTK_WIDGET (current_picture)); +} + +static void +set_zoomable_picture_container_properties ( + GtkScrolledWindow *zoomable_picture_container) { + GtkGesture *zoom_controller = gtk_gesture_zoom_new (); g_object_set_property_int (G_OBJECT (zoomable_picture_container), "hexpand", 1); g_object_set_property_int (G_OBJECT (zoomable_picture_container), "vexpand", 1); - chapter_visor_data->current_picture = - current_picture; - gtk_scrolled_window_set_child (zoomable_picture_container, GTK_WIDGET (current_picture)); - - gtk_widget_add_controller (GTK_WIDGET (zoomable_picture_container), GTK_EVENT_CONTROLLER (zoom_controller)); g_signal_connect (G_OBJECT (zoom_controller), "scale-changed", G_CALLBACK (fire_zoom), NULL); +} - gtk_box_append (chapter_view_container, GTK_WIDGET (zoomable_picture_container)); + +static void +append_chapter_view_leaflet (AdwLeaflet *views_leaflet, + GtkBox *chapter_view_container) { GtkWidget *widget = adw_leaflet_get_adjacent_child (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD); for (;widget;widget = adw_leaflet_get_adjacent_child @@ -91,6 +166,7 @@ setup_chapter_view (MgMangaChapter *chapter, AdwLeaflet *views_leaflet) { } adw_leaflet_append (views_leaflet, GTK_WIDGET (chapter_view_container)); adw_leaflet_navigate (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD); + } static void diff --git a/src/view/list_view_chapter.c b/src/view/list_view_chapter.c index 346bdc4..3344662 100644 --- a/src/view/list_view_chapter.c +++ b/src/view/list_view_chapter.c @@ -44,6 +44,7 @@ setup_list_view_chapter_list (GtkSignalListItemFactory *factory, gpointer user_data) { MgMangaChapter *manga_chapter = gtk_list_item_get_item (list_item); GtkBox *box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); + g_object_ref (G_OBJECT (box)); GtkLabel *title = GTK_LABEL (gtk_label_new (mg_manga_chapter_get_title (manga_chapter))); GtkImage *icon = GTK_IMAGE (gtk_image_new_from_icon_name ( "weather-clear-night-symbolic"));