Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorCarlos 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)
commit9716be33110255e599ee94a1364ee1c3bbd3b307 (patch)
tree8873ab561360f01eddfa153304c38e157a41f312 /shell
parenta2dd71cd0a16fe04b1f074e7cd5a95c35a70e9e7 (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.c62
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;
}