Skip to content

Commit

Permalink
implemented marks filter
Browse files Browse the repository at this point in the history
  • Loading branch information
nadvornik committed Aug 16, 2008
1 parent f060695 commit df8df1e
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 7 deletions.
27 changes: 27 additions & 0 deletions src/filedata.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions src/filedata.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 3 additions & 0 deletions src/typedefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
78 changes: 72 additions & 6 deletions src/view_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}

3 changes: 3 additions & 0 deletions src/view_file.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
1 change: 1 addition & 0 deletions src/view_file_icon.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
12 changes: 11 additions & 1 deletion src/view_file_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit df8df1e

Please sign in to comment.