/*! \brief Completes initialitation of the widget after realization. * \par Function Description * This function terminates the initialization of preview's GschemToplevel * and TOPLEVEL environments after the widget has been realized. * * It creates a preview page in the TOPLEVEL environment. * * \param [in] widget The preview widget. * \param [in] user_data Unused user data. */ static void preview_callback_realize (GtkWidget *widget, gpointer user_data) { Preview *preview = PREVIEW (widget); GschemToplevel *preview_w_current = preview->preview_w_current; GschemPageView *preview_view = GSCHEM_PAGE_VIEW (preview); g_return_if_fail (preview_view != NULL); PAGE *preview_page = preview_view->page; g_return_if_fail (preview_page != NULL); TOPLEVEL *preview_toplevel = preview_page->toplevel; g_return_if_fail (preview_toplevel != NULL); preview_w_current->window = preview_w_current->drawing_area->window; gtk_widget_grab_focus (preview_w_current->drawing_area); preview_w_current->win_width = preview_w_current->drawing_area->allocation.width; preview_w_current->win_height = preview_w_current->drawing_area->allocation.height; preview_w_current->drawable = preview_w_current->window; x_window_setup_gc (preview_w_current); gschem_page_view_zoom_extents (preview_view, NULL); }
/*! \brief Invalidate current path creation screen region. * \par Function Description * Invalidates the screen region occupied by the current path creation * preview and control handle helpers. */ void o_path_invalidate_rubber (GschemToplevel *w_current) { int added_sections; int min_x, min_y, max_x, max_y; g_return_if_fail (w_current != NULL); /* Calculate any new sections */ added_sections = path_next_sections (w_current); path_rubber_bbox (w_current, w_current->temp_path, &min_x, &max_y, &max_x, &min_y); /* Expand the bounding box to include any control handles * that are currently being drawn. */ min_x = MIN (min_x, w_current->second_wx); max_x = MAX (max_x, w_current->second_wx); min_y = MIN (min_y, w_current->second_wy); max_y = MAX (max_y, w_current->second_wy); gschem_page_view_invalidate_world_rect (GSCHEM_PAGE_VIEW (w_current->drawing_area), min_x, min_y, max_x, max_y); w_current->temp_path->num_sections -= added_sections; }
/*! \brief Get the selection adapter * * \param [in] w_current The current gschem toplevel * \return The selection adapter */ GschemPageView* gschem_toplevel_get_current_page_view (GschemToplevel *w_current) { g_return_val_if_fail (w_current != NULL, NULL); return GSCHEM_PAGE_VIEW (w_current->drawing_area); }
static void preview_init (GschemPreview *preview) { struct event_reg_t { gchar *detailed_signal; GCallback c_handler; } drawing_area_events[] = { { "realize", G_CALLBACK (preview_callback_realize) }, { "expose_event", G_CALLBACK (x_event_expose) }, { "button_press_event", G_CALLBACK (preview_callback_button_press) }, { "configure_event", G_CALLBACK (x_event_configure) }, { "scroll_event", G_CALLBACK (preview_event_scroll) }, { NULL, NULL } }, *tmp; GschemToplevel *preview_w_current; preview_w_current = gschem_toplevel_new (); gschem_toplevel_set_toplevel (preview_w_current, s_toplevel_new ()); preview_w_current->toplevel->load_newer_backup_func = x_fileselect_load_backup; preview_w_current->toplevel->load_newer_backup_data = preview_w_current; o_text_set_rendered_bounds_func (preview_w_current->toplevel, o_text_get_rendered_bounds, preview_w_current); i_vars_set (preview_w_current); /* be sure to turn off scrollbars */ preview_w_current->scrollbars_flag = FALSE; /* be sure to turn off the grid */ gschem_options_set_grid_mode (preview_w_current->options, GRID_MODE_NONE); /* preview_w_current windows don't have toolbars */ preview_w_current->handleboxes = FALSE; preview_w_current->toolbars = FALSE; preview_w_current->drawing_area = GTK_WIDGET (preview); preview->preview_w_current = preview_w_current; preview->active = FALSE; preview->filename = NULL; preview->buffer = NULL; GSCHEM_PAGE_VIEW (preview)->page = s_page_new (preview->preview_w_current->toplevel, "preview"); gtk_widget_set_events (GTK_WIDGET (preview), GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK); for (tmp = drawing_area_events; tmp->detailed_signal != NULL; tmp++) { g_signal_connect (GTK_WIDGET (preview), tmp->detailed_signal, tmp->c_handler, preview_w_current); } }
/*! \brief Completes initialitation of the widget after realization. * \par Function Description * This function terminates the initialization of the preview widget * after it has been realized. * * \param [in] widget The preview widget. * \param [in] user_data Unused user data. */ static void preview_callback_realize (GtkWidget *widget, gpointer user_data) { g_return_if_fail (widget != NULL); gtk_widget_grab_focus (widget); gschem_page_view_zoom_extents (GSCHEM_PAGE_VIEW (widget), NULL); }
/*! \brief get the filename for the current page */ static char* preview_get_filename (Preview *preview) { PAGE *page = gschem_page_view_get_page (GSCHEM_PAGE_VIEW (preview)); g_return_val_if_fail (page != NULL, ""); return page->page_filename; }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * * \note * used in button cancel code in x_events.c */ void o_picture_invalidate_rubber (GschemToplevel *w_current) { g_return_if_fail (w_current != NULL); gschem_page_view_invalidate_world_rect (GSCHEM_PAGE_VIEW (w_current->drawing_area), GET_PICTURE_LEFT (w_current), GET_PICTURE_TOP (w_current), GET_PICTURE_LEFT (w_current) + GET_PICTURE_WIDTH (w_current), GET_PICTURE_TOP (w_current) + GET_PICTURE_HEIGHT (w_current)); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description */ void a_zoom_box_invalidate_rubber (GschemToplevel *w_current) { g_return_if_fail (w_current != NULL); gschem_page_view_invalidate_world_rect (GSCHEM_PAGE_VIEW (w_current->drawing_area), w_current->first_wx, w_current->first_wy, w_current->second_wx, w_current->second_wy); }
static gboolean preview_event_configure (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { gboolean retval; GschemToplevel *preview_w_current = PREVIEW (widget)->preview_w_current; retval = x_event_configure (GSCHEM_PAGE_VIEW (widget), event, preview_w_current); return retval; }
void o_path_invalidate_rubber_grips (GschemToplevel *w_current) { int min_x, min_y, max_x, max_y; path_rubber_bbox (w_current, NULL, &min_x, &max_y, &max_x, &min_y); gschem_page_view_invalidate_world_rect (GSCHEM_PAGE_VIEW (w_current->drawing_area), min_x, min_y, max_x, max_y); }
/*! \brief Handles the press on a mouse button. * \par Function Description * It handles the user inputs. * * Three action are available: zoom in, pan and zoom out on preview display. * * \param [in] widget The preview widget. * \param [in] event The event structure. * \param [in] user_data Unused user data. * \returns FALSE to propagate the event further. */ static gboolean preview_callback_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { Preview *preview = PREVIEW (widget); GschemToplevel *preview_w_current = preview->preview_w_current; gint wx, wy; if (!preview->active) { return TRUE; } switch (event->button) { case 1: /* left mouse button: zoom in */ a_zoom (preview_w_current, GSCHEM_PAGE_VIEW (preview), ZOOM_IN, HOTKEY); gschem_page_view_invalidate_all (GSCHEM_PAGE_VIEW (widget)); break; case 2: /* middle mouse button: pan */ if (!x_event_get_pointer_position(preview_w_current, FALSE, &wx, &wy)) return FALSE; gschem_page_view_pan (GSCHEM_PAGE_VIEW (preview), wx, wy); break; case 3: /* right mouse button: zoom out */ a_zoom (preview_w_current, GSCHEM_PAGE_VIEW (preview), ZOOM_OUT, HOTKEY); gschem_page_view_invalidate_all (GSCHEM_PAGE_VIEW (widget)); break; } return FALSE; }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * * \param [in] widget The GschemPageView with the scroll event. * \param [in] event * \param [in] w_current */ gint x_event_scroll (GtkWidget *widget, GdkEventScroll *event, GschemToplevel *w_current) { GtkAdjustment *adj; gboolean pan_xaxis = FALSE; gboolean pan_yaxis = FALSE; gboolean zoom = FALSE; int pan_direction = 1; int zoom_direction = ZOOM_IN; GschemPageView *view = NULL; PAGE *page = NULL; g_return_val_if_fail ((w_current != NULL), 0); view = GSCHEM_PAGE_VIEW (widget); g_return_val_if_fail ((view != NULL), 0); page = gschem_page_view_get_page (view); if (page == NULL) { return FALSE; /* we cannot zoom page if it doesn't exist :) */ } /* update the state of the modifiers */ w_current->SHIFTKEY = (event->state & GDK_SHIFT_MASK ) ? 1 : 0; w_current->CONTROLKEY = (event->state & GDK_CONTROL_MASK) ? 1 : 0; w_current->ALTKEY = (event->state & GDK_MOD1_MASK) ? 1 : 0; if (w_current->scroll_wheel == SCROLL_WHEEL_CLASSIC) { /* Classic gschem behaviour */ zoom = !w_current->CONTROLKEY && !w_current->SHIFTKEY; pan_yaxis = !w_current->CONTROLKEY && w_current->SHIFTKEY; pan_xaxis = w_current->CONTROLKEY && !w_current->SHIFTKEY; } else { /* GTK style behaviour */ zoom = w_current->CONTROLKEY && !w_current->SHIFTKEY; pan_yaxis = !w_current->CONTROLKEY && !w_current->SHIFTKEY; pan_xaxis = !w_current->CONTROLKEY && w_current->SHIFTKEY; } /* If the user has a left/right scroll wheel, always scroll the y-axis */ if (event->direction == GDK_SCROLL_LEFT || event->direction == GDK_SCROLL_RIGHT) { zoom = FALSE; pan_yaxis = FALSE; pan_xaxis = TRUE; } /* You must have scrollbars enabled if you want to use the scroll wheel to pan */ if (!w_current->scrollbars_flag) { pan_xaxis = FALSE; pan_yaxis = FALSE; } switch (event->direction) { case GDK_SCROLL_UP: case GDK_SCROLL_LEFT: pan_direction = -1; zoom_direction = ZOOM_IN; break; case GDK_SCROLL_DOWN: case GDK_SCROLL_RIGHT: pan_direction = 1; zoom_direction = ZOOM_OUT; break; } if (zoom) { /*! \todo Change "HOTKEY" TO new "MOUSE" specifier? */ a_zoom(w_current, GSCHEM_PAGE_VIEW (widget), zoom_direction, HOTKEY); } if (pan_xaxis) { adj = gschem_page_view_get_hadjustment (GSCHEM_PAGE_VIEW (widget)); g_return_val_if_fail (adj != NULL, TRUE); gtk_adjustment_set_value(adj, MIN(adj->value + pan_direction * (adj->page_increment / w_current->scrollpan_steps), adj->upper - adj->page_size)); } if (pan_yaxis) { adj = gschem_page_view_get_vadjustment (GSCHEM_PAGE_VIEW (widget)); g_return_val_if_fail (adj != NULL, TRUE); gtk_adjustment_set_value(adj, MIN(adj->value + pan_direction * (adj->page_increment / w_current->scrollpan_steps), adj->upper - adj->page_size)); } if (w_current->undo_panzoom && (zoom || pan_xaxis || pan_yaxis)) { o_undo_savestate_old(w_current, UNDO_VIEWPORT_ONLY); } x_event_faked_motion (view, NULL); /* Stop further processing of this signal */ return TRUE; }
/*! \brief Updates the preview widget. * \par Function Description * This function updates the preview: if the preview is active and a * filename has been given, it opens the file and displays * it. Otherwise it displays a blank page. * * \param [in] preview The preview widget. */ static void preview_update (Preview *preview) { int left, top, right, bottom; int width, height; GError * err = NULL; GschemPageView *preview_view = GSCHEM_PAGE_VIEW (preview); g_return_if_fail (preview_view != NULL); PAGE *preview_page = gschem_page_view_get_page (preview_view); if (preview_page == NULL) { return; } TOPLEVEL *preview_toplevel = preview_page->toplevel; /* delete old preview */ s_page_delete_objects (preview_toplevel, preview_page); if (preview->active) { g_assert ((preview->filename == NULL) || (preview->buffer == NULL)); if (preview->filename != NULL) { /* open up file in current page */ f_open_flags (preview_toplevel, preview_page, preview->filename, F_OPEN_RC | F_OPEN_RESTORE_CWD, NULL); /* test value returned by f_open... - Fix me */ /* we should display something if there an error occured - Fix me */ } if (preview->buffer != NULL) { /* Load the data buffer */ GList * objects = o_read_buffer (preview_toplevel, NULL, preview->buffer, -1, _("Preview Buffer"), &err); if (err == NULL) { s_page_append_list (preview_toplevel, preview_page, objects); } else { s_page_append (preview_toplevel, preview_page, o_text_new(preview_toplevel, OBJ_TEXT, 2, 100, 100, LOWER_MIDDLE, 0, err->message, 10, VISIBLE, SHOW_NAME_VALUE)); g_error_free(err); } } } if (world_get_object_glist_bounds (preview_toplevel, s_page_objects (preview_page), &left, &top, &right, &bottom)) { /* Clamp the canvas size to the extents of the page being previewed */ width = right - left; height = bottom - top; GschemPageGeometry *geometry = gschem_page_view_get_page_geometry (preview_view); geometry->world_left = left - ((double)width * OVER_ZOOM_FACTOR); geometry->world_right = right + ((double)width * OVER_ZOOM_FACTOR); geometry->world_top = top - ((double)height * OVER_ZOOM_FACTOR); geometry->world_bottom = bottom + ((double)height * OVER_ZOOM_FACTOR); } /* display current page (possibly empty) */ gschem_page_view_zoom_extents (preview_view, NULL); }