Improved last workspaces list + added saving of settings

newfile
Markus Koch 2017-02-11 18:33:09 +01:00
parent 0cb3999495
commit 8d16aca056
3 changed files with 59 additions and 28 deletions

View File

@ -1,12 +1,6 @@
#include "mainwindow.h"
#include "mdiary.h"
enum {
WSCOL_LABEL = 0,
WSCOL_PATH,
WSCOL_COUNT
};
static gboolean mainWindow_workspace_entry_visible(GtkTreeModel *model,
GtkTreeIter *iter,
struct mainWindow *mainWindow)
@ -147,7 +141,7 @@ static gint mainWindow_sort_date_compare_func(GtkTreeModel *model,
return -1;
}
void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path)
void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path, gboolean append)
{
GtkTreeIter iter, iter_delete;
GRegex *regex;
@ -161,34 +155,37 @@ void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path)
g_match_info_matches(match_info)) {
g_match_info_fetch(match_info, 1);
gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter);
while (gtk_tree_model_iter_next(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter)) {
memcpy(&iter_delete, &iter, sizeof(iter)); /* Used for last element in case we need to reduce */
gtk_tree_model_get(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter,
WSCOL_PATH, &temp,
-1);
if (!g_strcmp0(temp, path)) {
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter)) {
do {
memcpy(&iter_delete, &iter, sizeof(iter)); /* scan for last */
gtk_tree_model_get(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter,
WSCOL_PATH, &temp,
-1);
if (!g_strcmp0(temp, path)) {
g_free(temp);
gtk_list_store_remove(mainWindow->workspaceListStore, &iter);
break;
}
g_free(temp);
del_iter = TRUE;
break;
}
g_free(temp);
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(mainWindow->workspaceListStore), &iter));
}
temp = g_strdup_printf("<b>%s</b>\n<span weight=\"ultralight\">%s</span>",
g_match_info_fetch(match_info, 2),
g_match_info_fetch(match_info, 1));
gtk_list_store_prepend(mainWindow->workspaceListStore, &iter);
if (append)
gtk_list_store_append(mainWindow->workspaceListStore, &iter);
else
gtk_list_store_prepend(mainWindow->workspaceListStore, &iter);
gtk_list_store_set(mainWindow->workspaceListStore, &iter,
WSCOL_LABEL, temp,
WSCOL_PATH, path,
-1);
g_free(temp);
if (del_iter)
gtk_list_store_remove(mainWindow->workspaceListStore, &iter_delete);
else if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(mainWindow->workspaceListStore), NULL)
> FILE_LIST_MAX_LEN)
if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(mainWindow->workspaceListStore), NULL)
> FILE_LIST_MAX_LEN)
gtk_list_store_remove(mainWindow->workspaceListStore, &iter_delete);
}
@ -718,7 +715,7 @@ static void mainWindow_switch_workspace(struct mainWindow *mainWindow, gchar *pa
mainWindow_set_meta_information(mainWindow,
mdiary_get_time_earliest(), mdiary_get_time_latest(),
FALSE);
mainWindow_add_recent_workspace(mainWindow, path);
mainWindow_add_recent_workspace(mainWindow, path, FALSE);
} else {
mainWindow_show_error(mainWindow, "Could not open workspace or no entries were found in it.");
}

View File

@ -8,6 +8,12 @@
#define FILE_LIST_MAX_LEN 5
enum {
WSCOL_LABEL = 0,
WSCOL_PATH,
WSCOL_COUNT
};
struct mainWindow {
GtkWidget *mainWindow;
GtkWidget *mainPane;
@ -73,6 +79,6 @@ void mainWindow_filterChanged(GtkWidget *widget, gpointer user_data);
void mainWindow_workspace_search_changed(GtkWidget *widget, gpointer user_data);
void mainWindow_checkDate(GtkWidget *widget, gint event, gpointer user_data);
void mainWindow_dateIconPress(GtkWidget *widget, gint icon_pos, gint event, gpointer user_data);
void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path);
void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path, gboolean append);
#endif /* MAINWINDOW_H */

View File

@ -10,7 +10,7 @@ static void mdiary_settings_parse_line(gchar *line, struct mdiary_settings *sett
if (g_regex_match(regex, line, 0, &match_info) &&
g_regex_get_capture_count(regex) > 0 &&
g_match_info_matches(match_info)) {
mainWindow_add_recent_workspace(settings->mainWindow, g_match_info_fetch(match_info, 1));
mainWindow_add_recent_workspace(settings->mainWindow, g_match_info_fetch(match_info, 1), TRUE);
}
g_regex_unref(regex);
@ -40,12 +40,40 @@ gboolean mdiary_load_settings(gchar *filename, struct mdiary_settings *settings)
g_input_stream_close(G_INPUT_STREAM(dstream), NULL, NULL);
g_input_stream_close(G_INPUT_STREAM(stream), NULL, NULL);
g_object_unref(file);
}
gboolean mdiary_save_settings(gchar *filename, struct mdiary_settings *settings)
{
g_print("SETTINGS: NYI.\n");
GtkTreeIter iter;
gchar *temp;
gchar *output_buffer;
GFileOutputStream *stream;
GFile *file;
file = g_file_new_for_path(filename);
stream = g_file_replace(
file, NULL, FALSE,
G_FILE_CREATE_NONE,
NULL, NULL);
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(settings->mainWindow->workspaceListStore), &iter)) {
do {
gtk_tree_model_get(GTK_TREE_MODEL(settings->mainWindow->workspaceListStore), &iter,
WSCOL_PATH, &temp,
-1);
output_buffer = g_strdup_printf("workspace = %s\n", temp);
g_output_stream_write(G_OUTPUT_STREAM(stream),
output_buffer, strlen(output_buffer), NULL, NULL);
g_free(output_buffer);
g_free(temp);
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(settings->mainWindow->workspaceListStore), &iter));
}
g_output_stream_close(G_OUTPUT_STREAM(stream),NULL,NULL);
g_object_unref(stream);
g_object_unref(file);
}
struct mdiary_settings *mdiary_settings_new(struct mainWindow *mainWindow)