/*! \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); GSCHEM_TOPLEVEL *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, ZOOM_IN, HOTKEY, A_PAN_DONT_REDRAW); o_invalidate_all (preview_w_current); break; case 2: /* middle mouse button: pan */ if (!x_event_get_pointer_position(preview_w_current, FALSE, &wx, &wy)) return FALSE; a_pan (preview_w_current, wx, wy); break; case 3: /* right mouse button: zoom out */ a_zoom (preview_w_current, ZOOM_OUT, HOTKEY, A_PAN_DONT_REDRAW); o_invalidate_all (preview_w_current); break; } return FALSE; }
/*! \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; }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * * \todo Only descends into the first source schematic * */ int o_edit_find_text (GSCHEM_TOPLEVEL *w_current, const GList *o_list, char *stext, int descend, int skip) { TOPLEVEL *toplevel = w_current->toplevel; char *attrib = NULL; int count = 0; PAGE *parent = NULL; char *current_filename = NULL; int page_control = 0; int pcount = 0; int rv; int x1, y1, x2, y2; int text_screen_height; const GList *iter; OBJECT *o_current; skiplast = skip; iter = o_list; while (iter != NULL) { o_current = (OBJECT *)iter->data; if (descend) { if (o_current->type == OBJ_COMPLEX) { parent = toplevel->page_current; attrib = o_attrib_search_attached_attribs_by_name (o_current, "source", count); /* if above is null, then look inside symbol */ if (attrib == NULL) { attrib = o_attrib_search_inherited_attribs_by_name (o_current, "source", count); /* looking_inside = TRUE; */ } if (attrib) { pcount = 0; current_filename = u_basic_breakup_string(attrib, ',', pcount); if (current_filename != NULL) { PAGE *child_page = s_hierarchy_down_schematic_single(toplevel, current_filename, parent, page_control, HIERARCHY_NORMAL_LOAD); if (child_page != NULL) { page_control = child_page->page_control; rv = o_edit_find_text (w_current, s_page_objects (child_page), stext, descend, skiplast); if (!rv) { s_page_goto( toplevel, child_page ); return 0; } } } } } } if (o_current->type == OBJ_TEXT) { const gchar *str = o_text_get_string (toplevel, o_current); /* replaced strcmp with strstr to simplify the search */ if (strstr (str,stext)) { if (!skiplast) { a_zoom(w_current, ZOOM_FULL, DONTCARE, A_PAN_DONT_REDRAW); world_get_single_object_bounds (toplevel, o_current, &x1, &y1, &x2, &y2); text_screen_height = SCREENabs (w_current, y2 - y1); /* this code will zoom/pan till the text screen height is about */ /* 50 pixels high, perhaps a future enhancement will be to make */ /* this number configurable */ while (text_screen_height < 50) { a_zoom(w_current, ZOOM_IN, DONTCARE, A_PAN_DONT_REDRAW); text_screen_height = SCREENabs (w_current, y2 - y1); } a_pan_general(w_current, o_current->text->x, o_current->text->y, 1, 0); /* Make sure the titlebar and scrollbars are up-to-date */ x_window_set_current_page(w_current, w_current->toplevel->page_current ); last_o = o_current; break; } if (last_o == o_current) { skiplast = 0; } } /* if (strstr(o_current->text->string,stext)) */ } /* if (o_current->type == OBJ_TEXT) */ iter = g_list_next (iter); if (iter == NULL) { return 1; } } return (iter == NULL); }