Commit adb93d57 authored by Victor Ananjevsky's avatar Victor Ananjevsky

add ability to load several images in picture dialog

parent cc415177
......@@ -866,9 +866,9 @@ Set initial size of picture. Available values are \fIfit\fP for fitting image in
Set increment value for scaling image.
.TP
.B \-\-filename=\fIFILENAME\fP
Set picture filename.
Set picture filename. If no file name is specified extra data will be used. In this case several filenames can be specified.
.PP
Some actions on a picture like scaling or rotating available from popup menu. Those actions can be made only on static images.
Some actions on a picture like navigation, scaling or rotating available from popup menu. Those actions can be made only on static images.
.SS Print options
.TP
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: YAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-12 08:06+0300\n"
"POT-Creation-Date: 2022-04-25 17:59+0300\n"
"PO-Revision-Date: 2021-11-28 19:00+0200\n"
"Last-Translator: Victor Ananjevsky <ananasik@gmail.com>\n"
"Language-Team: \n"
......@@ -66,47 +66,47 @@ msgstr "Початкове значення - менше за мінімальн
msgid "Initial value greater than maximum.\n"
msgstr "Початкове значення - більше за максимальне.\n"
#: ../src/form.c:491
#: ../src/form.c:498
msgid "Select files"
msgstr "Вибрати файли"
#: ../src/form.c:494 ../src/form.c:502 ../src/form.c:581 ../src/form.c:589
#: ../src/form.c:640 ../src/html.c:220 ../src/html.c:253 ../src/text.c:121
#: ../src/form.c:501 ../src/form.c:509 ../src/form.c:588 ../src/form.c:596
#: ../src/form.c:647 ../src/html.c:220 ../src/html.c:253 ../src/text.c:121
#: ../src/text.c:192 ../src/util.c:40
msgid "Cancel"
msgstr "Скасувати"
#: ../src/form.c:495 ../src/form.c:503 ../src/form.c:582 ../src/form.c:590
#: ../src/form.c:641 ../src/html.c:221 ../src/text.c:122 ../src/text.c:193
#: ../src/form.c:502 ../src/form.c:510 ../src/form.c:589 ../src/form.c:597
#: ../src/form.c:648 ../src/html.c:221 ../src/text.c:122 ../src/text.c:193
#: ../src/util.c:46
msgid "OK"
msgstr "Гаразд"
#: ../src/form.c:499
#: ../src/form.c:506
msgid "Select folders"
msgstr "Вибрати теки"
#: ../src/form.c:578
#: ../src/form.c:585
msgid "Select or create file"
msgstr "Вибрати або створити файл"
#: ../src/form.c:586
#: ../src/form.c:593
msgid "Select or create folder"
msgstr "Вибрати або створити теку"
#: ../src/form.c:637
#: ../src/form.c:644
msgid "Select date"
msgstr "Вибрати дату"
#: ../src/form.c:996
#: ../src/form.c:1023
msgid "Select file"
msgstr "Вибрати файл"
#: ../src/form.c:1026
#: ../src/form.c:1053
msgid "Select folder"
msgstr "Вибрати теку"
#: ../src/form.c:1194 ../src/form.c:1196
#: ../src/form.c:1221 ../src/form.c:1223
msgid "Link"
msgstr "Посилання"
......@@ -1522,328 +1522,328 @@ msgstr "ШЛЯХ"
msgid "Load extra arguments from file"
msgstr "Завантажити додаткові аргументи з файлу"
#: ../src/option.c:942
#: ../src/option.c:944
#, c-format
msgid "Mark %s doesn't have a value\n"
msgstr "Помітці %s не надано значення\n"
#: ../src/option.c:989
#: ../src/option.c:991
msgid "Images"
msgstr "Зображення"
#: ../src/option.c:1054
#: ../src/option.c:1056
#, c-format
msgid "Unknown color mode: %s\n"
msgstr "Невідомий режим кольору: '%s'\n"
#: ../src/option.c:1073
#: ../src/option.c:1075
#, c-format
msgid "Unknown buttons layout type: %s\n"
msgstr "Невідомий тип розміщення кнопок: %s\n"
#: ../src/option.c:1088
#: ../src/option.c:1090
#, c-format
msgid "Unknown align type: %s\n"
msgstr "Невідомий тип вирівнювання: %s\n"
#: ../src/option.c:1112
#: ../src/option.c:1114
#, c-format
msgid "Unknown justification type: %s\n"
msgstr "Невідомий тип вирівнювання: %s\n"
#: ../src/option.c:1129
#: ../src/option.c:1131
#, c-format
msgid "Unknown tab position type: %s\n"
msgstr "Невідомий тип позиції вкладки: %s\n"
#: ../src/option.c:1166
#: ../src/option.c:1168
#, c-format
msgid "Unknown ellipsize type: %s\n"
msgstr "Невідомий тип урізання: %s\n"
#: ../src/option.c:1179
#: ../src/option.c:1181
#, c-format
msgid "Unknown orientation: %s\n"
msgstr "Невідома орієнтація: %s\n"
#: ../src/option.c:1194
#: ../src/option.c:1196
#, c-format
msgid "Unknown source type: %s\n"
msgstr "Невідомий тип даних: %s\n"
#: ../src/option.c:1205
#: ../src/option.c:1207
msgid "Progress log"
msgstr "Вікно журналу"
#: ../src/option.c:1218
#: ../src/option.c:1220
#, c-format
msgid "Unknown size type: %s\n"
msgstr "Невідомий тип розміру: %s\n"
#: ../src/option.c:1260
#: ../src/option.c:1262
#, c-format
msgid "Unknown completion type: %s\n"
msgstr "Невідомий тип доповнення: %s\n"
#: ../src/option.c:1292
#: ../src/option.c:1294
#, c-format
msgid "Unknown boolean format type: %s\n"
msgstr "Невідомий тип булєвських значень: %s\n"
#: ../src/option.c:1308
#: ../src/option.c:1310
#, c-format
msgid "Unknown grid lines type: %s\n"
msgstr "Невідомий тип розподільних ліній: %s\n"
#: ../src/option.c:1325
#: ../src/option.c:1327
#, c-format
msgid "Unknown scrollbar policy type: %s\n"
msgstr "Невідомий тип прокрутки: %s\n"
#: ../src/option.c:1378
#: ../src/option.c:1380
#, c-format
msgid "Unknown smart Home/End mode: %s\n"
msgstr "Невідомий режим розумних Home/End: '%s'\n"
#: ../src/option.c:1488
#: ../src/option.c:1490
#, c-format
msgid "Unknown signal: %s\n"
msgstr "Невідомий сигнал: %s\n"
#: ../src/option.c:1725
#: ../src/option.c:1727
msgid "File exist. Overwrite?"
msgstr "Файл існує. Перезаписати?"
#: ../src/option.c:1867
#: ../src/option.c:1869
msgid "File was changed. Save it?"
msgstr "Файл був змінений. Зберегти його?"
#: ../src/option.c:1920
#: ../src/option.c:1922
msgid "- Yet another dialoging program"
msgstr "- Програма для відображення діалогів"
#. Adds general option entries
#: ../src/option.c:1924
#: ../src/option.c:1926
msgid "General options"
msgstr "Основні параметри"
#: ../src/option.c:1924
#: ../src/option.c:1926
msgid "Show general options"
msgstr "Показувати основні параметри"
#. Adds common option entries
#: ../src/option.c:1930
#: ../src/option.c:1932
msgid "Common options"
msgstr "Загальні параметри"
#: ../src/option.c:1930
#: ../src/option.c:1932
msgid "Show common options"
msgstr "Показувати загальні параметри діалогів"
#. Adds about option entries
#: ../src/option.c:1936
#: ../src/option.c:1938
msgid "About dialog options"
msgstr "Параметри діалогу о програмі"
#: ../src/option.c:1936
#: ../src/option.c:1938
msgid "Show custom about dialog options"
msgstr "Показувати параметри діалогу о програмі"
#. Adds app option entries
#: ../src/option.c:1942
#: ../src/option.c:1944
msgid "Application selection options"
msgstr "Параметри діалогу вибору додатка"
#: ../src/option.c:1942
#: ../src/option.c:1944
msgid "Show application selection options"
msgstr "Показувати параметри діалоги вибору додатка"
#. Adds calendar option entries
#: ../src/option.c:1948
#: ../src/option.c:1950
msgid "Calendar options"
msgstr "Параметри календаря"
#: ../src/option.c:1948
#: ../src/option.c:1950
msgid "Show calendar options"
msgstr "Показувати параметри календаря"
#. Adds color option entries
#: ../src/option.c:1954
#: ../src/option.c:1956
msgid "Color selection options"
msgstr "Параметри діалогу вибору кольору"
#: ../src/option.c:1954
#: ../src/option.c:1956
msgid "Show color selection options"
msgstr "Показувати параметри діалогу вибору кольору"
#. Adds dnd option entries
#: ../src/option.c:1960
#: ../src/option.c:1962
msgid "DND options"
msgstr "Параметри DND"
#: ../src/option.c:1960
#: ../src/option.c:1962
msgid "Show drag-n-drop options"
msgstr "Показувати параметри dnd"
#. Adds entry option entries
#: ../src/option.c:1966
#: ../src/option.c:1968
msgid "Text entry options"
msgstr "Параметри вводу тексту"
#: ../src/option.c:1966
#: ../src/option.c:1968
msgid "Show text entry options"
msgstr "Показувати параметри вводу тексту"
#. Adds file selection option entries
#: ../src/option.c:1972
#: ../src/option.c:1974
msgid "File selection options"
msgstr "Параметри діалогу вибору файлів"
#: ../src/option.c:1972
#: ../src/option.c:1974
msgid "Show file selection options"
msgstr "Показувати параметри діалогу вибору файлів"
#. Add font selection option entries
#: ../src/option.c:1978
#: ../src/option.c:1980
msgid "Font selection options"
msgstr "Параметри діалогу вибору шрифту"
#: ../src/option.c:1978
#: ../src/option.c:1980
msgid "Show font selection options"
msgstr "Показувати параметри діалоги вибору шрифту"
#. Add form option entries
#: ../src/option.c:1984
#: ../src/option.c:1986
msgid "Form options"
msgstr "Параметри діалогу форми"
#: ../src/option.c:1984
#: ../src/option.c:1986
msgid "Show form options"
msgstr "Показувати параметри діалогу форми"
#. Add html options entries
#: ../src/option.c:1991
#: ../src/option.c:1993
msgid "HTML options"
msgstr "Параметри HTML діалогу"
#: ../src/option.c:1991
#: ../src/option.c:1993
msgid "Show HTML options"
msgstr "Показувати параметри HTML діалогу"
#. Add icons option entries
#: ../src/option.c:1998
#: ../src/option.c:2000
msgid "Icons box options"
msgstr "Параметри діалогу піктограм"
#: ../src/option.c:1998
#: ../src/option.c:2000
msgid "Show icons box options"
msgstr "Показувати параметри діалогу піктограм швидкого доступу"
#. Adds list option entries
#: ../src/option.c:2004
#: ../src/option.c:2006
msgid "List options"
msgstr "Параметри списку"
#: ../src/option.c:2004
#: ../src/option.c:2006
msgid "Show list options"
msgstr "Показувати параметри списку"
#. Adds notebook option entries
#: ../src/option.c:2010
#: ../src/option.c:2012
msgid "Notebook options"
msgstr "Параметри діалогу з вкладками"
#: ../src/option.c:2010
#: ../src/option.c:2012
msgid "Show notebook dialog options"
msgstr "Показувати параметри діалогу з вкладками"
#. Adds notification option entries
#: ../src/option.c:2017
#: ../src/option.c:2019
msgid "Notification icon options"
msgstr "Параметри піктограми сповіщень"
#: ../src/option.c:2018
#: ../src/option.c:2020
msgid "Show notification icon options"
msgstr "Показувати параметри піктограми сповіщень"
#. Adds paned option entries
#: ../src/option.c:2025
#: ../src/option.c:2027
msgid "Paned dialog options"
msgstr "Параметри діалогу з панелями"
#: ../src/option.c:2025
#: ../src/option.c:2027
msgid "Show paned dialog options"
msgstr "Показувати параметри діалогу з панелями"
#. Adds picture option entries
#: ../src/option.c:2031
#: ../src/option.c:2033
msgid "Picture dialog options"
msgstr "Параметри діалогу з картинкою"
#: ../src/option.c:2031
#: ../src/option.c:2033
msgid "Show picture dialog options"
msgstr "Показувати параметри діалогу відображення картинки"
#. Adds print option entries
#: ../src/option.c:2037
#: ../src/option.c:2039
msgid "Print dialog options"
msgstr "Параметри діалогу друку"
#: ../src/option.c:2037
#: ../src/option.c:2039
msgid "Show print dialog options"
msgstr "Показувати параметри діалогу друку"
#. Adds progress option entries
#: ../src/option.c:2043
#: ../src/option.c:2045
msgid "Progress options"
msgstr "Параметри прогресу"
#: ../src/option.c:2043
#: ../src/option.c:2045
msgid "Show progress options"
msgstr "Показувати параметри прогресу"
#. Adds scale option entries
#: ../src/option.c:2049
#: ../src/option.c:2051
msgid "Scale options"
msgstr "Параметри масштабу"
#: ../src/option.c:2049
#: ../src/option.c:2051
msgid "Show scale options"
msgstr "Показувати параметри масштабу"
#. Adds text option entries
#: ../src/option.c:2055
#: ../src/option.c:2057
msgid "Text information options"
msgstr "Параметри текстової інформації"
#: ../src/option.c:2055
#: ../src/option.c:2057
msgid "Show text information options"
msgstr "Показувати параметри текстової інформації"
#. Adds sourceview option entries
#: ../src/option.c:2062
#: ../src/option.c:2064
msgid "SourceView options"
msgstr "Параметри SourceView"
#: ../src/option.c:2062
#: ../src/option.c:2064
msgid "Show SourceView options"
msgstr "Показувати параметри SourceView"
#. Adds file filters option entries
#: ../src/option.c:2069
#: ../src/option.c:2071
msgid "File filter options"
msgstr "Параметри фільтрів для діалогу вибору файлів"
#: ../src/option.c:2069
#: ../src/option.c:2071
msgid "Show file filter options"
msgstr "Показувати параметри фільтрів для діалогу вибору файлів"
#. Adds miscellaneous option entries
#: ../src/option.c:2075
#: ../src/option.c:2077
msgid "Miscellaneous options"
msgstr "Додаткові параметри"
#: ../src/option.c:2075
#: ../src/option.c:2077
msgid "Show miscellaneous options"
msgstr "Показувати додаткові параметри"
......@@ -1852,35 +1852,43 @@ msgstr "Показувати додаткові параметри"
msgid "WARNING: wrong focused pane number %d. Must be 1 or 2\n"
msgstr "УВАГА: невірний номер панелі %d. Повинен бути 1 чи 2\n"
#: ../src/picture.c:185
#: ../src/picture.c:217
msgid "Next image"
msgstr "Наступне зображення"
#: ../src/picture.c:222
msgid "Previous image"
msgstr "Попереднє зображення"
#: ../src/picture.c:232
msgid "Fit to window"
msgstr "По розміру вікна"
#: ../src/picture.c:190
#: ../src/picture.c:237
msgid "Original size"
msgstr "Оригінальний розмір"
#: ../src/picture.c:195
#: ../src/picture.c:242
msgid "Increase size"
msgstr "Збільшити розмір"
#: ../src/picture.c:200
#: ../src/picture.c:247
msgid "Decrease size"
msgstr "Зменшити розмір"
#: ../src/picture.c:209
#: ../src/picture.c:256
msgid "Rotate left"
msgstr "Повернути ліворуч"
#: ../src/picture.c:214
#: ../src/picture.c:261
msgid "Rotate right"
msgstr "Повернути праворуч"
#: ../src/picture.c:219
#: ../src/picture.c:266
msgid "Flip vertical"
msgstr "Віддзеркалити вертикально"
#: ../src/picture.c:224
#: ../src/picture.c:271
msgid "Flip horizontal"
msgstr "Віддзеркалити горизонтально"
......@@ -2032,7 +2040,7 @@ msgstr "Так"
msgid "WARNING: Run command failed: %s\n"
msgstr "УВАГА: Збій при запуску команди: %s\n"
#: ../src/util.c:891
#: ../src/util.c:888
msgid "Case _sensitive"
msgstr "Враховувати _регістр"
......
......@@ -19,16 +19,6 @@
#include "yad.h"
static GtkWidget *picture;
static GtkWidget *viewport;
static GtkWidget *popup_menu;
static GdkPixbufAnimation *anim_pb = NULL;
static GdkPixbuf *orig_pb = NULL;
static gboolean loaded = FALSE;
static gboolean animated = FALSE;
enum {
SIZE_FIT,
SIZE_ORIG,
......@@ -43,38 +33,87 @@ enum {
ROTATE_FLIP_HOR
};
typedef struct {
gchar *filename;
GdkPixbufAnimation *anim_pb;
GdkPixbuf *orig_pb;
gboolean loaded;
gboolean animated;
} ImageItem;
static GList *img_list = NULL;
static GList *lp = NULL;
static ImageItem *img = NULL;
static GtkWidget *picture;
static GtkWidget *viewport;
static GtkWidget *popup_menu;
static void
load_picture (gchar *filename)
load_picture ()
{
anim_pb = gdk_pixbuf_animation_new_from_file (filename, NULL);
orig_pb = gdk_pixbuf_animation_get_static_image (anim_pb);
if (orig_pb)
if (!img->loaded)
{
if (gdk_pixbuf_animation_is_static_image (anim_pb))
gtk_image_set_from_pixbuf (GTK_IMAGE (picture), orig_pb);
else
if (img->filename && g_file_test (img->filename, G_FILE_TEST_EXISTS))
{
gtk_image_set_from_animation (GTK_IMAGE (picture), anim_pb);
animated = TRUE;
img->anim_pb = gdk_pixbuf_animation_new_from_file (img->filename, NULL);
img->orig_pb = gdk_pixbuf_animation_get_static_image (img->anim_pb);
img->animated = !gdk_pixbuf_animation_is_static_image (img->anim_pb);
}
img->loaded = TRUE;
}
loaded = TRUE;
if (img->orig_pb)
{
if (img->animated)
gtk_image_set_from_animation (GTK_IMAGE (picture), g_object_ref (img->anim_pb));
else
gtk_image_set_from_pixbuf (GTK_IMAGE (picture), g_object_ref (img->orig_pb));
}
else
gtk_image_set_from_icon_name (GTK_IMAGE (picture), "image-missing", GTK_ICON_SIZE_DIALOG);
}
static void
next_img_cb (GtkWidget *w, gpointer d)
{
lp = g_list_next (lp);
if (!lp)
lp = g_list_first (img_list);
if (lp)
img = (ImageItem *) lp->data;
load_picture ();
if (options.picture_data.size == YAD_PICTURE_FIT)
picture_fit_to_window ();
}
static void
prev_img_cb (GtkWidget *w, gpointer d)
{
lp = g_list_previous (lp);
if (!lp)
lp = g_list_last (img_list);
if (lp)
img = (ImageItem *) lp->data;
load_picture ();
if (options.picture_data.size == YAD_PICTURE_FIT)
picture_fit_to_window ();
}
void
picture_fit_to_window ()
{
gdouble width, height, ww, wh;
gdouble factor;
if (animated || !gtk_widget_get_realized (viewport))
if (!gtk_widget_get_realized (viewport))
return;
width = gdk_pixbuf_get_width (orig_pb);
height = gdk_pixbuf_get_height (orig_pb);
width = gdk_pixbuf_get_width (img->orig_pb);
height = gdk_pixbuf_get_height (img->orig_pb);
ww = gdk_window_get_width (gtk_viewport_get_view_window (GTK_VIEWPORT (viewport)));
wh = gdk_window_get_height (gtk_viewport_get_view_window (GTK_VIEWPORT (viewport)));
......@@ -82,13 +121,9 @@ picture_fit_to_window ()
factor = MIN (ww / width, wh / height);
if (factor < 1.0)
{
GdkPixbuf *pb = gdk_pixbuf_scale_simple (g_object_ref (orig_pb), width * factor, height * factor, GDK_INTERP_HYPER);
GdkPixbuf *pb = gdk_pixbuf_scale_simple (img->orig_pb, width * factor, height * factor, GDK_INTERP_HYPER);
if (pb)
{
GdkPixbuf *old_pb = gtk_image_get_pixbuf (GTK_IMAGE (picture));
gtk_image_set_from_pixbuf (GTK_IMAGE (picture), pb);
g_object_unref (old_pb);
}
}
}
......@@ -114,8 +149,7 @@ change_size_cb (GtkWidget *w, gint type)
options.picture_data.size = YAD_PICTURE_FIT;
break;
case SIZE_ORIG:
gtk_image_set_from_pixbuf (GTK_IMAGE (picture), orig_pb);
g_object_unref (pb);
gtk_image_set_from_pixbuf (GTK_IMAGE (picture), g_object_ref (img->orig_pb));
options.picture_data.size = YAD_PICTURE_ORIG;
break;
case SIZE_INC:
......@@ -182,6 +216,23 @@ create_popup_menu ()
popup_menu = gtk_menu_new ();
gtk_menu_set_reserve_toggle_size (GTK_MENU (popup_menu), FALSE);
if (img_list)
{
mi = gtk_menu_item_new_with_label (_("Next image"));
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), mi);
g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (next_img_cb), NULL);
mi = gtk_menu_item_new_with_label (_("Previous image"));
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), mi);
g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (prev_img_cb), NULL);
mi = gtk_separator_menu_item_new ();
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), mi);
}
mi = gtk_menu_item_new_with_label (_("Fit to window"));
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), mi);
......@@ -230,7 +281,7 @@ create_popup_menu ()
static gboolean
button_handler (GtkWidget *w, GdkEventButton *ev, gpointer data)
{
if (ev->button == 3)
if (ev->button == 3 && !img->animated)
{
gtk_menu_popup_at_pointer (GTK_MENU (popup_menu), NULL);
return TRUE;
......@@ -252,6 +303,33 @@ size_allocate_cb ()
picture_fit_to_window ();
}
static void init_img_data ()
{
if (options.common_data.uri)
{
img = g_new0 (ImageItem, 1);
img->filename = options.common_data.uri;
}
else if (options.extra_data && *options.extra_data)
{
gchar **args = options.extra_data;
gint i = 0;
while (args[i] != NULL)
{
ImageItem *ii;
ii = g_new0 (ImageItem, 1);
ii->filename = args[i];
img_list = g_list_append (img_list, ii);
i++;
}
lp = g_list_first (img_list);
img = (ImageItem *) lp->data;
}
}
GtkWidget *
picture_create_widget (GtkWidget * dlg)
{
......@@ -272,19 +350,19 @@ picture_create_widget (GtkWidget * dlg)
gtk_container_add (GTK_CONTAINER (ev), picture);
/* load picture */
if (options.common_data.uri &&
g_file_test (options.common_data.uri, G_FILE_TEST_EXISTS))
load_picture (options.common_data.uri);
else
gtk_image_set_from_icon_name (GTK_IMAGE (picture), "image-missing", GTK_ICON_SIZE_DIALOG);
init_img_data ();
load_picture ();
if (loaded && !animated)
if (img)
{
create_popup_menu ();
g_signal_connect (G_OBJECT (ev), "button-press-event", G_CALLBACK (button_handler), NULL);
g_signal_connect (G_OBJECT (ev), "key-press-event", G_CALLBACK (key_handler), NULL);
g_signal_connect (G_OBJECT (ev), "size-allocate", G_CALLBACK (size_allocate_cb), NULL);
load_picture (0);
}
else
gtk_image_set_from_icon_name (GTK_IMAGE (picture), "image-missing", GTK_ICON_SIZE_DIALOG);
return sw;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment