/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_place_motion (GSCHEM_TOPLEVEL *w_current, int w_x, int w_y) { if (w_current->rubber_visible) o_place_invalidate_rubber (w_current, FALSE); w_current->second_wx = w_x; w_current->second_wy = w_y; o_place_invalidate_rubber (w_current, TRUE); w_current->rubber_visible = 1; }
/*! \brief Move the objects in the place list to new coordinates * * \par Function Description * This function erases the objects in the current place list at * their previous coordinates and draws them at the new given * coordinates. * * \param [in] w_current GschemToplevel which we're drawing for. * \param [in] w_x The current world X coordinate. * \param [in] w_y The current world Y coordinate. */ void o_place_motion (GschemToplevel *w_current, int w_x, int w_y) { PAGE *page = gschem_page_view_get_page (gschem_toplevel_get_current_page_view (w_current)); g_return_if_fail (page != NULL); g_return_if_fail (page->place_list != NULL); g_assert (w_current->inside_action != 0); if (w_current->rubber_visible) o_place_invalidate_rubber (w_current, FALSE); w_current->second_wx = w_x; w_current->second_wy = w_y; o_place_invalidate_rubber (w_current, TRUE); w_current->rubber_visible = 1; }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_place_start (GSCHEM_TOPLEVEL *w_current, int w_x, int w_y) { w_current->second_wx = w_x; w_current->second_wy = w_y; o_place_invalidate_rubber (w_current, TRUE); w_current->rubber_visible = 1; }
/*! \brief Mirror the objects being placed * * \par Function Description * This function erases the objects in the place list, mirrors * them, runs %mirror-objects-hook, and redraws the objects after * mirroring. * * \param [in] w_current The GschemToplevel object. */ void o_place_mirror (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); o_place_invalidate_rubber (w_current, FALSE); geda_object_list_mirror (page->place_list, w_current->first_wx, w_current->first_wy, page->toplevel); /* Run mirror-objects-hook */ g_run_hook_object_list (w_current, "%mirror-objects-hook", page->place_list); o_place_invalidate_rubber (w_current, TRUE); }
/*! \brief Start placement action * * \par Function Description * This function remembers the current world coordinates and * invalidates the bounding box of the objects in the current * place list. * * \param [in] w_current GschemToplevel which we're drawing for. * \param [in] w_x The current world X coordinate. * \param [in] w_y The current world Y coordinate. */ void o_place_start (GschemToplevel *w_current, int w_x, int w_y) { g_return_if_fail (w_current != NULL); i_action_start (w_current); w_current->second_wx = w_x; w_current->second_wy = w_y; o_place_invalidate_rubber (w_current, TRUE); w_current->rubber_visible = 1; }
/*! \brief Rotate the objects being placed * * \par Function Description * This function erases the objects in the place list, rotates * them, runs %rotate-objects-hook, and redraws the objects after * rotating. * * \param [in] w_current The GschemToplevel object. */ void o_place_rotate (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); o_place_invalidate_rubber (w_current, FALSE); o_glist_rotate_world (page->toplevel, w_current->first_wx, w_current->first_wy, 90, page->place_list); /* Run rotate-objects-hook */ g_run_hook_object_list (w_current, "%rotate-objects-hook", page->place_list); o_place_invalidate_rubber (w_current, TRUE); }
/*! \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 * */ gint x_event_button_released (GschemPageView *page_view, GdkEventButton *event, GschemToplevel *w_current) { PAGE *page = gschem_page_view_get_page (page_view); int unsnapped_wx, unsnapped_wy; int w_x, w_y; g_return_val_if_fail ((page_view != NULL), 0); g_return_val_if_fail ((w_current != NULL), 0); if (page == NULL) { return TRUE; /* terminate event */ } #if DEBUG printf("released! %d \n", w_current->event_state); #endif 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; gschem_page_view_SCREENtoWORLD (page_view, (int) event->x, (int) event->y, &unsnapped_wx, &unsnapped_wy); w_x = snap_grid (w_current, unsnapped_wx); w_y = snap_grid (w_current, unsnapped_wy); /* Huge switch statement to evaluate state transitions. Jump to * end_button_released label to escape the state evaluation rather * than returning from the function directly. */ scm_dynwind_begin ((scm_t_dynwind_flags) 0); g_dynwind_window (w_current); if (event->button == 1) { if (w_current->inside_action) { if (page->place_list != NULL) { switch(w_current->event_state) { case (COPYMODE) : case (MCOPYMODE) : o_copy_end(w_current); break; case (MOVEMODE) : o_move_end(w_current); break; default: break; } } else { switch(w_current->event_state) { case (GRIPS) : o_grips_end(w_current); break; case (PATHMODE) : o_path_end (w_current, w_x, w_y); break; case (SBOX) : o_select_box_end(w_current, unsnapped_wx, unsnapped_wy); break; case (SELECT) : o_select_end(w_current, unsnapped_wx, unsnapped_wy); break; case (ZOOMBOX) : a_zoom_box_end(w_current, unsnapped_wx, unsnapped_wy); break; default: break; } } } } else if (event->button == 2) { if (w_current->inside_action) { if (w_current->event_state == COMPMODE|| w_current->event_state == TEXTMODE|| w_current->event_state == MOVEMODE|| w_current->event_state == COPYMODE || w_current->event_state == MCOPYMODE || w_current->event_state == PASTEMODE ) { if (w_current->event_state == MOVEMODE) { o_move_invalidate_rubber (w_current, FALSE); } else { o_place_invalidate_rubber (w_current, FALSE); } w_current->rubber_visible = 0; o_place_rotate(w_current); if (w_current->event_state == COMPMODE) { o_complex_place_changed_run_hook (w_current); } if (w_current->event_state == MOVEMODE) { o_move_invalidate_rubber (w_current, TRUE); } else { o_place_invalidate_rubber (w_current, TRUE); } w_current->rubber_visible = 1; goto end_button_released; } } switch(w_current->middle_button) { case(ACTION): if (w_current->inside_action && (page->place_list != NULL)) { switch(w_current->event_state) { case (COPYMODE): o_copy_end(w_current); break; case (MOVEMODE): o_move_end(w_current); break; } } break; #ifdef HAVE_LIBSTROKE case(STROKE): DOING_STROKE = FALSE; x_stroke_translate_and_execute (w_current); break; #endif /* HAVE_LIBSTROKE */ case(MID_MOUSEPAN_ENABLED): if (gschem_page_view_pan_end (page_view) && w_current->undo_panzoom) { o_undo_savestate_old(w_current, UNDO_VIEWPORT_ONLY); } break; } } else if (event->button == 3) { /* just for ending a mouse pan */ if (gschem_page_view_pan_end (page_view) && w_current->undo_panzoom) { o_undo_savestate_old(w_current, UNDO_VIEWPORT_ONLY); } } end_button_released: scm_dynwind_end (); return(0); }