/* --------------------------------------------------------------------------- * sets the valid range for the crosshair cursor */ void SetCrosshairRange (Coord MinX, Coord MinY, Coord MaxX, Coord MaxY) { Crosshair.MinX = MAX (0, MinX); Crosshair.MinY = MAX (0, MinY); Crosshair.MaxX = MIN (PCB->MaxWidth, MaxX); Crosshair.MaxY = MIN (PCB->MaxHeight, MaxY); /* force update of position */ MoveCrosshairRelative (0, 0); }
/* --------------------------------------------------------------------------- * sets the valid range for the crosshair cursor */ void SetCrosshairRange (LocationType MinX, LocationType MinY, LocationType MaxX, LocationType MaxY) { Crosshair.MinX = MAX (0, MinX); Crosshair.MinY = MAX (0, MinY); Crosshair.MaxX = MIN ((LocationType) PCB->MaxWidth, MaxX); Crosshair.MaxY = MIN ((LocationType) PCB->MaxHeight, MaxY); /* force update of position */ MoveCrosshairRelative (0, 0); }
/* --------------------------------------------------------------------------- * set a new mode and update X cursor */ void SetMode (int Mode) { static bool recursing = false; /* protect the cursor while changing the mode * perform some additional stuff depending on the new mode * reset 'state' of attached objects */ if (recursing) return; recursing = true; notify_crosshair_change (false); addedLines = 0; Crosshair.AttachedObject.Type = NO_TYPE; Crosshair.AttachedObject.State = STATE_FIRST; Crosshair.AttachedPolygon.PointN = 0; if (PCB->RatDraw) { if (Mode == ARC_MODE || Mode == RECTANGLE_MODE || Mode == VIA_MODE || Mode == POLYGON_MODE || Mode == POLYGONHOLE_MODE || Mode == TEXT_MODE || Mode == INSERTPOINT_MODE || Mode == THERMAL_MODE) { Message (_("That mode is NOT allowed when drawing ratlines!\n")); Mode = NO_MODE; } } if (Settings.Mode == LINE_MODE && Mode == ARC_MODE && Crosshair.AttachedLine.State != STATE_FIRST) { Crosshair.AttachedLine.State = STATE_FIRST; Crosshair.AttachedBox.State = STATE_SECOND; Crosshair.AttachedBox.Point1.X = Crosshair.AttachedBox.Point2.X = Crosshair.AttachedLine.Point1.X; Crosshair.AttachedBox.Point1.Y = Crosshair.AttachedBox.Point2.Y = Crosshair.AttachedLine.Point1.Y; AdjustAttachedObjects (); } else if (Settings.Mode == ARC_MODE && Mode == LINE_MODE && Crosshair.AttachedBox.State != STATE_FIRST) { Crosshair.AttachedBox.State = STATE_FIRST; Crosshair.AttachedLine.State = STATE_SECOND; Crosshair.AttachedLine.Point1.X = Crosshair.AttachedLine.Point2.X = Crosshair.AttachedBox.Point1.X; Crosshair.AttachedLine.Point1.Y = Crosshair.AttachedLine.Point2.Y = Crosshair.AttachedBox.Point1.Y; Settings.Mode = Mode; AdjustAttachedObjects (); } else { if (Settings.Mode == ARC_MODE || Settings.Mode == LINE_MODE) SetLocalRef (0, 0, false); Crosshair.AttachedBox.State = STATE_FIRST; Crosshair.AttachedLine.State = STATE_FIRST; if (Mode == LINE_MODE && TEST_FLAG (AUTODRCFLAG, PCB)) { if (ResetConnections (true)) { IncrementUndoSerialNumber (); Draw (); } } } Settings.Mode = Mode; if (Mode == PASTEBUFFER_MODE) /* do an update on the crosshair range */ SetCrosshairRangeToBuffer (); else SetCrosshairRange (0, 0, PCB->MaxWidth, PCB->MaxHeight); recursing = false; /* force a crosshair grid update because the valid range * may have changed */ MoveCrosshairRelative (0, 0); notify_crosshair_change (true); }