/*! \private * \brief Get a property * * \param [in] object * \param [in] param_id * \param [in,out] value * \param [in] pspec */ static void get_property (GObject *object, guint param_id, GValue *value, GParamSpec *pspec) { GschemOptions *options = GSCHEM_OPTIONS (object); switch (param_id) { case PROP_GRID_MODE: g_value_set_int (value, gschem_options_get_grid_mode (options)); break; case PROP_MAGNETIC_NET_MODE: g_value_set_boolean (value, gschem_options_get_magnetic_net_mode (options)); break; case PROP_NET_RUBBER_BAND_MODE: g_value_set_boolean (value, gschem_options_get_net_rubber_band_mode (options)); break; case PROP_SNAP_MODE: g_value_set_int (value, gschem_options_get_snap_mode (options)); break; case PROP_SNAP_SIZE: g_value_set_int (value, gschem_options_get_snap_size (options)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); } }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_move_draw_rubber (GschemToplevel *w_current, EdaRenderer *renderer) { GList *s_iter; int diff_x, diff_y; gboolean net_rubber_band_mode; g_return_if_fail (w_current != NULL); o_place_draw_rubber (w_current, renderer); net_rubber_band_mode = gschem_options_get_net_rubber_band_mode (w_current->options); if (!net_rubber_band_mode) return; diff_x = w_current->second_wx - w_current->first_wx; diff_y = w_current->second_wy - w_current->first_wy; for (s_iter = w_current->stretch_list; s_iter != NULL; s_iter = g_list_next (s_iter)) { STRETCH *s_current = s_iter->data; OBJECT *object = s_current->object; int whichone = s_current->whichone; /* We can only stretch nets and buses */ switch (object->type) { case OBJ_NET: case OBJ_BUS: break; default: continue; } g_return_if_fail ((whichone >= 0) && (whichone < 2)); /* Apply stretch */ object->line->x[whichone] += diff_x; object->line->y[whichone] += diff_y; /* Draw stretched object */ eda_renderer_draw (renderer, object); /* Restore original geometry */ object->line->x[whichone] -= diff_x; object->line->y[whichone] -= diff_y; } }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_move_start(GschemToplevel *w_current, int w_x, int w_y) { GList *s_iter; g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_if_fail (page_view != NULL); PAGE *page = gschem_page_view_get_page (page_view); g_return_if_fail (page != NULL); g_return_if_fail (w_current->stretch_list == NULL); if (o_select_selected (w_current)) { i_set_state (w_current, MOVEMODE); gboolean net_rubber_band_mode; net_rubber_band_mode = gschem_options_get_net_rubber_band_mode (w_current->options); w_current->last_drawb_mode = LAST_DRAWB_MODE_NONE; w_current->first_wx = w_current->second_wx = w_x; w_current->first_wy = w_current->second_wy = w_y; o_invalidate_glist (w_current, geda_list_get_glist (page->selection_list)); if (net_rubber_band_mode) { o_move_prep_rubberband(w_current); /* Set the dont_redraw flag on rubberbanded objects and invalidate them. * This ensures that they are not drawn (in their un-stretched position) * during screen updates. */ for (s_iter = w_current->stretch_list; s_iter != NULL; s_iter = g_list_next (s_iter)) { STRETCH *stretch = s_iter->data; stretch->object->dont_redraw = TRUE; o_invalidate (w_current, stretch->object); } } o_select_move_to_place_list(w_current); i_action_start (w_current); o_move_invalidate_rubber (w_current, TRUE); } }
/*! \private * \brief Update the net rubber band mode widget with the current value * * \param [in,out] widget This widget */ static void update_net_rubber_band_mode_widget (GschemOptionsWidget *widget) { g_return_if_fail (widget != NULL); if (widget->options != NULL) { GschemToplevel *w_current; g_object_get (widget, "gschem-toplevel", &w_current, NULL); g_return_if_fail (w_current != NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget->net_rubber_band_widget), gschem_options_get_net_rubber_band_mode (w_current->options)); } }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_move_invalidate_rubber (GschemToplevel *w_current, int drawing) { GList *s_iter; int dx1, dx2, dy1, dy2; gboolean net_rubber_band_mode; g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_if_fail (page_view != NULL); net_rubber_band_mode = gschem_options_get_net_rubber_band_mode (w_current->options); o_place_invalidate_rubber (w_current, drawing); if (net_rubber_band_mode) { for (s_iter = w_current->stretch_list; s_iter != NULL; s_iter = g_list_next (s_iter)) { STRETCH *s_current = s_iter->data; OBJECT *object = s_current->object; switch (object->type) { case (OBJ_NET): case (OBJ_BUS): if (s_current->whichone == 0) { dx1 = w_current->second_wx - w_current->first_wx; dy1 = w_current->second_wy - w_current->first_wy; dx2 = dy2 = 0; } else { dx1 = dy1 = 0; dx2 = w_current->second_wx - w_current->first_wx; dy2 = w_current->second_wy - w_current->first_wy; } gschem_page_view_invalidate_world_rect (page_view, object->line->x[0] + dx1, object->line->y[0] + dy1, object->line->x[1] + dx2, object->line->y[1] + dy2); } } } }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_move_end(GschemToplevel *w_current) { GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_if_fail (page_view != NULL); PAGE *page = gschem_page_view_get_page (page_view); g_return_if_fail (page != NULL); GList *s_current = NULL; OBJECT *object; int diff_x, diff_y; GList *s_iter; GList *rubbernet_objects = NULL; gboolean net_rubber_band_mode; g_return_if_fail (w_current != NULL); g_return_if_fail (page != NULL); g_assert (w_current->inside_action != 0); object = o_select_return_first_object(w_current); if (!object) { /* actually this is an error condition hack */ i_action_stop (w_current); i_set_state(w_current, SELECT); return; } diff_x = w_current->second_wx - w_current->first_wx; diff_y = w_current->second_wy - w_current->first_wy; o_move_invalidate_rubber (w_current, FALSE); w_current->rubber_visible = 0; net_rubber_band_mode = gschem_options_get_net_rubber_band_mode (w_current->options); if (net_rubber_band_mode) { o_move_end_rubberband (w_current, diff_x, diff_y, &rubbernet_objects); } /* Unset the dont_redraw flag on rubberbanded objects. * We set this above, in o_move_start(). */ for (s_iter = w_current->stretch_list; s_iter != NULL; s_iter = g_list_next (s_iter)) { STRETCH *stretch = s_iter->data; stretch->object->dont_redraw = FALSE; } s_current = geda_list_get_glist( page->selection_list ); while (s_current != NULL) { object = (OBJECT *) s_current->data; if (object == NULL) { fprintf(stderr, _("ERROR: NULL object in o_move_end!\n")); exit(-1); } switch (object->type) { case (OBJ_COMPLEX): case (OBJ_PLACEHOLDER): /* TODO: Fix so we can just pass the complex to o_move_end_lowlevel, * IE.. by falling through the bottom of this case statement. */ /* this next section of code is from */ /* o_complex_world_translate_world */ object->complex->x = object->complex->x + diff_x; object->complex->y = object->complex->y + diff_y; o_move_end_lowlevel_glist (w_current, object->complex->prim_objs, diff_x, diff_y); object->w_bounds_valid_for = NULL; break; default: o_move_end_lowlevel (w_current, object, diff_x, diff_y); break; } s_current = g_list_next(s_current); } /* Draw the objects that were moved */ o_invalidate_glist (w_current, geda_list_get_glist (page->selection_list)); /* Draw the connected nets/buses that were also changed */ o_invalidate_glist (w_current, rubbernet_objects); /* Call move-objects-hook for moved objects and changed connected * nets/buses */ GList *moved_list = g_list_concat (page->place_list, rubbernet_objects); page->place_list = NULL; rubbernet_objects = NULL; g_run_hook_object_list (w_current, "%move-objects-hook", moved_list); g_list_free (moved_list); gschem_toplevel_page_content_changed (w_current, page); o_undo_savestate_old(w_current, UNDO_ALL); s_stretch_destroy_all (w_current->stretch_list); w_current->stretch_list = NULL; i_set_state(w_current, SELECT); i_action_stop (w_current); }