diff --git a/include/openmg/view/detail_manga.h b/include/openmg/view/detail_manga.h index 2cd1334..2a9d21c 100644 --- a/include/openmg/view/detail_manga.h +++ b/include/openmg/view/detail_manga.h @@ -3,5 +3,7 @@ #include +#include + GtkBox * -create_detail_view (MgManga *manga, AdwLeaflet *views_leaflet); +create_detail_view (MgManga *manga, ControlsAdwaita *controls); diff --git a/include/openmg/view/list_view_manga.h b/include/openmg/view/list_view_manga.h index 54b3ad5..7a323ef 100644 --- a/include/openmg/view/list_view_manga.h +++ b/include/openmg/view/list_view_manga.h @@ -1,5 +1,7 @@ #include #include +#include + GtkListView * -create_list_view_mangas (GListStore *mangas, AdwLeaflet *views_leaflet); +create_list_view_mangas (GListStore *mangas, ControlsAdwaita *controls); diff --git a/src/view/detail_manga.c b/src/view/detail_manga.c index b816338..77ba530 100644 --- a/src/view/detail_manga.c +++ b/src/view/detail_manga.c @@ -13,6 +13,18 @@ #include #include +typedef struct { + GtkWidget *reorder; + GtkWidget *hide_description; + AdwHeaderBar *header; +} HeaderButtons; +static void +hide_controls (GtkWidget *detail_view, + gpointer user_data); +static void +show_controls (GtkWidget *detail_view, + gpointer user_data); + static void reverse_list (GtkButton *reverse_button, gpointer user_data) { @@ -48,7 +60,9 @@ toggle_folded (GtkButton *toggle_folded_button, } GtkBox * -create_detail_view (MgManga *manga, AdwLeaflet *views_leaflet) { +create_detail_view (MgManga *manga, ControlsAdwaita *controls) { + AdwLeaflet *views_leaflet = controls->views_leaflet; + AdwHeaderBar *header = controls->header; MgBackendReadmng *readmng = mg_backend_readmng_new (); GtkWidget *scroll; GtkBox *detail_view = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); @@ -68,6 +82,7 @@ create_detail_view (MgManga *manga, AdwLeaflet *views_leaflet) { char *title_text = mg_util_xml_get_title_text ( xml_util, manga_title_text); char *description_text; + HeaderButtons *buttons = g_malloc (sizeof *buttons); scroll = gtk_scrolled_window_new (); g_object_set_property_int (G_OBJECT (scroll), "vexpand", 1); @@ -100,11 +115,21 @@ create_detail_view (MgManga *manga, AdwLeaflet *views_leaflet) { gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scroll), GTK_WIDGET (chapter_list)); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_box_append (detail_view, GTK_WIDGET (toggle_folded_button)); gtk_box_append (detail_view, scroll); - gtk_box_append (detail_view, GTK_WIDGET (reverse_list_button)); - g_clear_object (&readmng); + buttons->header = header; + buttons->hide_description = GTK_WIDGET (toggle_folded_button); + buttons->reorder = GTK_WIDGET (reverse_list_button); + + g_object_ref (G_OBJECT (reverse_list_button)); + g_object_ref (G_OBJECT (toggle_folded_button)); + + g_signal_connect (detail_view, "map", G_CALLBACK (show_controls), + buttons); + g_signal_connect (detail_view, "unmap", G_CALLBACK (hide_controls), + buttons); + + g_clear_object (&readmng); g_free (url_image); g_free (manga_title_text); g_free (title_text); @@ -112,3 +137,21 @@ create_detail_view (MgManga *manga, AdwLeaflet *views_leaflet) { g_clear_object (&xml_util); return detail_view; } + +static void +hide_controls (GtkWidget *detail_view, + gpointer user_data) { + HeaderButtons *buttons = (HeaderButtons *) user_data; + AdwHeaderBar *header = buttons->header; + adw_header_bar_remove (header, GTK_WIDGET (buttons->hide_description)); + adw_header_bar_remove (header, GTK_WIDGET (buttons->reorder)); +} + +static void +show_controls (GtkWidget *detail_view, + gpointer user_data) { + HeaderButtons *buttons = (HeaderButtons *) user_data; + AdwHeaderBar *header = buttons->header; + adw_header_bar_pack_end (header, GTK_WIDGET (buttons->hide_description)); + adw_header_bar_pack_end (header, GTK_WIDGET (buttons->reorder)); +} diff --git a/src/view/list_view_manga.c b/src/view/list_view_manga.c index c775a33..16807e5 100644 --- a/src/view/list_view_manga.c +++ b/src/view/list_view_manga.c @@ -9,6 +9,7 @@ #include #include #include +#include typedef struct { GtkListView *list_view; @@ -24,7 +25,8 @@ static void manga_selected (GtkListView *list_view, guint position, gpointer user_data) { - AdwLeaflet *views_leaflet = ADW_LEAFLET (user_data); + ControlsAdwaita *controls = (ControlsAdwaita *) user_data; + AdwLeaflet *views_leaflet = controls->views_leaflet; GtkSingleSelection *selection = GTK_SINGLE_SELECTION (gtk_list_view_get_model (list_view)); GListModel *mangas = gtk_single_selection_get_model (selection); @@ -39,7 +41,7 @@ manga_selected (GtkListView *list_view, ADW_NAVIGATION_DIRECTION_FORWARD); } - GtkBox *detail_view = create_detail_view (manga, views_leaflet); + GtkBox *detail_view = create_detail_view (manga, controls); adw_leaflet_append (views_leaflet, GTK_WIDGET (detail_view)); adw_leaflet_navigate (views_leaflet, ADW_NAVIGATION_DIRECTION_FORWARD); } @@ -66,7 +68,8 @@ setup_list_view_mangas (GtkSignalListItemFactory *factory, } GtkListView * -create_list_view_mangas (GListStore *mangas, AdwLeaflet *views_leaflet) { +create_list_view_mangas (GListStore *mangas, ControlsAdwaita *controls) { + AdwLeaflet *views_leaflet = controls->views_leaflet; GtkSingleSelection *selection = gtk_single_selection_new (G_LIST_MODEL (mangas)); GtkListItemFactory *factory = gtk_signal_list_item_factory_new (); GtkListView *list_view_manga = NULL; @@ -80,7 +83,8 @@ create_list_view_mangas (GListStore *mangas, AdwLeaflet *views_leaflet) { g_object_set_property_int (G_OBJECT (list_view_manga), "single-click-activate", 1); + g_signal_connect (G_OBJECT (list_view_manga), "activate", - G_CALLBACK (manga_selected), views_leaflet); + G_CALLBACK (manga_selected), controls); return list_view_manga; } diff --git a/src/view/main_view.c b/src/view/main_view.c index 7bc77f7..55a0182 100644 --- a/src/view/main_view.c +++ b/src/view/main_view.c @@ -28,19 +28,25 @@ activate (AdwApplication *app, GtkListView *list_view; GtkWidget *scroll; AdwLeaflet *views_leaflet = ADW_LEAFLET (adw_leaflet_new ()); + ControlsAdwaita *controls = g_malloc (sizeof *controls); + typedef void (*swipe_back_t)(AdwLeaflet *, gboolean); swipe_back_t swipe_back = (swipe_back_t) dlsym (NULL, "adw_leaflet_set_can_navigate_back"); + + if (!swipe_back) { swipe_back = (swipe_back_t) dlsym (NULL, "adw_leaflet_set_can_swipe_back"); } swipe_back (views_leaflet, 1); - create_headerbar (box, views_leaflet); + AdwHeaderBar *header_bar = create_headerbar (box, views_leaflet); + controls->header = header_bar; + controls->views_leaflet = views_leaflet; mangas = mg_backend_readmng_get_featured_manga (readmng); - list_view = create_list_view_mangas (mangas, views_leaflet); + list_view = create_list_view_mangas (mangas, controls); scroll = gtk_scrolled_window_new (); gtk_widget_set_valign (scroll, GTK_ALIGN_FILL);