From 99e3de70b9a7d66a9a8fc12944679fbfd2d1b988 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 9 Jul 2017 16:56:45 +0200 Subject: [PATCH 1/8] Add UI elements for new-entry button --- glade/mainWindow.glade | 15 ++++++++++++++- src/mainwindow.c | 24 ++++++++++++++++++++++++ src/mainwindow.h | 4 ++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/glade/mainWindow.glade b/glade/mainWindow.glade index 6fb9e29..caff17d 100644 --- a/glade/mainWindow.glade +++ b/glade/mainWindow.glade @@ -460,6 +460,19 @@ 0 + + + New Entry + True + True + True + + + False + True + 1 + + Decrypt GPG @@ -531,7 +544,7 @@ False True - 1 + 2 diff --git a/src/mainwindow.c b/src/mainwindow.c index 5e18881..d54ade9 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -408,6 +408,10 @@ static void mainWindow_connect_signals(struct mainWindow *mainWindow) "changed", (GCallback) mainWindow_workspace_search_changed, mainWindow); + g_signal_connect(mainWindow->buttonNew, + "clicked", + (GCallback) mainWindow_new_entry_clicked, + mainWindow); g_signal_connect(mainWindow->buttonDecrypt, "clicked", (GCallback) mainWindow_decrypt_gpg_clicked, @@ -545,6 +549,7 @@ struct mainWindow *mainWindow_new() mainWindow->buttonClearSearch = GTK_WIDGET(gtk_builder_get_object(builder, "buttonClearSearch")); mainWindow->headerBar = GTK_WIDGET(gtk_builder_get_object(builder, "headerBar")); mainWindow->labelDateToDate = GTK_WIDGET(gtk_builder_get_object(builder, "label_date_to_date")); + mainWindow->buttonNew = GTK_WIDGET(gtk_builder_get_object(builder, "buttonNew")); mainWindow->buttonDecrypt = GTK_WIDGET(gtk_builder_get_object(builder, "buttonDecrypt")); mainWindow->stackRenderMode = GTK_WIDGET(gtk_builder_get_object(builder, "stackRenderMode")); mainWindow->entryListView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "entryListView")); @@ -559,6 +564,8 @@ struct mainWindow *mainWindow_new() mainWindow->workspaceListSelection = GTK_TREE_SELECTION(gtk_builder_get_object(builder, "treeWorkspaceSelection")); + mainWindow->currentWorkspaceUrl = NULL; + mainWindow->settingsDialog.settingsDialog = GTK_WIDGET(gtk_builder_get_object(builder, "settingsDialog")); mainWindow->settingsDialog.comboDisplayMode = GTK_WIDGET(gtk_builder_get_object(builder, "comboDisplayMode")); @@ -945,6 +952,8 @@ void mainWindow_switch_workspace(struct mainWindow *mainWindow, gchar *path, gbo mdiary_scanner->time_earliest, mdiary_scanner->time_latest, FALSE); mainWindow_add_recent_workspace(mainWindow, path, FALSE); + g_free(mainWindow->currentWorkspaceUrl); + mainWindow->currentWorkspaceUrl = g_strdup(path); gtk_header_bar_set_subtitle(GTK_HEADER_BAR(mainWindow->headerBar), path); if (mdiary_scanner->entries_encrypted > 0 && !gpg_enabled) gtk_widget_set_visible(mainWindow->buttonDecrypt, TRUE); @@ -1019,6 +1028,21 @@ void mainWindow_otherWorkspaceClicked(GtkWidget *widget, gpointer user_data) gtk_widget_destroy(dialog); } +/** + * @brief mainWindow_otherWorkspaceClicked is called when the user clicks the New Entry button. + * @param widget N/A + * @param user_data struct mainWindow * + */ +void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) +{ + struct mainWindow *mainWindow = (struct mainWindow *)user_data; + + // Get ws path + // Ask user for filename + // Create file and paste template + // Launch editor on file +} + void mainWindow_decrypt_gpg_clicked(GtkWidget *widget, gpointer user_data) { struct mainWindow *mainWindow = (struct mainWindow *)user_data; diff --git a/src/mainwindow.h b/src/mainwindow.h index fbffc37..910bdcf 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -41,6 +41,7 @@ struct mainWindow { GtkWidget *buttonClearSearch; GtkWidget *headerBar; GtkWidget *labelDateToDate; + GtkWidget *buttonNew; GtkWidget *buttonDecrypt; GtkWidget *webkitView; GtkWidget *webkitScrollArea; @@ -50,6 +51,8 @@ struct mainWindow { GtkTextBuffer *textBuffer; GtkEntryCompletion *searchEntryCompletion; + gchar *currentWorkspaceUrl; + GtkListStore *completionListStore; GtkListStore *entryListStore; GtkWidget *selectedDateEntry; @@ -105,6 +108,7 @@ 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, gboolean append); void mainWindow_switch_workspace(struct mainWindow *mainWindow, gchar *path, gboolean gpg_enabled); +void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data); void mainWindow_decrypt_gpg_clicked(GtkWidget *widget, gpointer user_data); void mainWindow_renderer_set(struct mainWindow *mainWindow, enum renderer_mode state); void mainWindow_settings_show(struct mainWindow *mainWindow); From 92b75f526dc1eb53f78e7929a23feae61f1e8a1f Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 9 Jul 2017 19:41:10 +0200 Subject: [PATCH 2/8] Move code to launch the external editor to own function --- src/mainwindow.c | 34 +++++++++++++++++++++++----------- src/mainwindow.h | 1 + 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index d54ade9..47ca81a 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -780,6 +780,27 @@ void mainWindow_entrySelected(GtkWidget *widget, gpointer user_data) } } +/** + * @brief mainWindow_openExternalEditor opens the supplied path with the default system editor + * @param mainWindow + * @param path is the file to open + */ +void mainWindow_openExternalEditor(gchar *path) +{ + GFile *file; + GAppInfo *info; + GList *files = NULL; + + g_info("Opening entry in external editor."); + file = g_file_new_for_path(path); + info = g_file_query_default_handler(file, NULL, NULL); + files = g_list_append(files, (gpointer) file); + g_app_info_launch(info, files, NULL, NULL); + g_list_free(files); // Content is freed individually + g_object_unref(info); + g_object_unref(file); +} + /** * @brief mainWindow_entryActivated is the callback when the user doubleclicks or presses enter on an entry * @param widget is the entryListView @@ -787,9 +808,7 @@ void mainWindow_entrySelected(GtkWidget *widget, gpointer user_data) */ void mainWindow_entryActivated(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data) { - GFile *file; - GAppInfo *info; - GList *files = NULL; + GtkTreeModel *model; GtkTreeIter iter; GtkTreeView *treeview = (GtkTreeView*) widget; @@ -798,16 +817,9 @@ void mainWindow_entryActivated(GtkWidget *widget, GtkTreePath *path, GtkTreeView model = gtk_tree_view_get_model(treeview); if (gtk_tree_model_get_iter(model, &iter, path)) { - g_info("Opening entry in external editor."); gtk_tree_model_get(model, &iter, COL_URL, &name, -1); - file = g_file_new_for_path(name); - info = g_file_query_default_handler(file, NULL, NULL); - files = g_list_append(files, (gpointer) file); - g_app_info_launch(info, files, NULL, NULL); + mainWindow_openExternalEditor(name); g_free(name); - g_list_free(files); // Content is freed individually - g_object_unref(info); - g_object_unref(file); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 910bdcf..6f6a0a2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -101,6 +101,7 @@ void mainWindow_workspaceListClicked(GtkWidget *widget, void mainWindow_clearSearch(GtkWidget *widget, gpointer user_data); void mainWindow_calendarSelected(GtkWidget *widget, gpointer user_data); void mainWindow_entrySelected(GtkWidget *widget, gpointer user_data); +void mainWindow_openExternalEditor(gchar *path); void mainWindow_entryActivated(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data); void mainWindow_filterChanged(GtkWidget *widget, gpointer user_data); void mainWindow_workspace_search_changed(GtkWidget *widget, gpointer user_data); From aded0ec710985ea12a12bc32b3a13c05afa2f204 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 9 Jul 2017 19:42:30 +0200 Subject: [PATCH 3/8] Implement initial version of the new entry button (#3) --- src/mainwindow.c | 69 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index 47ca81a..fd38543 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1,6 +1,14 @@ #include "mainwindow.h" #include "mdiary.h" +const gchar *default_template = "\ +# Title\n\ + Date: 01.01.2000 00:00\n\ + Summary: \n\ + Tags: \n\ +\n\ +Text"; + static gboolean mainWindow_workspace_entry_visible(GtkTreeModel *model, GtkTreeIter *iter, struct mainWindow *mainWindow) @@ -959,13 +967,15 @@ void mainWindow_switch_workspace(struct mainWindow *mainWindow, gchar *path, gbo mdiary_reset_store(mainWindow->entryListStore, mainWindow->completionListStore); mdiary_scanner = mdiary_scanner_new(gpg_enabled); + + g_free(mainWindow->currentWorkspaceUrl); + mainWindow->currentWorkspaceUrl = g_strdup(path); + if (mdiary_scan_to_store(mdiary_scanner, path, mainWindow->entryListStore, mainWindow->completionListStore)) { mainWindow_set_meta_information(mainWindow, mdiary_scanner->time_earliest, mdiary_scanner->time_latest, FALSE); mainWindow_add_recent_workspace(mainWindow, path, FALSE); - g_free(mainWindow->currentWorkspaceUrl); - mainWindow->currentWorkspaceUrl = g_strdup(path); gtk_header_bar_set_subtitle(GTK_HEADER_BAR(mainWindow->headerBar), path); if (mdiary_scanner->entries_encrypted > 0 && !gpg_enabled) gtk_widget_set_visible(mainWindow->buttonDecrypt, TRUE); @@ -1047,8 +1057,61 @@ void mainWindow_otherWorkspaceClicked(GtkWidget *widget, gpointer user_data) */ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) { - struct mainWindow *mainWindow = (struct mainWindow *)user_data; + void close_dialog(GtkWidget *widget, gpointer dlg) + { + gtk_dialog_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK); + } + struct mainWindow *mainWindow = (struct mainWindow *)user_data; + GtkWidget *dialog; + GtkWidget *textInput; + gchar *path; + FILE *fd; + gchar *default_path; + GDateTime *datetime; + + dialog = gtk_message_dialog_new(GTK_WINDOW(mainWindow->mainWindow), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, + "Please enter the filename of the entry"); + textInput = gtk_entry_new(); + datetime = g_date_time_new_now_local(); + default_path = g_date_time_format(datetime, "%Y/%Y-%m-%d"); + gtk_entry_set_text(GTK_ENTRY(textInput), default_path); + g_free(default_path); + g_date_time_unref(datetime); + gtk_box_pack_end(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), textInput, true, true, 4); + g_signal_connect(textInput, + "activate", + (GCallback) close_dialog, + dialog); + gtk_widget_show(textInput); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + path = (gchar*) gtk_entry_get_text(GTK_ENTRY(textInput)); + if (strlen(path) > 0) { + if (path[0] != '/') + path = g_strdup_printf("%s/%s.md", mainWindow->currentWorkspaceUrl, path); + else + path = g_strdup_printf("%s.md", path); + fd = fopen(path, "r"); + if (fd) { + fclose(fd); + g_warning("File '%s' already exists.", path); + } else { + fd = fopen(path, "w"); + if (fd) { + fwrite(default_template, sizeof(char), strlen(default_template), fd); + fclose(fd); + mainWindow_openExternalEditor(path); + } else { + g_warning("Could not open file '%s' for writing.", path); + } + } + } + } + + gtk_widget_destroy(GTK_WIDGET(dialog)); // Get ws path // Ask user for filename // Create file and paste template From 871669f9047b80584dfa8de583e5ada533024b4c Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 17 Mar 2018 12:47:52 +0100 Subject: [PATCH 4/8] Automatically fill current date and time when creating a new entry --- src/mainwindow.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index 0c0cfee..84b25d1 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1,13 +1,14 @@ #include "mainwindow.h" #include "mdiary.h" -const gchar *default_template = "\ -# Title\n\ - Date: 01.01.2000 00:00\n\ - Summary: \n\ - Tags: \n\ -\n\ -Text"; +const gchar *default_template[] = {"# Title\n" + "Date: ", "\0", + "\n" + "Summary: \n" + "Tags: \n" + "\n" + "Text", + NULL}; static gboolean mainWindow_workspace_entry_visible(GtkTreeModel *model, GtkTreeIter *iter, @@ -1072,6 +1073,7 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) FILE *fd; gchar *default_path; GDateTime *datetime; + int i; dialog = gtk_message_dialog_new(GTK_WINDOW(mainWindow->mainWindow), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, @@ -1082,7 +1084,6 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) default_path = g_date_time_format(datetime, "%Y/%Y-%m-%d"); gtk_entry_set_text(GTK_ENTRY(textInput), default_path); g_free(default_path); - g_date_time_unref(datetime); gtk_box_pack_end(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), textInput, true, true, 4); g_signal_connect(textInput, "activate", @@ -1104,7 +1105,15 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) } else { fd = fopen(path, "w"); if (fd) { - fwrite(default_template, sizeof(char), strlen(default_template), fd); + for (i = 0; default_template[i] != NULL; ++i) { + if (default_template[i][0] == '\0') { + default_path = g_date_time_format(datetime, "%d.%m.%Y %H:%M"); + fwrite(default_path, sizeof(char), strlen(default_path), fd); + g_free(default_path); + } else { + fwrite(default_template[i], sizeof(char), strlen(default_template[i]), fd); + } + } fclose(fd); mainWindow_openExternalEditor(path); } else { @@ -1114,6 +1123,8 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) } } + g_date_time_unref(datetime); + gtk_widget_destroy(GTK_WIDGET(dialog)); // Get ws path // Ask user for filename From 10ad046629b065ed03d0394d3f8b94b7df722437 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 17 Mar 2018 13:20:09 +0100 Subject: [PATCH 5/8] Remove obsolete comments --- src/mainwindow.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index 84b25d1..1956f3d 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1126,10 +1126,6 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) g_date_time_unref(datetime); gtk_widget_destroy(GTK_WIDGET(dialog)); - // Get ws path - // Ask user for filename - // Create file and paste template - // Launch editor on file } void mainWindow_decrypt_gpg_clicked(GtkWidget *widget, gpointer user_data) From c4809f29b24e8e9adc86eb17ca33cf03fdb45f04 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 17 Mar 2018 14:48:17 +0100 Subject: [PATCH 6/8] Make date format for new entries customizable --- glade/mainWindow.glade | 40 +++++++++++++++++++++++++-------- src/mainwindow.c | 51 +++++++++++++++++++++++++++++++++++++++--- src/mainwindow.h | 4 ++++ src/settings.c | 13 +++++++++++ 4 files changed, 96 insertions(+), 12 deletions(-) diff --git a/glade/mainWindow.glade b/glade/mainWindow.glade index caff17d..94d7534 100644 --- a/glade/mainWindow.glade +++ b/glade/mainWindow.glade @@ -1,5 +1,5 @@ - + @@ -520,20 +520,21 @@ vertical 4 - + True False - 4 + 4 + 4 True False + end Entry display mode: - False - True - 0 + 0 + 0 @@ -542,9 +543,30 @@ False - False - True - 2 + 1 + 0 + + + + + True + False + end + New entry date format: + + + 0 + 1 + + + + + True + False + + + 1 + 1 diff --git a/src/mainwindow.c b/src/mainwindow.c index 1956f3d..4e5dcce 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -498,6 +498,28 @@ static void mainWindow_settings_combo_changed(GtkComboBox *widget, gpointer user mainWindow_entrySelected(NULL, user_data); } +static void mainWindow_settings_comboNewDateFormat_changed(GtkComboBox *widget, gpointer user_data) +{ + struct mainWindow *mainWindow = (struct mainWindow *)user_data; + + mainWindow_set_new_file_date_format(mainWindow, gtk_combo_box_get_active_id(GTK_COMBO_BOX(mainWindow->settingsDialog.comboNewDateFormat))); +} + +const gchar *newDateFormats[] = {"%d.%m.%Y %H:%M", + "%Y-%m-%d %H:%M", + NULL}; + +void mainWindow_set_new_file_date_format(struct mainWindow *mainWindow, gchar *fmt) +{ + if (!fmt) { + fmt = newDateFormats[0]; + } + g_free(mainWindow->newFileDateFormat); + mainWindow->newFileDateFormat = g_strdup(fmt); + + gtk_combo_box_set_active_id(mainWindow->settingsDialog.comboNewDateFormat, fmt); +} + static gboolean mainWindow_settings_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(widget); @@ -511,6 +533,10 @@ void mainWindow_settings_show(struct mainWindow *mainWindow) static void mainWindow_configure_settings_dialog(struct mainWindow *mainWindow) { + GDateTime *datetime; + int i; + gchar *text; + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(mainWindow->settingsDialog.comboDisplayMode), "text", "Text only"); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(mainWindow->settingsDialog.comboDisplayMode), @@ -518,11 +544,26 @@ static void mainWindow_configure_settings_dialog(struct mainWindow *mainWindow) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(mainWindow->settingsDialog.comboDisplayMode), "html", "Full HTML with images"); + datetime = g_date_time_new_now_local(); + for (i= 0; newDateFormats[i]; ++i) { + text = g_date_time_format(datetime, newDateFormats[i]); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(mainWindow->settingsDialog.comboNewDateFormat), + newDateFormats[i], text); + g_free(text); + } + g_date_time_unref(datetime); + + g_signal_connect(mainWindow->settingsDialog.comboDisplayMode, "changed", (GCallback) mainWindow_settings_combo_changed, mainWindow); + g_signal_connect(mainWindow->settingsDialog.comboNewDateFormat, + "changed", + (GCallback) mainWindow_settings_comboNewDateFormat_changed, + mainWindow); + g_signal_connect(mainWindow->settingsDialog.settingsDialog, "delete-event", (GCallback) mainWindow_settings_delete_event, @@ -575,8 +616,9 @@ struct mainWindow *mainWindow_new() mainWindow->currentWorkspaceUrl = NULL; - mainWindow->settingsDialog.settingsDialog = GTK_WIDGET(gtk_builder_get_object(builder, "settingsDialog")); - mainWindow->settingsDialog.comboDisplayMode = GTK_WIDGET(gtk_builder_get_object(builder, "comboDisplayMode")); + mainWindow->settingsDialog.settingsDialog = GTK_WIDGET(gtk_builder_get_object(builder, "settingsDialog")); + mainWindow->settingsDialog.comboDisplayMode = GTK_WIDGET(gtk_builder_get_object(builder, "comboDisplayMode")); + mainWindow->settingsDialog.comboNewDateFormat = GTK_WIDGET(gtk_builder_get_object(builder, "comboNewDateFormat")); mainWindow->filterSettings.time_start = 0; mainWindow->filterSettings.time_end = -1; @@ -586,6 +628,8 @@ struct mainWindow *mainWindow_new() mainWindow->renderer = RENDERER_NONE; + mainWindow->newFileDateFormat = NULL; + gtk_builder_connect_signals(builder, NULL); g_object_unref(G_OBJECT(builder)); @@ -601,6 +645,7 @@ struct mainWindow *mainWindow_new() mainWindow_configure_entry_completion(mainWindow); mainWindow_set_meta_information(mainWindow, 0, 0, TRUE); + mainWindow_set_new_file_date_format(mainWindow, NULL); mainWindow_renderer_set(mainWindow, RENDERER_TEXT); return mainWindow; @@ -1107,7 +1152,7 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data) if (fd) { for (i = 0; default_template[i] != NULL; ++i) { if (default_template[i][0] == '\0') { - default_path = g_date_time_format(datetime, "%d.%m.%Y %H:%M"); + default_path = g_date_time_format(datetime, mainWindow->newFileDateFormat); fwrite(default_path, sizeof(char), strlen(default_path), fd); g_free(default_path); } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 6f6a0a2..40408d8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -81,9 +81,12 @@ struct mainWindow { GtkListStore *workspaceListStore; GtkTreeModelFilter *workspaceListFiltered; + gchar *newFileDateFormat; + struct settingsDialog { GtkWidget *settingsDialog; GtkWidget *comboDisplayMode; + GtkWidget *comboNewDateFormat; } settingsDialog; }; @@ -113,5 +116,6 @@ void mainWindow_new_entry_clicked(GtkWidget *widget, gpointer user_data); void mainWindow_decrypt_gpg_clicked(GtkWidget *widget, gpointer user_data); void mainWindow_renderer_set(struct mainWindow *mainWindow, enum renderer_mode state); void mainWindow_settings_show(struct mainWindow *mainWindow); +void mainWindow_set_new_file_date_format(struct mainWindow *mainWindow, gchar *fmt); #endif /* MAINWINDOW_H */ diff --git a/src/settings.c b/src/settings.c index e7e8a66..864a3a1 100644 --- a/src/settings.c +++ b/src/settings.c @@ -20,6 +20,14 @@ static void mdiary_settings_parse_line(gchar *line, struct mdiary_settings *sett mainWindow_renderer_set(settings->mainWindow, atoi(g_match_info_fetch(match_info, 1))); } g_regex_unref(regex); + + regex = g_regex_new("^newfileformat = (.*)", G_REGEX_RAW, 0, NULL); + if (g_regex_match(regex, line, 0, &match_info) && + g_regex_get_capture_count(regex) > 0 && + g_match_info_matches(match_info)) { + mainWindow_set_new_file_date_format(settings->mainWindow, g_match_info_fetch(match_info, 1)); + } + g_regex_unref(regex); } gboolean mdiary_load_settings(gchar *filename, struct mdiary_settings *settings) @@ -80,6 +88,11 @@ gboolean mdiary_save_settings(gchar *filename, struct mdiary_settings *settings) output_buffer, strlen(output_buffer), NULL, NULL); g_free(output_buffer); + output_buffer = g_strdup_printf("newfileformat = %s\n", settings->mainWindow->newFileDateFormat); + g_output_stream_write(G_OUTPUT_STREAM(stream), + output_buffer, strlen(output_buffer), NULL, NULL); + g_free(output_buffer); + 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, From aa4d74f6031c99b139fe2aa2aee6af5917bb568f Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 17 Mar 2018 15:39:37 +0100 Subject: [PATCH 7/8] Allow custom date formats --- glade/mainWindow.glade | 62 ++++++++++++++++++++++++++++++++++++------ src/mainwindow.c | 41 +++++++++++++++++++++++++++- src/mainwindow.h | 3 ++ 3 files changed, 97 insertions(+), 9 deletions(-) diff --git a/glade/mainWindow.glade b/glade/mainWindow.glade index 94d7534..28c5759 100644 --- a/glade/mainWindow.glade +++ b/glade/mainWindow.glade @@ -461,11 +461,12 @@ - - New Entry - True + + Decrypt GPG True True + imageDecrypt + True False @@ -474,12 +475,11 @@ - - Decrypt GPG + + New Entry + True True True - imageDecrypt - True False @@ -560,9 +560,55 @@ - + True False + + + True + False + + + True + False + + + page0 + page0 + + + + + True + True + + + page1 + page1 + 1 + + + + + False + True + 0 + + + + + ... + True + True + True + Use custom format + + + False + True + 1 + + 1 diff --git a/src/mainwindow.c b/src/mainwindow.c index 4e5dcce..729411c 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -505,19 +505,50 @@ static void mainWindow_settings_comboNewDateFormat_changed(GtkComboBox *widget, mainWindow_set_new_file_date_format(mainWindow, gtk_combo_box_get_active_id(GTK_COMBO_BOX(mainWindow->settingsDialog.comboNewDateFormat))); } + +static void mainWindow_settings_buttonCustomNewFileDateFormat_clicked(GtkComboBox *widget, gpointer user_data) +{ + struct mainWindow *mainWindow = (struct mainWindow *)user_data; + + if (gtk_stack_get_visible_child(GTK_STACK(mainWindow->settingsDialog.stackNewDateFormat)) == mainWindow->settingsDialog.entryNewDateFormat) { + mainWindow_set_new_file_date_format(mainWindow, gtk_entry_get_text(mainWindow->settingsDialog.entryNewDateFormat)); + gtk_stack_set_visible_child(GTK_STACK(mainWindow->settingsDialog.stackNewDateFormat), + mainWindow->settingsDialog.comboNewDateFormat); + gtk_button_set_label(GTK_BUTTON(mainWindow->settingsDialog.buttonCustomNewFileDateFormat), "..."); + } else { + gtk_stack_set_visible_child(GTK_STACK(mainWindow->settingsDialog.stackNewDateFormat), + mainWindow->settingsDialog.entryNewDateFormat); + gtk_button_set_label(GTK_BUTTON(mainWindow->settingsDialog.buttonCustomNewFileDateFormat), "OK"); + } +} + const gchar *newDateFormats[] = {"%d.%m.%Y %H:%M", "%Y-%m-%d %H:%M", NULL}; void mainWindow_set_new_file_date_format(struct mainWindow *mainWindow, gchar *fmt) { + GDateTime *datetime; + gchar *text; + if (!fmt) { fmt = newDateFormats[0]; } g_free(mainWindow->newFileDateFormat); mainWindow->newFileDateFormat = g_strdup(fmt); - gtk_combo_box_set_active_id(mainWindow->settingsDialog.comboNewDateFormat, fmt); + gtk_entry_set_text(mainWindow->settingsDialog.entryNewDateFormat, fmt); + + /* Custom format -> Add to list for this session */ + if (!gtk_combo_box_set_active_id(mainWindow->settingsDialog.comboNewDateFormat, fmt)) { + datetime = g_date_time_new_now_local(); + text = g_date_time_format(datetime, fmt); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(mainWindow->settingsDialog.comboNewDateFormat), + fmt, text); + g_free(text); + g_date_time_unref(datetime); + gtk_combo_box_set_active_id(mainWindow->settingsDialog.comboNewDateFormat, fmt); + } } static gboolean mainWindow_settings_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) @@ -564,6 +595,11 @@ static void mainWindow_configure_settings_dialog(struct mainWindow *mainWindow) (GCallback) mainWindow_settings_comboNewDateFormat_changed, mainWindow); + g_signal_connect(mainWindow->settingsDialog.buttonCustomNewFileDateFormat, + "clicked", + (GCallback) mainWindow_settings_buttonCustomNewFileDateFormat_clicked, + mainWindow); + g_signal_connect(mainWindow->settingsDialog.settingsDialog, "delete-event", (GCallback) mainWindow_settings_delete_event, @@ -619,6 +655,9 @@ struct mainWindow *mainWindow_new() mainWindow->settingsDialog.settingsDialog = GTK_WIDGET(gtk_builder_get_object(builder, "settingsDialog")); mainWindow->settingsDialog.comboDisplayMode = GTK_WIDGET(gtk_builder_get_object(builder, "comboDisplayMode")); mainWindow->settingsDialog.comboNewDateFormat = GTK_WIDGET(gtk_builder_get_object(builder, "comboNewDateFormat")); + mainWindow->settingsDialog.stackNewDateFormat = GTK_WIDGET(gtk_builder_get_object(builder, "stackNewDateFormat")); + mainWindow->settingsDialog.entryNewDateFormat = GTK_WIDGET(gtk_builder_get_object(builder, "entryNewDateFormat")); + mainWindow->settingsDialog.buttonCustomNewFileDateFormat = GTK_WIDGET(gtk_builder_get_object(builder, "buttonCustomNewFileDateFormat")); mainWindow->filterSettings.time_start = 0; mainWindow->filterSettings.time_end = -1; diff --git a/src/mainwindow.h b/src/mainwindow.h index 40408d8..6f4b02e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -86,7 +86,10 @@ struct mainWindow { struct settingsDialog { GtkWidget *settingsDialog; GtkWidget *comboDisplayMode; + GtkWidget *stackNewDateFormat; GtkWidget *comboNewDateFormat; + GtkWidget *buttonCustomNewFileDateFormat; + GtkWidget *entryNewDateFormat; } settingsDialog; }; From 27ad3385b74733d314d9dd96e1b34e8febf89649 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 17 Mar 2018 15:42:16 +0100 Subject: [PATCH 8/8] Correct indentations --- src/mainwindow.c | 22 +++++++++++----------- src/settings.c | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/mainwindow.c b/src/mainwindow.c index 729411c..487e33b 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -8,7 +8,7 @@ const gchar *default_template[] = {"# Title\n" "Tags: \n" "\n" "Text", - NULL}; + NULL}; static gboolean mainWindow_workspace_entry_visible(GtkTreeModel *model, GtkTreeIter *iter, @@ -215,9 +215,9 @@ static void mainWindow_configure_workspaceTreeView(struct mainWindow *mainWindow G_TYPE_STRING); mainWindow->workspaceListFiltered = GTK_TREE_MODEL_FILTER( - gtk_tree_model_filter_new( - GTK_TREE_MODEL(mainWindow->workspaceListStore), - NULL)); + gtk_tree_model_filter_new( + GTK_TREE_MODEL(mainWindow->workspaceListStore), + NULL)); gtk_tree_model_filter_set_visible_func(mainWindow->workspaceListFiltered, (GtkTreeModelFilterVisibleFunc) mainWindow_workspace_entry_visible, @@ -798,9 +798,9 @@ static void mainWindow_set_text(struct mainWindow *mainWindow, gchar *text, gcha base_url = g_strdup_printf("file://%s", file_url); file = g_file_new_for_path(tempfile_path); stream = g_file_replace( - file, NULL, FALSE, - G_FILE_CREATE_NONE, - NULL, NULL); + file, NULL, FALSE, + G_FILE_CREATE_NONE, + NULL, NULL); g_output_stream_write(G_OUTPUT_STREAM(stream), text, strlen(text), NULL, NULL); g_output_stream_flush(G_OUTPUT_STREAM(stream), NULL, NULL); @@ -950,13 +950,13 @@ void mainWindow_filterChanged(GtkWidget *widget, gpointer user_data) } mainWindow->filterSettings.search_title = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(mainWindow->checkSearchTitle)); + GTK_TOGGLE_BUTTON(mainWindow->checkSearchTitle)); mainWindow->filterSettings.search_tags = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(mainWindow->checkSearchTags)); + GTK_TOGGLE_BUTTON(mainWindow->checkSearchTags)); mainWindow->filterSettings.search_text = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(mainWindow->checkSearchText)); + GTK_TOGGLE_BUTTON(mainWindow->checkSearchText)); mainWindow->filterSettings.search_summary = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(mainWindow->checkSearchSummary)); + GTK_TOGGLE_BUTTON(mainWindow->checkSearchSummary)); gtk_tree_model_filter_refilter(mainWindow->entryListFiltered); } diff --git a/src/settings.c b/src/settings.c index 864a3a1..edc2e70 100644 --- a/src/settings.c +++ b/src/settings.c @@ -78,9 +78,9 @@ gboolean mdiary_save_settings(gchar *filename, struct mdiary_settings *settings) file = g_file_new_for_path(filename); stream = g_file_replace( - file, NULL, FALSE, - G_FILE_CREATE_NONE, - NULL, NULL); + file, NULL, FALSE, + G_FILE_CREATE_NONE, + NULL, NULL); output_buffer = g_strdup_printf("renderer = %d\n", settings->mainWindow->renderer);