diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2007-07-09 17:14:00 (GMT) |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@src.gnome.org> | 2007-07-09 17:14:00 (GMT) |
commit | 9716be33110255e599ee94a1364ee1c3bbd3b307 (patch) | |
tree | 8873ab561360f01eddfa153304c38e157a41f312 /shell | |
parent | a2dd71cd0a16fe04b1f074e7cd5a95c35a70e9e7 (diff) |
Update also the region of the current selected button when clicking on
2007-07-09 Carlos Garcia Campos <carlosgc@gnome.org>
* shell/ev-view.c: (ev_view_form_field_button_create_widget):
Update also the region of the current selected button when
clicking on another button if they are radio buttons.
svn path=/trunk/; revision=2566
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ev-view.c | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/shell/ev-view.c b/shell/ev-view.c index 44af421..0bbef7d 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -1637,14 +1637,13 @@ ev_view_form_field_button_create_widget (EvView *view, EvFormField *field) { EvFormFieldButton *field_button = EV_FORM_FIELD_BUTTON (field); + GdkRegion *field_region; switch (field_button->type) { case EV_FORM_FIELD_BUTTON_PUSH: - break; - case EV_FORM_FIELD_BUTTON_CHECK: - case EV_FORM_FIELD_BUTTON_RADIO: { - gboolean state; - GdkRegion *field_region; + return NULL; + case EV_FORM_FIELD_BUTTON_CHECK: { + gboolean state; field_region = ev_view_form_field_get_region (view, field); @@ -1652,15 +1651,56 @@ ev_view_form_field_button_create_widget (EvView *view, field); ev_document_forms_form_field_button_set_state (EV_DOCUMENT_FORMS (view->document), field, !state); - ev_pixbuf_cache_reload_page (view->pixbuf_cache, - field_region, - field->page, - view->rotation, - view->scale); - gdk_region_destroy (field_region); + } + break; + + case EV_FORM_FIELD_BUTTON_RADIO: { + gboolean state; + GList *forms_mapping, *l; + + state = ev_document_forms_form_field_button_get_state (EV_DOCUMENT_FORMS (view->document), + field); + if (state && field_button->state) + return NULL; + + field_region = ev_view_form_field_get_region (view, field); + + /* For radio buttons we need to update also the region for the + * current selected item + */ + forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache, + field->page); + for (l = forms_mapping; l; l = g_list_next (l)) { + EvFormField *radio = ((EvFormFieldMapping *)(l->data))->field; + GdkRegion *radio_region; + + if (radio->id == field->id) + continue; + + /* FIXME: only buttons in the same group should be updated */ + if (!EV_IS_FORM_FIELD_BUTTON (radio) || + EV_FORM_FIELD_BUTTON (radio)->type != EV_FORM_FIELD_BUTTON_RADIO || + EV_FORM_FIELD_BUTTON (radio)->state != TRUE) + continue; + + radio_region = ev_view_form_field_get_region (view, radio); + gdk_region_union (field_region, radio_region); + gdk_region_destroy (radio_region); + } + + ev_document_forms_form_field_button_set_state (EV_DOCUMENT_FORMS (view->document), + field, TRUE); + field_button->state = TRUE; } break; } + + ev_pixbuf_cache_reload_page (view->pixbuf_cache, + field_region, + field->page, + view->rotation, + view->scale); + gdk_region_destroy (field_region); return NULL; } |