Mercurial > geeqie.yaz
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); |