diff --git a/src/mainwindow.c b/src/mainwindow.c index 15af846..977f0b9 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1,6 +1,45 @@ #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) +{ + GRegex *regex; + GMatchInfo *match_info; + gchar *searchString; + gchar *temp; + gboolean ret = FALSE; + + searchString = gtk_entry_get_text(GTK_ENTRY(mainWindow->workspaceSearch)); + + if (g_strcmp0(searchString, "")) { + regex = g_regex_new(searchString, G_REGEX_CASELESS, 0, NULL); + gtk_tree_model_get(model, iter, WSCOL_PATH, &temp, -1); + if (g_regex_match(regex, temp, 0, &match_info) && g_match_info_matches(match_info)) + ret = TRUE; + g_free(temp); + } else { + ret = TRUE; + } + + return ret; +} + +void mainWindow_workspace_search_changed(GtkWidget *widget, gpointer user_data) +{ + struct mainWindow *mainWindow = (struct mainWindow *)user_data; + + gtk_tree_model_filter_refilter(mainWindow->workspaceListFiltered); +} + + /** * @brief mainWindow_list_entry_visible checks whether the entry should be displayed. * @param model N/A @@ -8,7 +47,9 @@ * @param mainWindow struct mainWindow * * @return True when it should displayed, else false. */ -static gboolean mainWindow_list_entry_visible(GtkTreeModel *model, GtkTreeIter *iter, struct mainWindow *mainWindow) +static gboolean mainWindow_list_entry_visible(GtkTreeModel *model, + GtkTreeIter *iter, + struct mainWindow *mainWindow) { GRegex *regex; GMatchInfo *match_info; @@ -102,6 +143,33 @@ static gint mainWindow_sort_date_compare_func(GtkTreeModel *model, return -1; } +static void mainWindow_add_recent_workspace(struct mainWindow *mainWindow, gchar *path) +{ + GtkTreeIter iter; + GRegex *regex; + GMatchInfo *match_info; + gchar *temp; + + regex = g_regex_new("(.*)\\/(.*)", G_REGEX_RAW, 0, NULL); + if (g_regex_match(regex, path, 0, &match_info) && + g_regex_get_capture_count(regex) > 1 && + g_match_info_matches(match_info)) { + g_match_info_fetch(match_info, 1); + + temp = g_strdup_printf("%s\n%s", + g_match_info_fetch(match_info, 2), + g_match_info_fetch(match_info, 1)); + gtk_list_store_append(mainWindow->workspaceListStore, &iter); + gtk_list_store_set(mainWindow->workspaceListStore, &iter, + WSCOL_LABEL, temp, + WSCOL_PATH, path, + -1); + g_free(temp); + } + + g_regex_unref(regex); +} + /** * @brief mainWindow_wschooser_configure_treeView configures the GtkTreeView for workspace selection * @param mainWindow @@ -111,34 +179,28 @@ static void mainWindow_configure_workspaceTreeView(struct mainWindow *mainWindow GtkCellRenderer *renderer; GtkTreeViewColumn *col; - mainWindow->workspaceListStore = gtk_list_store_new(1, G_TYPE_STRING); + mainWindow->workspaceListStore = gtk_list_store_new(WSCOL_COUNT, + G_TYPE_STRING, + G_TYPE_STRING); - /* - * TODO: - * gtk_tree_model_filter_set_visible_func(mainWindow->workspaceListStore, - * (GtkTreeModelFilterVisibleFunc) mainWindow_list_entry_visible, - * mainWindow, NULL); - */ + mainWindow->workspaceListFiltered = GTK_TREE_MODEL_FILTER( + gtk_tree_model_filter_new( + GTK_TREE_MODEL(mainWindow->workspaceListStore), + NULL)); - gtk_tree_view_set_model(mainWindow->workspaceListView, GTK_TREE_MODEL(mainWindow->workspaceListStore)); + gtk_tree_model_filter_set_visible_func(mainWindow->workspaceListFiltered, + (GtkTreeModelFilterVisibleFunc) mainWindow_workspace_entry_visible, + mainWindow, NULL); + + gtk_tree_view_set_model(mainWindow->workspaceListView, GTK_TREE_MODEL(mainWindow->workspaceListFiltered)); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(mainWindow->workspaceListView, -1, "", renderer, - "markup", 0, NULL); - - /* Test entry for debugging */ - - GtkTreeIter iter; - - gtk_list_store_append(mainWindow->workspaceListStore, &iter); - gtk_list_store_set(mainWindow->workspaceListStore, &iter, - 0, "testworkspace\n\n/home/user/Documents", - -1); - gtk_list_store_append(mainWindow->workspaceListStore, &iter); - gtk_list_store_set(mainWindow->workspaceListStore, &iter, - 0, "testworkspace\n\n/home/user/Documents", - -1); + "markup", WSCOL_LABEL, NULL); + /* Test only */ + mainWindow_add_recent_workspace(mainWindow, "/home/user/Document/diary"); + mainWindow_add_recent_workspace(mainWindow, "/home/user/Document/workfoo"); } /** @@ -293,6 +355,10 @@ static void mainWindow_connect_signals(struct mainWindow *mainWindow) "row-activated", (GCallback) mainWindow_workspaceListClicked, mainWindow); + g_signal_connect(mainWindow->workspaceSearch, + "changed", + (GCallback) mainWindow_workspace_search_changed, + mainWindow); } /** @@ -337,7 +403,7 @@ struct mainWindow *mainWindow_new() mainWindow->textBuffer = GTK_TEXT_BUFFER(gtk_builder_get_object(builder, "entryTextBuffer")); mainWindow->buttonOtherWorkspace = GTK_WIDGET(gtk_builder_get_object(builder, "buttonOtherWorkspace")); - mainWindow->searchWorkspace = GTK_WIDGET(gtk_builder_get_object(builder, "searchWorkspace")); + mainWindow->workspaceSearch = GTK_WIDGET(gtk_builder_get_object(builder, "searchWorkspace")); mainWindow->popoverWorkspace = GTK_WIDGET(gtk_builder_get_object(builder, "popoverWorkspace")); mainWindow->workspaceListView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeWorkspace")); mainWindow->workspaceListSelection = GTK_TREE_SELECTION(gtk_builder_get_object(builder, @@ -585,12 +651,22 @@ void mainWindow_dateIconPress(GtkWidget *widget, gint icon_pos, gint event, gpoi } void mainWindow_workspaceListClicked(GtkWidget *widget, - GtkTreePath *path, + GtkTreePath *tree_path, GtkTreeViewColumn *column, gpointer user_data) { struct mainWindow *mainWindow = (struct mainWindow *)user_data; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *selection; + gchar *path; gtk_popover_popdown(GTK_POPOVER(mainWindow->popoverWorkspace)); - g_print("TODO: Workspace list clicked.\n"); + + selection = gtk_tree_view_get_selection(mainWindow->workspaceListView); + if (gtk_tree_selection_get_selected(selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, WSCOL_PATH, &path, -1); + g_print("TODO: Switch workspace to %s\n", path); + g_free(path); + } } diff --git a/src/mainwindow.h b/src/mainwindow.h index c040f4e..fd5df81 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -41,11 +41,12 @@ struct mainWindow { } filterSettings; GtkWidget *buttonOtherWorkspace; - GtkWidget *searchWorkspace; + GtkWidget *workspaceSearch; GtkWidget *popoverWorkspace; GtkTreeView *workspaceListView; GtkTreeSelection *workspaceListSelection; GtkListStore *workspaceListStore; + GtkTreeModelFilter *workspaceListFiltered; }; struct mainWindow *mainWindow_new(); @@ -55,13 +56,14 @@ void mainWindow_set_meta_information(struct mainWindow *mainWindow, guint time_e void mainWindow_showPopover(GtkWidget *widget, GdkEvent *event, gpointer user_data); void mainWindow_otherWorkspaceClicked(GtkWidget *widget, gint event, gpointer user_data); void mainWindow_workspaceListClicked(GtkWidget *widget, - GtkTreePath *path, + GtkTreePath *tree_path, GtkTreeViewColumn *column, gpointer user_data); 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_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);