diff --git a/2.10/Source/CustomDrawControl.pas b/2.10/Source/CustomDrawControl.pas index b379714..92a19a6 100644 --- a/2.10/Source/CustomDrawControl.pas +++ b/2.10/Source/CustomDrawControl.pas @@ -9,11 +9,13 @@ type TCustomDrawControl = class(TCustomControl) private FOnPaint: TNotifyEvent; + FOnLeave: TNotifyEvent; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; protected public @@ -34,6 +36,7 @@ type // property OnMouseWheelUp; property OnEnter; property OnExit; + property OnMouseLeave: TNotifyEvent read FOnLeave write FOnLeave; end; implementation @@ -60,6 +63,11 @@ begin Message.Result := Message.Result or DLGC_WANTARROWS; end; +procedure TCustomDrawControl.CMMouseLeave(var Message: TMessage); +begin + if Assigned(FOnLeave) then FOnLeave(Self); +end; + procedure TCustomDrawControl.Paint; begin if Assigned(FOnPaint) then FOnPaint(Self); diff --git a/2.10/Source/Editor.dfm b/2.10/Source/Editor.dfm index 730a494..e91a61d 100644 --- a/2.10/Source/Editor.dfm +++ b/2.10/Source/Editor.dfm @@ -1,8 +1,8 @@ object EditForm: TEditForm - Left = 377 - Top = 179 + Left = 350 + Top = 163 Width = 586 - Height = 600 + Height = 586 Caption = 'Transform Editor' Color = clBtnFace Constraints.MinHeight = 400 @@ -54,7 +54,7 @@ object EditForm: TEditForm TextHeight = 13 object StatusBar: TStatusBar Left = 0 - Top = 557 + Top = 543 Width = 578 Height = 15 Panels = < @@ -333,14 +333,14 @@ object EditForm: TEditForm Left = 0 Top = 24 Width = 578 - Height = 533 + Height = 519 Align = alClient TabOrder = 1 object Splitter1: TSplitter Left = 396 Top = 1 Width = 9 - Height = 531 + Height = 517 Align = alRight AutoSnap = False Beveled = True @@ -351,7 +351,7 @@ object EditForm: TEditForm Left = 1 Top = 1 Width = 395 - Height = 531 + Height = 517 Align = alClient BevelOuter = bvNone Color = clAppWorkSpace @@ -361,7 +361,7 @@ object EditForm: TEditForm Left = 405 Top = 1 Width = 172 - Height = 531 + Height = 517 Align = alRight Alignment = taLeftJustify BevelOuter = bvNone @@ -401,7 +401,7 @@ object EditForm: TEditForm Left = 0 Top = 136 Width = 172 - Height = 395 + Height = 381 Align = alClient TabOrder = 0 object lblTransform: TLabel @@ -434,7 +434,7 @@ object EditForm: TEditForm Left = 1 Top = 26 Width = 170 - Height = 368 + Height = 354 ActivePage = TriangleTab Align = alBottom Anchors = [akLeft, akTop, akRight, akBottom] @@ -447,7 +447,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 322 + Height = 308 HorzScrollBar.Visible = False VertScrollBar.Smooth = True VertScrollBar.Style = ssFlat @@ -1156,65 +1156,65 @@ object EditForm: TEditForm object tabXForm: TTabSheet Caption = 'Transform' object lbla: TLabel - Left = 9 - Top = 12 + Left = 4 + Top = 8 Width = 10 Height = 13 Caption = 'a:' end object Label1: TLabel - Left = 9 - Top = 36 + Left = 82 + Top = 8 Width = 10 Height = 13 Caption = 'b:' end object Label2: TLabel - Left = 9 - Top = 60 + Left = 4 + Top = 32 Width = 9 Height = 13 Caption = 'c:' end object Label3: TLabel - Left = 9 - Top = 84 + Left = 82 + Top = 32 Width = 10 Height = 13 Caption = 'd:' end object Label4: TLabel - Left = 9 - Top = 108 + Left = 4 + Top = 56 Width = 10 Height = 13 Caption = 'e:' end object Label5: TLabel - Left = 9 - Top = 132 + Left = 82 + Top = 56 Width = 8 Height = 13 Caption = 'f:' end object Label6: TLabel - Left = 9 - Top = 156 + Left = 36 + Top = 84 Width = 38 Height = 13 Caption = 'Weight:' end object Label29: TLabel - Left = 9 - Top = 180 + Left = 36 + Top = 108 Width = 52 Height = 13 Caption = 'Symmetry:' end object txtA: TEdit - Left = 32 - Top = 8 - Width = 110 + Left = 20 + Top = 4 + Width = 57 Height = 21 TabOrder = 0 Text = '0' @@ -1222,9 +1222,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtB: TEdit - Left = 32 - Top = 32 - Width = 110 + Left = 96 + Top = 4 + Width = 57 Height = 21 TabOrder = 1 Text = '0' @@ -1232,9 +1232,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtC: TEdit - Left = 32 - Top = 56 - Width = 110 + Left = 20 + Top = 28 + Width = 57 Height = 21 TabOrder = 2 Text = '0' @@ -1242,9 +1242,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtD: TEdit - Left = 32 - Top = 80 - Width = 110 + Left = 96 + Top = 28 + Width = 57 Height = 21 TabOrder = 3 Text = '0' @@ -1252,9 +1252,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtE: TEdit - Left = 32 - Top = 104 - Width = 110 + Left = 20 + Top = 52 + Width = 57 Height = 21 TabOrder = 4 Text = '0' @@ -1262,9 +1262,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtF: TEdit - Left = 32 - Top = 128 - Width = 110 + Left = 96 + Top = 52 + Width = 57 Height = 21 TabOrder = 5 Text = '0' @@ -1272,9 +1272,9 @@ object EditForm: TEditForm OnKeyPress = CoefKeyPress end object txtP: TEdit - Left = 72 - Top = 152 - Width = 70 + Left = 96 + Top = 80 + Width = 57 Height = 21 TabOrder = 6 Text = '0' @@ -1282,9 +1282,9 @@ object EditForm: TEditForm OnKeyPress = txtPKeyPress end object txtSymmetry: TEdit - Left = 72 - Top = 176 - Width = 70 + Left = 96 + Top = 104 + Width = 57 Height = 21 TabOrder = 7 Text = '0' @@ -1298,7 +1298,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 322 + Height = 308 Align = alClient ScrollBars = ssVertical TabOrder = 0 @@ -1324,7 +1324,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 322 + Height = 308 Align = alClient ScrollBars = ssVertical TabOrder = 0 @@ -1450,15 +1450,16 @@ object EditForm: TEditForm TabOrder = 1 OnClick = chkUseXFormColorClick end - object chkFlameBack: TCheckBox + object chkHelpers: TCheckBox Left = 8 Top = 36 Width = 129 Height = 17 - Caption = 'Use flame background' - Enabled = False + Caption = 'Enable helpers' + Checked = True + State = cbChecked TabOrder = 2 - OnClick = chkFlameBackClick + OnClick = chkHelpersClick end object pnlReference: TPanel Left = 8 @@ -1502,7 +1503,7 @@ object EditForm: TEditForm object EditPopup: TPopupMenu AutoPopup = False Images = EditorTB - Left = 360 + Left = 352 Top = 40 object mnuAutoZoom: TMenuItem Caption = 'Auto Zoom' @@ -1613,7 +1614,7 @@ object EditForm: TEditForm end end object EditorTB: TImageList - Left = 361 + Left = 353 Top = 80 Bitmap = { 494C01010D000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 diff --git a/2.10/Source/Editor.pas b/2.10/Source/Editor.pas index 2c19cd7..d019cd7 100644 --- a/2.10/Source/Editor.pas +++ b/2.10/Source/Editor.pas @@ -88,7 +88,7 @@ type Label21: TLabel; pnlBackColor: TPanel; chkUseXFormColor: TCheckBox; - chkFlameBack: TCheckBox; + chkHelpers: TCheckBox; pnlReference: TPanel; TriangleScrollBox: TScrollBox; TrianglePanel: TPanel; @@ -176,6 +176,7 @@ type procedure TriangleViewKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TriangleViewExit(Sender: TObject); + procedure TriangleViewMouseLeave(Sender: TObject); procedure FormShow(Sender: TObject); procedure mnuDeleteClick(Sender: TObject); @@ -208,7 +209,7 @@ type ScrollCode: TScrollCode; var ScrollPos: Integer); procedure scrlXFormColorChange(Sender: TObject); procedure chkUseXFormColorClick(Sender: TObject); - procedure chkFlameBackClick(Sender: TObject); + procedure chkHelpersClick(Sender: TObject); procedure pnlBackColorClick(Sender: TObject); procedure pnlReferenceClick(Sender: TObject); procedure txtXFormColorExit(Sender: TObject); @@ -301,9 +302,7 @@ type SelectMode: boolean; HasChanged: boolean; - oldx, oldy: double; - // --Z-- - olddist: double; + oldx, oldy, olddist: double; Pivot: TSPoint; VarsCache: array[0..64] of double; // hack: to prevent slow valuelist redraw @@ -375,6 +374,8 @@ var gCenterX: double; gCenterY: double; + HelpersEnabled: boolean = true; + {$R *.DFM} { Triangle transformations } @@ -880,6 +881,9 @@ begin end; procedure TEditForm.TriangleViewPaint(Sender: TObject); +const + foc_ofs = 4; + foc_size = 32; var ix, iy, sc: double; @@ -890,6 +894,8 @@ var end; var i: integer; + d, d1, dx, dy, k: double; + tx, ty: double; ax, ay: integer; a, b, c: TPoint; @@ -919,17 +925,10 @@ begin brush.Color := pnlBackColor.Color; FillRect(Rect(0, 0, Width, Height)); - if TWinControl(Sender).Focused then - begin - brush.Color := GridColor1; - FrameRect(Rect(1, 1, Width-1, Height-1)); -// Rectangle(Rect(1, 1, Width-1, Height-1)); - brush.Color := pnlBackColor.Color; - end; - - // draw grid Pen.Style := psSolid; Pen.Width := 1; + + // draw grid Pen.Color := GridColor2; gridX1:=gCenterX-ix/sc; gridX2:=gCenterX+(Width-ix)/sc; @@ -972,16 +971,15 @@ begin {Reference Triangle} Pen.Style := psDot; Pen.color := pnlReference.Color; - a := ToScreen(MainTriangles[-1].x[0], MainTriangles[-1].y[0]); b := ToScreen(MainTriangles[-1].x[1], MainTriangles[-1].y[1]); c := ToScreen(MainTriangles[-1].x[2], MainTriangles[-1].y[2]); Polyline([a, b, c, a]); Font.color := Pen.color; - TextOut(a.x, a.y, 'A'); - TextOut(b.x, b.y, 'B'); - TextOut(c.x, c.y, 'C'); + TextOut(a.x+2, a.y+1, 'A'); + TextOut(b.x+2, b.y+1, 'B'); + TextOut(c.x+2, c.y+1, 'C'); Pen.Style := psSolid; @@ -1002,46 +1000,105 @@ begin Ellipse(c.x - 4, c.y - 4, c.x + 4, c.y + 4); Font.color := Pen.color; - TextOut(a.x, a.y, 'A'); - TextOut(b.x, b.y, 'B'); - TextOut(c.x, c.y, 'C'); + TextOut(c.x+2, c.y+1, 'C'); + TextOut(b.x+2, b.y+1, 'B'); + TextOut(a.x+2, a.y+1, 'A'); end; - // if dragging, draw pivot axis - if TriangleCaught or CornerCaught then + + if (TriangleCaught or CornerCaught) then // if dragging, draw pivot axis begin - Pen.Mode := pmMerge; - Pen.Color := $555555; - Pen.Style := psDot; -// ax := integer(round(ix + (Pivot.x - gCenterX)*sc)); -// ay := integer(round(iy + (gCentery - Pivot.y)*sc)); + if HelpersEnabled then + begin + pen.Color := $808080; + //pen.Color := 0; + //brush.Color := $808080; + pen.Mode := pmMerge; + pen.Style := psSolid;//psDot; a := ToScreen(Pivot.x, Pivot.y); MoveTo(a.x, 0); LineTo(a.x, Height); MoveTo(0, a.y); LineTo(Width, a.y); - Pen.Color := $808080; - Pen.Style := psSolid; - Pen.Mode := pmXor; - if CornerCaught then + if (editMode = modeRotate) or (editMode = modeScale) then // draw circle begin -// ax := integer(round(ix + (MainTriangles[SelectedTriangle].x[SelectedCorner] - gCenterX)*sc)); -// ay := integer(round(iy - (MainTriangles[SelectedTriangle].y[SelectedCorner] - gCenterY)*sc)); - a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], - MainTriangles[SelectedTriangle].y[SelectedCorner]); - end - else begin -// ax := integer(round(ix + (GetPivot.x - gCenterX)*sc)); -// ay := integer(round(iy - (GetPivot.y - gCenterY)*sc)); - a := ToScreen(GetPivot.x, GetPivot.y); - end; - MoveTo(a.x, 0); - LineTo(a.x, Height); - MoveTo(0, a.y); - LineTo(Width, a.y); - Pen.Mode := pmCopy; + if CornerCaught then begin + dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y; + d := Hypot(dx, dy); +// d := dist(Pivot.x, Pivot.y, +// MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]); + end + else begin +// d := MinDouble; + dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y; + d := Hypot(dx, dy); + for i := 1 to 2 do + begin +// tx := MainTriangles[SelectedTriangle].x[i] - Pivot.x; +// ty := MainTriangles[SelectedTriangle].y[i] - Pivot.y; + d1 := Hypot(tx, ty); + d1 := dist(Pivot.x, Pivot.y, MainTriangles[SelectedTriangle].x[i], MainTriangles[SelectedTriangle].y[i]); + if d1 > d then begin + d := d1; +// dx := tx; +// dy := ty; + end; + end; + d1 := Hypot(dx, dy); + if (d1 <> d) and (d1 <> 0) then + begin + dx := dx/d1 * d; + dy := dy/d1 * d; + end; + end; - mouseOverTriangle := SelectedTriangle; + //i := min( min(Width, Height), integer(round(dmax * sc))); + i := integer(round(d * sc)); + if i > 4 then begin + pen.Color := $808080; + brush.Style := bsClear; + Ellipse(a.x - i, a.y - i, a.x + i, a.y + i); + + a := ToScreen(Pivot.x - dy, Pivot.y + dx); + b := ToScreen(Pivot.x + dy, Pivot.y - dx); + MoveTo(a.x, a.y); + LineTo(b.X, b.y); + end; + + // rotated axis + if (dx <> 0) and (dy <> 0) then + begin + k := dy / dx; + if abs(k) < 1 then begin + MoveTo(0, round(iy - sc*(Pivot.y - ( ix/sc-GCenterX+Pivot.x)*k - GCenterY))); + LineTo(Width, round(iy - sc*(Pivot.y - (-ix/sc-GCenterX+Pivot.x)*k - GCenterY))); + end + else begin + MoveTo(round(ix + sc*(Pivot.x - (-iy/sc-GCenterY+Pivot.y)/k - GCenterX)), 0); + LineTo(round(ix + sc*(Pivot.x - ( iy/sc-GCenterY+Pivot.y)/k - GCenterX)), Height); + end; + end; + end + else //if editMode = modeMove then // draw target axis + begin + Pen.Color := $808080; + Pen.Mode := pmMerge;//Xor; + brush.Color := 0; + if CornerCaught then + a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], + MainTriangles[SelectedTriangle].y[SelectedCorner]) + else + a := ToScreen(GetPivot.x, GetPivot.y); + MoveTo(a.x, 0); + LineTo(a.x, Height); + MoveTo(0, a.y); + LineTo(Width, a.y); + Pen.Mode := pmCopy; + end; + end; // endif HelpersEnabled + mouseOverTriangle := SelectedTriangle; end; if (mouseOverTriangle >= 0) then // highlight triangle under cursor @@ -1071,11 +1128,11 @@ begin begin font.Color := GetTriangleColor(mouseOverTriangle); brush.Style := bsClear; - ay := Height-3 + font.Height; // font.height < 0 + ay := Height-foc_ofs*2 + font.Height; // font.height < 0 for i:= NRVAR - 1 downto 0 do if cp.xform[mouseOverTriangle].vars[i] <> 0 then begin - ax := Width-3 - TextWidth(Varnames(i)); + ax := Width-foc_ofs*2 - TextWidth(Varnames(i)); TextOut(ax, ay, Varnames(i)); Inc(ay, font.Height); end; @@ -1087,28 +1144,39 @@ begin brush.Color:=clSilver; if CornerCaught then // draw selected corner begin -// ax := integer(round(ix + (MainTriangles[SelectedTriangle].x[SelectedCorner] - gCenterX) * sc)); -// ay := integer(round(iy - (MainTriangles[SelectedTriangle].y[SelectedCorner] - gCenterY) * sc)); a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]); Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); end else if (mouseOverTriangle>=0) and (mouseOverCorner >= 0) then // highlight corner under cursor begin -// ax := integer(round(ix + (MainTriangles[mouseOverTriangle].x[mouseOverCorner] - gCenterX) * sc)); -// ay := integer(round(iy - (MainTriangles[mouseOverTriangle].y[mouseOverCorner] - gCenterY) * sc)); a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverCorner], MainTriangles[mouseOverTriangle].y[mouseOverCorner]); Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); end; // draw pivot point -// ax := integer(round(ix + (GetPivot.x - gCenterX) * sc)); -// ay := integer(round(iy - (GetPivot.y - gCenterY) * sc)); a := ToScreen(GetPivot.x, GetPivot.y); Pen.Style := psSolid; - pen.Color:=clWhite; - brush.Color:=clSilver; + pen.Color := clWhite; + brush.Color := clSilver; Ellipse(a.x - 2, a.y - 2, a.x + 2, a.y + 2); - // -- + + if TWinControl(Sender).Focused then + begin + pen.Color := $808080; + pen.Mode := pmXor; + MoveTo(foc_ofs, foc_size); + LineTo(foc_ofs, foc_ofs); + LineTo(foc_size, foc_ofs); + MoveTo(Width-1-foc_ofs, foc_size); + LineTo(Width-1-foc_ofs, foc_ofs); + LineTo(Width-1-foc_size, foc_ofs); + MoveTo(Width-1-foc_ofs, Height-1-foc_size); + LineTo(Width-1-foc_ofs, Height-1-foc_ofs); + LineTo(Width-1-foc_size, Height-1-foc_ofs); + MoveTo(foc_ofs, Height-1-foc_size); + LineTo(foc_ofs, Height-1-foc_ofs); + LineTo(foc_size, Height-1-foc_ofs); + end; end; TriangleView.Canvas.Draw(0, 0, Bitmap); finally @@ -1122,11 +1190,11 @@ var begin // Custom control setup TriangleView := TCustomDrawControl.Create(self); - TriangleView.TabStop := True; + TriangleView.TabStop := True; TriangleView.TabOrder := 0; - TriangleView.Parent := GrphPnl; - TriangleView.Align := alClient; - TriangleView.Visible := True; + TriangleView.Parent := GrphPnl; + TriangleView.Align := alClient; + TriangleView.Visible := True; TriangleView.OnPaint := TriangleViewPaint; @@ -1138,8 +1206,9 @@ begin TriangleView.OnKeyDown := TriangleViewKeyDown; TriangleView.OnKeyUp := TriangleViewKeyUp; - TriangleView.OnEnter := rgPivotClicked; // hack: - TriangleView.OnExit := TriangleViewExit; // there's only Invalidate() in there :) + TriangleView.OnEnter := rgPivotClicked; // hack: it's only Invalidate() in there :) + TriangleView.OnExit := TriangleViewExit; + TriangleView.OnMouseLeave := TriangleViewmouseLeave; // for i:= 0 to NRVAR - 1 do begin @@ -1192,13 +1261,22 @@ var d: double; i0, i1: integer; -label FoundCorner; +label FoundCorner, Skip1, Skip2; begin Scale(fx, fy, x, y); // --Z-- StatusBar.Panels[0].Text := Format('X: %f', [fx]); StatusBar.Panels[1].Text := Format('Y: %f', [fy]); + if viewDragMode then // graph panning + begin + viewDragged := true; + GcenterX := GcenterX - (fx - oldx); + GcenterY := GcenterY - (fy - oldy); + TriangleView.Refresh; + exit; + end; + mt:=mouseOverTriangle; mc:=MouseOverCorner; @@ -1241,40 +1319,52 @@ FoundCorner: else TriangleView.Cursor := crArrow; - if viewDragMode then // graph panning - begin - viewDragged := true; - GcenterX := GcenterX - (fx - oldx); - GcenterY := GcenterY - (fy - oldy); - TriangleView.Refresh; - exit; - end; - Shift := Shift - [ssLeft]; - if CornerCaught then - begin { Drag a corner } + if CornerCaught then // Modify a point /////////////////////////////////////// + begin // if (Shift = [ssAlt]) or ((editMode = modeRotate) and (Shift = [])) then if (editMode = modeRotate) then // rotate point begin // rotate point around pivot d := dist(Pivot.X, Pivot.Y, fx, fy); if d<>0 then begin - vx := (fx-Pivot.X)*olddist/d; - vy := (fy-Pivot.Y)*olddist/d; + if ssShift in Shift then // angle snap + begin + try + t := StrToFloat(txtTrgRotateValue.Text)/180*PI; + //assert(t<>0); + except + t := 15.0*PI/180.0; + txtTrgRotateValue.Text := '15'; + end; + if t = 0 then goto Skip1; //? + + a := Round(arctan2(fy-Pivot.Y, fx-Pivot.X)/t)*t; + vx := olddist*cos(a); + vy := olddist*sin(a); + end + else begin +Skip1: + vx := (fx-Pivot.X)*olddist/d; + vy := (fy-Pivot.Y)*olddist/d; + a := arctan2(vy,vx) - arctan2(oldy,oldx); + end; + MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X+vx; + MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y+vy; end - else begin - vx := 0; - vy := 0; - end; - MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X+vx; - MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y+vy; - vx:=arctan2(vy,vx); - vy:=arctan2(oldy,oldx); - StatusBar.Panels[2].Text := Format('Rotate: %3.2f°', [(vx-vy)*180/PI]); + else a := 0; + vy := abs( + arctan2(MainTriangles[SelectedTriangle].y[0]-MainTriangles[SelectedTriangle].y[1], + MainTriangles[SelectedTriangle].x[0]-MainTriangles[SelectedTriangle].x[1]) + -arctan2(MainTriangles[SelectedTriangle].y[2]-MainTriangles[SelectedTriangle].y[1], + MainTriangles[SelectedTriangle].x[2]-MainTriangles[SelectedTriangle].x[1]) + ); + if vy > PI then vy := 2*PI - vy; + StatusBar.Panels[2].Text := Format('Rotate: %3.2f° 0 then begin vy := (oldx*(fx-Pivot.X) + oldy*(fy-Pivot.Y))/(olddist*olddist); MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X+oldx*vy; @@ -1313,26 +1403,36 @@ FoundCorner: StatusBar.Refresh; exit; end - else if TriangleCaught then { Modify a whole triangle } + else if TriangleCaught then // Modify a whole triangle /////////////////////// begin // if (Shift = [ssAlt]) or ((editMode = modeRotate) and (Shift = [])) then // rotate if (editMode = modeRotate) then // rotate triangle begin a := arctan2(fy-Pivot.Y, fx-Pivot.X) - arctan2(oldy, oldx); - if ssShift in Shift then + if ssShift in Shift then // angle snap begin try t := StrToFloat(txtTrgRotateValue.Text)/180*PI; - assert(t<>0); + //assert(t<>0); except t := 15.0*PI/180.0; txtTrgRotateValue.Text := '15'; end; + if t = 0 then goto Skip2; + a := Round(a/t)*t end; +Skip2: MainTriangles[SelectedTriangle] := RotateTrianglePoint(OldTriangle, Pivot.X, Pivot.Y, a); - StatusBar.Panels[2].Text := Format('Rotate: %3.2f°', [a*180/PI]); + + vx := MainTriangles[SelectedTriangle].x[0]-MainTriangles[SelectedTriangle].x[1]; + vy := MainTriangles[SelectedTriangle].y[0]-MainTriangles[SelectedTriangle].y[1]; + if abs(vx*(MainTriangles[SelectedTriangle].x[2]-MainTriangles[SelectedTriangle].x[1])+ + vy*(MainTriangles[SelectedTriangle].y[2]-MainTriangles[SelectedTriangle].y[1])) < 0.001 + then + StatusBar.Panels[2].Text := Format('Rotate: %3.2f° Local axis: %3.2f°', [a*180/PI, arctan2(vy, vx)*180/PI]) + else StatusBar.Panels[2].Text := Format('Rotate: %3.2f°', [a*180/PI]); end // else if (Shift = [ssCtrl]) or ((editMode = modeScale) and (Shift = [])) then else if (editMode = modeScale) then // scale @@ -1433,7 +1533,7 @@ begin i := InsideTriangle(fx, fy); if i >= 0 then SelectedTriangle := i else - if Shift * [ssAlt,ssCtrl,ssShift] = [] then exit; + if oldMode = modeNone then exit; end; TriangleCaught := True; @@ -1449,7 +1549,7 @@ begin TriangleView.Invalidate; exit; end - else if (Button = mbRight) and + else if (Button = mbRight) and not (TriangleCaught or CornerCaught) then // graph panning begin SetCaptureControl(TriangleView); @@ -1475,7 +1575,7 @@ begin end else TriangleView.Invalidate; end - else if (Button = mbRight) and viewDragMode then // --Z-- panning + else if (Button = mbRight) and viewDragMode then begin viewDragMode := false; if viewDragged=false then // haven't dragged - popup menu then @@ -1540,7 +1640,7 @@ begin if Registry.ValueExists('ReferenceTriangleColor') then ReferenceTriangleColor := Registry.ReadInteger('ReferenceTriangleColor') else - ReferenceTriangleColor := integer(clGray); + ReferenceTriangleColor := $7f7f7f; if Registry.ValueExists('ResetLocation') then mnuResetLoc.checked := Registry.ReadBool('ResetLocation') else mnuResetLoc.checked := true; @@ -1561,7 +1661,7 @@ begin Registry.Free; end; chkUseXFormColor.checked := UseTransformColors; - chkFlameBack.checked := UseFlameBackground; +// chkFlameBack.checked := UseFlameBackground; pnlBackColor.Color := TColor(BackgroundColor); GrphPnl.Color := TColor(BackgroundColor); pnlGridColor1.Color := GridColor1; @@ -2179,9 +2279,9 @@ begin TriangleView.Invalidate; end; -procedure TEditForm.chkFlameBackClick(Sender: TObject); +procedure TEditForm.chkHelpersClick(Sender: TObject); begin - UseFlameBackground := chkFlameBack.checked; + HelpersEnabled := chkHelpers.checked; TriangleView.Invalidate; end; @@ -2451,8 +2551,8 @@ var cell: TGridCoord; begin if Button = mbLeft then begin + varDragOld:=x; cell := TValueListEditor(Sender).MouseCoord(x, y); - if (cell.y < 1) or (cell.y >= TValueListEditor(Sender).RowCount) or (cell.x <> 0) then exit; @@ -2465,8 +2565,7 @@ begin GetCursorPos(mousepos); // hmmm varDragMode:=true; - varDragOld:=x; - varDragPos:=x; + varDragPos:=0; SetCaptureControl(TValueListEditor(Sender)); if Sender = VEVars then varDragValue := cp.xform[SelectedTriangle].vars[varDragIndex] @@ -2553,7 +2652,7 @@ var v: double; begin if (TValueListEditor(Sender).Values[VarNames(varDragIndex)] = '0') or - (varDragPos >= TValueListEditor(Sender).ColWidths[0]) then exit; + (varDragOld >= TValueListEditor(Sender).ColWidths[0]) then exit; MainForm.UpdateUndo; if Sender = VEVars then @@ -2820,8 +2919,11 @@ procedure TEditForm.TriangleViewKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin - if (oldMode <> modeNone) and - (key in [VK_SHIFT, VK_MENU, VK_CONTROL]) then + if (oldMode <> modeNone) and ( + ((key = VK_SHIFT) and (editMode = modeMove)) or + ((key = VK_MENU) and (editMode = modeRotate)) or + ((key = VK_CONTROL) and (editMode = modeScale)) + ) then begin editMode := oldMode; oldMode := modeNone; @@ -2833,8 +2935,6 @@ end; procedure TEditForm.TriangleViewExit(Sender: TObject); begin - mouseOverTriangle := -1; - if oldMode <> modeNone then begin editMode := oldMode; @@ -2844,9 +2944,19 @@ begin tbScale.Down := (editMode = modeScale); end; + mouseOverTriangle := -1; TriangleView.Invalidate; end; +procedure TEditForm.TriangleViewMouseLeave(Sender: TObject); +begin + if viewDragMode = false then + begin + mouseOverTriangle := -1; + TriangleView.Invalidate; + end; +end; + procedure TEditForm.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin @@ -2863,6 +2973,8 @@ begin TriangleView.Invalidate; ShowSelectedInfo; end; +{ // these keys are not so good, must think about it... + VK_SPACE: EditForm.tbSelectClick(Sender); Ord('Q'): EditForm.tbEditModeClick(tbMove); @@ -2879,6 +2991,7 @@ begin Ord('C'): EditForm.rgPivot.ItemIndex:=2; Ord('V'): EditForm.rgPivot.ItemIndex:=3; Ord('B'): EditForm.rgPivot.ItemIndex:=4; +} else key_handled := false; exit; @@ -2911,7 +3024,7 @@ begin StatusBar.Panels[2].Text := 'Select OFF'; end; - // hack (to generate MouseMove event): + // hack: to generate MouseMove event GetCursorPos(MousePos); SetCursorPos(MousePos.x, MousePos.y); end; diff --git a/2.10/Source/Main.pas b/2.10/Source/Main.pas index f8894a5..b026118 100644 --- a/2.10/Source/Main.pas +++ b/2.10/Source/Main.pas @@ -1916,9 +1916,9 @@ begin end else begin - Triangles[-1].x[0] := 0; Triangles[-1].y[0] := 0; - Triangles[-1].x[1] := 1; Triangles[-1].y[1] := 0; - Triangles[-1].x[2] := 1; Triangles[-1].y[2] := 1.5; + Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x" + Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0" + Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y" end; for j := 0 to xforms - 1 do @@ -1931,10 +1931,8 @@ begin f := cp1.xform[j].c[2][1]; for i := 0 to 2 do begin - triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * - c + e; - triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * - d + f; + triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * c + e; + triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * d + f; end; end; for i := -1 to xforms - 1 do