]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Update also the region of the current selected button when clicking on
[evince.git] / shell / ev-view.c
index 468a8946acd72e84f6efe5429320872f80e90691..0bbef7db3ff6738efb2351e357687ac9826d7221 100644 (file)
@@ -231,6 +231,7 @@ static void       find_changed_cb                            (EvDocument
                                                              int                 page,
                                                              EvView             *view);
 static void       job_finished_cb                            (EvPixbufCache      *pixbuf_cache,
+                                                             GdkRegion          *region,
                                                              EvView             *view);
 static void       page_changed_cb                            (EvPageCache        *page_cache,
                                                              int                 new_page,
@@ -1598,6 +1599,24 @@ ev_view_get_form_field_at_location (EvView  *view,
                return NULL;
 }
 
+static GdkRegion *
+ev_view_form_field_get_region (EvView      *view,
+                              EvFormField *field)
+{
+       EvRectangle  field_area;
+       GdkRectangle view_area;
+       GList       *forms_mapping;
+
+       forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
+                                                               field->page);
+       ev_form_field_mapping_get_area (forms_mapping, field, &field_area);
+       doc_rect_to_view_rect (view, field->page, &field_area, &view_area);
+       view_area.x -= view->scroll_x;
+       view_area.y -= view->scroll_y;
+
+       return gdk_region_rectangle (&view_area);
+}
+
 static gboolean
 ev_view_forms_remove_widgets (EvView *view)
 {
@@ -1618,25 +1637,70 @@ 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: {
+                       return NULL;
+               case EV_FORM_FIELD_BUTTON_CHECK: {
                        gboolean state;
 
+                       field_region = ev_view_form_field_get_region (view, field);
+                       
                        state = ev_document_forms_form_field_button_get_state (EV_DOCUMENT_FORMS (view->document),
                                                                               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->page,
-                                                    view->rotation,
-                                                    view->scale);
+               }
+                       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;
 }
@@ -1651,14 +1715,19 @@ ev_view_form_field_text_save (EvView    *view,
        
        if (field->changed) {
                EvFormFieldText *field_text = EV_FORM_FIELD_TEXT (field);
+               GdkRegion       *field_region;
+
+               field_region = ev_view_form_field_get_region (view, field);
                
                ev_document_forms_form_field_text_set_text (EV_DOCUMENT_FORMS (view->document),
                                                            field, field_text->text);
                field->changed = FALSE;
                ev_pixbuf_cache_reload_page (view->pixbuf_cache,
+                                            field_region,
                                             field->page,
                                             view->rotation,
                                             view->scale);
+               gdk_region_destroy (field_region);
        }
 }
 
@@ -1757,23 +1826,28 @@ ev_view_form_field_choice_save (EvView    *view,
        if (field->changed) {
                GList             *l;
                EvFormFieldChoice *field_choice = EV_FORM_FIELD_CHOICE (field);
+               GdkRegion         *field_region;
+
+               field_region = ev_view_form_field_get_region (view, field);
 
                if (field_choice->is_editable) {
                        ev_document_forms_form_field_choice_set_text (EV_DOCUMENT_FORMS (view->document),
                                                                      field, field_choice->text);
-               }
-               
-               ev_document_forms_form_field_choice_unselect_all (EV_DOCUMENT_FORMS (view->document), field);
-               for (l = field_choice->selected_items; l && l->data; l = g_list_next (l)) {
-                       ev_document_forms_form_field_choice_select_item (EV_DOCUMENT_FORMS (view->document),
-                                                                        field,
-                                                                        GPOINTER_TO_INT (l->data));
+               } else {
+                       ev_document_forms_form_field_choice_unselect_all (EV_DOCUMENT_FORMS (view->document), field);
+                       for (l = field_choice->selected_items; l; l = g_list_next (l)) {
+                               ev_document_forms_form_field_choice_select_item (EV_DOCUMENT_FORMS (view->document),
+                                                                                field,
+                                                                                GPOINTER_TO_INT (l->data));
+                       }
                }
                field->changed = FALSE;
                ev_pixbuf_cache_reload_page (view->pixbuf_cache,
+                                            field_region,
                                             field->page,
                                             view->rotation,
                                             view->scale);
+               gdk_region_destroy (field_region);
        }
 }
 
@@ -3895,9 +3969,15 @@ find_changed_cb (EvDocument *document, int page, EvView *view)
 
 static void
 job_finished_cb (EvPixbufCache *pixbuf_cache,
+                GdkRegion     *region,
                 EvView        *view)
 {
-       gtk_widget_queue_draw (GTK_WIDGET (view));
+       if (region) {
+               gdk_window_invalidate_region (view->layout.bin_window,
+                                             region, TRUE);
+       } else {
+               gtk_widget_queue_draw (GTK_WIDGET (view));
+       }
 }
 
 static void