2021-10-29 22:08:49 +02:00
|
|
|
#include <gtk/gtk.h>
|
2021-10-31 20:42:58 +01:00
|
|
|
#include <gdk/gdk.h>
|
|
|
|
#include <adwaita.h>
|
2021-10-29 22:08:49 +02:00
|
|
|
|
|
|
|
#include <openmg/manga.h>
|
2021-10-30 18:59:54 +02:00
|
|
|
#include <openmg/util/soup.h>
|
2021-11-01 14:38:15 +01:00
|
|
|
#include <openmg/util/gobject_utility_extensions.h>
|
2021-10-30 18:59:54 +02:00
|
|
|
|
2021-11-01 14:38:15 +01:00
|
|
|
#include <openmg/view/detail_manga.h>
|
2021-10-29 22:08:49 +02:00
|
|
|
#include <openmg/view/list_view_manga.h>
|
2021-11-01 14:38:15 +01:00
|
|
|
#include <openmg/view/picture.h>
|
2021-11-22 23:40:22 +01:00
|
|
|
#include <openmg/view/controls.h>
|
2021-11-01 14:38:15 +01:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
GtkListView *list_view;
|
|
|
|
AdwLeaflet *views_leaflet;
|
|
|
|
} ActivationValues;
|
2021-10-29 22:08:49 +02:00
|
|
|
|
|
|
|
static void
|
|
|
|
setup_list_view_mangas (GtkSignalListItemFactory *factory,
|
|
|
|
GtkListItem *list_item,
|
|
|
|
gpointer user_data);
|
|
|
|
|
2021-10-31 20:42:58 +01:00
|
|
|
static void
|
|
|
|
manga_selected (GtkListView *list_view,
|
|
|
|
guint position,
|
|
|
|
gpointer user_data) {
|
2021-11-22 23:40:22 +01:00
|
|
|
ControlsAdwaita *controls = (ControlsAdwaita *) user_data;
|
2022-01-23 11:35:31 +01:00
|
|
|
controls->avoid_list_image_downloads = true;;
|
2022-01-23 10:53:46 +01:00
|
|
|
for (size_t i = 0; i < controls->image_threads_len; i++) {
|
|
|
|
g_cancellable_cancel (controls->image_threads[i]);
|
|
|
|
}
|
|
|
|
if (controls->image_threads) {
|
|
|
|
g_free (controls->image_threads);
|
|
|
|
}
|
|
|
|
controls->image_threads = NULL;
|
|
|
|
controls->image_threads_len = 0;
|
2021-11-22 23:40:22 +01:00
|
|
|
AdwLeaflet *views_leaflet = controls->views_leaflet;
|
2021-11-01 14:38:15 +01:00
|
|
|
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));
|
|
|
|
|
2021-10-31 21:06:15 +01:00
|
|
|
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,
|
2021-11-01 14:38:15 +01:00
|
|
|
ADW_NAVIGATION_DIRECTION_FORWARD);
|
2021-10-31 21:06:15 +01:00
|
|
|
}
|
|
|
|
|
2021-11-22 23:40:22 +01:00
|
|
|
GtkBox *detail_view = create_detail_view (manga, controls);
|
2021-11-01 14:38:15 +01:00
|
|
|
adw_leaflet_append (views_leaflet, GTK_WIDGET (detail_view));
|
2021-10-31 20:42:58 +01:00
|
|
|
adw_leaflet_navigate (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD);
|
2022-01-23 11:35:31 +01:00
|
|
|
controls->avoid_list_image_downloads = false;
|
2021-10-31 20:42:58 +01:00
|
|
|
}
|
|
|
|
|
2022-01-19 00:29:44 +01:00
|
|
|
#ifdef LIST_IMAGES
|
2022-01-16 22:39:01 +01:00
|
|
|
static void
|
|
|
|
picture_ready_manga_preview (GObject *source_object,
|
|
|
|
GAsyncResult *res,
|
|
|
|
gpointer user_data) {
|
|
|
|
GTask *task = G_TASK (res);
|
|
|
|
GtkWidget *picture = g_task_propagate_pointer (task, NULL);
|
|
|
|
GtkBox *box = GTK_BOX (source_object);
|
|
|
|
if (GTK_IS_WIDGET (picture)) {
|
|
|
|
g_object_set_property_int (G_OBJECT (picture), "margin-end", 5);
|
|
|
|
gtk_box_prepend (box, picture);
|
|
|
|
}
|
|
|
|
}
|
2022-01-19 00:29:44 +01:00
|
|
|
#endif
|
2022-01-16 22:39:01 +01:00
|
|
|
|
2021-10-29 22:08:49 +02:00
|
|
|
static void
|
|
|
|
setup_list_view_mangas (GtkSignalListItemFactory *factory,
|
|
|
|
GtkListItem *list_item,
|
|
|
|
gpointer user_data) {
|
2022-01-23 10:53:46 +01:00
|
|
|
ControlsAdwaita *controls = (ControlsAdwaita *) user_data;
|
2021-10-29 22:08:49 +02:00
|
|
|
MgManga *manga = gtk_list_item_get_item (list_item);
|
|
|
|
GtkBox *box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0));
|
2021-11-07 17:59:43 +01:00
|
|
|
char *manga_title = mg_manga_get_title (manga);
|
2021-11-22 01:02:00 +01:00
|
|
|
char *image_url = mg_manga_get_image_url (manga);
|
2021-10-31 20:42:58 +01:00
|
|
|
|
2021-11-07 17:59:43 +01:00
|
|
|
GtkWidget *label = gtk_label_new (manga_title);
|
2022-01-23 11:35:31 +01:00
|
|
|
GtkPicture *picture = NULL;
|
2022-01-19 00:29:44 +01:00
|
|
|
#ifdef LIST_IMAGES
|
2022-01-23 10:53:46 +01:00
|
|
|
GCancellable *cancellable = g_cancellable_new ();
|
2022-01-23 11:35:31 +01:00
|
|
|
picture = create_picture_from_url (image_url, 100,
|
|
|
|
picture_ready_manga_preview, box, cancellable,
|
|
|
|
controls->avoid_list_image_downloads);
|
2022-01-23 10:53:46 +01:00
|
|
|
controls->image_threads_len++;
|
|
|
|
controls->image_threads = g_realloc (controls->image_threads,
|
|
|
|
controls->image_threads_len * sizeof *(controls->image_threads));
|
|
|
|
controls->image_threads[controls->image_threads_len-1] = cancellable;
|
2022-01-19 00:29:44 +01:00
|
|
|
#endif
|
2021-10-29 22:08:49 +02:00
|
|
|
|
2022-01-16 22:39:01 +01:00
|
|
|
g_object_set_property_int (G_OBJECT(box), "height-request", 100);
|
2022-01-19 00:29:44 +01:00
|
|
|
#ifdef LIST_IMAGES
|
2022-01-18 21:00:39 +01:00
|
|
|
if (picture) {
|
|
|
|
gtk_box_append (box, GTK_WIDGET (picture));
|
|
|
|
}
|
2022-01-19 00:29:44 +01:00
|
|
|
#endif
|
2021-10-29 22:08:49 +02:00
|
|
|
gtk_box_append (box, label);
|
2022-01-16 04:09:04 +01:00
|
|
|
|
2021-10-29 22:08:49 +02:00
|
|
|
gtk_list_item_set_child (list_item, GTK_WIDGET (box));
|
2021-11-07 17:59:43 +01:00
|
|
|
g_free (manga_title);
|
2021-11-22 01:02:00 +01:00
|
|
|
g_free (image_url);
|
2021-10-29 22:08:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
GtkListView *
|
2021-11-22 23:40:22 +01:00
|
|
|
create_list_view_mangas (GListStore *mangas, ControlsAdwaita *controls) {
|
2021-10-29 22:08:49 +02:00
|
|
|
GtkSingleSelection *selection = gtk_single_selection_new (G_LIST_MODEL (mangas));
|
|
|
|
GtkListItemFactory *factory = gtk_signal_list_item_factory_new ();
|
2021-10-31 20:42:58 +01:00
|
|
|
GtkListView *list_view_manga = NULL;
|
|
|
|
|
2021-10-29 22:08:49 +02:00
|
|
|
g_signal_connect (G_OBJECT (factory), "bind",
|
2021-10-31 20:42:58 +01:00
|
|
|
G_CALLBACK (setup_list_view_mangas),
|
2022-01-23 10:53:46 +01:00
|
|
|
controls);
|
2021-10-31 20:42:58 +01:00
|
|
|
|
|
|
|
list_view_manga = GTK_LIST_VIEW (gtk_list_view_new (GTK_SELECTION_MODEL (selection),
|
|
|
|
factory));
|
2021-11-01 13:43:17 +01:00
|
|
|
g_object_set_property_int (G_OBJECT (list_view_manga),
|
|
|
|
"single-click-activate", 1);
|
2021-10-31 20:42:58 +01:00
|
|
|
|
2021-11-22 23:40:22 +01:00
|
|
|
|
2021-10-31 20:42:58 +01:00
|
|
|
g_signal_connect (G_OBJECT (list_view_manga), "activate",
|
2021-11-22 23:40:22 +01:00
|
|
|
G_CALLBACK (manga_selected), controls);
|
2021-10-31 20:42:58 +01:00
|
|
|
return list_view_manga;
|
2021-10-29 22:08:49 +02:00
|
|
|
}
|