From 09e406a9270319274596679f16ae8b79bad30698 Mon Sep 17 00:00:00 2001 From: zueuk Date: Thu, 15 Sep 2005 14:23:32 +0000 Subject: [PATCH] (Almost) finished the 'custom triangle view control'... Well, actually it's just a workaround to intercept keystrokes... It still can't even catch arrow-keys, looks like I missed something... :-\ --- 2.10/Source/Adjust.dfm | 3 +- 2.10/Source/CustomDrawControl.pas | 62 +++++ 2.10/Source/Editor.dfm | 10 +- 2.10/Source/Editor.pas | 430 +++++++++++++----------------- 2.10/Source/Main.pas | 3 +- 5 files changed, 261 insertions(+), 247 deletions(-) create mode 100644 2.10/Source/CustomDrawControl.pas diff --git a/2.10/Source/Adjust.dfm b/2.10/Source/Adjust.dfm index c34d9ac..966736c 100644 --- a/2.10/Source/Adjust.dfm +++ b/2.10/Source/Adjust.dfm @@ -173,7 +173,7 @@ object AdjustForm: TAdjustForm Top = 133 Width = 390 Height = 131 - ActivePage = TabSheet3 + ActivePage = TabSheet1 Align = alBottom TabOrder = 1 object TabSheet1: TTabSheet @@ -450,6 +450,7 @@ object AdjustForm: TAdjustForm Top = 76 Width = 113 Height = 21 + Cursor = crHandPoint BevelOuter = bvLowered Color = clBlack TabOrder = 6 diff --git a/2.10/Source/CustomDrawControl.pas b/2.10/Source/CustomDrawControl.pas new file mode 100644 index 0000000..d7648ee --- /dev/null +++ b/2.10/Source/CustomDrawControl.pas @@ -0,0 +1,62 @@ +unit CustomDrawControl; + +interface + +uses + Classes, Controls, Messages, Windows, Graphics; + +type + TCustomDrawControl = class(TCustomControl) + private + FOnPaint: 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; + protected + + public + procedure Paint; override; + + property OnPaint: TNotifyEvent read FOnPaint write FOnPaint; + property Canvas; + + property OnDblClick; + property OnKeyDown; +// property OnKeyPress; +// property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; +// property OnMouseWheelDown; +// property OnMouseWheelUp; + property OnEnter; + property OnExit; + end; + +implementation + +procedure TCustomDrawControl.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +{ +procedure TCustomDrawControl.WMSetFocus(var Message: TWMSetFocus); +begin + Invalidate; +end; + +procedure TCustomDrawControl.WMKillFocus(var Message: TWMKillFocus); +begin + Invalidate; +end; +} + +procedure TCustomDrawControl.Paint; +begin + if Assigned(FOnPaint) then FOnPaint(Self); +end; + +end. diff --git a/2.10/Source/Editor.dfm b/2.10/Source/Editor.dfm index b9a5906..94bf8de 100644 --- a/2.10/Source/Editor.dfm +++ b/2.10/Source/Editor.dfm @@ -417,11 +417,9 @@ object EditForm: TEditForm Color = clBlack DropDownCount = 12 ItemHeight = 13 - TabOrder = 1 - TabStop = False + TabOrder = 0 OnChange = cbTransformsChange OnDrawItem = cbTransformsDrawItem - OnKeyDown = cbKeyDown end object PageControl: TPageControl Left = 1 @@ -432,7 +430,7 @@ object EditForm: TEditForm Align = alBottom Anchors = [akLeft, akTop, akRight, akBottom] MultiLine = True - TabOrder = 0 + TabOrder = 1 TabStop = False object TriangleTab: TTabSheet Caption = 'Triangle' @@ -1419,6 +1417,7 @@ object EditForm: TEditForm Top = 72 Width = 129 Height = 17 + Cursor = crHandPoint BevelOuter = bvLowered Color = clBlack TabOrder = 0 @@ -1448,6 +1447,7 @@ object EditForm: TEditForm Top = 152 Width = 129 Height = 17 + Cursor = crHandPoint BevelOuter = bvLowered Color = clGray TabOrder = 3 @@ -1458,6 +1458,7 @@ object EditForm: TEditForm Top = 112 Width = 62 Height = 17 + Cursor = crHandPoint BevelOuter = bvLowered Color = clBlack TabOrder = 4 @@ -1468,6 +1469,7 @@ object EditForm: TEditForm Top = 112 Width = 62 Height = 17 + Cursor = crHandPoint BevelOuter = bvLowered Color = clBlack TabOrder = 5 diff --git a/2.10/Source/Editor.pas b/2.10/Source/Editor.pas index 6bad2c4..554cd41 100644 --- a/2.10/Source/Editor.pas +++ b/2.10/Source/Editor.pas @@ -23,7 +23,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Math, Menus, ToolWin, Registry, MyTypes, - ControlPoint, Render, cmap, Grids, ValEdit, Buttons, ImgList, TriangleGraph; + ControlPoint, Render, cmap, Grids, ValEdit, Buttons, ImgList, CustomDrawControl; const // PixelCountMax = 32768; @@ -159,19 +159,22 @@ type procedure vleVariablesKeyPress(Sender: TObject; var Key: Char); procedure vleVariablesExit(Sender: TObject); procedure FormCreate(Sender: TObject); - procedure GraphImageMouseMove(Sender: TObject; Shift: TShiftState; X, + procedure TriangleViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer); - procedure GraphImageMouseDown(Sender: TObject; Button: TMouseButton; + procedure TriangleViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer); - procedure GraphImageMouseUp(Sender: TObject; Button: TMouseButton; + procedure TriangleViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer); + procedure TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState; + WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); + procedure TriangleViewDblClick(Sender: TObject); + procedure TriangleViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormShow(Sender: TObject); procedure mnuDeleteClick(Sender: TObject); procedure mnuAddClick(Sender: TObject); procedure mnuDupClick(Sender: TObject); procedure mnuAutoZoomClick(Sender: TObject); -// procedure mnuXFlipClick(Sender: TObject); -// procedure mnuYFlipClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure txtPKeyPress(Sender: TObject; var Key: Char); @@ -191,7 +194,6 @@ type procedure mnuHorizintalFlipAllClick(Sender: TObject); procedure mnuFlipVerticalClick(Sender: TObject); procedure mnuFlipHorizontalClick(Sender: TObject); - procedure GraphImageDblClick(Sender: TObject); procedure cbTransformsChange(Sender: TObject); procedure CoefKeyPress(Sender: TObject; var Key: Char); procedure CoefExit(Sender: TObject); @@ -206,14 +208,11 @@ type procedure txtXFormColorKeyPress(Sender: TObject; var Key: Char); procedure txtSymmetryExit(Sender: TObject); procedure txtSymmetryKeyPress(Sender: TObject; var Key: Char); + procedure VEVarsKeyPress(Sender: TObject; var Key: Char); procedure VEVarsExit(Sender: TObject); procedure VEVarsValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: String); -// procedure mnuRotateRightClick(Sender: TObject); -// procedure mnuRotateLeftClick(Sender: TObject); -// procedure mnuScaleUpClick(Sender: TObject); -// procedure mnuScaleDownClick(Sender: TObject); procedure btTrgRotateLeftClick(Sender: TObject); procedure btTrgRotateRightClick(Sender: TObject); @@ -226,15 +225,12 @@ type procedure btTrgMoveDownClick(Sender: TObject); procedure btTrgScaleUpClick(Sender: TObject); procedure btTrgScaleDownClick(Sender: TObject); - procedure editKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure splitterMoved(Sender: TObject); procedure tbSelectClick(Sender: TObject); procedure btTrgMoveLUClick(Sender: TObject); procedure btTrgMoveLDClick(Sender: TObject); procedure btTrgMoveRUClick(Sender: TObject); procedure btTrgMoveRDClick(Sender: TObject); - procedure editMouseWheel(Sender: TObject; Shift: TShiftState; - WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); procedure PreviewImageDblClick(Sender: TObject); procedure editKeyPress(Sender: TObject; var Key: Char); procedure rgPivotClicked(Sender: TObject); @@ -254,8 +250,6 @@ type procedure cbTransformsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); - procedure cbKeyDown(Sender: TObject; var Key: Word; - Shift: TShiftState); procedure tbFullViewClick(Sender: TObject); @@ -267,16 +261,15 @@ type Shift: TShiftState; X, Y: Integer); private - TriangleGraph: TTriangleGraph; - bm: TBitmap; + TriangleView: TCustomDrawControl; +// bm: TBitmap; cmap: TColorMap; // cp1: TControlPoint; PreviewDensity: double; // --Z-- - graphDragMode, dragged: boolean; + viewDragMode, viewDragged: boolean; editMode: (modeMove, modeRotate, modeScale); - key_handled: boolean; // hack... there must be a better way to do this :-\ MousePos: TPoint; // in screen coordinates mouseOverTriangle: integer; @@ -320,7 +313,7 @@ type // --Z-- functions moved from outside (?) procedure ShowSelectedInfo; - procedure Scale(var fx, fy: double; x, y, Width, Height: integer); + procedure Scale(var fx, fy: double; x, y: integer); procedure ReadjustWeights(var cp: TControlPoint); public @@ -331,7 +324,7 @@ type procedure UpdateDisplay(preview_only: boolean = false); procedure AutoZoom; - procedure DrawGraph; + procedure TriangleViewPaint(Sender: TObject); end; const @@ -369,11 +362,14 @@ var oldTriangle: TTriangle; gCenterX: double; gCentery: double; - gxlength: double; - gylength: double; {$R *.DFM} +procedure DrawGraph; +begin + EditForm.TriangleView.Invalidate; +end; + { Triangle transformations } function OffsetTriangleRandom(t: TTriangle): TTriangle; @@ -567,7 +563,6 @@ begin ShowSelectedInfo; AutoZoom; - DrawGraph; end; procedure TEditForm.DrawPreview; @@ -692,19 +687,20 @@ begin end; end; -procedure TEditForm.Scale(var fx, fy: double; x, y, Width, Height: integer); +procedure TEditForm.Scale(var fx, fy: double; x, y: integer); var sc: double; begin sc := 50 * GraphZoom; - fx := (x - (Width / 2)) / sc + gCenterX; - fy := -((y - (Height / 2)) / sc - gCentery); + fx := (x - (TriangleView.Width / 2)) / sc + gCenterX; + fy := -((y - (TriangleView.Height / 2)) / sc - gCentery); end; procedure TEditForm.AutoZoom; var i, j: integer; xminz, yminz, xmaxz, ymaxz: double; + gxlength, gylength: double; begin xminz := 0; yminz := 0; @@ -724,15 +720,18 @@ begin gylength := ymaxz - yminz; gCenterX := xminz + gxlength / 2; gCentery := yminz + gylength / 2; + if gxlength >= gylength then begin - GraphZoom := TriangleGraph.Width / 60 / gxlength; + GraphZoom := TriangleView.Width / 60 / gxlength; end else begin - GraphZoom := TriangleGraph.Height / 60 / gylength; + GraphZoom := TriangleView.Height / 60 / gylength; end; EditForm.StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]); + + TriangleView.Invalidate; end; procedure TEditForm.UpdateFlameX; @@ -757,7 +756,7 @@ begin if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms); DrawPreview; ShowSelectedInfo; - DrawGraph; + TriangleView.Refresh;; end; procedure TEditForm.UpdateFlame(DrawMain: boolean); @@ -768,7 +767,7 @@ begin if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms); DrawPreview; ShowSelectedInfo; - DrawGraph; + TriangleView.Invalidate; if DrawMain then begin MainForm.StopThread; MainCp.Copy(cp); @@ -916,35 +915,45 @@ begin else Result := clr[n mod 16]; end; -procedure TEditForm.DrawGraph; +procedure TEditForm.TriangleViewPaint(Sender: TObject); +var + ix, iy, sc: double; + + function ToScreen(fx, fy: double): TPoint; + begin + Result.x := integer(round(ix + (fx - gCenterX) * sc)); + Result.y := integer(round(iy - (fy - gCenterY) * sc)); + end; var i: integer; - ix, iy, sc: double; - ax, ay, bx, by, cx, cy: integer; + + ax, ay {, bx, by, cx, cy}: integer; + a, b, c: TPoint; + + BitMap: TBitMap; Width, Height: integer; -// BitMap: TBitMap; - // --Z-- + gridX1, gridX2, gridY1, gridY2, gi, gstep: double; gp: TRoundToRange; label DrawCorner; begin - // --Z-- hmmm: - if SelectedTriangle < 0 then SelectedTriangle := 0 - else if SelectedTriangle >= Transforms then SelectedTriangle := Transforms-1; + assert(SelectedTriangle >= 0); + assert(TCustomDrawControl(Sender) = TriangleView); + if SelectedTriangle >= Transforms then SelectedTriangle := Transforms-1; -// BitMap := TBitMap.Create; + BitMap := TBitMap.Create; + Width := TriangleView.Width; + Height := TriangleView.Height; + Bitmap.Width := Width; + Bitmap.Height := Height; + ix := Width / 2; + iy := Height / 2; + sc := 50 * GraphZoom; try - Width := TriangleGraph.Width; - Height := TriangleGraph.Height; -// BitMap.Width := Width; -// BitMap.Height := Height; - ix := Width / 2; - iy := Height / 2; - sc := 50 * GraphZoom; -// with Bitmap.canvas do - with TriangleGraph.Canvas do + with Bitmap.Canvas do begin brush.Color := pnlBackColor.Color; +//if not TriangleView.Focused then brush.Color := brush.Color xor $1f1f1f; FillRect(rect(0, 0, Width, Height)); Pen.Width := 1; @@ -996,6 +1005,7 @@ begin {Reference Triangle} Pen.Style := psDot; Pen.color := pnlReference.Color; +{ ax := integer(round(ix + (MainTriangles[-1].x[0] - gCenterX) * sc)); ay := integer(round(iy - (MainTriangles[-1].y[0] - gCenterY) * sc)); bx := integer(round(ix + (MainTriangles[-1].x[1] - gCenterX) * sc)); @@ -1003,62 +1013,47 @@ begin cx := integer(round(ix + (MainTriangles[-1].x[2] - gCenterX) * sc)); cy := integer(round(iy - (MainTriangles[-1].y[2] - gCenterY) * sc)); Polyline([Point(ax,ay), Point(bx,by), Point(cx,cy), Point(ax,ay)]); +} + 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(ax, ay, 'A'); - TextOut(bx, by, 'B'); - TextOut(cx, cy, 'C'); + TextOut(a.x, a.y, 'A'); + TextOut(b.x, b.y, 'B'); + TextOut(c.x, c.y, 'C'); Pen.Style := psSolid; {Transforms} for i := 0 to Transforms - 1 do begin +{ ax := integer(round(ix + (MainTriangles[i].x[0] - gCenterX) * sc)); ay := integer(round(iy - (MainTriangles[i].y[0] - gCenterY) * sc)); bx := integer(round(ix + (MainTriangles[i].x[1] - gCenterX) * sc)); by := integer(round(iy - (MainTriangles[i].y[1] - gCenterY) * sc)); cx := integer(round(ix + (MainTriangles[i].x[2] - gCenterX) * sc)); cy := integer(round(iy - (MainTriangles[i].y[2] - gCenterY) * sc)); -{ - TrgPoints[0].x := integer(round(ix + (MainTriangles[i].x[0] - gCenterX) * sc)); - TrgPoints[0].y := integer(round(iy - (MainTriangles[i].y[0] - gCenterY) * sc)); - TrgPoints[1].x := integer(round(ix + (MainTriangles[i].x[1] - gCenterX) * sc)); - TrgPoints[1].y := integer(round(iy - (MainTriangles[i].y[1] - gCenterY) * sc)); - TrgPoints[2].x := integer(round(ix + (MainTriangles[i].x[2] - gCenterX) * sc)); - TrgPoints[2].y := integer(round(iy - (MainTriangles[i].y[2] - gCenterY) * sc)); } - //brush.Color := pnlBackColor.Color; + a := ToScreen(MainTriangles[i].x[0], MainTriangles[i].y[0]); + b := ToScreen(MainTriangles[i].x[1], MainTriangles[i].y[1]); + c := ToScreen(MainTriangles[i].x[2], MainTriangles[i].y[2]); Pen.Color := GetTriangleColor(i); - if i <> SelectedTriangle then Pen.Style := psDot; - //MoveTo(ax, ay); LineTo(bx, by); LineTo(cx, cy); LineTo(ax, ay); - Polyline([Point(ax,ay), Point(bx,by), Point(cx,cy), Point(ax,ay)]); + Polyline([a, b, c, a]); Pen.Style := psSolid; - Ellipse(ax - 4, ay - 4, ax + 4, ay + 4); - Ellipse(bx - 4, by - 4, bx + 4, by + 4); - Ellipse(cx - 4, cy - 4, cx + 4, cy + 4); + Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); + Ellipse(b.x - 4, b.y - 4, b.x + 4, b.y + 4); + Ellipse(c.x - 4, c.y - 4, c.x + 4, c.y + 4); Font.color := Pen.color; - //brush.Color := pnlBackColor.Color; - TextOut(ax, ay, 'A'); - TextOut(bx, by, 'B'); - TextOut(cx, cy, 'C'); -{ - brush.style:=bsClear; - Font.color := pnlBackColor.Color; - font.style:=[fsBold]; - TextOut(ax+2, ay+2, 'A'); - TextOut(bx+2, by+2, 'B'); - TextOut(cx+2, cy+2, 'C'); - font.style:=[]; - - Font.color := Pen.color; - TextOut(ax+1, ay+1, 'A'); - TextOut(bx+1, by+1, 'B'); - TextOut(cx+1, cy+1, 'C'); -} + TextOut(a.x, a.y, 'A'); + TextOut(b.x, b.y, 'B'); + TextOut(c.x, c.y, 'C'); end; // if dragging, draw pivot axis @@ -1067,28 +1062,32 @@ 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)); - MoveTo(ax, 0); - LineTo(ax, Height); - MoveTo(0, ay); - LineTo(Width, ay); +// ax := integer(round(ix + (Pivot.x - gCenterX)*sc)); +// ay := integer(round(iy + (gCentery - Pivot.y)*sc)); + a := ToScreen(Pivot.x, Pivot.y); + MoveTo(a.x, 0); + LineTo(a.x, Height); + MoveTo(0, a.y); + LineTo(Width, a.y); Pen.Color := $707070; Pen.Style := psSolid; Pen.Mode := pmXor; if CornerCaught then begin - ax := integer(round(ix + (MainTriangles[SelectedTriangle].x[SelectedCorner] - gCenterX)*sc)); - ay := integer(round(iy - (MainTriangles[SelectedTriangle].y[SelectedCorner] - gCenterY)*sc)); +// 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)); +// ax := integer(round(ix + (GetPivot.x - gCenterX)*sc)); +// ay := integer(round(iy - (GetPivot.y - gCenterY)*sc)); + a := ToScreen(GetPivot.x, GetPivot.y); end; - MoveTo(ax, 0); - LineTo(ax, Height); - MoveTo(0, ay); - LineTo(Width, ay); + MoveTo(a.x, 0); + LineTo(a.x, Height); + MoveTo(0, a.y); + LineTo(Width, a.y); Pen.Mode := pmCopy; mouseOverTriangle := SelectedTriangle; @@ -1096,26 +1095,31 @@ begin if (mouseOverTriangle >= 0) then // highlight triangle under cursor begin +{ ax := integer(round(ix + (MainTriangles[mouseOverTriangle].x[0] - gCenterX) * sc)); ay := integer(round(iy - (MainTriangles[mouseOverTriangle].y[0] - gCenterY) * sc)); bx := integer(round(ix + (MainTriangles[mouseOverTriangle].x[1] - gCenterX) * sc)); by := integer(round(iy - (MainTriangles[mouseOverTriangle].y[1] - gCenterY) * sc)); cx := integer(round(ix + (MainTriangles[mouseOverTriangle].x[2] - gCenterX) * sc)); cy := integer(round(iy - (MainTriangles[mouseOverTriangle].y[2] - gCenterY) * sc)); -// Pen.Style:=psSolid; +} + a := ToScreen(MainTriangles[mouseOverTriangle].x[0], MainTriangles[mouseOverTriangle].y[0]); + b := ToScreen(MainTriangles[mouseOverTriangle].x[1], MainTriangles[mouseOverTriangle].y[1]); + c := ToScreen(MainTriangles[mouseOverTriangle].x[2], MainTriangles[mouseOverTriangle].y[2]); + pen.Width:=2; Pen.Color:=GetTriangleColor(mouseOverTriangle) shr 1 and $7f7f7f; - Pen.Mode:=pmMerge;//pmXor; + Pen.Mode:=pmMerge; brush.Color:=Pen.Color shr 1 and $7f7f7f; - //Polyline([Point(ax,ay), Point(bx,by), Point(cx,cy), Point(ax,ay)]); - Polygon([Point(ax,ay), Point(bx,by), Point(cx,cy)]); +// Polygon([Point(ax,ay), Point(bx,by), Point(cx,cy)]); + Polygon([a, b, c]); + pen.width:=4; - Ellipse(ax - 3, ay - 3, ax + 3, ay + 3); - Ellipse(bx - 3, by - 3, bx + 3, by + 3); - Ellipse(cx - 3, cy - 3, cx + 3, cy + 3); + Ellipse(a.x - 3, a.y - 3, a.x + 3, a.y + 3); + Ellipse(b.x - 3, b.y - 3, b.x + 3, b.y + 3); + Ellipse(c.x - 3, c.y - 3, c.x + 3, c.y + 3); pen.width:=1; pen.mode:=pmCopy; -// brush.Color := pen.Color; end; pen.color := clWhite; @@ -1128,7 +1132,6 @@ begin end else if (mouseOverTriangle>=0) and (mouseOverCorner >= 0) then // highlight corner under cursor begin -// brush.Color := GetTriangleColor(mouseOverTriangle) shr 1 and $7f7f7f; ax := integer(round(ix + (MainTriangles[mouseOverTriangle].x[mouseOverCorner] - gCenterX) * sc)); ay := integer(round(iy - (MainTriangles[mouseOverTriangle].y[mouseOverCorner] - gCenterY) * sc)); Ellipse(ax - 4, ay - 4, ax + 4, ay + 4); @@ -1141,19 +1144,11 @@ begin pen.Color:=clWhite; brush.Color:=clSilver; Ellipse(ax - 2, ay - 2, ax + 2, ay + 2); -{ - MoveTo(ax-3, ay); - LineTo(ax, ay-3); - LineTo(ax+3, ay); - LineTo(ax, ay+3); - LineTo(ax-3, ay); -} // -- end; -// GraphImage.Picture.Graphic := Bitmap; -// GraphImage.Refresh; + TriangleView.Canvas.Draw(0, 0, Bitmap); finally -// BitMap.Free; + BitMap.Free; end; end; @@ -1161,22 +1156,25 @@ procedure TEditForm.FormCreate(Sender: TObject); var i: integer; begin -// - TriangleGraph := TTriangleGraph.Create(self); - TriangleGraph.TabStop := True; - TriangleGraph.Parent := GrphPnl; - TriangleGraph.Align := alClient; - TriangleGraph.Visible := True; +// Custom control setup + TriangleView := TCustomDrawControl.Create(self); + TriangleView.TabStop := True; + TriangleView.TabOrder := 0; + TriangleView.Parent := GrphPnl; + TriangleView.Align := alClient; + TriangleView.Visible := True; - TriangleGraph.OnDblClick := GraphImageDblClick; - TriangleGraph.OnMouseDown := GraphImageMouseDown; - TriangleGraph.OnMouseMove := GraphImageMouseMove; - TriangleGraph.OnMouseUp := GraphImageMouseUp; - TriangleGraph.OnMouseWheel := EditMouseWheel; - TriangleGraph.OnKeyDown := EditKeyDown; + TriangleView.OnPaint := TriangleViewPaint; -// TriangleGraph.PopupMenu := EditPopup; -// TriangleGraph.OnPaint := + TriangleView.OnDblClick := TriangleViewDblClick; + TriangleView.OnMouseDown := TriangleViewMouseDown; + TriangleView.OnMouseMove := TriangleViewMouseMove; + TriangleView.OnMouseUp := TriangleViewMouseUp; + TriangleView.OnMouseWheel := TriangleViewMouseWheel; + TriangleView.OnKeyDown := TriangleViewKeyDown; + + TriangleView.OnEnter := rgPivotClicked; // hack: + TriangleView.OnExit := rgPivotClicked; // there's only Invalidate() in there :) // for i:= 0 to NRVAR - 1 do begin @@ -1187,7 +1185,7 @@ begin vleVariables.InsertRow(GetVariableNameAt(i), '0', True); end; - bm := TBitmap.Create; +// bm := TBitmap.Create; GraphZoom := 1; case EditPrevQual of @@ -1216,7 +1214,7 @@ begin VarsCache[i] := MinDouble; end; -procedure TEditForm.GraphImageMouseMove(Sender: TObject; Shift: TShiftState; +procedure TEditForm.TriangleViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer); var vx, vy, fx, fy: double; @@ -1226,7 +1224,7 @@ var d: double; label FoundCorner; begin - Scale(fx, fy, x, y, TriangleGraph.Width, TriangleGraph.Height); + Scale(fx, fy, x, y); // --Z-- StatusBar.Panels[0].Text := Format('X: %f', [fx]); StatusBar.Panels[1].Text := Format('Y: %f', [fy]); @@ -1265,16 +1263,16 @@ FoundCorner: if (mouseOverTriangle >= 0) and (SelectMode or (mouseOverTriangle = SelectedTriangle)) then - TriangleGraph.Cursor := crHandPoint + TriangleView.Cursor := crHandPoint else - TriangleGraph.Cursor := crArrow; + TriangleView.Cursor := crArrow; - if graphDragMode then // graph panning + if viewDragMode then // graph panning begin - dragged := true; + viewDragged := true; GcenterX := GcenterX - (fx - oldx); GcenterY := GcenterY - (fy - oldy); - DrawGraph; + TriangleView.Refresh; exit; end; @@ -1386,24 +1384,24 @@ FoundCorner: if (mouseOverTriangle >= 0) then StatusBar.Panels[2].Text := Format('Transform #%d', [mouseOverTriangle+1]) else StatusBar.Panels[2].Text := ''; - DrawGraph; + TriangleView.Refresh;; end end; -procedure TEditForm.GraphImageMouseDown(Sender: TObject; Button: TMouseButton; +procedure TEditForm.TriangleViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer); var d, fx, fy: double; i, j: integer; //label GotCorner; begin -// intoldx := x; -// intoldy := y; + TWinControl(Sender).SetFocus; + CornerCaught := False; TriangleCaught := False; - dragged := false; // --Z-- - Scale(fx, fy, x, y, TriangleGraph.Width, TriangleGraph.Height); - Shift := Shift - [ssLeft]; // --Z-- + viewDragged := false; + Scale(fx, fy, x, y); + Shift := Shift - [ssLeft]; if Button = mbLeft then begin if SelectMode = false then // Only change the selected triangle @@ -1424,7 +1422,7 @@ begin CornerCaught := True; DrawPreview; ShowSelectedInfo; - DrawGraph; + TriangleView.Invalidate; exit; // end; @@ -1449,7 +1447,7 @@ begin CornerCaught := True; DrawPreview; ShowSelectedInfo; - DrawGraph; + TriangleView.Invalidate; exit; end; end; @@ -1478,32 +1476,32 @@ begin DrawPreview; ShowSelectedInfo; - DrawGraph; + TriangleView.Invalidate; exit; end else if Button = mbRight then // graph panning begin - SetCaptureControl(TriangleGraph); + SetCaptureControl(TriangleView); Screen.Cursor := crSizeAll; - graphDragMode := true; + viewDragMode := true; oldx := fx; oldY := fy; end; end; -procedure TEditForm.GraphImageMouseUp(Sender: TObject; Button: TMouseButton; +procedure TEditForm.TriangleViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer); begin if Button = mbRight then // --Z-- panning begin - graphDragMode := false; - if dragged=false then // haven't dragged - popup menu then + viewDragMode := false; + if viewDragged=false then // haven't dragged - popup menu then begin GetCursorPos(mousepos); // hmmm EditPopup.Popup(mousepos.x, mousepos.y); end - else dragged := false; + else viewDragged := false; Screen.Cursor := crDefault; SetCaptureControl(nil); exit; @@ -1516,7 +1514,7 @@ begin UpdateFlame(true); HasChanged := False; end - else DrawGraph; + else TriangleView.Invalidate; end; { @@ -1670,6 +1668,7 @@ begin pnlGridColor1.Color := GridColor1; pnlGridColor2.Color := GridColor2; pnlReference.color := TColor(ReferenceTriangleColor); + UpdateDisplay; end; @@ -1723,27 +1722,7 @@ end; procedure TEditForm.mnuAutoZoomClick(Sender: TObject); begin AutoZoom; - DrawGraph; end; -{ -procedure TEditForm.mnuXFlipClick(Sender: TObject); -begin -// MainTriangles[SelectedTriangle] := FlipTriangleHorizontal(MainTriangles[SelectedTriangle]); - with MainTriangles[SelectedTriangle] do // --Z-- - begin - x[0] := GetPivot.x - x[0]; - x[1] := x[1]; - x[2] := x[2]; - end; - UpdateFlame(True); -end; - -procedure TEditForm.mnuYFlipClick(Sender: TObject); -begin - MainTriangles[SelectedTriangle] := FlipTriangleVertical(MainTriangles[SelectedTriangle]); - UpdateFlame(True); -end; -} procedure TEditForm.btnCloseClick(Sender: TObject); begin @@ -1753,7 +1732,6 @@ end; procedure TEditForm.FormResize(Sender: TObject); begin Autozoom; - DrawGraph; end; procedure TEditForm.CornerEditExit(Sender: TObject); @@ -1992,7 +1970,7 @@ end; procedure TEditForm.FormDestroy(Sender: TObject); begin - bm.free; +// bm.free; cp.free; Render.free; end; @@ -2104,17 +2082,16 @@ begin UpdateFlame(True); end; -procedure TEditForm.GraphImageDblClick(Sender: TObject); +procedure TEditForm.TriangleViewDblClick(Sender: TObject); begin AutoZoom; - DrawGraph; end; procedure TEditForm.cbTransformsChange(Sender: TObject); begin if SelectedTriangle <> cbTransforms.ItemIndex then SelectedTriangle := cbTransforms.ItemIndex; ShowSelectedInfo; - DrawGraph; + TriangleView.Invalidate; end; procedure TEditForm.cbTransformsDrawItem(Control: TWinControl; @@ -2304,13 +2281,13 @@ end; procedure TEditForm.chkUseXFormColorClick(Sender: TObject); begin UseTransformColors := chkUseXFormColor.checked; - DrawGraph; + TriangleView.Invalidate; end; procedure TEditForm.chkFlameBackClick(Sender: TObject); begin UseFlameBackground := chkFlameBack.checked; - DrawGraph; + TriangleView.Invalidate; end; procedure TEditForm.pnlBackColorClick(Sender: TObject); @@ -2321,7 +2298,7 @@ begin pnlBackColor.Color := AdjustForm.ColorDialog.Color; BackgroundColor := Integer(pnlBackColor.color); GrphPnl.Color := BackgroundColor; - DrawGraph; + TriangleView.Invalidate; end; end; @@ -2332,7 +2309,7 @@ begin begin pnlReference.Color := AdjustForm.ColorDialog.Color; ReferenceTriangleColor := Integer(pnlReference.color); - DrawGraph; + TriangleView.Invalidate; end; end; @@ -2343,7 +2320,7 @@ begin begin pnlGridColor1.Color := AdjustForm.ColorDialog.Color; GridColor1 := Integer(pnlGridColor1.color); - DrawGraph; + TriangleView.Invalidate; end; end; @@ -2354,7 +2331,7 @@ begin begin pnlGridColor2.Color := AdjustForm.ColorDialog.Color; GridColor2 := Integer(pnlGridColor2.color); - DrawGraph; + TriangleView.Invalidate; end; end; @@ -2772,11 +2749,10 @@ begin end; end; -procedure TEditForm.editKeyDown(Sender: TObject; var Key: Word; +procedure TEditForm.TriangleViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var coeff: double; -label goNext; begin if Shift = [ssShift] then coeff := 10 else if Shift = [ssCtrl] then coeff := 0.1 @@ -2784,47 +2760,36 @@ begin // if (PageControl.TabIndex <> 2) or // variations // (PageControl.TabIndex <> 3) then // variables - begin -// MainForm.UpdateUndo; - case key of - VK_LEFT: - if Shift = [ssAlt] then btTrgRotateLeftClick(Sender) - else TrgMove(-coeff,0); - VK_RIGHT: - if Shift = [ssAlt] then btTrgRotateRightClick(Sender) - else TrgMove(coeff,0); - VK_UP: - if Shift = [ssAlt] then btTrgScaleUpClick(Sender) - else TrgMove(0,coeff); - VK_DOWN: - if Shift = [ssAlt] then btTrgScaleDownClick(Sender) - else TrgMove(0,-coeff); - VK_PRIOR: btTrgRotateLeftClick(Sender); - VK_NEXT: btTrgRotateRightClick(Sender); - VK_HOME: btTrgScaleUpClick(Sender); - VK_END: btTrgScaleDownClick(Sender); - VK_INSERT: mnuDupClick(Sender); - VK_DELETE: {if Shift = [ssShift] then} mnuDeleteClick(Sender); - else goto goNext; - end; -// HasChanged := True; - key_handled:=true; - exit; - end; - -goNext: - case key of + VK_LEFT: + if Shift = [ssAlt] then btTrgRotateLeftClick(Sender) + else TrgMove(-coeff,0); + VK_RIGHT: + if Shift = [ssAlt] then btTrgRotateRightClick(Sender) + else TrgMove(coeff,0); + VK_UP: + if Shift = [ssAlt] then btTrgScaleUpClick(Sender) + else TrgMove(0,coeff); + VK_DOWN: + if Shift = [ssAlt] then btTrgScaleDownClick(Sender) + else TrgMove(0,-coeff); + VK_PRIOR: btTrgRotateLeftClick(Sender); + VK_NEXT: btTrgRotateRightClick(Sender); + VK_HOME: btTrgScaleUpClick(Sender); + VK_END: btTrgScaleDownClick(Sender); + VK_INSERT: mnuDupClick(Sender); + VK_DELETE: {if Shift = [ssShift] then} mnuDeleteClick(Sender); + VK_ADD: if SelectedTriangle < Transforms-1 then begin Inc(SelectedTriangle); - DrawGraph; + TriangleView.Invalidate; ShowSelectedInfo; end; VK_SUBTRACT: if SelectedTriangle > 0 then begin Dec(SelectedTriangle); - DrawGraph; + TriangleView.Invalidate; ShowSelectedInfo; end; VK_SPACE: EditForm.tbSelectClick(Sender); @@ -2844,11 +2809,9 @@ goNext: Ord('V'): EditForm.rgPivot.ItemIndex:=3; Ord('B'): EditForm.rgPivot.ItemIndex:=4; else - key_handled := false; exit; end; key := 0; - key_handled := true; end; procedure TEditForm.editKeyPress(Sender: TObject; var Key: Char); @@ -2881,14 +2844,14 @@ begin SetCursorPos(MousePos.x, MousePos.y); end; -procedure TEditForm.editMouseWheel(Sender: TObject; Shift: TShiftState; +procedure TEditForm.TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin if WheelDelta > 0 then GraphZoom := GraphZoom * 1.25 else GraphZoom := GraphZoom * 0.8; EditForm.StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]); - DrawGraph; + TriangleView.Invalidate; Handled := true; end; @@ -2902,17 +2865,9 @@ end; procedure TEditForm.rgPivotClicked(Sender: TObject); begin - DrawGraph; + TriangleView.Invalidate; end; -{ -procedure TEditForm.VEVarsSelectCell(Sender: TObject; ACol, ARow: Integer; - var CanSelect: Boolean); -begin - DrawGraph; -end; -} - procedure TEditForm.tbEditModeClick(Sender: TObject); begin if Sender = tbRotate then editMode := modeRotate @@ -3024,11 +2979,6 @@ begin } end; -procedure TEditForm.cbKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); -begin - key:=0; -end; - procedure TEditForm.tbFullViewClick(Sender: TObject); begin MainForm.mnuFullScreenClick(Sender); diff --git a/2.10/Source/Main.pas b/2.10/Source/Main.pas index 45550d4..55c3b60 100644 --- a/2.10/Source/Main.pas +++ b/2.10/Source/Main.pas @@ -2444,8 +2444,7 @@ end; procedure TMainForm.mnuAutoZoomClick(Sender: TObject); begin - EditForm.AutoZoom; - EditForm.DrawGraph; + EditForm.AutoZoom; // redraw included end; function GradTitle(str: string): string;