/*! \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 Invalidate bounding box or outline for OBJECT placement * * \par Function Description * This function invalidates the bounding box where objects would be * drawn by o_place_draw_rubber() * * The function applies manhatten mode constraints to the coordinates * before drawing if the CONTROL key is recording as being pressed in * the w_current structure. * * The "drawing" parameter is used to indicate if this drawing should * immediately use the selected feedback mode and positioning constraints. * * With drawing=TRUE, the selected conditions are used immediately, * otherwise the conditions from the last drawing operation are used, * saving the new state for next time. * * This function should be called with drawing=TRUE when starting a * rubberbanding operation and when otherwise refreshing the rubberbanded * outline (e.g. after a screen redraw). For any undraw operation, should * be called with drawing=FALSE, ensuring that the undraw XOR matches the * mode and constraints of the corresponding "draw" operation. * * If any mode / constraint changes are made between a undraw, redraw XOR * pair, the latter (draw) operation must be called with drawing=TRUE. If * no mode / constraint changes were made between the pair, it is not * harmful to call the draw operation with "drawing=FALSE". * * \param [in] w_current GschemToplevel which we're drawing for. * \param [in] drawing Set to FALSE for undraw operations to ensure * matching conditions to a previous draw operation. */ void o_place_invalidate_rubber (GschemToplevel *w_current, int drawing) { int diff_x, diff_y; int left, top, bottom, right; 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 (page->place_list != NULL); /* If drawing is true, then don't worry about the previous drawing * method and movement constraints, use with the current settings */ if (drawing) { /* Ensure we set this to flag there is "something" supposed to be * drawn when the invalidate call below causes an expose event. */ w_current->last_drawb_mode = w_current->actionfeedback_mode; w_current->drawbounding_action_mode = (w_current->CONTROLKEY && ! ((w_current->event_state == PASTEMODE) || (w_current->event_state == COMPMODE) || (w_current->event_state == TEXTMODE))) ? CONSTRAINED : FREE; } /* Calculate delta of X-Y positions from buffer's origin */ diff_x = w_current->second_wx - w_current->first_wx; diff_y = w_current->second_wy - w_current->first_wy; /* Adjust the coordinates according to the movement constraints */ /* Need to update the w_current->{first,second}_w{x,y} coords even * though we're only invalidating because the move rubberband code * (which may execute right after this function) expects these * coordinates to be correct. */ if (w_current->drawbounding_action_mode == CONSTRAINED) { if (abs (diff_x) >= abs (diff_y)) { w_current->second_wy = w_current->first_wy; diff_y = 0; } else { w_current->second_wx = w_current->first_wx; diff_x = 0; } } /* Find the bounds of the drawing to be done */ world_get_object_glist_bounds (page->toplevel, page->place_list, &left, &top, &right, &bottom); gschem_page_view_invalidate_world_rect (page_view, left + diff_x, top + diff_y, right + diff_x, bottom + diff_y); }
/*! \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); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_net_invalidate_rubber (GschemToplevel *w_current) { int size = 0, magnetic_halfsize; int magnetic_x, magnetic_y; gboolean magnetic_net_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); gschem_page_view_WORLDtoSCREEN (page_view, w_current->magnetic_wx, w_current->magnetic_wy, &magnetic_x, &magnetic_y); size = gschem_page_view_SCREENabs (page_view, NET_WIDTH); magnetic_net_mode = gschem_options_get_magnetic_net_mode (w_current->options); if (magnetic_net_mode) { if (w_current->magnetic_wx != -1 && w_current->magnetic_wy != -1) { magnetic_halfsize = max (4 * size, MAGNETIC_HALFSIZE); o_invalidate_rect (w_current, magnetic_x - magnetic_halfsize, magnetic_y - magnetic_halfsize, magnetic_x + magnetic_halfsize, magnetic_y + magnetic_halfsize); } } gschem_page_view_invalidate_world_rect (page_view, w_current->first_wx, w_current->first_wy, w_current->second_wx, w_current->second_wy); gschem_page_view_invalidate_world_rect (page_view, w_current->second_wx, w_current->second_wy, w_current->third_wx, w_current->third_wy); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description */ void a_zoom_box_invalidate_rubber (GschemToplevel *w_current) { g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); gschem_page_view_invalidate_world_rect (page_view, w_current->first_wx, w_current->first_wy, w_current->second_wx, w_current->second_wy); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_circle_invalidate_rubber (GschemToplevel *w_current) { g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); gschem_page_view_invalidate_world_rect (page_view, w_current->first_wx - w_current->distance, w_current->first_wy - w_current->distance, w_current->first_wx + w_current->distance, w_current->first_wy + w_current->distance); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_arc_invalidate_rubber (GschemToplevel *w_current) { g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); /* FIXME: This isn't a tight bounding box */ gschem_page_view_invalidate_world_rect (page_view, w_current->first_wx - w_current->distance, w_current->first_wy - w_current->distance, w_current->first_wx + w_current->distance, w_current->first_wy + w_current->distance); }
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); }
/*! \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); } } } }