From bd6417c6210ab94706d9edf77174d58ddf7d8bf5 Mon Sep 17 00:00:00 2001 From: oscfdezdz <42654671+oscfdezdz@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:35:31 +0100 Subject: [PATCH] detail-view: Split screenshot overlay into its own view --- po/POTFILES | 2 + src/exm-detail-view.blp | 423 ++++++++++++++++-------------------- src/exm-detail-view.c | 102 ++------- src/exm-screenshot-view.blp | 68 ++++++ src/exm-screenshot-view.c | 105 +++++++++ src/exm-screenshot-view.h | 18 ++ src/exm-window.blp | 4 + src/exm-zoom-picture.c | 1 - src/exm.gresource.xml.in | 1 + src/meson.build | 6 +- src/style.css | 3 +- 11 files changed, 406 insertions(+), 327 deletions(-) create mode 100644 src/exm-screenshot-view.blp create mode 100644 src/exm-screenshot-view.c create mode 100644 src/exm-screenshot-view.h diff --git a/po/POTFILES b/po/POTFILES index 1a28e569..780b03c3 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -25,6 +25,8 @@ src/exm-rating.blp src/exm-rating.c src/exm-screenshot.blp src/exm-screenshot.c +src/exm-screenshot-view.blp +src/exm-screenshot-view.c src/exm-search-row.blp src/exm-search-row.c src/exm-upgrade-assistant.blp diff --git a/src/exm-detail-view.blp b/src/exm-detail-view.blp index 9ef5db32..d7d2edcd 100644 --- a/src/exm-detail-view.blp +++ b/src/exm-detail-view.blp @@ -2,7 +2,6 @@ using Gtk 4.0; using Adw 1; template $ExmDetailView : Adw.NavigationPage { - Adw.ToolbarView { [top] @@ -26,309 +25,251 @@ template $ExmDetailView : Adw.NavigationPage { unapply => $breakpoint_unapply_cb() swapped; } - Gtk.Overlay { - [overlay] - Gtk.Overlay image_overlay { - visible: false; - - [overlay] - Gtk.Box { - orientation: horizontal; - spacing: 16; - - halign: end; - valign: end; - - margin-top: 24; - margin-bottom: 24; - margin-start: 24; - margin-end: 24; - - Gtk.Box { - styles ["linked"] + Gtk.Stack stack { + vexpand: true; - Gtk.Button { - styles ["osd", "circular"] - icon-name: "zoom-in-symbolic"; + Gtk.StackPage { + name: "page_spinner"; - tooltip-text: _("Zoom In"); + child: Gtk.Box { + orientation: vertical; + spacing: 24; + valign: center; - action-name: "detail.zoom-in"; - } - - Gtk.Button { - styles ["osd", "circular"] - icon-name: "zoom-out-symbolic"; - - tooltip-text: _("Zoom Out"); - - action-name: "detail.zoom-out"; - } + Gtk.Spinner { + spinning: true; + height-request: 32; + width-request: 32; } - Gtk.Button ext_screenshot_popin_button { - styles ["osd", "circular"] - icon-name: "pip-in-symbolic"; - - tooltip-text: _("Return to view"); + Gtk.Label { + styles["title-1"] + label: _("Loading Details"); } - } - - Adw.Bin { - styles ["tint"] - - hexpand: true; - vexpand: true; - - $ExmZoomPicture overlay_screenshot {} - } + }; } - Gtk.Stack stack { - vexpand: true; - - Gtk.StackPage { - name: "page_spinner"; - - child: Gtk.Box { - orientation: vertical; - spacing: 24; - valign: center; - - Gtk.Spinner { - spinning: true; - height-request: 32; - width-request: 32; - } - - Gtk.Label { - styles["title-1"] - label: _("Loading Details"); - } - }; - } + Gtk.StackPage { + name: "page_error"; - Gtk.StackPage { - name: "page_error"; + child: Adw.StatusPage { + title: _("An Error Occurred"); + icon-name: "dialog-question-symbolic"; + }; + } - child: Adw.StatusPage { - title: _("An Error Occurred"); - icon-name: "dialog-question-symbolic"; - }; - } + Gtk.StackPage { + name: "page_detail"; + child: Gtk.ScrolledWindow scroll_area { + Adw.Clamp { + maximum-size: 800; - Gtk.StackPage { - name: "page_detail"; - child: Gtk.ScrolledWindow scroll_area { - Adw.Clamp { - maximum-size: 800; + Gtk.Box { + styles ["detail"] + orientation: vertical; + spacing: 24; - Gtk.Box { - styles ["detail"] - orientation: vertical; + Gtk.Box header { + orientation: horizontal; spacing: 24; - Gtk.Box header { + Gtk.Image ext_icon { + halign: center; + valign: center; + pixel-size: 64; + } + + Gtk.Box header_suffix { orientation: horizontal; spacing: 24; - Gtk.Image ext_icon { - halign: center; + Gtk.Box { + orientation: vertical; + hexpand: true; valign: center; - pixel-size: 64; - } - - Gtk.Box header_suffix { - orientation: horizontal; - spacing: 24; - - Gtk.Box { - orientation: vertical; - hexpand: true; - valign: center; - - Gtk.Label ext_title { - styles ["title-1"] - xalign: 0; - ellipsize: end; - } - Gtk.Label ext_author { - styles ["dim-label"] - label: "Author"; - xalign: 0; - ellipsize: end; - } + Gtk.Label ext_title { + styles ["title-1"] + xalign: 0; + ellipsize: end; } - $ExmInstallButton ext_install { - valign: center; - halign: center; + Gtk.Label ext_author { + styles ["dim-label"] + label: "Author"; + xalign: 0; + ellipsize: end; } } - } - - Gtk.Overlay ext_screenshot_container { - [overlay] - Gtk.Button ext_screenshot_popout_button { - styles ["osd", "circular"] - icon-name: "pip-out-symbolic"; - halign: end; - valign: end; - - margin-top: 8; - margin-bottom: 8; - margin-start: 8; - margin-end: 8; - tooltip-text: _("Enlarge image"); + $ExmInstallButton ext_install { + valign: center; + halign: center; } + } + } - $ExmScreenshot ext_screenshot {} + Gtk.Overlay ext_screenshot_container { + [overlay] + Gtk.Button ext_screenshot_popout_button { + styles ["osd", "circular"] + icon-name: "pip-out-symbolic"; + halign: end; + valign: end; + + margin-top: 8; + margin-bottom: 8; + margin-start: 8; + margin-end: 8; + + tooltip-text: _("Enlarge image"); + clicked => $screenshot_view_cb(template); } - Gtk.Box { - orientation: vertical; + $ExmScreenshot ext_screenshot {} + } + + Gtk.Box { + orientation: vertical; - Gtk.Label { - styles ["title-4", "detail-heading"] + Gtk.Label { + styles ["title-4", "detail-heading"] - label: _("Description"); - xalign: 0; - } + label: _("Description"); + xalign: 0; + } - Gtk.Label ext_description { - styles ["multiline"] - xalign: 0; - wrap: true; - wrap-mode: word_char; - selectable: true; - } + Gtk.Label ext_description { + styles ["multiline"] + xalign: 0; + wrap: true; + wrap-mode: word_char; + selectable: true; } + } - $ExmInfoBar ext_info_bar {} + $ExmInfoBar ext_info_bar {} - Gtk.Box { - orientation: vertical; + Gtk.Box { + orientation: vertical; - Gtk.Label { - styles ["title-4", "detail-heading"] + Gtk.Label { + styles ["title-4", "detail-heading"] - label: _("Links"); - xalign: 0; - } + label: _("Links"); + xalign: 0; + } - Gtk.ListBox { - styles ["boxed-list"] + Gtk.ListBox { + styles ["boxed-list"] - selection-mode: none; + selection-mode: none; - Adw.ActionRow link_homepage { - [prefix] - Gtk.Image { - icon-name: "go-home-symbolic"; - } + Adw.ActionRow link_homepage { + [prefix] + Gtk.Image { + icon-name: "go-home-symbolic"; + } - title: _("Homepage"); - activatable: true; - action-name: "detail.open-homepage"; + title: _("Homepage"); + activatable: true; + action-name: "detail.open-homepage"; - [suffix] - Gtk.Image { - styles ["dim-label"] - icon-name: "external-link-symbolic"; - } + [suffix] + Gtk.Image { + styles ["dim-label"] + icon-name: "external-link-symbolic"; } + } - Adw.ActionRow link_extensions { - [prefix] - Gtk.Image { - icon-name: "web-browser-symbolic"; - } + Adw.ActionRow link_extensions { + [prefix] + Gtk.Image { + icon-name: "web-browser-symbolic"; + } - title: _("View on Extensions"); - activatable: true; - action-name: "detail.open-extensions"; + title: _("View on Extensions"); + activatable: true; + action-name: "detail.open-extensions"; - [suffix] - Gtk.Image { - styles ["dim-label"] - icon-name: "external-link-symbolic"; - } + [suffix] + Gtk.Image { + styles ["dim-label"] + icon-name: "external-link-symbolic"; } } } + } - Gtk.Box { - orientation: vertical; + Gtk.Box { + orientation: vertical; - Gtk.Label { - styles ["title-4", "detail-heading"] + Gtk.Label { + styles ["title-4", "detail-heading"] - label: _("User Reviews"); - xalign: 0; - } + label: _("User Reviews"); + xalign: 0; + } - // TODO: Abstract into common class - Gtk.Stack comment_stack { - vexpand: true; + // TODO: Abstract into common class + Gtk.Stack comment_stack { + vexpand: true; - Gtk.StackPage { - name: "page_spinner"; + Gtk.StackPage { + name: "page_spinner"; - child: Gtk.Image { - icon-name: "content-loading-symbolic"; - icon-size: large; - valign: center; - }; - } + child: Gtk.Image { + icon-name: "content-loading-symbolic"; + icon-size: large; + valign: center; + }; + } - Gtk.StackPage { - name: "page_error"; + Gtk.StackPage { + name: "page_error"; - child: Adw.StatusPage { - title: _("An Error Occurred"); - icon-name: "dialog-question-symbolic"; - }; - } + child: Adw.StatusPage { + title: _("An Error Occurred"); + icon-name: "dialog-question-symbolic"; + }; + } - Gtk.StackPage { - name: "page_empty"; + Gtk.StackPage { + name: "page_empty"; - child: Gtk.Label { - label: _("There are no comments."); - valign: start; - xalign: 0; - }; - } + child: Gtk.Label { + label: _("There are no comments."); + valign: start; + xalign: 0; + }; + } - Gtk.StackPage { - name: "page_comments"; - - child: Gtk.Box { - orientation: vertical; - - Gtk.FlowBox comment_box { - max-children-per-line: 2; - homogeneous: true; - selection-mode: none; - row-spacing: 12; - column-spacing: 12; - } - Gtk.Button show_more_btn { - label: _("_Show All Reviews"); - halign: center; - margin-top: 10; - use-underline: true; - } - }; - } + Gtk.StackPage { + name: "page_comments"; + + child: Gtk.Box { + orientation: vertical; + + Gtk.FlowBox comment_box { + max-children-per-line: 2; + homogeneous: true; + selection-mode: none; + row-spacing: 12; + column-spacing: 12; + } + Gtk.Button show_more_btn { + label: _("_Show All Reviews"); + halign: center; + margin-top: 10; + use-underline: true; + } + }; } } } } - }; - } + } + }; } } }; diff --git a/src/exm-detail-view.c b/src/exm-detail-view.c index 2c9f4f0a..11af87d5 100644 --- a/src/exm-detail-view.c +++ b/src/exm-detail-view.c @@ -21,7 +21,7 @@ #include "exm-detail-view.h" #include "exm-screenshot.h" -#include "exm-zoom-picture.h" +#include "exm-screenshot-view.h" #include "exm-info-bar.h" #include "exm-comment-tile.h" #include "exm-comment-dialog.h" @@ -66,14 +66,11 @@ struct _ExmDetailView ExmScreenshot *ext_screenshot; GtkOverlay *ext_screenshot_container; GtkButton *ext_screenshot_popout_button; - GtkButton *ext_screenshot_popin_button; ExmInfoBar *ext_info_bar; GtkScrolledWindow *scroll_area; GtkStack *comment_stack; GtkFlowBox *comment_box; GtkButton *show_more_btn; - AdwBin *image_overlay; - ExmZoomPicture *overlay_screenshot; AdwActionRow *link_homepage; gchar *uri_homepage; @@ -182,6 +179,9 @@ on_image_loaded (GObject *source, GError *error = NULL; GdkTexture *texture = exm_image_resolver_resolve_finish (EXM_IMAGE_RESOLVER (source), res, &error); + AdwNavigationView *parent; + ExmScreenshotView *screenshot_view; + if (error) { // TODO: Properly log this @@ -189,10 +189,12 @@ on_image_loaded (GObject *source, return; } + parent = ADW_NAVIGATION_VIEW (gtk_widget_get_parent (GTK_WIDGET (self))); + screenshot_view = EXM_SCREENSHOT_VIEW (adw_navigation_view_find_page (parent, "screenshot-view")); + exm_screenshot_set_paintable (self->ext_screenshot, GDK_PAINTABLE (texture)); - exm_zoom_picture_set_paintable (self->overlay_screenshot, GDK_PAINTABLE (texture)); + exm_screenshot_view_set_screenshot (screenshot_view, GDK_PAINTABLE (texture)); exm_screenshot_display (self->ext_screenshot); - exm_zoom_picture_set_zoom_level (self->overlay_screenshot, 1.0f); g_object_unref (texture); g_object_unref (self); @@ -300,10 +302,8 @@ on_data_loaded (GObject *source, GError *error = NULL; ExmDetailView *self; ExmInstallButtonState install_state; - GtkWidget *child; GList *version_iter; ExmShellVersionMap *version_map; - gchar *uri; self = EXM_DETAIL_VIEW (user_data); @@ -328,6 +328,7 @@ on_data_loaded (GObject *source, adw_window_title_set_title (self->title, name); adw_window_title_set_subtitle (self->title, uuid); + adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (self), name); is_installed = exm_manager_is_installed_uuid (self->manager, uuid); is_supported = exm_search_result_supports_shell_version (data, self->shell_version); @@ -356,7 +357,6 @@ on_data_loaded (GObject *source, self->resolver_cancel = g_cancellable_new (); exm_screenshot_set_paintable (self->ext_screenshot, NULL); - exm_zoom_picture_set_paintable (self->overlay_screenshot, NULL); exm_screenshot_reset (self->ext_screenshot); gtk_widget_set_visible (GTK_WIDGET (self->ext_screenshot_container), TRUE); @@ -444,7 +444,6 @@ exm_detail_view_load_for_uuid (ExmDetailView *self, self->uuid = uuid; gtk_stack_set_visible_child_name (self->stack, "page_spinner"); - gtk_widget_set_visible (GTK_WIDGET (self->image_overlay), FALSE); exm_data_provider_get_async (self->provider, uuid, NULL, on_data_loaded, self); } @@ -483,30 +482,6 @@ open_link (ExmDetailView *self, gtk_uri_launcher_launch (uri, GTK_WINDOW (toplevel), NULL, NULL, NULL); } -static void -notify_zoom (ExmZoomPicture *picture, - GParamSpec *pspec, - ExmDetailView *self) -{ - float zoom_level; - float max_zoom; - float min_zoom; - - zoom_level = exm_zoom_picture_get_zoom_level (picture); - max_zoom = exm_zoom_picture_get_zoom_level_max (picture); - min_zoom = exm_zoom_picture_get_zoom_level_min (picture); - - // Set action states - if (zoom_level < max_zoom) - g_simple_action_set_enabled (self->zoom_in, TRUE); - if (zoom_level == max_zoom) - g_simple_action_set_enabled (self->zoom_in, FALSE); - if (zoom_level > min_zoom) - g_simple_action_set_enabled (self->zoom_out, TRUE); - if (zoom_level == min_zoom) - g_simple_action_set_enabled (self->zoom_out, FALSE); -} - static void on_bind_manager (ExmDetailView *self) { @@ -554,6 +529,15 @@ update_headerbar_cb (ExmDetailView *self) gtk_adjustment_get_value (adj) > 0); } +static void +screenshot_view_cb (ExmDetailView *self) +{ + AdwNavigationView *parent; + + parent = ADW_NAVIGATION_VIEW (gtk_widget_get_parent (GTK_WIDGET (self))); + adw_navigation_view_push_by_tag (parent, "screenshot-view"); +} + static void exm_detail_view_class_init (ExmDetailViewClass *klass) { @@ -594,7 +578,6 @@ exm_detail_view_class_init (ExmDetailViewClass *klass) gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_container); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popout_button); - gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popin_button); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions); @@ -602,34 +585,18 @@ exm_detail_view_class_init (ExmDetailViewClass *klass) gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_box); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_stack); gtk_widget_class_bind_template_child (widget_class, ExmDetailView, show_more_btn); - gtk_widget_class_bind_template_child (widget_class, ExmDetailView, image_overlay); - gtk_widget_class_bind_template_child (widget_class, ExmDetailView, overlay_screenshot); gtk_widget_class_bind_template_callback (widget_class, breakpoint_apply_cb); gtk_widget_class_bind_template_callback (widget_class, breakpoint_unapply_cb); + gtk_widget_class_bind_template_callback (widget_class, screenshot_view_cb); gtk_widget_class_install_action (widget_class, "detail.open-extensions", NULL, open_link); gtk_widget_class_install_action (widget_class, "detail.open-homepage", NULL, open_link); - - gtk_widget_class_add_binding_action (widget_class, GDK_KEY_plus, GDK_CONTROL_MASK, "detail.zoom-in", NULL); - gtk_widget_class_add_binding_action (widget_class, GDK_KEY_minus, GDK_CONTROL_MASK, "detail.zoom-out", NULL); - gtk_widget_class_add_binding_action (widget_class, GDK_KEY_0, GDK_CONTROL_MASK, "detail.zoom-reset", NULL); -} - -static void -widget_show(GtkWidget *widget) { - gtk_widget_set_visible(widget, TRUE); -} - -static void -widget_hide(GtkWidget *widget) { - gtk_widget_set_visible(widget, FALSE); } static void exm_detail_view_init (ExmDetailView *self) { - GSimpleActionGroup *group; GtkAdjustment *adj; gtk_widget_init_template (GTK_WIDGET (self)); @@ -638,42 +605,11 @@ exm_detail_view_init (ExmDetailView *self) self->resolver = exm_image_resolver_new (); self->comment_provider = exm_comment_provider_new (); - self->zoom_in = g_simple_action_new ("zoom-in", NULL); - g_signal_connect_swapped (self->zoom_in, "activate", G_CALLBACK (exm_zoom_picture_zoom_in), self->overlay_screenshot); - - self->zoom_out = g_simple_action_new ("zoom-out", NULL); - g_signal_connect_swapped (self->zoom_out, "activate", G_CALLBACK (exm_zoom_picture_zoom_out), self->overlay_screenshot); - - self->zoom_reset = g_simple_action_new ("zoom-reset", NULL); - g_signal_connect_swapped (self->zoom_reset, "activate", G_CALLBACK (exm_zoom_picture_zoom_reset), self->overlay_screenshot); - - group = g_simple_action_group_new (); - g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_in)); - g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_out)); - g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_reset)); - gtk_widget_insert_action_group (GTK_WIDGET (self), "detail", G_ACTION_GROUP (group)); - - // Update action state on zoom change - g_signal_connect (self->overlay_screenshot, - "notify::zoom-level", - G_CALLBACK (notify_zoom), - self); - g_signal_connect (self->ext_install, "clicked", G_CALLBACK (install_remote), self); - g_signal_connect_swapped (self->ext_screenshot_popout_button, - "clicked", - G_CALLBACK (widget_show), - self->image_overlay); - - g_signal_connect_swapped (self->ext_screenshot_popin_button, - "clicked", - G_CALLBACK (widget_hide), - self->image_overlay); - adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scroll_area)); g_signal_connect_swapped (adj, "value-changed", G_CALLBACK (update_headerbar_cb), self); diff --git a/src/exm-screenshot-view.blp b/src/exm-screenshot-view.blp new file mode 100644 index 00000000..6fd0a7b5 --- /dev/null +++ b/src/exm-screenshot-view.blp @@ -0,0 +1,68 @@ +using Gtk 4.0; +using Adw 1; + +template $ExmScreenshotView: Adw.NavigationPage { + styles [ + "tint" + ] + + tag: "screenshot-view"; + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + content: Gtk.Overlay { + [overlay] + Gtk.Overlay image_overlay { + [overlay] + Gtk.Box { + orientation: horizontal; + spacing: 12; + halign: end; + valign: end; + margin-top: 18; + margin-bottom: 18; + margin-start: 18; + margin-end: 18; + + Gtk.Button { + styles [ + "osd", + "circular" + ] + + icon-name: "zoom-out-symbolic"; + tooltip-text: _("Zoom Out"); + action-name: "screenshot.zoom-out"; + height-request: 42; + width-request: 42; + } + + Gtk.Button { + styles [ + "osd", + "circular" + ] + + icon-name: "zoom-in-symbolic"; + tooltip-text: _("Zoom In"); + action-name: "screenshot.zoom-in"; + height-request: 42; + width-request: 42; + } + } + + Adw.Bin { + hexpand: true; + vexpand: true; + + $ExmZoomPicture overlay_screenshot { + zoom-level: 1.0; + notify::zoom-level => $notify_zoom(); + } + } + } + }; + } +} diff --git a/src/exm-screenshot-view.c b/src/exm-screenshot-view.c new file mode 100644 index 00000000..50e17fc6 --- /dev/null +++ b/src/exm-screenshot-view.c @@ -0,0 +1,105 @@ +#include "exm-screenshot-view.h" + +#include "exm-zoom-picture.h" + +struct _ExmScreenshotView +{ + AdwNavigationPage parent_instance; + + GSimpleAction *zoom_in; + GSimpleAction *zoom_out; + GSimpleAction *zoom_reset; + + ExmZoomPicture *overlay_screenshot; +}; + +G_DEFINE_FINAL_TYPE (ExmScreenshotView, exm_screenshot_view, ADW_TYPE_NAVIGATION_PAGE) + +ExmScreenshotView * +exm_screenshot_view_new (void) +{ + return g_object_new (EXM_TYPE_SCREENSHOT_VIEW, NULL); +} + +static void +exm_screenshot_view_finalize (GObject *object) +{ + ExmScreenshotView *self = (ExmScreenshotView *)object; + + G_OBJECT_CLASS (exm_screenshot_view_parent_class)->finalize (object); +} + +void +exm_screenshot_view_set_screenshot (ExmScreenshotView *self, + GdkPaintable *paintable) +{ + exm_zoom_picture_set_paintable (self->overlay_screenshot, paintable); + exm_zoom_picture_set_zoom_level (self->overlay_screenshot, 1.0f); +} + +static void +notify_zoom (ExmZoomPicture *picture, + GParamSpec *pspec, + ExmScreenshotView *self) +{ + float zoom_level; + float max_zoom; + float min_zoom; + + zoom_level = exm_zoom_picture_get_zoom_level (picture); + max_zoom = exm_zoom_picture_get_zoom_level_max (picture); + min_zoom = exm_zoom_picture_get_zoom_level_min (picture); + + // Set action states + if (zoom_level < max_zoom) + g_simple_action_set_enabled (self->zoom_in, TRUE); + if (zoom_level == max_zoom) + g_simple_action_set_enabled (self->zoom_in, FALSE); + if (zoom_level > min_zoom) + g_simple_action_set_enabled (self->zoom_out, TRUE); + if (zoom_level == min_zoom) + g_simple_action_set_enabled (self->zoom_out, FALSE); +} + +static void +exm_screenshot_view_class_init (ExmScreenshotViewClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = exm_screenshot_view_finalize; + + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/com/mattjakeman/ExtensionManager/exm-screenshot-view.ui"); + + gtk_widget_class_bind_template_child (widget_class, ExmScreenshotView, overlay_screenshot); + + gtk_widget_class_bind_template_callback (widget_class, notify_zoom); + + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_plus, GDK_CONTROL_MASK, "screenshot.zoom-in", NULL); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_minus, GDK_CONTROL_MASK, "screenshot.zoom-out", NULL); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_0, GDK_CONTROL_MASK, "screenshot.zoom-reset", NULL); +} + +static void +exm_screenshot_view_init (ExmScreenshotView *self) +{ + GSimpleActionGroup *group; + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->zoom_in = g_simple_action_new ("zoom-in", NULL); + g_signal_connect_swapped (self->zoom_in, "activate", G_CALLBACK (exm_zoom_picture_zoom_in), self->overlay_screenshot); + + self->zoom_out = g_simple_action_new ("zoom-out", NULL); + g_signal_connect_swapped (self->zoom_out, "activate", G_CALLBACK (exm_zoom_picture_zoom_out), self->overlay_screenshot); + + self->zoom_reset = g_simple_action_new ("zoom-reset", NULL); + g_signal_connect_swapped (self->zoom_reset, "activate", G_CALLBACK (exm_zoom_picture_zoom_reset), self->overlay_screenshot); + + group = g_simple_action_group_new (); + g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_in)); + g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_out)); + g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (self->zoom_reset)); + gtk_widget_insert_action_group (GTK_WIDGET (self), "screenshot", G_ACTION_GROUP (group)); +} diff --git a/src/exm-screenshot-view.h b/src/exm-screenshot-view.h new file mode 100644 index 00000000..22ebc5d1 --- /dev/null +++ b/src/exm-screenshot-view.h @@ -0,0 +1,18 @@ +# pragma once + +#include + +G_BEGIN_DECLS + +#define EXM_TYPE_SCREENSHOT_VIEW (exm_screenshot_view_get_type()) + +G_DECLARE_FINAL_TYPE (ExmScreenshotView, exm_screenshot_view, EXM, SCREENSHOT_VIEW, AdwNavigationPage) + +ExmScreenshotView * +exm_screenshot_view_new (void); + +void +exm_screenshot_view_set_screenshot (ExmScreenshotView *self, + GdkPaintable *paintable); + +G_END_DECLS diff --git a/src/exm-window.blp b/src/exm-window.blp index 0a55e65c..b8c56186 100644 --- a/src/exm-window.blp +++ b/src/exm-window.blp @@ -75,6 +75,10 @@ template $ExmWindow : Adw.ApplicationWindow { } $ExmDetailView detail_view {} + + $ExmScreenshotView screenshot_view { + title: bind detail_view.title; + } }; } diff --git a/src/exm-zoom-picture.c b/src/exm-zoom-picture.c index 393e5326..1ff2240e 100644 --- a/src/exm-zoom-picture.c +++ b/src/exm-zoom-picture.c @@ -335,7 +335,6 @@ exm_zoom_picture_init (ExmZoomPicture *self) { GtkGesture *gesture; - exm_zoom_picture_set_zoom_level (self, 1.0f); gtk_widget_set_overflow (GTK_WIDGET (self), GTK_OVERFLOW_HIDDEN); gesture = gtk_gesture_zoom_new (); diff --git a/src/exm.gresource.xml.in b/src/exm.gresource.xml.in index e1b7605e..b814b6b4 100644 --- a/src/exm.gresource.xml.in +++ b/src/exm.gresource.xml.in @@ -15,6 +15,7 @@ exm-error-dialog.ui exm-info-bar.ui exm-info-bar-item.ui + exm-screenshot-view.ui res/suggestions.txt ../data/@appstream_file@ style.css diff --git a/src/meson.build b/src/meson.build index eca7be45..61237d97 100644 --- a/src/meson.build +++ b/src/meson.build @@ -13,6 +13,9 @@ exm_sources = [ 'exm-info-bar.c', 'exm-info-bar-item.c', + # Screenshot View + 'exm-screenshot-view.c', + # Installed Page 'exm-installed-page.c', 'exm-extension-row.c', @@ -66,7 +69,8 @@ blueprints = custom_target('blueprints', 'exm-upgrade-assistant.blp', 'exm-error-dialog.blp', 'exm-info-bar.blp', - 'exm-info-bar-item.blp' + 'exm-info-bar-item.blp', + 'exm-screenshot-view.blp' ), output: '.', command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'], diff --git a/src/style.css b/src/style.css index edc91caf..12cb9e7c 100644 --- a/src/style.css +++ b/src/style.css @@ -15,7 +15,8 @@ } .tint { - background-color: rgba(0,0,0,0.8); + background-color: rgba(0, 0, 0, 1); + color: white; } .search-row {