Mercurial > geeqie
comparison src/view_file_list.c @ 1699:81ccb9cf7ef5
do not use cell_data_func
cell_data_func is too slow, store formatted string in the tree_store
instead
author | nadvornik |
---|---|
date | Fri, 24 Jul 2009 12:21:23 +0000 |
parents | 98cd4f700f35 |
children | bda2d599cc70 |
comparison
equal
deleted
inserted
replaced
1698:bfe04f01de5e | 1699:81ccb9cf7ef5 |
---|---|
35 /* Index to tree store */ | 35 /* Index to tree store */ |
36 enum { | 36 enum { |
37 FILE_COLUMN_POINTER = 0, | 37 FILE_COLUMN_POINTER = 0, |
38 FILE_COLUMN_VERSION, | 38 FILE_COLUMN_VERSION, |
39 FILE_COLUMN_THUMB, | 39 FILE_COLUMN_THUMB, |
40 FILE_COLUMN_FORMATTED, | |
40 FILE_COLUMN_NAME, | 41 FILE_COLUMN_NAME, |
41 FILE_COLUMN_SIDECARS, | 42 FILE_COLUMN_SIDECARS, |
42 FILE_COLUMN_SIZE, | 43 FILE_COLUMN_SIZE, |
43 FILE_COLUMN_DATE, | 44 FILE_COLUMN_DATE, |
45 FILE_COLUMN_EXPANDED, | |
44 FILE_COLUMN_COLOR, | 46 FILE_COLUMN_COLOR, |
45 FILE_COLUMN_MARKS, | 47 FILE_COLUMN_MARKS, |
46 FILE_COLUMN_MARKS_LAST = FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1, | 48 FILE_COLUMN_MARKS_LAST = FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1, |
47 FILE_COLUMN_COUNT | 49 FILE_COLUMN_COUNT |
48 }; | 50 }; |
51 /* Index to tree view */ | 53 /* Index to tree view */ |
52 enum { | 54 enum { |
53 FILE_VIEW_COLUMN_MARKS = 0, | 55 FILE_VIEW_COLUMN_MARKS = 0, |
54 FILE_VIEW_COLUMN_MARKS_LAST = FILE_VIEW_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1, | 56 FILE_VIEW_COLUMN_MARKS_LAST = FILE_VIEW_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1, |
55 FILE_VIEW_COLUMN_THUMB, | 57 FILE_VIEW_COLUMN_THUMB, |
56 FILE_VIEW_COLUMN_NAME, | 58 FILE_VIEW_COLUMN_FORMATTED, |
57 FILE_VIEW_COLUMN_SIZE, | 59 FILE_VIEW_COLUMN_SIZE, |
58 FILE_VIEW_COLUMN_DATE, | 60 FILE_VIEW_COLUMN_DATE, |
59 FILE_VIEW_COLUMN_COUNT | 61 FILE_VIEW_COLUMN_COUNT |
60 }; | 62 }; |
61 | 63 |
63 | 65 |
64 static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd); | 66 static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd); |
65 static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data); | 67 static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data); |
66 static void vflist_populate_view(ViewFile *vf); | 68 static void vflist_populate_view(ViewFile *vf); |
67 static gboolean vflist_is_multiline(ViewFile *vf); | 69 static gboolean vflist_is_multiline(ViewFile *vf); |
70 static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded); | |
68 | 71 |
69 | 72 |
70 /* | 73 /* |
71 *----------------------------------------------------------------------------- | 74 *----------------------------------------------------------------------------- |
72 * misc | 75 * misc |
797 } | 800 } |
798 | 801 |
799 return TRUE; | 802 return TRUE; |
800 } | 803 } |
801 | 804 |
805 static void vflist_expand_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | |
806 { | |
807 ViewFile *vf = data; | |
808 vflist_set_expanded(vf, iter, TRUE); | |
809 } | |
810 | |
811 static void vflist_collapse_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | |
812 { | |
813 ViewFile *vf = data; | |
814 vflist_set_expanded(vf, iter, FALSE); | |
815 } | |
816 | |
802 /* | 817 /* |
803 *----------------------------------------------------------------------------- | 818 *----------------------------------------------------------------------------- |
804 * misc | 819 * misc |
805 *----------------------------------------------------------------------------- | 820 *----------------------------------------------------------------------------- |
806 */ | 821 */ |
810 gboolean path_currently_selected, gpointer data) | 825 gboolean path_currently_selected, gpointer data) |
811 { | 826 { |
812 return TRUE; | 827 return TRUE; |
813 } | 828 } |
814 */ | 829 */ |
830 | |
831 static gchar* vflist_get_formatted(ViewFile *vf, const gchar *name, const gchar *sidecars, const gchar *size, const gchar *time, gboolean expanded) | |
832 { | |
833 gboolean multiline = vflist_is_multiline(vf); | |
834 gchar *text; | |
835 | |
836 if (multiline) | |
837 { | |
838 text = g_strdup_printf("%s %s\n%s\n%s", name, expanded ? "" : sidecars, size, time); | |
839 } | |
840 else | |
841 { | |
842 text = g_strdup_printf("%s %s", name, expanded ? "" : sidecars); | |
843 } | |
844 return text; | |
845 } | |
846 | |
847 static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded) | |
848 { | |
849 GtkTreeStore *store; | |
850 gchar *name; | |
851 gchar *sidecars; | |
852 gchar *size; | |
853 gchar *time; | |
854 gchar *formatted; | |
855 | |
856 store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview))); | |
857 | |
858 gtk_tree_model_get(GTK_TREE_MODEL(store), iter, | |
859 FILE_COLUMN_NAME, &name, | |
860 FILE_COLUMN_SIDECARS, &sidecars, | |
861 FILE_COLUMN_SIZE, &size, | |
862 FILE_COLUMN_DATE, &time, | |
863 -1); | |
864 formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded); | |
865 | |
866 gtk_tree_store_set(store, iter, FILE_COLUMN_FORMATTED, formatted, | |
867 FILE_COLUMN_EXPANDED, expanded, | |
868 -1); | |
869 g_free(time); | |
870 g_free(size); | |
871 g_free(sidecars); | |
872 g_free(name); | |
873 g_free(formatted); | |
874 } | |
875 | |
815 static void vflist_setup_iter(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd) | 876 static void vflist_setup_iter(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd) |
816 { | 877 { |
817 gchar *size; | 878 gchar *size; |
818 gchar *sidecars = NULL; | 879 gchar *sidecars = NULL; |
819 gchar *name; | 880 gchar *name; |
820 const gchar *time = text_from_time(fd->date); | 881 const gchar *time = text_from_time(fd->date); |
821 gchar *link = islink(fd->path) ? GQ_LINK_STR : ""; | 882 gchar *link = islink(fd->path) ? GQ_LINK_STR : ""; |
822 const gchar *disabled_grouping; | 883 const gchar *disabled_grouping; |
884 gchar *formatted; | |
885 gboolean expanded = FALSE; | |
886 | |
887 if (fd->sidecar_files) /* expanded has no effect on files without sidecars */ | |
888 { | |
889 gtk_tree_model_get(GTK_TREE_MODEL(store), iter, FILE_COLUMN_EXPANDED, &expanded, -1); | |
890 } | |
823 | 891 |
824 sidecars = file_data_sc_list_to_string(fd); | 892 sidecars = file_data_sc_list_to_string(fd); |
825 | 893 |
826 disabled_grouping = fd->disable_grouping ? _(" [NO GROUPING]") : ""; | 894 disabled_grouping = fd->disable_grouping ? _(" [NO GROUPING]") : ""; |
827 name = g_strdup_printf("%s%s%s", link, fd->name, disabled_grouping); | 895 name = g_strdup_printf("%s%s%s", link, fd->name, disabled_grouping); |
828 size = text_from_size(fd->size); | 896 size = text_from_size(fd->size); |
829 | 897 |
898 formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded); | |
899 | |
830 gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd, | 900 gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd, |
831 FILE_COLUMN_VERSION, fd->version, | 901 FILE_COLUMN_VERSION, fd->version, |
832 FILE_COLUMN_THUMB, fd->thumb_pixbuf, | 902 FILE_COLUMN_THUMB, fd->thumb_pixbuf, |
903 FILE_COLUMN_FORMATTED, formatted, | |
833 FILE_COLUMN_SIDECARS, sidecars, | 904 FILE_COLUMN_SIDECARS, sidecars, |
834 FILE_COLUMN_NAME, name, | 905 FILE_COLUMN_NAME, name, |
835 FILE_COLUMN_SIZE, size, | 906 FILE_COLUMN_SIZE, size, |
836 FILE_COLUMN_DATE, time, | 907 FILE_COLUMN_DATE, time, |
837 #define STORE_SET_IS_SLOW 1 | 908 #define STORE_SET_IS_SLOW 1 |
857 } | 928 } |
858 #endif | 929 #endif |
859 g_free(size); | 930 g_free(size); |
860 g_free(sidecars); | 931 g_free(sidecars); |
861 g_free(name); | 932 g_free(name); |
933 g_free(formatted); | |
862 } | 934 } |
863 | 935 |
864 static void vflist_setup_iter_recursive(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *parent_iter, GList *list, GList *selected) | 936 static void vflist_setup_iter_recursive(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *parent_iter, GList *list, GList *selected) |
865 { | 937 { |
866 GList *work; | 938 GList *work; |
1629 g_list_free(list); | 1701 g_list_free(list); |
1630 | 1702 |
1631 g_object_set(G_OBJECT(cell), "height", options->thumbnails.max_height, NULL); | 1703 g_object_set(G_OBJECT(cell), "height", options->thumbnails.max_height, NULL); |
1632 gtk_tree_view_column_set_visible(column, thumb); | 1704 gtk_tree_view_column_set_visible(column, thumb); |
1633 | 1705 |
1634 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_NAME); | 1706 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_FORMATTED); |
1635 if (!column) return; | 1707 if (!column) return; |
1636 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(listview), column); | 1708 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(listview), column); |
1637 | 1709 |
1638 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_SIZE); | 1710 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_SIZE); |
1639 if (!column) return; | 1711 if (!column) return; |
1765 g_object_set(G_OBJECT(cell), | 1837 g_object_set(G_OBJECT(cell), |
1766 "cell-background-gdk", vflist_listview_color_shifted(vf->listview), | 1838 "cell-background-gdk", vflist_listview_color_shifted(vf->listview), |
1767 "cell-background-set", set, NULL); | 1839 "cell-background-set", set, NULL); |
1768 } | 1840 } |
1769 | 1841 |
1770 static void vflist_name_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, | 1842 static void vflist_listview_add_column(ViewFile *vf, gint n, const gchar *title, gboolean image, gboolean right_justify, gboolean expand) |
1771 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) | |
1772 { | |
1773 ViewFile *vf = data; | |
1774 gboolean multiline = vflist_is_multiline(vf); | |
1775 gchar *text; | |
1776 gboolean expanded; | |
1777 GtkTreePath *tpath; | |
1778 | |
1779 tpath = gtk_tree_model_get_path(tree_model, iter); | |
1780 expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(vf->listview), tpath); | |
1781 gtk_tree_path_free(tpath); | |
1782 | |
1783 if (multiline) | |
1784 { | |
1785 gchar *name, *sidecars, *size, *time; | |
1786 gtk_tree_model_get(tree_model, iter, FILE_COLUMN_SIDECARS, &sidecars, | |
1787 FILE_COLUMN_NAME, &name, | |
1788 FILE_COLUMN_SIZE, &size, | |
1789 FILE_COLUMN_DATE, &time, | |
1790 -1); | |
1791 text = g_strdup_printf("%s %s\n%s\n%s", name, expanded ? "" : sidecars, size, time); | |
1792 g_free(name); | |
1793 g_free(sidecars); | |
1794 g_free(size); | |
1795 g_free(time); | |
1796 } | |
1797 else | |
1798 { | |
1799 gchar *name, *sidecars; | |
1800 gtk_tree_model_get(tree_model, iter, FILE_COLUMN_SIDECARS, &sidecars, | |
1801 FILE_COLUMN_NAME, &name, | |
1802 -1); | |
1803 text = g_strdup_printf("%s %s", name, expanded ? "" : sidecars); | |
1804 g_free(name); | |
1805 g_free(sidecars); | |
1806 } | |
1807 | |
1808 g_object_set(cell, "text", text, NULL); | |
1809 g_free(text); | |
1810 | |
1811 /* now call the common cb */ | |
1812 vflist_listview_color_cb(tree_column, cell, tree_model, iter, data); | |
1813 } | |
1814 | |
1815 | |
1816 static void vflist_listview_add_column(ViewFile *vf, gint n, const gchar *title, gboolean image, gboolean right_justify, | |
1817 gboolean expand, GtkTreeCellDataFunc cell_data_func) | |
1818 { | 1843 { |
1819 GtkTreeViewColumn *column; | 1844 GtkTreeViewColumn *column; |
1820 GtkCellRenderer *renderer; | 1845 GtkCellRenderer *renderer; |
1821 | 1846 |
1822 column = gtk_tree_view_column_new(); | 1847 column = gtk_tree_view_column_new(); |
1843 cell_renderer_height_override(renderer); | 1868 cell_renderer_height_override(renderer); |
1844 gtk_tree_view_column_pack_start(column, renderer, TRUE); | 1869 gtk_tree_view_column_pack_start(column, renderer, TRUE); |
1845 gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n); | 1870 gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n); |
1846 } | 1871 } |
1847 | 1872 |
1848 if (cell_data_func) | 1873 gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vf, NULL); |
1849 gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, vf, NULL); | |
1850 else | |
1851 gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vf, NULL); | |
1852 g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n)); | 1874 g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n)); |
1853 g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n)); | 1875 g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n)); |
1854 | 1876 |
1855 gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column); | 1877 gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column); |
1856 } | 1878 } |
1967 vf->info = g_new0(ViewFileInfoList, 1); | 1989 vf->info = g_new0(ViewFileInfoList, 1); |
1968 | 1990 |
1969 flist_types[FILE_COLUMN_POINTER] = G_TYPE_POINTER; | 1991 flist_types[FILE_COLUMN_POINTER] = G_TYPE_POINTER; |
1970 flist_types[FILE_COLUMN_VERSION] = G_TYPE_INT; | 1992 flist_types[FILE_COLUMN_VERSION] = G_TYPE_INT; |
1971 flist_types[FILE_COLUMN_THUMB] = GDK_TYPE_PIXBUF; | 1993 flist_types[FILE_COLUMN_THUMB] = GDK_TYPE_PIXBUF; |
1994 flist_types[FILE_COLUMN_FORMATTED] = G_TYPE_STRING; | |
1972 flist_types[FILE_COLUMN_NAME] = G_TYPE_STRING; | 1995 flist_types[FILE_COLUMN_NAME] = G_TYPE_STRING; |
1973 flist_types[FILE_COLUMN_SIDECARS] = G_TYPE_STRING; | 1996 flist_types[FILE_COLUMN_SIDECARS] = G_TYPE_STRING; |
1974 flist_types[FILE_COLUMN_SIZE] = G_TYPE_STRING; | 1997 flist_types[FILE_COLUMN_SIZE] = G_TYPE_STRING; |
1975 flist_types[FILE_COLUMN_DATE] = G_TYPE_STRING; | 1998 flist_types[FILE_COLUMN_DATE] = G_TYPE_STRING; |
1999 flist_types[FILE_COLUMN_EXPANDED] = G_TYPE_BOOLEAN; | |
1976 flist_types[FILE_COLUMN_COLOR] = G_TYPE_BOOLEAN; | 2000 flist_types[FILE_COLUMN_COLOR] = G_TYPE_BOOLEAN; |
1977 for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++) | 2001 for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++) |
1978 flist_types[i] = G_TYPE_BOOLEAN; | 2002 flist_types[i] = G_TYPE_BOOLEAN; |
1979 | 2003 |
1980 store = gtk_tree_store_newv(FILE_COLUMN_COUNT, flist_types); | 2004 store = gtk_tree_store_newv(FILE_COLUMN_COUNT, flist_types); |
1981 | 2005 |
1982 vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | 2006 vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); |
1983 g_object_unref(store); | 2007 g_object_unref(store); |
1984 | 2008 |
2009 g_signal_connect(G_OBJECT(vf->listview), "row-expanded", | |
2010 G_CALLBACK(vflist_expand_cb), vf); | |
2011 | |
2012 g_signal_connect(G_OBJECT(vf->listview), "row-collapsed", | |
2013 G_CALLBACK(vflist_collapse_cb), vf); | |
2014 | |
1985 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview)); | 2015 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview)); |
1986 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE); | 2016 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE); |
1987 gtk_tree_selection_set_select_function(selection, vflist_select_cb, vf, NULL); | 2017 gtk_tree_selection_set_select_function(selection, vflist_select_cb, vf, NULL); |
1988 | 2018 |
1989 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE); | 2019 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE); |
1996 vflist_listview_add_column_toggle(vf, i + FILE_COLUMN_MARKS, ""); | 2026 vflist_listview_add_column_toggle(vf, i + FILE_COLUMN_MARKS, ""); |
1997 g_assert(column == FILE_VIEW_COLUMN_MARKS + i); | 2027 g_assert(column == FILE_VIEW_COLUMN_MARKS + i); |
1998 column++; | 2028 column++; |
1999 } | 2029 } |
2000 | 2030 |
2001 vflist_listview_add_column(vf, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE, NULL); | 2031 vflist_listview_add_column(vf, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE); |
2002 g_assert(column == FILE_VIEW_COLUMN_THUMB); | 2032 g_assert(column == FILE_VIEW_COLUMN_THUMB); |
2003 column++; | 2033 column++; |
2004 | 2034 |
2005 vflist_listview_add_column(vf, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE, TRUE, vflist_name_cell_data_cb); | 2035 vflist_listview_add_column(vf, FILE_COLUMN_FORMATTED, _("Name"), FALSE, FALSE, TRUE); |
2006 g_assert(column == FILE_VIEW_COLUMN_NAME); | 2036 g_assert(column == FILE_VIEW_COLUMN_FORMATTED); |
2007 column++; | 2037 column++; |
2008 | 2038 |
2009 vflist_listview_add_column(vf, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE, NULL); | 2039 vflist_listview_add_column(vf, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE); |
2010 g_assert(column == FILE_VIEW_COLUMN_SIZE); | 2040 g_assert(column == FILE_VIEW_COLUMN_SIZE); |
2011 column++; | 2041 column++; |
2012 | 2042 |
2013 vflist_listview_add_column(vf, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, FALSE, NULL); | 2043 vflist_listview_add_column(vf, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, FALSE); |
2014 g_assert(column == FILE_VIEW_COLUMN_DATE); | 2044 g_assert(column == FILE_VIEW_COLUMN_DATE); |
2015 column++; | 2045 column++; |
2016 | 2046 |
2017 file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM); | 2047 file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM); |
2018 return vf; | 2048 return vf; |