aboutsummaryrefslogtreecommitdiff
path: root/fiv-view.c
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2021-12-19 12:35:53 +0100
committerPřemysl Eric Janouch <p@janouch.name>2021-12-21 13:05:11 +0100
commit9899a266357a30c4371bdc4c66c3dc5af9b66ff0 (patch)
tree3d59744f0b6e3d765da7fc54d5ef7ef39ea34b3b /fiv-view.c
parent24f9d21ca759570ae6e79e7440bcab00091ae14e (diff)
downloadfiv-9899a266357a30c4371bdc4c66c3dc5af9b66ff0.tar.gz
fiv-9899a266357a30c4371bdc4c66c3dc5af9b66ff0.tar.xz
fiv-9899a266357a30c4371bdc4c66c3dc5af9b66ff0.zip
Add a file information dialog based on ExifTool
Right now, it isn't very pleasing to use.
Diffstat (limited to 'fiv-view.c')
-rw-r--r--fiv-view.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/fiv-view.c b/fiv-view.c
index b95ad3d..adb13b6 100644
--- a/fiv-view.c
+++ b/fiv-view.c
@@ -786,6 +786,76 @@ save_as(FivView *self, gboolean frame)
}
}
+static void
+info(FivView *self)
+{
+ // TODO(p): Add a fallback to internal capabilities.
+ // The simplest is to specify the filename and the resolution.
+ GtkWindow *window = get_toplevel(GTK_WIDGET(self));
+ int flags = G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE;
+
+ GError *error = NULL;
+ GSubprocess *subprocess = g_subprocess_new(flags, &error, "exiftool",
+ "-tab", "-groupNames", "-duplicates", "-extractEmbedded", "--binary",
+ "-quiet", "--", self->path, NULL);
+ if (error) {
+ show_error_dialog(window, error);
+ return;
+ }
+
+ gchar *out = NULL, *err = NULL;
+ if (!g_subprocess_communicate_utf8(
+ subprocess, NULL, NULL, &out, &err, &error)) {
+ show_error_dialog(window, error);
+ return;
+ }
+
+ GtkWidget *dialog = gtk_widget_new(GTK_TYPE_DIALOG,
+ "use-header-bar", TRUE,
+ "title", "Information",
+ "transient-for", window,
+ "destroy-with-parent", TRUE, NULL);
+
+ GtkWidget *content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+ if (*err) {
+ GtkWidget *info = gtk_info_bar_new();
+ GtkInfoBar *info_bar = GTK_INFO_BAR(info);
+ gtk_info_bar_set_message_type(info_bar, GTK_MESSAGE_WARNING);
+
+ GtkWidget *info_area = gtk_info_bar_get_content_area(info_bar);
+ GtkWidget *label = gtk_label_new(g_strstrip(err));
+ gtk_container_add(GTK_CONTAINER(info_area), label);
+
+ gtk_container_add(GTK_CONTAINER(content_area), info);
+ }
+
+ // TODO(p): Parse as GROUP\tTAG\tVALUE, do s/_/ /g in the group name,
+ // put the data in a GtkTreeModel/GtkTreeView.
+ GtkWidget *label = gtk_label_new(out);
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE);
+ gtk_label_set_xalign(GTK_LABEL(label), 0.);
+ gtk_label_set_yalign(GTK_LABEL(label), 0.);
+ gtk_widget_set_hexpand(label, TRUE);
+ gtk_widget_set_vexpand(label, TRUE);
+
+ GtkWidget *scroller = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_max_content_width(
+ GTK_SCROLLED_WINDOW(scroller), 800);
+ gtk_scrolled_window_set_max_content_height(
+ GTK_SCROLLED_WINDOW(scroller), 800);
+ gtk_scrolled_window_set_propagate_natural_width(
+ GTK_SCROLLED_WINDOW(scroller), TRUE);
+ gtk_scrolled_window_set_propagate_natural_height(
+ GTK_SCROLLED_WINDOW(scroller), TRUE);
+ gtk_container_add(GTK_CONTAINER(scroller), label);
+ gtk_container_add(GTK_CONTAINER(content_area), scroller);
+
+ g_free(out);
+ g_free(err);
+ g_object_unref(subprocess);
+ gtk_widget_show_all(dialog);
+}
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static inline gboolean
@@ -823,6 +893,12 @@ fiv_view_key_press_event(GtkWidget *widget, GdkEventKey *event)
return save_as(self, TRUE);
}
}
+ if (state == GDK_MOD1_MASK) {
+ switch (event->keyval) {
+ case GDK_KEY_Return:
+ return command(self, FIV_VIEW_COMMAND_INFO);
+ }
+ }
if (state != 0)
return FALSE;
@@ -1043,6 +1119,8 @@ fiv_view_command(FivView *self, FivViewCommand command)
print(self);
break; case FIV_VIEW_COMMAND_SAVE_PAGE:
save_as(self, FALSE);
+ break; case FIV_VIEW_COMMAND_INFO:
+ info(self);
break; case FIV_VIEW_COMMAND_ZOOM_IN:
set_scale(self, self->scale * SCALE_STEP);