From 8d16aca0568fb5bbf737f34137589248a1e8fb8d Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 11 Feb 2017 18:33:09 +0100 Subject: [PATCH] Improved last workspaces list + added saving of settings --- src/mainwindow.c | 45 +++++++++++++++++++++------------------------ src/mainwindow.h | 8 +++++++- src/settings.c | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 28 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index 91128d8..18582bf 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -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("%s\n%s", 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."); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 5e7ba33..9b1d794 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -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 */ diff --git a/src/settings.c b/src/settings.c index 5807010..a88e881 100644 --- a/src/settings.c +++ b/src/settings.c @@ -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)