submenu = gtk_menu_new();
for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
{
- text = g_strdup_printf(_("Mark %d"), i + 1);
+ text = g_strdup_printf(_("Mark %d"), 1 + (i < 9 ? i : -1));
item = menu_item_add(submenu, text, G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd);
g_object_set_data(G_OBJECT(item), "mark", GINT_TO_POINTER(i + 1));
g_free(text);
#define FIXED_ICON_SIZE_MAX 512
-#define TOGGLE_WIDTH 13
-#define TOGGLE_SPACING 18
-
static void gqv_cell_renderer_icon_get_property(GObject *object,
guint param_id,
extern "C" {
#endif /* __cplusplus */
+#define TOGGLE_WIDTH 13
+#define TOGGLE_SPACING 16
+
#define GQV_TYPE_CELL_RENDERER_ICON (gqv_cell_renderer_icon_get_type())
#define GQV_CELL_RENDERER_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GQV_TYPE_CELL_RENDERER_ICON, GQvCellRendererIcon))
{
CollectTable *ct = data;
+ /* If there is no unsaved data, save the window geometry
+ */
+ if (!ct->cd->changed)
+ {
+ if (!collection_save(ct->cd, ct->cd->path))
+ {
+ log_printf("failed saving to collection path: %s\n", ct->cd->path);
+ }
+ }
+
if (ct->popup)
{
g_signal_handlers_disconnect_matched(G_OBJECT(ct->popup), G_SIGNAL_MATCH_DATA,
if (cw) collection_window_close_final(cw);
}
+/**
+ * @brief Check if any Collection windows have unsaved data
+ * @returns TRUE if unsaved data exists
+ *
+ * Also saves window geometry for Collection windows that have
+ * no unsaved data
+ */
gboolean collection_window_modified_exists(void)
{
GList *work;
+ gboolean ret;
+
+ ret = FALSE;
work = collection_window_list;
while (work)
{
CollectWindow *cw = work->data;
- if (cw->cd->changed) return TRUE;
+ if (cw->cd->changed)
+ {
+ ret = TRUE;
+ }
+ else
+ {
+ if (!collection_save(cw->table->cd, cw->table->cd->path))
+ {
+ log_printf("failed saving to collection path: %s\n", cw->table->cd->path);
+ }
+ }
work = work->next;
}
- return FALSE;
+ return ret;
}
static gboolean collection_window_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
return FALSE;
}
+/**
+ * @brief Appends a user information message to the log window queue
+ * @param data The message
+ * @returns FALSE
+ *
+ * If the first word of the message is either "error" or "warning"
+ * (case insensitive) the message is color-coded appropriately
+ */
static gboolean log_normal_cb(gpointer data)
{
gchar *buf = data;
- log_window_append(buf, LOG_NORMAL);
+ gchar *buf_casefold = g_utf8_casefold(buf, -1);
+ gchar *error_casefold = g_utf8_casefold(_("error"), -1);
+ gchar *warning_casefold = g_utf8_casefold(_("warning"), -1);
+
+ if (buf_casefold == g_strstr_len(buf_casefold, -1, error_casefold))
+ {
+ log_window_append(buf, LOG_ERROR);
+ }
+ else if (buf_casefold == g_strstr_len(buf_casefold, -1, warning_casefold))
+ {
+ log_window_append(buf, LOG_WARN);
+ }
+ else
+ {
+ log_window_append(buf, LOG_NORMAL);
+ }
+
g_free(buf);
+ g_free(buf_casefold);
+ g_free(error_casefold);
+ g_free(warning_casefold);
return FALSE;
}
message = g_strdup_vprintf(format, ap);
va_end(ap);
- location = g_strdup_printf("%s:%s:%d:", file_name, function_name, line_number);
+ if (options && options->log_window.timer_data)
+ {
+ location = g_strdup_printf("%s:%s:%s:%d:", get_exec_time(), file_name,
+ function_name, line_number);
+ }
+ else
+ {
+ location = g_strdup_printf("%s:%s:%d:", file_name, function_name, line_number);
+ }
+
buf = g_strconcat(location, message, NULL);
log_domain_print_message(domain,buf);
g_free(location);
fd->magick = FD_MAGICK;
fd->exifdate = 0;
fd->rating = 0;
+ fd->format_class = filter_file_get_class(path_utf8);
if (disable_sidecars) fd->disable_grouping = TRUE;
filter_add_if_missing("erf", "Epson raw format", ".erf", FORMAT_CLASS_RAWIMAGE, FALSE, TRUE, TRUE);
filter_add_if_missing("srw", "Samsung raw format", ".srw", FORMAT_CLASS_RAWIMAGE, FALSE, TRUE, TRUE);
filter_add_if_missing("rw2", "Panasonic raw format", ".rw2", FORMAT_CLASS_RAWIMAGE, FALSE, TRUE, TRUE);
+
+ /* video files */
+ filter_add_if_missing("mp4", "MP4 video file", ".mp4;.m4v;.3gp;.3g2", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
+ filter_add_if_missing("3gp", "3GP video file", ".3gp;.3g2", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
+ filter_add_if_missing("mov", "MOV video file", ".mov;.qt", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
+ filter_add_if_missing("avi", "AVI video file", ".avi", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
+ filter_add_if_missing("mpg", "MPG video file", ".mpg;.mpeg;.mts;.m2ts;", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
+ filter_add_if_missing("mkv", "Matroska video file", ".mkv;", FORMAT_CLASS_VIDEO, FALSE, FALSE, FALSE);
}
GList *filter_to_list(const gchar *extensions)
return !!filter_name_find(file_class_extension_list[file_class], name);
}
+FileFormatClass filter_file_get_class(const gchar *name)
+{
+ if (filter_file_class(name, FORMAT_CLASS_IMAGE)) return FORMAT_CLASS_IMAGE;
+ if (filter_file_class(name, FORMAT_CLASS_RAWIMAGE)) return FORMAT_CLASS_RAWIMAGE;
+ if (filter_file_class(name, FORMAT_CLASS_META)) return FORMAT_CLASS_META;
+ if (filter_file_class(name, FORMAT_CLASS_VIDEO)) return FORMAT_CLASS_VIDEO;
+ return FORMAT_CLASS_UNKNOWN;
+}
+
gboolean filter_name_is_writable(const gchar *name)
{
return !!filter_name_find(file_writable_list, name);
const gchar *registered_extension_from_path(const gchar *name);
gboolean filter_name_exists(const gchar *name);
gboolean filter_file_class(const gchar *name, FileFormatClass file_class);
+FileFormatClass filter_file_get_class(const gchar *name);
gboolean filter_name_is_writable(const gchar *name);
gboolean filter_name_allow_sidecar(const gchar *name);
geeqie_logo.png \
scroller.png \
sheet_broken.png \
+ sheet_metadata.png \
+ sheet_unknown.png \
+ sheet_video.png \
icon_float.png \
icon_thumb.png \
icon_book.png \
icon_thumb $(srcdir)/icon_thumb.png \
icon_scroller $(srcdir)/scroller.png \
icon_broken $(srcdir)/sheet_broken.png \
+ icon_metadata $(srcdir)/sheet_metadata.png \
+ icon_unknown $(srcdir)/sheet_unknown.png \
+ icon_video $(srcdir)/sheet_video.png \
icon_book $(srcdir)/icon_book.png \
icon_config $(srcdir)/icon_config.png \
icon_tools $(srcdir)/icon_tools.png \
icon_view.svg \
sheet_blank.svg \
sheet_broken.svg \
+ sheet_metadata.svg \
+ sheet_unknown.svg \
+ sheet_video.svg \
spinner_orbit.svg
EXTRA_DIST = $(svg_images)
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg1"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.1 r"
+ width="256.00000pt"
+ height="256.00000pt"
+ sodipodi:docname="sheet_metadata.svg"
+ version="1.1"
+ inkscape:export-filename="/home/tomaszg/src/geeqie/geeqie.org/src/icons/svg/sheet_blankx.svg.png"
+ inkscape:export-xdpi="13.5"
+ inkscape:export-ydpi="13.5">
+ <metadata
+ id="metadata883">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="162.82316"
+ inkscape:cy="169.784"
+ inkscape:window-width="2554"
+ inkscape:window-height="1384"
+ showgrid="true"
+ gridtolerance="1.0000000pt"
+ snaptoguides="false"
+ guidetolerance="5.0000000pt"
+ snaptogrid="true"
+ inkscape:window-x="3"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg1">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0"
+ originy="0"
+ spacingx="14.222222"
+ spacingy="14.222222"
+ color="#3f3fff"
+ empcolor="#3f3fff"
+ opacity="0.15"
+ empopacity="0.38"
+ empspacing="5" />
+ </sodipodi:namedview>
+ <path
+ style="fill:#f5f5e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.33333349;stroke-linejoin:round"
+ d="M 53.333333,21.333333 V 314.66667 H 293.33333 V 128 c 0,-7.33333 0,-13.33333 -2.66666,-22 L 237.33333,26 c -10.66666,-4.666667 -18.66666,-4.666667 -24,-4.666667 z"
+ id="path826"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.25619836;fill-rule:evenodd;stroke:none;stroke-width:5.33333349;stroke-linejoin:round"
+ d="m 292,107.33333 v 0 L 238.66667,27.333333 230.51878,90.228764 C 248.96977,98.444445 269.30637,107.33333 292,107.33333 Z"
+ id="path829"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fafaeb;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.66666675;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 225.33333,80.666667 C 252,84.84151 265.33333,83.966498 292,107.33333 L 238.66667,27.333333 c 0,31.919914 -8.88889,35.555556 -13.33334,53.333334 z"
+ id="path828"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot831"
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.66666794px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:'FreeMono Italic';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#003380;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(-16.906653,49.002012)"><flowRegion
+ id="flowRegion833"
+ style="font-size:42.66666794px;fill:#003380"><rect
+ id="rect835"
+ width="189.33333"
+ height="190"
+ x="75"
+ y="60.333332"
+ style="font-size:42.66666794px;fill:#003380" /></flowRegion><flowPara
+ id="flowPara837"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:64px;font-family:FreeMono;-inkscape-font-specification:'FreeMono Bold';fill:#003380">0101 0110 1011 0101 0101</flowPara></flowRoot></svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg1"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.1 r"
+ width="256.00000pt"
+ height="256.00000pt"
+ sodipodi:docname="sheet_unknown.svg"
+ version="1.1"
+ inkscape:export-filename="/home/tomaszg/src/geeqie/geeqie.org/src/icons/sheet_unknown.png"
+ inkscape:export-xdpi="13.5"
+ inkscape:export-ydpi="13.5">
+ <metadata
+ id="metadata883">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="162.82316"
+ inkscape:cy="169.784"
+ inkscape:window-width="2554"
+ inkscape:window-height="1384"
+ showgrid="true"
+ gridtolerance="1.0000000pt"
+ snaptoguides="false"
+ guidetolerance="5.0000000pt"
+ snaptogrid="true"
+ inkscape:window-x="3"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg1">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0"
+ originy="0"
+ spacingx="14.222222"
+ spacingy="14.222222"
+ color="#3f3fff"
+ empcolor="#3f3fff"
+ opacity="0.15"
+ empopacity="0.38"
+ empspacing="5" />
+ </sodipodi:namedview>
+ <path
+ style="fill:#f5f5e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.33333349;stroke-linejoin:round"
+ d="M 53.333333,21.333333 V 314.66667 H 293.33333 V 128 c 0,-7.33333 0,-13.33333 -2.66666,-22 L 237.33333,26 c -10.66666,-4.666667 -18.66666,-4.666667 -24,-4.666667 z"
+ id="path826"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.25619836;fill-rule:evenodd;stroke:none;stroke-width:5.33333349;stroke-linejoin:round"
+ d="m 292,107.33333 v 0 L 238.66667,27.333333 230.51878,90.228764 C 248.96977,98.444445 269.30637,107.33333 292,107.33333 Z"
+ id="path829"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fafaeb;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.66666675;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 225.33333,80.666667 C 252,84.84151 265.33333,83.966498 292,107.33333 L 238.66667,27.333333 c 0,31.919914 -8.88889,35.555556 -13.33334,53.333334 z"
+ id="path828"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.66666794px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:'FreeMono Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(-15.163317,80.274016)"><flowRegion
+ id="flowRegion833"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.66666794px;font-family:FreeMono;-inkscape-font-specification:'FreeMono Bold';fill:#000000"><rect
+ id="rect835"
+ width="189.33333"
+ height="190"
+ x="75"
+ y="60.333332"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.66666794px;font-family:FreeMono;-inkscape-font-specification:'FreeMono Bold';fill:#000000" /></flowRegion><flowPara
+ id="flowPara837"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:85.33333588px;font-family:FreeMono;-inkscape-font-specification:'FreeMono Bold';fill:#000000">???</flowPara></flowRoot></svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg1"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.1 r"
+ width="256.00000pt"
+ height="256.00000pt"
+ sodipodi:docname="sheet_video.svg"
+ version="1.1"
+ inkscape:export-filename="/home/tomaszg/src/geeqie/geeqie.org/src/icons/sheet_video.png"
+ inkscape:export-xdpi="13.5"
+ inkscape:export-ydpi="13.5">
+ <metadata
+ id="metadata883">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="148.42568"
+ inkscape:cy="222.41884"
+ inkscape:window-width="2554"
+ inkscape:window-height="1384"
+ showgrid="true"
+ gridtolerance="1.0000000pt"
+ snaptoguides="false"
+ guidetolerance="5.0000000pt"
+ snaptogrid="true"
+ inkscape:window-x="3"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg1">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0"
+ originy="0"
+ spacingx="14.222222"
+ spacingy="14.222222"
+ color="#3f3fff"
+ empcolor="#3f3fff"
+ opacity="0.15"
+ empopacity="0.38"
+ empspacing="5" />
+ </sodipodi:namedview>
+ <path
+ style="fill:#f5f5e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.33333349;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 53.333333,21.333333 V 314.66667 H 293.33333 V 128 c 0,-7.33333 0,-13.33333 -2.66666,-22 L 237.33333,26 c -10.66666,-4.666667 -18.66666,-4.666667 -24,-4.666667 z"
+ id="path826"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.25619836;fill-rule:evenodd;stroke:none;stroke-width:5.33333349;stroke-linejoin:round"
+ d="m 292,107.33333 v 0 L 238.66667,27.333333 230.51878,90.228764 C 248.96977,98.444445 269.30637,107.33333 292,107.33333 Z"
+ id="path829"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fafaeb;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.66666675;stroke-linejoin:round;stroke-dasharray:none"
+ d="M 225.33333,80.666667 C 252,84.84151 265.33333,83.966498 292,107.33333 L 238.66667,27.333333 c 0,31.919914 -8.88889,35.555556 -13.33334,53.333334 z"
+ id="path828"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#e6f3f5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5.33300018;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path1502"
+ cx="173.33333"
+ cy="195.55556"
+ r="81.777779" />
+ <path
+ style="fill:#808080;fill-rule:evenodd;stroke:#000000;stroke-width:5.33300018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 139.11112,124.55556 V 266.77778 L 252.16667,194.66667 Z"
+ id="path1506"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+</svg>
for (mark = 0; mark < FILEDATA_MARKS_SIZE; mark++)
{
- g_string_append_printf(buf, file_data_get_mark(fd, mark) ? " <span background='#FF00FF'>%c</span>" : " %c", '1' + mark);
+ g_string_append_printf(buf, file_data_get_mark(fd, mark) ? " <span background='#FF00FF'>%c</span>" : " %c", '1' + (mark < 9 ? mark : -1) );
}
if (*text)
{
GdkPixbuf *pixbuf;
- pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+ switch (imd->image_fd->format_class)
+ {
+ case FORMAT_CLASS_UNKNOWN:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_UNKNOWN);
+ break;
+ case FORMAT_CLASS_META:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_METADATA);
+ break;
+ case FORMAT_CLASS_VIDEO:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_VIDEO);
+ break;
+ default:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+ }
+
image_change_pixbuf(imd, pixbuf, image_zoom_get(imd), FALSE);
g_object_unref(pixbuf);
gtk_action_group_add_actions(lw->action_group, &entry, 1, lw);
action = gtk_action_group_get_action(lw->action_group, name);
- g_object_set_data(G_OBJECT(action), "mark_num", GINT_TO_POINTER(mark));
+ g_object_set_data(G_OBJECT(action), "mark_num", GINT_TO_POINTER(mark > 0 ? mark : 10));
}
static void layout_actions_setup_marks(LayoutWindow *lw)
for (mark = 1; mark <= FILEDATA_MARKS_SIZE; mark++)
{
- layout_actions_setup_mark(lw, mark, "Mark%d", _("Mark _%d"), NULL, NULL, NULL);
- layout_actions_setup_mark(lw, mark, "SetMark%d", _("_Set mark %d"), NULL, _("Set mark %d"), G_CALLBACK(layout_menu_set_mark_sel_cb));
- layout_actions_setup_mark(lw, mark, "ResetMark%d", _("_Reset mark %d"), NULL, _("Reset mark %d"), G_CALLBACK(layout_menu_res_mark_sel_cb));
- layout_actions_setup_mark(lw, mark, "ToggleMark%d", _("_Toggle mark %d"), "%d", _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
- layout_actions_setup_mark(lw, mark, "ToggleMark%dAlt1", _("_Toggle mark %d"), "KP_%d", _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
- layout_actions_setup_mark(lw, mark, "SelectMark%d", _("Se_lect mark %d"), "<control>%d", _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
- layout_actions_setup_mark(lw, mark, "SelectMark%dAlt1", _("_Select mark %d"), "<control>KP_%d", _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
- layout_actions_setup_mark(lw, mark, "AddMark%d", _("_Add mark %d"), NULL, _("Add mark %d"), G_CALLBACK(layout_menu_sel_mark_or_cb));
- layout_actions_setup_mark(lw, mark, "IntMark%d", _("_Intersection with mark %d"), NULL, _("Intersection with mark %d"), G_CALLBACK(layout_menu_sel_mark_and_cb));
- layout_actions_setup_mark(lw, mark, "UnselMark%d", _("_Unselect mark %d"), NULL, _("Unselect mark %d"), G_CALLBACK(layout_menu_sel_mark_minus_cb));
- layout_actions_setup_mark(lw, mark, "FilterMark%d", _("_Filter mark %d"), NULL, _("Filter mark %d"), G_CALLBACK(layout_menu_mark_filter_toggle_cb));
+ gint i = (mark < 10 ? mark : 0);
+
+ layout_actions_setup_mark(lw, i, "Mark%d", _("Mark _%d"), NULL, NULL, NULL);
+ layout_actions_setup_mark(lw, i, "SetMark%d", _("_Set mark %d"), NULL, _("Set mark %d"), G_CALLBACK(layout_menu_set_mark_sel_cb));
+ layout_actions_setup_mark(lw, i, "ResetMark%d", _("_Reset mark %d"), NULL, _("Reset mark %d"), G_CALLBACK(layout_menu_res_mark_sel_cb));
+ layout_actions_setup_mark(lw, i, "ToggleMark%d", _("_Toggle mark %d"), "%d", _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
+ layout_actions_setup_mark(lw, i, "ToggleMark%dAlt1", _("_Toggle mark %d"), "KP_%d", _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
+ layout_actions_setup_mark(lw, i, "SelectMark%d", _("Se_lect mark %d"), "<control>%d", _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
+ layout_actions_setup_mark(lw, i, "SelectMark%dAlt1", _("_Select mark %d"), "<control>KP_%d", _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
+ layout_actions_setup_mark(lw, i, "AddMark%d", _("_Add mark %d"), NULL, _("Add mark %d"), G_CALLBACK(layout_menu_sel_mark_or_cb));
+ layout_actions_setup_mark(lw, i, "IntMark%d", _("_Intersection with mark %d"), NULL, _("Intersection with mark %d"), G_CALLBACK(layout_menu_sel_mark_and_cb));
+ layout_actions_setup_mark(lw, i, "UnselMark%d", _("_Unselect mark %d"), NULL, _("Unselect mark %d"), G_CALLBACK(layout_menu_sel_mark_minus_cb));
+ layout_actions_setup_mark(lw, i, "FilterMark%d", _("_Filter mark %d"), NULL, _("Filter mark %d"), G_CALLBACK(layout_menu_mark_filter_toggle_cb));
g_string_append_printf(desc,
" <menu action='Mark%d'>"
" <separator/>"
" <menuitem action='FilterMark%d'/>"
" </menu>",
- mark, mark, mark, mark, mark, mark, mark, mark, mark);
+ i, i, i, i, i, i, i, i, i);
}
g_string_append(desc,
" </menubar>");
for (mark = 1; mark <= FILEDATA_MARKS_SIZE; mark++)
{
+ gint i = (mark < 10 ? mark : 0);
+
g_string_append_printf(desc,
"<accelerator action='ToggleMark%dAlt1'/>"
"<accelerator action='SelectMark%dAlt1'/>",
- mark, mark);
+ i, i);
}
g_string_append(desc, "</ui>" );
GtkWidget *scrolledwin;
GtkWidget *text;
+#if !GTK_CHECK_VERSION(3,0,0)
GdkColor colors[LOG_COUNT];
+#else
+ GtkTextTag *color_tags[LOG_COUNT];
+#endif
guint lines;
GtkWidget *regexp_box;
GtkWidget *bar;
GtkWidget *pause;
GtkWidget *wrap;
+ GtkWidget *timer_data;
GtkWidget *debug_level;
};
+#if !GTK_CHECK_VERSION(3,0,0)
typedef struct _LogDef LogDef;
struct _LogDef
{
{ LOG_WARN, "warning", "orange" },
{ LOG_ERROR, "error", "red" },
};
+#endif
static LogWindow *logwindow = NULL;
}
}
+static void log_window_timer_data_cb(GtkWidget *widget, gpointer data)
+{
+ LogWindow *logwin = data;
+
+ options->log_window.timer_data = !options->log_window.timer_data;
+}
+
static void log_window_regexp_cb(GtkWidget *text_entry, gpointer data)
{
gchar *new_regexp;
logwin->wrap = pref_button_new(hbox, NULL, "Line wrap", FALSE,
G_CALLBACK(log_window_line_wrap_cb), logwin);
+ logwin->timer_data = pref_button_new(hbox, NULL, "Timer data", FALSE,
+ G_CALLBACK(log_window_timer_data_cb), logwin);
+
pref_label_new(hbox, "Filter regexp");
textbox = gtk_entry_new();
#if !GTK_CHECK_VERSION(3,0,0)
GdkColormap *colormap;
gboolean success[LOG_COUNT];
-#endif
gint i;
g_assert(logwin != NULL);
g_assert(logwin->colors != NULL);
-#if !GTK_CHECK_VERSION(3,0,0)
for (i = LOG_NORMAL; i < LOG_COUNT; i++)
{
gboolean ok = gdk_color_parse(logdefs[i].color, &logwin->colors[i]);
break;
}
}
-#endif
+
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text));
for (i = LOG_NORMAL; i < LOG_COUNT; i++)
gtk_text_buffer_create_tag(buffer, logdefs[i].tag,
"foreground-gdk", &logwin->colors[i],
"family", "MonoSpace",
NULL);
+#else
+ g_assert(logwin != NULL);
+
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text));
+
+ logwin->color_tags[LOG_NORMAL] = gtk_text_buffer_create_tag (buffer,
+ "black_foreground", "foreground", "black",
+ "family", "MonoSpace", NULL);
+ logwin->color_tags[LOG_MSG] = gtk_text_buffer_create_tag (buffer,
+ "blue_foreground", "foreground", "blue",
+ "family", "MonoSpace", NULL);
+ logwin->color_tags[LOG_WARN] = gtk_text_buffer_create_tag (buffer,
+ "orange_foreground", "foreground", "orange",
+ "family", "MonoSpace", NULL);
+ logwin->color_tags[LOG_ERROR] = gtk_text_buffer_create_tag (buffer,
+ "red_foreground", "foreground", "red",
+ "family", "MonoSpace", NULL);
+#endif
}
static void log_window_show(LogWindow *logwin)
LogType type;
};
-
+#if !GTK_CHECK_VERSION(3,0,0)
static void log_window_insert_text(GtkTextBuffer *buffer, GtkTextIter *iter,
const gchar *text, const gchar *tag)
{
gtk_text_buffer_insert_with_tags_by_name(buffer, iter, str_utf8, -1, tag, NULL);
g_free(str_utf8);
}
+#else
+static void log_window_insert_text(GtkTextBuffer *buffer, GtkTextIter *iter,
+ const gchar *text, GtkTextTag *tag)
+{
+ gchar *str_utf8;
+ if (!text || !*text) return;
+
+ str_utf8 = utf8_validate_or_convert(text);
+ gtk_text_buffer_insert_with_tags(buffer, iter, str_utf8, -1, tag, NULL);
+ g_free(str_utf8);
+}
+#endif
void log_window_append(const gchar *str, LogType type)
{
GList *prev;
LogMsg *oldest_msg = work->data;
+#if !GTK_CHECK_VERSION(3,0,0)
log_window_insert_text(buffer, &iter, oldest_msg->text, logdefs[oldest_msg->type].tag);
+#else
+ log_window_insert_text(buffer, &iter, oldest_msg->text,
+ logwindow->color_tags[oldest_msg->type]);
+#endif
prev = work->prev;
memory = g_list_delete_link(memory, work);
}
}
+#if !GTK_CHECK_VERSION(3,0,0)
log_window_insert_text(buffer, &iter, str, logdefs[type].tag);
+#else
+ log_window_insert_text(buffer, &iter, str, logwindow->color_tags[type]);
+#endif
if (!options->log_window.paused)
{
FileData *sfd = work->data;
work = work->next;
- if (filter_file_class(sfd->extension, FORMAT_CLASS_META)) continue;
+ if (sfd->format_class == FORMAT_CLASS_META) continue;
metadata_write_list(sfd, key, values);
}
path = keyword_tree_get_path(keyword_tree, kw_iter);
file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free);
- mark_str = g_strdup_printf("%d", mark + 1);
+ mark_str = g_strdup_printf("%d", (mark < 9 ? mark : -1) + 1);
gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1);
g_free(mark_str);
}
if (mark_str)
{
+ gint i = (gint)atoi(mark_str);
+ if (i == 0) i = 10;
+
meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree),
- &iter, (gint)atoi(mark_str) - 1);
+ &iter, i - 1);
}
g_free(name);
options->log_window_lines = 1000;
options->log_window.line_wrap = TRUE;
options->log_window.paused = FALSE;
+ options->log_window.timer_data = FALSE;
return options;
}
struct {
gboolean paused;
gboolean line_wrap;
+ gboolean timer_data;
} log_window;
};
{ PIXBUF_INLINE_FOLDER_UP, folder_up },
{ PIXBUF_INLINE_SCROLLER, icon_scroller },
{ PIXBUF_INLINE_BROKEN, icon_broken },
+ { PIXBUF_INLINE_METADATA, icon_metadata },
+ { PIXBUF_INLINE_UNKNOWN, icon_unknown },
+ { PIXBUF_INLINE_VIDEO, icon_video },
{ PIXBUF_INLINE_ICON, gqview_icon },
{ PIXBUF_INLINE_LOGO, geeqie_logo },
{ PIXBUF_INLINE_ICON_FLOAT, icon_float },
GdkPixbuf *pixbuf_fallback(FileData *fd, gint requested_width, gint requested_height)
{
- GdkPixbuf *pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); /* FIXME use different images according to FORMAT_CLASS */
+ GdkPixbuf *pixbuf;
+
+ switch (fd->format_class)
+ {
+ case FORMAT_CLASS_UNKNOWN:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_UNKNOWN);
+ break;
+ case FORMAT_CLASS_META:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_METADATA);
+ break;
+ case FORMAT_CLASS_VIDEO:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_VIDEO);
+ break;
+ default:
+ pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+ }
if (requested_width && requested_height)
{
#define PIXBUF_INLINE_FOLDER_UP "folder_up"
#define PIXBUF_INLINE_SCROLLER "scroller"
#define PIXBUF_INLINE_BROKEN "broken"
+#define PIXBUF_INLINE_METADATA "metadata"
+#define PIXBUF_INLINE_UNKNOWN "unknown"
+#define PIXBUF_INLINE_VIDEO "video"
#define PIXBUF_INLINE_ICON "icon"
#define PIXBUF_INLINE_LOGO "logo"
N_("Unknown"),
N_("Image"),
N_("RAW Image"),
- N_("Metadata")
+ N_("Metadata"),
+ N_("Video")
};
/* config memory values */
pref_spin_new_int(group, _("Debug level:"), NULL,
DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX, 1, get_debug_level(), &debug_c);
+ pref_checkbox_new_int(group, _("Timer data"),
+ options->log_window.timer_data, &c_options->log_window.timer_data);
+
pref_spin_new_int(group, _("Log Window max. lines:"), NULL,
1, 99999, 1, options->log_window_lines, &options->log_window_lines);
#endif
WRITE_NL(); WRITE_BOOL(*options, tools_restore_state);
WRITE_NL(); WRITE_UINT(*options, log_window_lines);
+ WRITE_NL(); WRITE_BOOL(*options, log_window.timer_data);
/* File operations Options */
WRITE_NL(); WRITE_BOOL(*options, file_ops.enable_in_place_rename);
if (READ_BOOL(*options, tools_restore_state)) continue;
if (READ_INT(*options, log_window_lines)) continue;
+ if (READ_BOOL(*options, log_window.timer_data)) continue;
/* Properties dialog options */
if (READ_CHAR(*options, properties.tabs_order)) continue;
if (!tl->fd) tl->fd = file_data_ref(fd);
+ if (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE)
+ {
+ thumb_loader_set_fallback(tl);
+ return FALSE;
+ }
if (tl->cache_enable)
{
tl->fd = file_data_ref(fd);
- if (!stat_utf8(fd->path, &st))
+ if (!stat_utf8(fd->path, &st) || (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE))
{
thumb_loader_std_set_fallback(tl);
return FALSE;
FORMAT_CLASS_IMAGE,
FORMAT_CLASS_RAWIMAGE,
FORMAT_CLASS_META,
+ FORMAT_CLASS_VIDEO,
FILE_FORMAT_CLASSES
} FileFormatClass;
gboolean mouse_wheel_mode;
};
-#define FILEDATA_MARKS_SIZE 6
+#define FILEDATA_MARKS_SIZE 10
struct _FileDataChangeInfo {
FileDataChangeType type;
const gchar *name;
const gchar *extension;
gchar *extended_extension;
+ FileFormatClass format_class;
gchar *collate_key_name;
gchar *collate_key_name_nocase;
gint64 size;
gint h;
gint x;
gint y;
- gboolean paused;
} log_window;
gboolean tools_float;
/* between these, the icon width is increased by thumb_max_width / 2 */
#define THUMB_MIN_ICON_WIDTH 128
-#define THUMB_MAX_ICON_WIDTH 150
+#define THUMB_MAX_ICON_WIDTH 160
+#define THUMB_MIN_ICON_WIDTH_WITH_MARKS TOGGLE_SPACING * FILEDATA_MARKS_SIZE
#define VFICON_MAX_COLUMNS 32
#define THUMB_BORDER_PADDING 2
{
gint width;
- if (!VFICON(vf)->show_text) return options->thumbnails.max_width;
+ if (!VFICON(vf)->show_text && !vf->marks_enabled ) return options->thumbnails.max_width;
width = options->thumbnails.max_width + options->thumbnails.max_width / 2;
if (width < THUMB_MIN_ICON_WIDTH) width = THUMB_MIN_ICON_WIDTH;
if (width > THUMB_MAX_ICON_WIDTH) width = options->thumbnails.max_width;
+ if (vf->marks_enabled && width < THUMB_MIN_ICON_WIDTH_WITH_MARKS) width = THUMB_MIN_ICON_WIDTH_WITH_MARKS;
return width;
}
FILE_COLUMN_MARKS + 3, file_data_get_mark(fd, 3),
FILE_COLUMN_MARKS + 4, file_data_get_mark(fd, 4),
FILE_COLUMN_MARKS + 5, file_data_get_mark(fd, 5),
-#if FILEDATA_MARKS_SIZE != 6
+ FILE_COLUMN_MARKS + 6, file_data_get_mark(fd, 6),
+ FILE_COLUMN_MARKS + 7, file_data_get_mark(fd, 7),
+ FILE_COLUMN_MARKS + 8, file_data_get_mark(fd, 8),
+ FILE_COLUMN_MARKS + 9, file_data_get_mark(fd, 9),
+#if FILEDATA_MARKS_SIZE != 10
#error this needs to be updated
#endif
#endif