diff options
author | nirav <nirav@teisuu.com> | 2018-10-14 18:30:40 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2018-10-14 18:30:40 +0530 |
commit | a7488f38fef1960086af860063f1958fb75d58f3 (patch) | |
tree | f2308d105bdbd5de1a178429c7e2d2b002a8339a | |
parent | fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4 (diff) | |
download | im-a7488f38fef1960086af860063f1958fb75d58f3.tar.gz im-a7488f38fef1960086af860063f1958fb75d58f3.zip |
Added info panel to show current file name, resolution and list index
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 25 | ||||
-rw-r--r-- | data/qwe.css | 9 | ||||
-rw-r--r-- | data/qwe.gresources.xml | 6 | ||||
-rw-r--r-- | src/file.c | 10 | ||||
-rw-r--r-- | src/file.h | 2 | ||||
-rw-r--r-- | src/image.c | 6 | ||||
-rw-r--r-- | src/input.c | 3 | ||||
-rw-r--r-- | src/window.c | 71 | ||||
-rw-r--r-- | src/window.h | 3 |
10 files changed, 119 insertions, 18 deletions
@@ -1,3 +1,3 @@ -.clang_complete +src/resources.c qwe *.o @@ -1,35 +1,42 @@ CC?=cc INSTALL?=install +PKGCONFIG?=$(shell which pkg-config) +GLIB_COMPILE_RESOURCES?=$(shell $(PKGCONFIG) --variable=glib_compile_resources gio-2.0) CFLAGS?=-o2 -pipe CFLAGS+=-Wall -Wextra -Wno-unused-parameter -CFLAGS+=$(shell pkg-config --cflags gtk+-3.0) -LDFLAGS+=$(shell pkg-config --libs gtk+-3.0) -PREFIX?=/usr +CFLAGS+=$(shell $(PKGCONFIG) --cflags gtk+-3.0) +LDFLAGS+=$(shell $(PKGCONFIG) --libs gtk+-3.0) +PREFIX?=/usr/local BINDIR?=$(PREFIX)/bin APPDIR?=$(PREFIX)/share/applications MANDIR?=$(PREFIX)/share/man/man1 SRCDIR=src +DATADIR=data OUTDIR=build -OBJECTS=\ - $(OUTDIR)/main.o \ - $(OUTDIR)/file.o \ - $(OUTDIR)/image.o \ - $(OUTDIR)/input.o \ - $(OUTDIR)/window.o \ +OBJECTS= $(OUTDIR)/main.o \ + $(OUTDIR)/file.o \ + $(OUTDIR)/image.o \ + $(OUTDIR)/input.o \ + $(OUTDIR)/window.o \ + $(OUTDIR)/resources.o all: qwe qwe: $(OBJECTS) $(CC) -o qwe $(OBJECTS) $(LDFLAGS) +$(SRCDIR)/resources.c: $(DATADIR)/qwe.gresources.xml $(DATADIR)/qwe.css + $(GLIB_COMPILE_RESOURCES) $(DATADIR)/qwe.gresources.xml --target=$(SRCDIR)/resources.c --generate-source + $(OUTDIR)/%.o: $(SRCDIR)/%.c @mkdir -p $(OUTDIR) $(CC) -c $(CFLAGS) -o $@ $< clean: rm -rf $(OUTDIR) qwe + rm -rf $(SRCDIR)/resources.c install: qwe qwe.desktop $(INSTALL) -m0755 qwe $(BINDIR) diff --git a/data/qwe.css b/data/qwe.css new file mode 100644 index 0000000..375165e --- /dev/null +++ b/data/qwe.css @@ -0,0 +1,9 @@ +#info-panel { + background-color: #000000; + color: #ffffff; + padding: 0px 4px; +} + +#main-window { + background-color: #444444; +} diff --git a/data/qwe.gresources.xml b/data/qwe.gresources.xml new file mode 100644 index 0000000..336977a --- /dev/null +++ b/data/qwe.gresources.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/org/gtk/qwe"> + <file alias="qwe.css">data/qwe.css</file> + </gresource> +</gresources> @@ -133,3 +133,13 @@ void clean() } g_free(file_list); } + +int get_current_file_index() +{ + return curr_file_index; +} + +int get_total_file_count() +{ + return file_list_count; +} @@ -7,5 +7,7 @@ void prev_file(); void first_file(); void last_file(); void clean(); +int get_current_file_index(); +int get_total_file_count(); #endif diff --git a/src/image.c b/src/image.c index 3daf00e..052f1b3 100644 --- a/src/image.c +++ b/src/image.c @@ -40,6 +40,9 @@ void pixbuf_load_callback(GObject *source_object, GAsyncResult *res, gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf)); aspect_ratio = (double)pixbuf_width / (double)pixbuf_height; fit_image(); + set_window_title(g_file_get_basename(file), pixbuf_width, pixbuf_height); + if (file != NULL) + g_object_unref(file); loading = 0; } @@ -64,10 +67,7 @@ int load_image(char *file_name) file = g_file_new_for_path(file_name); g_file_read_async(file, G_PRIORITY_DEFAULT, NULL, &file_read_callback, NULL); - if (file != NULL) - g_object_unref(file); curr_zoom = 1.0; - set_window_title(g_path_get_basename(file_name)); return 0; } diff --git a/src/input.c b/src/input.c index 76b61a9..40a717a 100644 --- a/src/input.c +++ b/src/input.c @@ -110,6 +110,9 @@ void handle_key_press(GdkEvent *event) case GDK_KEY_f: toggle_fullscreen(); break; + case GDK_KEY_i: + toggle_infopanel(); + break; default: break; } diff --git a/src/window.c b/src/window.c index 2f0dbce..1a81796 100644 --- a/src/window.c +++ b/src/window.c @@ -5,8 +5,11 @@ #include <gtk-3.0/gtk/gtk.h> GtkWidget *window; +GtkWidget *info_panel; GtkWidget *scrolled_window; +GtkWidget *info_panel_left, *info_panel_right; int is_fullscreen = 0; +int show_info = 0; static gboolean key_press(GtkWindow *window, GdkEvent *event, gpointer data) { @@ -47,11 +50,24 @@ static gboolean configure_callback(GtkWindow *window, GdkEvent *event, return TRUE; } +void load_css() +{ + GtkCssProvider *provider = gtk_css_provider_new(); + gtk_css_provider_load_from_resource(provider, "/org/gtk/qwe/qwe.css"); + gtk_style_context_add_provider_for_screen( + gdk_display_get_default_screen(gdk_display_get_default()), + GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + g_object_unref(provider); +} + void create_main_window(GApplication *app) { + // root window window = gtk_application_window_new(GTK_APPLICATION(app)); + gtk_widget_set_name(GTK_WIDGET(window), "main-window"); gtk_window_set_title(GTK_WINDOW(window), "qwe"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); + gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK); g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(configure_callback), NULL); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press), @@ -62,16 +78,45 @@ void create_main_window(GApplication *app) G_CALLBACK(button_release), NULL); g_signal_connect(G_OBJECT(window), "motion-notify-event", G_CALLBACK(motion_notify), NULL); - gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK); g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(scroll_callback), NULL); + // scrolled window scrolled_window = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_set_vexpand(GTK_WIDGET(scrolled_window), TRUE); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(new_image())); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(scrolled_window)); + GtkWidget *viewport = gtk_viewport_new(NULL, NULL); + gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(new_image())); + gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(viewport)); + + // info panel + info_panel = gtk_grid_new(); + gtk_widget_set_name(GTK_WIDGET(info_panel), "info_panel"); + info_panel_left = gtk_label_new(NULL); + gtk_widget_set_hexpand(GTK_WIDGET(info_panel_left), TRUE); + gtk_label_set_ellipsize(GTK_LABEL(info_panel_left), PANGO_ELLIPSIZE_END); + gtk_label_set_xalign(GTK_LABEL(info_panel_left), 0.0f); + gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_left), 0, 0, 1, + 1); + info_panel_right = gtk_label_new(NULL); + gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_right), 1, 0, 1, + 1); + gtk_widget_set_valign(GTK_WIDGET(info_panel), GTK_ALIGN_END); + gtk_widget_set_name(GTK_WIDGET(info_panel_left), "info-panel"); + gtk_widget_set_name(GTK_WIDGET(info_panel_right), "info-panel"); + + // overlay + GtkWidget *overlay = gtk_overlay_new(); + gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(scrolled_window)); + gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(info_panel)); + gtk_overlay_set_overlay_pass_through(GTK_OVERLAY(overlay), + GTK_WIDGET(info_panel), TRUE); + + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(overlay)); gtk_widget_show_all(GTK_WIDGET(window)); + gtk_widget_hide(GTK_WIDGET(info_panel)); + load_css(); } void scroll_window(gdouble x, gdouble y) @@ -88,9 +133,16 @@ void scroll_window(gdouble x, gdouble y) v_adj); } -void set_window_title(const char *title) +void set_window_title(const char *title, int width, int height) { gtk_window_set_title(GTK_WINDOW(window), title); + // TODO use malloc + char file[100], count[100]; + sprintf(file, "%s - %dx%d", title, width, height); + sprintf(count, "%d/%d", get_current_file_index() + 1, + get_total_file_count()); + gtk_label_set_text(GTK_LABEL(info_panel_left), file); + gtk_label_set_text(GTK_LABEL(info_panel_right), count); } void get_curr_win_size(gint *width, gint *height) @@ -115,3 +167,14 @@ void toggle_fullscreen() is_fullscreen = 1; } } + +void toggle_infopanel() +{ + if (show_info) { + gtk_widget_hide(GTK_WIDGET(info_panel)); + show_info = 0; + } else { + gtk_widget_show(GTK_WIDGET(info_panel)); + show_info = 1; + } +} diff --git a/src/window.h b/src/window.h index 0c9dbd9..3b344b0 100644 --- a/src/window.h +++ b/src/window.h @@ -6,8 +6,9 @@ void create_main_window(GApplication *app); void get_curr_win_size(gint *width, gint *height); void scroll_window(gdouble x, gdouble y); -void set_window_title(const char *title); +void set_window_title(const char *title, int width, int height); void quit(); void toggle_fullscreen(); +void toggle_infopanel(); #endif |