comparison src/pan-view.c @ 20:b542e45eb053

##### Note: GQview CVS on sourceforge is not always up to date, please use ##### ##### an offical release when making enhancements and translation updates. ##### Sat Mar 5 15:51:07 2005 John Ellis <johne@verizon.net> * pan-view.c: Make date search work in calendar view, plus calendar fixes. Make '/' search key refocus search entry.
author gqview
date Sat, 05 Mar 2005 20:55:43 +0000
parents bc5da5b63abd
children 17acca639a86
comparison
equal deleted inserted replaced
19:d501ca64de41 20:b542e45eb053
219 ThumbLoader *tl; 219 ThumbLoader *tl;
220 PanItem *queue_pi; 220 PanItem *queue_pi;
221 GList *queue; 221 GList *queue;
222 222
223 PanItem *click_pi; 223 PanItem *click_pi;
224 PanItem *search_pi;
224 225
225 gint idle_id; 226 gint idle_id;
226 }; 227 };
227 228
228 typedef struct _PanCacheData PanCacheData; 229 typedef struct _PanCacheData PanCacheData;
876 877
877 thumb_loader_free(pw->tl); 878 thumb_loader_free(pw->tl);
878 pw->tl = NULL; 879 pw->tl = NULL;
879 880
880 pw->click_pi = NULL; 881 pw->click_pi = NULL;
882 pw->search_pi = NULL;
881 } 883 }
882 884
883 static PanItem *pan_item_new_thumb(PanWindow *pw, FileData *fd, gint x, gint y) 885 static PanItem *pan_item_new_thumb(PanWindow *pw, FileData *fd, gint x, gint y)
884 { 886 {
885 PanItem *pi; 887 PanItem *pi;
1105 { 1107 {
1106 if (!pi) return; 1108 if (!pi) return;
1107 1109
1108 if (pw->click_pi == pi) pw->click_pi = NULL; 1110 if (pw->click_pi == pi) pw->click_pi = NULL;
1109 if (pw->queue_pi == pi) pw->queue_pi = NULL; 1111 if (pw->queue_pi == pi) pw->queue_pi = NULL;
1112 if (pw->search_pi == pi) pw->search_pi = NULL;
1110 pw->queue = g_list_remove(pw->queue, pi); 1113 pw->queue = g_list_remove(pw->queue, pi);
1111 1114
1112 pw->list = g_list_remove(pw->list, pi); 1115 pw->list = g_list_remove(pw->list, pi);
1113 image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height); 1116 image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height);
1114 pan_item_free(pi); 1117 pan_item_free(pi);
1878 { 1881 {
1879 list = g_list_delete_link(list, node); 1882 list = g_list_delete_link(list, node);
1880 } 1883 }
1881 } 1884 }
1882 1885
1886 #if 0
1883 if (!list) return; 1887 if (!list) return;
1888 #endif
1884 1889
1885 grid = (gint)(sqrt(g_list_length(list)) + 0.5); 1890 grid = (gint)(sqrt(g_list_length(list)) + 0.5);
1886 1891
1887 x = pi_day->x + pi_day->width + 4; 1892 x = pi_day->x + pi_day->width + 4;
1888 y = pi_day->y; 1893 y = pi_day->y;
1898 PAN_POPUP_BORDER, 1903 PAN_POPUP_BORDER,
1899 PAN_POPUP_COLOR, PAN_POPUP_ALPHA, 1904 PAN_POPUP_COLOR, PAN_POPUP_ALPHA,
1900 PAN_POPUP_BORDER_COLOR, PAN_POPUP_ALPHA); 1905 PAN_POPUP_BORDER_COLOR, PAN_POPUP_ALPHA);
1901 pan_item_set_key(pbox, "day_bubble"); 1906 pan_item_set_key(pbox, "day_bubble");
1902 1907
1903 pi = list->data; 1908 if (pi_day->fd)
1904 if (pi->fd)
1905 { 1909 {
1906 PanItem *plabel; 1910 PanItem *plabel;
1907 gchar *buf; 1911 gchar *buf;
1908 1912
1909 buf = date_value_string(pi->fd->date, DATE_LENGTH_WEEK); 1913 buf = date_value_string(pi_day->fd->date, DATE_LENGTH_WEEK);
1910 plabel = pan_item_new_text(pw, x, y, buf, TEXT_ATTR_BOLD | TEXT_ATTR_HEADING, 1914 plabel = pan_item_new_text(pw, x, y, buf, TEXT_ATTR_BOLD | TEXT_ATTR_HEADING,
1911 PAN_POPUP_TEXT_COLOR, 255); 1915 PAN_POPUP_TEXT_COLOR, 255);
1912 pan_item_set_key(plabel, "day_bubble"); 1916 pan_item_set_key(plabel, "day_bubble");
1913 g_free(buf); 1917 g_free(buf);
1914 1918
1915 pan_item_size_by_item(pbox, plabel, 0); 1919 pan_item_size_by_item(pbox, plabel, 0);
1916 1920
1917 y += plabel->height; 1921 y += plabel->height;
1918 } 1922 }
1919 1923
1920 column = 0; 1924 if (list)
1921 1925 {
1922 x += PAN_FOLDER_BOX_BORDER; 1926 column = 0;
1923 y += PAN_FOLDER_BOX_BORDER; 1927
1924 1928 x += PAN_FOLDER_BOX_BORDER;
1925 work = list; 1929 y += PAN_FOLDER_BOX_BORDER;
1926 while (work) 1930
1927 { 1931 work = list;
1928 PanItem *dot; 1932 while (work)
1929 1933 {
1930 dot = work->data; 1934 PanItem *dot;
1931 work = work->next; 1935
1932 1936 dot = work->data;
1933 if (dot->fd) 1937 work = work->next;
1934 { 1938
1935 PanItem *pimg; 1939 if (dot->fd)
1936
1937 pimg = pan_item_new_thumb(pw, file_data_new_simple(dot->fd->path), x, y);
1938 pan_item_set_key(pimg, "day_bubble");
1939
1940 pan_item_size_by_item(pbox, pimg, PAN_FOLDER_BOX_BORDER);
1941
1942 column++;
1943 if (column < grid)
1944 { 1940 {
1945 x += pimg->width + PAN_THUMB_GAP; 1941 PanItem *pimg;
1946 } 1942
1947 else 1943 pimg = pan_item_new_thumb(pw, file_data_new_simple(dot->fd->path), x, y);
1948 { 1944 pan_item_set_key(pimg, "day_bubble");
1949 column = 0; 1945
1950 x = pbox->x + PAN_FOLDER_BOX_BORDER; 1946 pan_item_size_by_item(pbox, pimg, PAN_FOLDER_BOX_BORDER);
1951 y += pimg->height + PAN_THUMB_GAP; 1947
1948 column++;
1949 if (column < grid)
1950 {
1951 x += PAN_THUMB_SIZE + PAN_THUMB_GAP;
1952 }
1953 else
1954 {
1955 column = 0;
1956 x = pbox->x + PAN_FOLDER_BOX_BORDER;
1957 y += PAN_THUMB_SIZE + PAN_THUMB_GAP;
1958 }
1952 } 1959 }
1953 } 1960 }
1954 } 1961 }
1955 1962
1956 x1 = pi_day->x + pi_day->width - 8; 1963 x1 = pi_day->x + pi_day->width - 8;
1957 y1 = pi_day->y + 8; 1964 y1 = pi_day->y + 8;
1958 x2 = pbox->x + 1; 1965 x2 = pbox->x + 1;
1959 y2 = pbox->y + 36; 1966 y2 = pbox->y + MIN(42, pbox->height);
1960 x3 = pbox->x + 1; 1967 x3 = pbox->x + 1;
1961 y3 = pbox->y + 12; 1968 y3 = MAX(pbox->y, y2 - 30);
1962 triangle_rect_region(x1, y1, x2, y2, x3, y3, 1969 triangle_rect_region(x1, y1, x2, y2, x3, y3,
1963 &x, &y, &w, &h); 1970 &x, &y, &w, &h);
1964 1971
1965 pi = pan_item_new_tri(pw, NULL, x, y, w, h, 1972 pi = pan_item_new_tri(pw, NULL, x, y, w, h,
1966 x1, y1, x2, y2, x3, y3, 1973 x1, y1, x2, y2, x3, y3,
2089 gint dx, dy; 2096 gint dx, dy;
2090 gint n = 0; 2097 gint n = 0;
2091 2098
2092 dt = date_to_time(year, month, day); 2099 dt = date_to_time(year, month, day);
2093 2100
2094 pi_day = pan_item_new_box(pw, NULL, x, y, PAN_CAL_DAY_WIDTH, PAN_CAL_DAY_HEIGHT, 2101 fd = g_new0(FileData, 1);
2102 /* path and name must be non NULL, so make them an invalid filename */
2103 fd->path = g_strdup("//");
2104 fd->name = path;
2105 fd->date = dt;
2106 pi_day = pan_item_new_box(pw, fd, x, y, PAN_CAL_DAY_WIDTH, PAN_CAL_DAY_HEIGHT,
2095 PAN_FOLDER_BOX_OUTLINE_THICKNESS, 2107 PAN_FOLDER_BOX_OUTLINE_THICKNESS,
2096 PAN_FOLDER_BOX_COLOR, PAN_FOLDER_BOX_ALPHA, 2108 PAN_FOLDER_BOX_COLOR, PAN_FOLDER_BOX_ALPHA,
2097 PAN_FOLDER_BOX_OUTLINE_COLOR, PAN_FOLDER_BOX_OUTLINE_ALPHA); 2109 PAN_FOLDER_BOX_OUTLINE_COLOR, PAN_FOLDER_BOX_OUTLINE_ALPHA);
2098 pan_item_set_key(pi_day, "day"); 2110 pan_item_set_key(pi_day, "day");
2099 2111
2126 pi_day->color_a = MIN(PAN_FOLDER_BOX_ALPHA + 64 + n, 255); 2138 pi_day->color_a = MIN(PAN_FOLDER_BOX_ALPHA + 64 + n, 255);
2127 n++; 2139 n++;
2128 2140
2129 work = work->next; 2141 work = work->next;
2130 fd = (work) ? work->data : NULL; 2142 fd = (work) ? work->data : NULL;
2143 }
2144
2145 if (n > 0)
2146 {
2147 PanItem *pi;
2148
2149 buf = g_strdup_printf("( %d )", n);
2150 pi = pan_item_new_text(pw, x, y, buf, TEXT_ATTR_NONE,
2151 PAN_TEXT_COLOR, 255);
2152 g_free(buf);
2153
2154 pi->x = pi_day->x + (pi_day->width - pi->width) / 2;
2155 pi->y = pi_day->y + (pi_day->height - pi->height) / 2;
2131 } 2156 }
2132 2157
2133 buf = g_strdup_printf("%d", day); 2158 buf = g_strdup_printf("%d", day);
2134 pan_item_new_text(pw, x + 4, y + 4, buf, TEXT_ATTR_BOLD | TEXT_ATTR_HEADING, 2159 pan_item_new_text(pw, x + 4, y + 4, buf, TEXT_ATTR_BOLD | TEXT_ATTR_HEADING,
2135 PAN_TEXT_COLOR, 255); 2160 PAN_TEXT_COLOR, 255);
3042 gtk_label_set_text(GTK_LABEL(pw->label_message), text); 3067 gtk_label_set_text(GTK_LABEL(pw->label_message), text);
3043 return; 3068 return;
3044 } 3069 }
3045 3070
3046 work = pw->list; 3071 work = pw->list;
3047 while (work) 3072 if (pw->layout == LAYOUT_CALENDAR)
3048 { 3073 {
3049 PanItem *pi; 3074 while (work)
3050 3075 {
3051 pi = work->data; 3076 PanItem *pi;
3052 work = work->next; 3077
3053 3078 pi = work->data;
3054 if (pi->fd && 3079 work = work->next;
3055 (pi->type == ITEM_THUMB || pi->type == ITEM_IMAGE)) 3080
3056 { 3081 if (pi->fd &&
3057 size += pi->fd->size; 3082 pi->type == ITEM_BOX &&
3058 count++; 3083 pi->key && strcmp(pi->key, "dot") == 0)
3084 {
3085 size += pi->fd->size;
3086 count++;
3087 }
3088 }
3089 }
3090 else
3091 {
3092 while (work)
3093 {
3094 PanItem *pi;
3095
3096 pi = work->data;
3097 work = work->next;
3098
3099 if (pi->fd &&
3100 (pi->type == ITEM_THUMB || pi->type == ITEM_IMAGE))
3101 {
3102 size += pi->fd->size;
3103 count++;
3104 }
3059 } 3105 }
3060 } 3106 }
3061 3107
3062 ss = text_from_size_abrev(size); 3108 ss = text_from_size_abrev(size);
3063 buf = g_strdup_printf(_("%d images, %s"), count, ss); 3109 buf = g_strdup_printf(_("%d images, %s"), count, ss);
3303 case GDK_Delete: case GDK_KP_Delete: 3349 case GDK_Delete: case GDK_KP_Delete:
3304 break; 3350 break;
3305 case '/': 3351 case '/':
3306 if (!pw->fs) 3352 if (!pw->fs)
3307 { 3353 {
3308 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), TRUE); 3354 if (GTK_WIDGET_VISIBLE(pw->search_box))
3355 {
3356 gtk_widget_grab_focus(pw->search_entry);
3357 }
3358 else
3359 {
3360 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), TRUE);
3361 }
3309 stop_signal = TRUE; 3362 stop_signal = TRUE;
3310 } 3363 }
3311 break; 3364 break;
3312 case GDK_Escape: 3365 case GDK_Escape:
3313 if (pw->fs) 3366 if (pw->fs)
3623 static gint valid_date_separator(gchar c) 3676 static gint valid_date_separator(gchar c)
3624 { 3677 {
3625 return (c == '/' || c == '-' || c == ' ' || c == '.' || c == ','); 3678 return (c == '/' || c == '-' || c == ' ' || c == '.' || c == ',');
3626 } 3679 }
3627 3680
3628 static GList *pan_search_by_date_val(PanWindow *pw, ItemType type, gint year, gint month, gint day) 3681 static GList *pan_search_by_date_val(PanWindow *pw, ItemType type,
3682 gint year, gint month, gint day,
3683 const gchar *key)
3629 { 3684 {
3630 GList *list = NULL; 3685 GList *list = NULL;
3631 GList *work; 3686 GList *work;
3632 3687
3633 work = g_list_last(pw->list); 3688 work = g_list_last(pw->list);
3636 PanItem *pi; 3691 PanItem *pi;
3637 3692
3638 pi = work->data; 3693 pi = work->data;
3639 work = work->prev; 3694 work = work->prev;
3640 3695
3641 if (pi->fd && (pi->type == type || type == ITEM_NONE)) 3696 if (pi->fd && (pi->type == type || type == ITEM_NONE) &&
3697 ((!key && !pi->key) || (key && pi->key && strcmp(key, pi->key) == 0)))
3642 { 3698 {
3643 struct tm *tl; 3699 struct tm *tl;
3644 3700
3645 tl = localtime(&pi->fd->date); 3701 tl = localtime(&pi->fd->date);
3646 if (tl) 3702 if (tl)
3660 } 3716 }
3661 3717
3662 static gint pan_search_by_date(PanWindow *pw, const gchar *text) 3718 static gint pan_search_by_date(PanWindow *pw, const gchar *text)
3663 { 3719 {
3664 PanItem *pi = NULL; 3720 PanItem *pi = NULL;
3665 GList *list; 3721 GList *list = NULL;
3666 GList *found; 3722 GList *found;
3667 gint year; 3723 gint year;
3668 gint month = -1; 3724 gint month = -1;
3669 gint day = -1; 3725 gint day = -1;
3670 gchar *ptr; 3726 gchar *ptr;
3672 struct tm *lt; 3728 struct tm *lt;
3673 time_t t; 3729 time_t t;
3674 gchar *message; 3730 gchar *message;
3675 gchar *buf; 3731 gchar *buf;
3676 gchar *buf_count; 3732 gchar *buf_count;
3677 ItemType type;
3678 3733
3679 if (!text) return FALSE; 3734 if (!text) return FALSE;
3680 3735
3681 ptr = (gchar *)text; 3736 ptr = (gchar *)text;
3682 while (*ptr != '\0') 3737 while (*ptr != '\0')
3748 day < -1 || day == 0 || day > 31) return FALSE; 3803 day < -1 || day == 0 || day > 31) return FALSE;
3749 3804
3750 t = date_to_time(year, month, day); 3805 t = date_to_time(year, month, day);
3751 if (t < 0) return FALSE; 3806 if (t < 0) return FALSE;
3752 3807
3753 type = (pw->size > LAYOUT_SIZE_THUMB_LARGE) ? ITEM_IMAGE : ITEM_THUMB; 3808 if (pw->layout == LAYOUT_CALENDAR)
3754 3809 {
3755 list = pan_search_by_date_val(pw, type, year, month, day); 3810 list = pan_search_by_date_val(pw, ITEM_BOX, year, month, day, "day");
3811 }
3812 else
3813 {
3814 ItemType type;
3815
3816 type = (pw->size > LAYOUT_SIZE_THUMB_LARGE) ? ITEM_IMAGE : ITEM_THUMB;
3817 list = pan_search_by_date_val(pw, type, year, month, day, NULL);
3818 }
3819
3756 if (list) 3820 if (list)
3757 { 3821 {
3758 found = g_list_find(list, pw->click_pi); 3822 found = g_list_find(list, pw->search_pi);
3759 if (found && found->next) 3823 if (found && found->next)
3760 { 3824 {
3761 found = found->next; 3825 found = found->next;
3762 pi = found->data; 3826 pi = found->data;
3763 } 3827 }
3765 { 3829 {
3766 pi = list->data; 3830 pi = list->data;
3767 } 3831 }
3768 } 3832 }
3769 3833
3770 if (pi) 3834 pw->search_pi = pi;
3835
3836 if (pw->layout == LAYOUT_CALENDAR && pi && pi->type == ITEM_BOX)
3837 {
3838 pan_info_update(pw, NULL);
3839 pan_calendar_update(pw, pi);
3840 image_scroll_to_point(pw->imd,
3841 pi->x + pi->width / 2,
3842 pi->y + pi->height / 2, 0.5, 0.5);
3843 }
3844 else if (pi)
3771 { 3845 {
3772 pan_info_update(pw, pi); 3846 pan_info_update(pw, pi);
3773 image_scroll_to_point(pw->imd, 3847 image_scroll_to_point(pw->imd,
3774 pi->x - PAN_FOLDER_BOX_BORDER * 5 / 2, 3848 pi->x - PAN_FOLDER_BOX_BORDER * 5 / 2,
3775 pi->y, 0.0, 0.5); 3849 pi->y, 0.0, 0.5);