From dbcd7afff017f1f23f549a2e35153c5306f534b9 Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Mon, 1 Nov 2021 14:38:15 +0100 Subject: [PATCH] Refactor of picture retrieval and implementing the things needed to create the details view. --- Makefile | 2 +- .../openmg/util/gobject_utility_extensions.h | 5 ++ include/openmg/view/detail_manga.h | 4 + include/openmg/view/picture.h | 4 + src/util/gobject_utility_extensions.c | 11 +++ src/view/detail_manga.c | 17 +++++ src/view/list_view_manga.c | 76 +++++-------------- src/view/picture.c | 36 +++++++++ 8 files changed, 98 insertions(+), 57 deletions(-) create mode 100644 include/openmg/util/gobject_utility_extensions.h create mode 100644 include/openmg/view/detail_manga.h create mode 100644 include/openmg/view/picture.h create mode 100644 src/util/gobject_utility_extensions.c create mode 100644 src/view/detail_manga.c create mode 100644 src/view/picture.c diff --git a/Makefile b/Makefile index 1f54d94..d4d75ec 100644 --- a/Makefile +++ b/Makefile @@ -6,4 +6,4 @@ LDFLAGS := $(shell pkg-config --libs ${LIBS}) CC_COMMAND := ${CC} ${INCDIR} ${CFLAGS} all: build build: - ${CC_COMMAND} src/util/regex.c src/util/string.c src/util/xml.c src/util/soup.c src/view/list_view_manga.c src/view/main_view.c src/manga.c src/backend/readmng.c src/main.c -o main ${LDFLAGS} -ggdb + ${CC_COMMAND} src/view/picture.c src/util/gobject_utility_extensions.c src/view/detail_manga.c src/util/regex.c src/util/string.c src/util/xml.c src/util/soup.c src/view/list_view_manga.c src/view/main_view.c src/manga.c src/backend/readmng.c src/main.c -o main ${LDFLAGS} -ggdb diff --git a/include/openmg/util/gobject_utility_extensions.h b/include/openmg/util/gobject_utility_extensions.h new file mode 100644 index 0000000..3c4d922 --- /dev/null +++ b/include/openmg/util/gobject_utility_extensions.h @@ -0,0 +1,5 @@ +#pragma once +#include + +void +g_object_set_property_int(GObject *object, char *property_key, int value); diff --git a/include/openmg/view/detail_manga.h b/include/openmg/view/detail_manga.h new file mode 100644 index 0000000..8ef7a97 --- /dev/null +++ b/include/openmg/view/detail_manga.h @@ -0,0 +1,4 @@ +#include + +GtkBox * +create_detail_view (MgManga *manga); diff --git a/include/openmg/view/picture.h b/include/openmg/view/picture.h new file mode 100644 index 0000000..ff61283 --- /dev/null +++ b/include/openmg/view/picture.h @@ -0,0 +1,4 @@ +#pragma once +#include +GtkPicture * +create_picture_from_url (char *url, gint picture_height); diff --git a/src/util/gobject_utility_extensions.c b/src/util/gobject_utility_extensions.c new file mode 100644 index 0000000..f0c9e0e --- /dev/null +++ b/src/util/gobject_utility_extensions.c @@ -0,0 +1,11 @@ +#include + +void +g_object_set_property_int(GObject *object, char *property_key, int value) { + GValue property = G_VALUE_INIT; + g_value_init (&property, G_TYPE_INT); + g_value_set_int (&property, value); + g_object_set_property (object, property_key, &property); +} + + diff --git a/src/view/detail_manga.c b/src/view/detail_manga.c new file mode 100644 index 0000000..0fc83df --- /dev/null +++ b/src/view/detail_manga.c @@ -0,0 +1,17 @@ +#include + +#include + +#include +#include + +GtkBox * +create_detail_view (MgManga *manga) { + GtkBox *detail_view = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); + GtkBox *descriptive_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); + GtkPicture *manga_image = create_picture_from_url ( + mg_manga_get_image_url(manga), 200); + gtk_box_append (descriptive_box, GTK_WIDGET (manga_image)); + gtk_box_append (detail_view, GTK_WIDGET (descriptive_box)); + return detail_view; +} diff --git a/src/view/list_view_manga.c b/src/view/list_view_manga.c index e795827..8b8ec51 100644 --- a/src/view/list_view_manga.c +++ b/src/view/list_view_manga.c @@ -4,38 +4,43 @@ #include #include +#include +#include #include +#include + +typedef struct { + GtkListView *list_view; + AdwLeaflet *views_leaflet; +} ActivationValues; -static void -g_object_set_property_int(GObject *object, char *property_key, int value); static void setup_list_view_mangas (GtkSignalListItemFactory *factory, GtkListItem *list_item, gpointer user_data); -typedef struct { - GListStore *mangas; - AdwLeaflet *views_leaflet; -} MangaPressedValues; - static void manga_selected (GtkListView *list_view, guint position, gpointer user_data) { - MangaPressedValues *manga_pressed_values = (MangaPressedValues *) user_data; - AdwLeaflet *views_leaflet = manga_pressed_values->views_leaflet; - GtkBox *box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); + AdwLeaflet *views_leaflet = ADW_LEAFLET (user_data); + GtkSingleSelection *selection = GTK_SINGLE_SELECTION + (gtk_list_view_get_model (list_view)); + GListModel *mangas = gtk_single_selection_get_model (selection); + MgManga *manga = MG_MANGA (g_list_model_get_item (mangas, position)); + GtkWidget *widget = adw_leaflet_get_adjacent_child (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD); while (widget) { adw_leaflet_remove (views_leaflet, widget); widget = adw_leaflet_get_adjacent_child (views_leaflet, - ADW_NAVIGATION_DIRECTION_FORWARD); + ADW_NAVIGATION_DIRECTION_FORWARD); } - adw_leaflet_append (views_leaflet, GTK_WIDGET (box)); + GtkBox *detail_view = create_detail_view (manga); + adw_leaflet_append (views_leaflet, GTK_WIDGET (detail_view)); adw_leaflet_navigate (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD); } @@ -47,35 +52,9 @@ setup_list_view_mangas (GtkSignalListItemFactory *factory, GtkBox *box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); GtkWidget *label = gtk_label_new (mg_manga_get_title (manga)); - GtkWidget *picture; + GtkWidget *picture = GTK_WIDGET ( + create_picture_from_url (mg_manga_get_image_url(manga), 200)); - GFileIOStream *iostream; - GFile *tmp_image; - GError *error = NULL; - - size_t size_downloaded_image = 0; - char *downloaded_image; - - MgUtilSoup *util_soup = mg_util_soup_new (); - downloaded_image = mg_util_soup_get_request (util_soup, mg_manga_get_image_url(manga), - &size_downloaded_image); - tmp_image = g_file_new_tmp ("mangareadertmpfileXXXXXX", - &iostream, - &error - ); - if (error) { - fprintf (stderr, "Unable to read file: %s\n", error->message); - return; - } - error = NULL; - g_output_stream_write (g_io_stream_get_output_stream (G_IO_STREAM (iostream)), - downloaded_image, size_downloaded_image, NULL, &error); - if (error) { - fprintf (stderr, "Unable to write file: %s\n", error->message); - return; - } - picture = gtk_picture_new_for_file (tmp_image); - g_object_set_property_int (G_OBJECT(picture), "height-request", 200); gtk_box_append (box, picture); gtk_box_append (box, label); gtk_list_item_set_child (list_item, GTK_WIDGET (box)); @@ -85,13 +64,8 @@ GtkListView * create_list_view_mangas (GListStore *mangas, AdwLeaflet *views_leaflet) { GtkSingleSelection *selection = gtk_single_selection_new (G_LIST_MODEL (mangas)); GtkListItemFactory *factory = gtk_signal_list_item_factory_new (); - MangaPressedValues *manga_pressed_values = NULL; GtkListView *list_view_manga = NULL; - manga_pressed_values = g_malloc (sizeof *manga_pressed_values); - manga_pressed_values->mangas = mangas; - manga_pressed_values->views_leaflet = views_leaflet; - g_signal_connect (G_OBJECT (factory), "bind", G_CALLBACK (setup_list_view_mangas), views_leaflet); @@ -102,16 +76,6 @@ create_list_view_mangas (GListStore *mangas, AdwLeaflet *views_leaflet) { "single-click-activate", 1); g_signal_connect (G_OBJECT (list_view_manga), "activate", - G_CALLBACK (manga_selected), manga_pressed_values); + G_CALLBACK (manga_selected), views_leaflet); return list_view_manga; } - -static void -g_object_set_property_int(GObject *object, char *property_key, int value) { - GValue property = G_VALUE_INIT; - g_value_init (&property, G_TYPE_INT); - g_value_set_int (&property, value); - g_object_set_property (object, property_key, &property); -} - - diff --git a/src/view/picture.c b/src/view/picture.c new file mode 100644 index 0000000..a06ac07 --- /dev/null +++ b/src/view/picture.c @@ -0,0 +1,36 @@ +#include + +#include + +#include +#include + +GtkPicture * +create_picture_from_url (char *url, gint picture_height) { + GtkPicture *picture; + GFileIOStream *iostream; + GFile *tmp_image; + GError *error = NULL; + + size_t size_downloaded_image = 0; + char *downloaded_image; + + MgUtilSoup *util_soup = mg_util_soup_new (); + downloaded_image = mg_util_soup_get_request (util_soup, + url, &size_downloaded_image); + tmp_image = g_file_new_tmp ("mangareadertmpfileXXXXXX", &iostream, &error); + if (error) { + fprintf (stderr, "Unable to read file: %s\n", error->message); + return NULL; + } + error = NULL; + g_output_stream_write (g_io_stream_get_output_stream (G_IO_STREAM (iostream)), + downloaded_image, size_downloaded_image, NULL, &error); + if (error) { + fprintf (stderr, "Unable to write file: %s\n", error->message); + return NULL; + } + picture = GTK_PICTURE (gtk_picture_new_for_file (tmp_image)); + g_object_set_property_int (G_OBJECT(picture), "height-request", picture_height); + return picture; +}