implemented marks filter
authorVladimir Nadvornik <nadvornik@suse.cz>
Sat, 16 Aug 2008 20:34:14 +0000 (20:34 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sat, 16 Aug 2008 20:34:14 +0000 (20:34 +0000)
src/filedata.c
src/filedata.h
src/typedefs.h
src/view_file.c
src/view_file.h
src/view_file_icon.c
src/view_file_list.c

index e0ef735..0e8b5f3 100644 (file)
@@ -1068,6 +1068,33 @@ void file_data_set_mark(FileData *fd, gint n, gboolean value)
        file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
 }
 
+gboolean file_data_filter_marks(FileData *fd, guint filter)
+{
+       return ((fd->marks & filter) == filter);
+}
+
+GList *file_data_filter_marks_list(GList *list, guint filter)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               GList *link = work;
+               work = work->next;
+
+               if (!file_data_filter_marks(fd, filter))
+                       {
+                       list = g_list_remove_link(list, link);
+                       file_data_unref(fd);
+                       g_list_free(link);
+                       }
+               }
+
+       return list;
+}
+
 gint file_data_get_user_orientation(FileData *fd)
 {
        return fd->user_orientation;
index 9ee162c..1ce28fa 100644 (file)
@@ -65,6 +65,9 @@ GList *filelist_recursive(FileData *dir_fd);
 
 gboolean file_data_get_mark(FileData *fd, gint n);
 void file_data_set_mark(FileData *fd, gint n, gboolean value);
+gboolean file_data_filter_marks(FileData *fd, guint filter);
+GList *file_data_filter_marks_list(GList *list, guint filter);
+
 gint file_data_get_user_orientation(FileData *fd);
 void file_data_set_user_orientation(FileData *fd, gint value);
 
index c12aae1..ff06387 100644 (file)
@@ -640,6 +640,9 @@ struct _ViewFile
 
        GtkWidget *widget;
        GtkWidget *listview;
+       GtkWidget *scrolled;
+       GtkWidget *filter;
+       GtkWidget *filter_check[FILEDATA_MARKS_SIZE];
 
        FileData *dir_fd;
        GList *list;
index 310416f..ebfca52 100644 (file)
@@ -656,6 +656,35 @@ static void vf_destroy_cb(GtkWidget *widget, gpointer data)
        g_free(vf);
 }
 
+static void vf_marks_filter_toggle_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFile *vf = data;
+       vf_refresh_idle(vf);
+}
+
+
+static GtkWidget *vf_marks_filter_init(ViewFile *vf)
+{
+       GtkWidget *frame = gtk_frame_new(NULL);
+       GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
+       
+       gint i;
+       
+       for (i = 0; i < FILEDATA_MARKS_SIZE ; i++)
+               {
+               GtkWidget *check = gtk_check_button_new();
+               gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
+               g_signal_connect(G_OBJECT(check), "toggled",
+                        G_CALLBACK(vf_marks_filter_toggle_cb), vf);
+
+               gtk_widget_show(check);
+               vf->filter_check[i] = check;
+               }
+       gtk_container_add(GTK_CONTAINER(frame), hbox);
+       gtk_widget_show(hbox);
+       return frame;
+}
+
 ViewFile *vf_new(FileViewType type, FileData *dir_fd)
 {
        ViewFile *vf;
@@ -678,11 +707,18 @@ ViewFile *vf_new(FileViewType type, FileData *dir_fd)
 
        vf->refresh_idle_id = -1;
 
-       vf->widget = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vf->widget), GTK_SHADOW_IN);
-       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vf->widget),
+       vf->scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vf->scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vf->scrolled),
                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
        
+       vf->filter = vf_marks_filter_init(vf);
+
+       vf->widget = gtk_vbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vf->widget), vf->filter, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vf->widget), vf->scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(vf->scrolled);
+       
        g_signal_connect(G_OBJECT(vf->widget), "destroy",
                         G_CALLBACK(vf_destroy_cb), vf);
 
@@ -701,7 +737,7 @@ ViewFile *vf_new(FileViewType type, FileData *dir_fd)
        g_signal_connect(G_OBJECT(vf->listview), "button_release_event",
                         G_CALLBACK(vf_release_cb), vf);
 
-       gtk_container_add(GTK_CONTAINER(vf->widget), vf->listview);
+       gtk_container_add(GTK_CONTAINER(vf->scrolled), vf->listview);
        gtk_widget_show(vf->listview);
 
        if (dir_fd) vf_set_fd(vf, dir_fd);
@@ -741,6 +777,28 @@ void vf_marks_set(ViewFile *vf, gint enable)
        case FILEVIEW_LIST: vflist_marks_set(vf, enable); break;
        case FILEVIEW_ICON: vficon_marks_set(vf, enable); break;
        }
+       if (enable)
+               gtk_widget_show(vf->filter);
+       else
+               gtk_widget_hide(vf->filter);
+
+       vf_refresh_idle(vf);
+}
+
+guint vf_marks_get_filter(ViewFile *vf)
+{
+       guint ret = 0;
+       gint i;
+       if (!vf->marks_enabled) return 0;
+       
+       for (i = 0; i < FILEDATA_MARKS_SIZE ; i++)
+               {
+               if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vf->filter_check[i])))
+                       {
+                       ret |= 1 << i;
+                       }
+               }
+       return ret;
 }
 
 void vf_set_layout(ViewFile *vf, LayoutWindow *layout)
@@ -771,6 +829,14 @@ void vf_refresh_idle_cancel(ViewFile *vf)
 }
 
 
+void vf_refresh_idle(ViewFile *vf)
+{
+       if (vf->refresh_idle_id == -1)
+               {
+               vf->refresh_idle_id = g_idle_add(vf_refresh_idle_cb, vf);
+               }
+}
+
 void vf_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        ViewFile *vf = data;
@@ -804,9 +870,9 @@ void vf_notify_cb(FileData *fd, NotifyType type, gpointer data)
                        }
                }
        
-       if (refresh && vf->refresh_idle_id == -1)
+       if (refresh)
                {
-               vf->refresh_idle_id = g_idle_add(vf_refresh_idle_cb, vf);
+               vf_refresh_idle(vf);
                }
 }
 
index 83b08f6..3910849 100644 (file)
@@ -31,11 +31,14 @@ void vf_set_layout(ViewFile *vf, LayoutWindow *layout);
 
 gint vf_set_fd(ViewFile *vf, FileData *fd);
 gint vf_refresh(ViewFile *vf);
+void vf_refresh_idle(ViewFile *vf);
 
 void vf_thumb_set(ViewFile *vf, gint enable);
 void vf_marks_set(ViewFile *vf, gint enable);
 void vf_sort_set(ViewFile *vf, SortType type, gint ascend);
 
+guint vf_marks_get_filter(ViewFile *vf);
+
 GList *vf_pop_menu_file_list(ViewFile *vf);
 GtkWidget *vf_pop_menu(ViewFile *vf);
 
index ca32dd6..a30530c 100644 (file)
@@ -2107,6 +2107,7 @@ static gint vficon_refresh_real(ViewFile *vf, gint keep_position)
        if (vf->dir_fd)
                {
                ret = filelist_read(vf->dir_fd, &new_filelist, NULL);
+               new_filelist = file_data_filter_marks_list(new_filelist, vf_marks_get_filter(vf));
                }
 
        vf->list = iconlist_sort(vf->list, vf->sort_method, vf->sort_ascend); /* the list might not be sorted if there were renames */
index c01d1ea..d4f90a6 100644 (file)
@@ -1564,6 +1564,12 @@ void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
                                break;
                        }
                
+               if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
+                       {
+                       vf_refresh_idle(vf);
+                       }
+
+               
                file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
 
                gtk_tree_store_set(GTK_TREE_STORE(store), &iter, FILE_COLUMN_MARKS + n, file_data_get_mark(fd, n), -1);
@@ -1693,7 +1699,7 @@ gint vflist_refresh(ViewFile *vf)
                file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification of changes detected by filelist_read */
 
                ret = filelist_read(vf->dir_fd, &vf->list, NULL);
-
+               vf->list = file_data_filter_marks_list(vf->list, vf_marks_get_filter(vf));
                file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
 
                DEBUG_1("%s vflist_refresh: sort", get_exec_time());
@@ -1820,6 +1826,10 @@ static void vflist_listview_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *
        mark = !mark;
        file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification */
        file_data_set_mark(fd, col_idx - FILE_COLUMN_MARKS, mark);
+       if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
+               {
+               vf_refresh_idle(vf);
+               }
        file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
 
        gtk_tree_store_set(store, &iter, col_idx, mark, -1);