/*
- * Geeqie
- * Copyright (C) 2008 - 2010 The Geeqie Team
+ * Copyright (C) 2008 - 2016 The Geeqie Team
*
* Authors: John Ellis, Vladimir Nadvornik, Laurent Monin
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * This software is released under the GNU General Public License (GNU GPL).
- * Please read the included file COPYING for more information.
- * This software comes with no warranty of any kind, use at your own risk!
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "main.h"
#include "secure_save.h"
#include "ui_fileops.h"
-/*
+
+/**
+ * @file
*-----------------------------------------------------------------------------
- * history lists
+ * Implements a history chain. Used by the Back and Forward toolbar buttons.
+ * Selecting any folder appends the path to the end of the chain.
+ * Pressing the Back and Forward buttons moves along the chain, but does
+ * not make additions to the chain.
+ * The chain always increases and is deleted at the end of the session
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+static GList *history_chain = NULL;
+static guint chain_index = G_MAXUINT;
+static gboolean nav_button = FALSE; /** Used to prevent the nav buttons making entries to the chain **/
+
+const gchar *history_chain_back()
+{
+ nav_button = TRUE;
+
+ chain_index = chain_index > 0 ? chain_index - 1 : 0;
+
+ return g_list_nth_data(history_chain, chain_index);
+}
+
+const gchar *history_chain_forward()
+{
+ nav_button= TRUE;
+ guint last = g_list_length(history_chain) - 1;
+
+ chain_index = chain_index < last ? chain_index + 1 : last;
+
+ return g_list_nth_data(history_chain, chain_index);
+}
+
+/**
+ * @brief Appends a path to the history chain
+ * @param path Path selected
+ *
+ * Each time the user selects a new path it is appended to the chain
+ * except when it is identical to the current last entry
+ * The pointer is always moved to the end of the chain
+ */
+void history_chain_append_end(const gchar *path)
+{
+ GList *work;
+
+ if (!nav_button)
+ {
+ if(chain_index == G_MAXUINT)
+ {
+ history_chain = g_list_append (history_chain, g_strdup(path));
+ chain_index = 0;
+ }
+ else
+ {
+ work = g_list_last(history_chain);
+ if (g_strcmp0(work->data , path) != 0)
+ {
+ history_chain = g_list_append (history_chain, g_strdup(path));
+ chain_index = g_list_length(history_chain) - 1;
+ DEBUG_3("%d %s", chain_index, path);
+ }
+ else
+ {
+ chain_index = g_list_length(history_chain) - 1;
+ }
+ }
+ }
+ else
+ {
+ nav_button = FALSE;
+ }
+}
+
+/**
+ * @file
+ *-----------------------------------------------------------------------------
+ * Implements an image history chain. Whenever an image is displayed it is
+ * appended to a chain.
+ * Pressing the Image Back and Image Forward buttons moves along the chain,
+ * but does not make additions to the chain.
+ * The chain always increases and is deleted at the end of the session
+ *
*-----------------------------------------------------------------------------
*/
+static GList *image_chain = NULL;
+static guint image_chain_index = G_MAXUINT;
+static gboolean image_nav_button = FALSE; /** Used to prevent the nav buttons making entries to the chain **/
+const gchar *image_chain_back()
+{
+ image_nav_button = TRUE;
+
+ image_chain_index = image_chain_index > 0 ? image_chain_index - 1 : 0;
+
+ return g_list_nth_data(image_chain, image_chain_index);
+}
-#define HISTORY_DEFAULT_KEY_COUNT 16
+const gchar *image_chain_forward()
+{
+ image_nav_button= TRUE;
+ guint last = g_list_length(image_chain) - 1;
+ image_chain_index = image_chain_index < last ? image_chain_index + 1 : last;
+
+ return g_list_nth_data(image_chain, image_chain_index);
+}
+
+/**
+ * @brief Appends a path to the image history chain
+ * @param path Image path selected
+ *
+ * Each time the user selects a new image it is appended to the chain
+ * except when it is identical to the current last entry
+ * The pointer is always moved to the end of the chain
+ */
+void image_chain_append_end(const gchar *path)
+{
+ GList *work;
+
+ if (!image_nav_button)
+ {
+ if(image_chain_index == G_MAXUINT)
+ {
+ image_chain = g_list_append(image_chain, g_strdup(path));
+ image_chain_index = 0;
+ }
+ else
+ {
+ work = g_list_last(image_chain);
+ if (g_strcmp0(work->data , path) != 0)
+ {
+ image_chain = g_list_append(image_chain, g_strdup(path));
+ image_chain_index = g_list_length(image_chain) - 1;
+ DEBUG_3("%d %s", image_chain_index, path);
+ }
+ else
+ {
+ image_chain_index = g_list_length(image_chain) - 1;
+ }
+ }
+ }
+ else
+ {
+ image_nav_button = FALSE;
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * history lists
+ *-----------------------------------------------------------------------------
+ */
typedef struct _HistoryData HistoryData;
struct _HistoryData
SecureSaveInfo *ssi;
GList *list;
gchar *pathl;
+ gint list_count;
pathl = path_from_utf8(path);
ssi = secure_open(pathl);
* so that when reading they are added correctly
*/
work = g_list_last(hd->list);
+ list_count = g_list_position(hd->list, g_list_last(hd->list)) + 1;
while (work && secsave_errno == SS_ERR_NONE)
{
- secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+ if ((!(strcmp(hd->key, "path_list") == 0 && list_count > options->open_recent_list_maxsize)) && (!(strcmp(hd->key, "recent") == 0 && (!isfile(work->data)))))
+ {
+ secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+ }
work = work->prev;
+ list_count--;
}
secure_fputc(ssi, '\n');
}
hd->list = g_list_prepend(hd->list, g_strdup(path));
- if (max == -1) max = HISTORY_DEFAULT_KEY_COUNT;
+ if (max == -1) max = options->open_recent_list_maxsize;
if (max > 0)
{
gint len = 0;