comparison src/filelist.c @ 167:05bf5d364dba

fixed filelist refresh
author nadvornik
date Sat, 22 Dec 2007 20:33:09 +0000
parents f8bd5d49eed8
children 9a56e3d13e67
comparison
equal deleted inserted replaced
166:4d14387b7bb7 167:05bf5d364dba
626 * file info struct 626 * file info struct
627 *----------------------------------------------------------------------------- 627 *-----------------------------------------------------------------------------
628 */ 628 */
629 629
630 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source); 630 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source);
631 static void file_data_check_sidecars(FileData *fd);
632 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd);
631 633
632 634
633 static void file_data_set_path(FileData *fd, const gchar *path) 635 static void file_data_set_path(FileData *fd, const gchar *path)
634 { 636 {
635 637
666 fd->extension = extension_from_path(fd->path); 668 fd->extension = extension_from_path(fd->path);
667 if (fd->extension == NULL) 669 if (fd->extension == NULL)
668 fd->extension = fd->name + strlen(fd->name); 670 fd->extension = fd->name + strlen(fd->name);
669 } 671 }
670 672
671 static void file_data_check_update(FileData *fd, struct stat *st) 673 static void file_data_check_changed_files(FileData *fd, struct stat *st)
672 { 674 {
675 GList *work;
673 if (fd->size != st->st_size || 676 if (fd->size != st->st_size ||
674 fd->date != st->st_mtime) 677 fd->date != st->st_mtime)
675 { 678 {
676 fd->size = st->st_size; 679 fd->size = st->st_size;
677 fd->date = st->st_mtime; 680 fd->date = st->st_mtime;
678 if (fd->pixbuf) g_object_unref(fd->pixbuf); 681 if (fd->pixbuf) g_object_unref(fd->pixbuf);
679 fd->pixbuf = NULL; 682 fd->pixbuf = NULL;
680 } 683 }
681 } 684
682 685 work = fd->sidecar_files;
683 static void file_data_check_sidecars(FileData *fd); 686 while (work)
687 {
688 FileData *sfd = work->data;
689 struct stat st;
690
691 if (!stat_utf8(sfd->path, &st))
692 {
693 file_data_disconnect_sidecar_file(fd, sfd);
694 }
695
696 file_data_check_changed_files(sfd, &st);
697 work = work->next;
698 }
699 }
700
684 static GHashTable *file_data_pool = NULL; 701 static GHashTable *file_data_pool = NULL;
685 702
686 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars) 703 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars)
687 { 704 {
688 FileData *fd; 705 FileData *fd;
693 file_data_pool = g_hash_table_new (g_str_hash, g_str_equal); 710 file_data_pool = g_hash_table_new (g_str_hash, g_str_equal);
694 711
695 fd = g_hash_table_lookup(file_data_pool, path_utf8); 712 fd = g_hash_table_lookup(file_data_pool, path_utf8);
696 if (fd) 713 if (fd)
697 { 714 {
698 file_data_check_update(fd, st); 715 file_data_check_changed_files(fd, st);
699 printf("file_data_pool hit: '%s'\n", fd->path); 716 printf("file_data_pool hit: '%s'\n", fd->path);
700 return file_data_ref(fd); 717 return file_data_ref(fd);
701 } 718 }
702 719
703 fd = g_new0(FileData, 1); 720 fd = g_new0(FileData, 1);
792 if(!g_list_find(target->sidecar_files, sfd)) 809 if(!g_list_find(target->sidecar_files, sfd))
793 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd); 810 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
794 return target; 811 return target;
795 } 812 }
796 813
814
797 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source) 815 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
798 { 816 {
799 GList *work; 817 GList *work;
800 file_data_add_sidecar_file(target, source); 818 file_data_add_sidecar_file(target, source);
801 819
807 work = work->next; 825 work = work->next;
808 } 826 }
809 827
810 g_list_free(source->sidecar_files); 828 g_list_free(source->sidecar_files);
811 source->sidecar_files = NULL; 829 source->sidecar_files = NULL;
812 830
831 target->sidecar_files = filelist_sort(target->sidecar_files, SORT_NAME, TRUE);
813 return target; 832 return target;
814 } 833 }
834
835
815 836
816 FileData *file_data_ref(FileData *fd) 837 FileData *file_data_ref(FileData *fd)
817 { 838 {
818 if (fd == NULL) return NULL; 839 if (fd == NULL) return NULL;
819 840
881 parent->sidecar_files = NULL; 902 parent->sidecar_files = NULL;
882 903
883 file_data_free(parent); 904 file_data_free(parent);
884 905
885 } 906 }
907 }
908
909 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd)
910 {
911 sfd->parent = target;
912 g_assert(g_list_find(target->sidecar_files, sfd));
913
914 target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
915 sfd->parent = NULL;
916
917 if (sfd->ref == 0) {
918 file_data_free(sfd);
919 return NULL;
920 }
921
922 return sfd;
886 } 923 }
887 924
888 /* compare name without extension */ 925 /* compare name without extension */
889 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2) 926 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2)
890 { 927 {
1020 switch (filelist_sort_method) 1057 switch (filelist_sort_method)
1021 { 1058 {
1022 case SORT_SIZE: 1059 case SORT_SIZE:
1023 if (fa->size < fb->size) return -1; 1060 if (fa->size < fb->size) return -1;
1024 if (fa->size > fb->size) return 1; 1061 if (fa->size > fb->size) return 1;
1025 return 0; 1062 return CASE_SORT(fa->name, fb->name); /* fall back to name */
1026 break; 1063 break;
1027 case SORT_TIME: 1064 case SORT_TIME:
1028 if (fa->date < fb->date) return -1; 1065 if (fa->date < fb->date) return -1;
1029 if (fa->date > fb->date) return 1; 1066 if (fa->date > fb->date) return 1;
1030 return 0; 1067 return CASE_SORT(fa->name, fb->name); /* fall back to name */
1031 break; 1068 break;
1032 #ifdef HAVE_STRVERSCMP 1069 #ifdef HAVE_STRVERSCMP
1033 case SORT_NUMBER: 1070 case SORT_NUMBER:
1034 return strverscmp(fa->name, fb->name); 1071 return strverscmp(fa->name, fb->name);
1035 break; 1072 break;
1037 case SORT_NAME: 1074 case SORT_NAME:
1038 default: 1075 default:
1039 return CASE_SORT(fa->name, fb->name); 1076 return CASE_SORT(fa->name, fb->name);
1040 break; 1077 break;
1041 } 1078 }
1079 }
1080
1081 gint filelist_sort_compare_filedata_full(FileData *fa, FileData *fb, SortType method, gint ascend)
1082 {
1083 filelist_sort_method = method;
1084 filelist_sort_ascend = ascend;
1085 return filelist_sort_compare_filedata(fa, fb);
1042 } 1086 }
1043 1087
1044 static gint filelist_sort_file_cb(void *a, void *b) 1088 static gint filelist_sort_file_cb(void *a, void *b)
1045 { 1089 {
1046 return filelist_sort_compare_filedata(a, b); 1090 return filelist_sort_compare_filedata(a, b);