diff options
Diffstat (limited to 'vec2ddes.bmx')
-rw-r--r-- | vec2ddes.bmx | 209 |
1 files changed, 146 insertions, 63 deletions
diff --git a/vec2ddes.bmx b/vec2ddes.bmx index 2782d93..a63cd75 100644 --- a/vec2ddes.bmx +++ b/vec2ddes.bmx @@ -176,7 +176,7 @@ Type TDesLine Extends TDesObj EndIf SetColor(r,g,b) - DrawLine(p1.x*scale,p1.y*scale,p2.x*scale,p2.y*scale) + DrawLine(p1.lx()*scale,p1.ly()*scale,p2.lx()*scale,p2.ly()*scale) End Method Method DrawSelect() @@ -236,6 +236,8 @@ End Type Type TDesPoint Extends TDesObj Field x:Int Field y:Int + Field dx:Double + Field dy:Double Function Create:TDesObj(x:Int, y:Int) Local o:TDesPoint=New TDesPoint @@ -265,11 +267,11 @@ Type TDesPoint Extends TDesObj Method Draw(normals:Int) SetColor(255,255,255) - DrawRect(x*scale-1,y*scale-1,3,3) + DrawRect(lx()*scale-1,ly()*scale-1,3,3) End Method Method DrawSelect() - DrawSelBox(x,y) + DrawSelBox(lx(),ly()) End Method Method MouseOver:Int(x:Int, y:Int) @@ -284,6 +286,18 @@ Type TDesPoint Extends TDesObj EndIf End Method + Method DragDelta(x:Double, y:Double) + dx=x + dy=y + End Method + + Method CompleteDragDelta() + x=lx() + y=ly() + dx=0 + dy=0 + End Method + Method Edit() End Method @@ -295,6 +309,14 @@ Type TDesPoint Extends TDesObj x=CalcSnap(x) y=CalcSnap(y) End Method + + Method lx:Int() + Return x+dx + End Method + + Method ly:Int() + Return y+dy + End Method End Type ' **** Globals @@ -433,11 +455,18 @@ Function DoDesigner() Const DOT_TO_DOT_SNAP_MODE:Int=3 Const LINE_TO_LINE_MODE:Int=4 + Const DRAG_NONE:Int=0 + Const DRAG_SINGLE:Int=1 + Const DRAG_MULTI:Int=2 + Local sel:TDesObj=Null - Local drag:Int=False - Local sel1:TDesObj=Null + Local drag:Int=DRAG_NONE + Local sellist:TList=CreateList() Local mode:Int=NORMAL_MODE + Local dragx:Double + Local dragy:Double + While Not Designer.done Cls @@ -479,7 +508,7 @@ Function DoDesigner() Local x:Int=(MouseX()-GraphicsWidth()/2) Local y:Int=(MouseY()-GraphicsHeight()/2) - If Not drag + If drag=DRAG_NONE sel=Null EndIf @@ -493,116 +522,170 @@ Function DoDesigner() If sel<>Null sel.SetInfo(Designer.info) - sel.DrawSelect() Select mode Case LINE_MODE If IsPoint(sel) - If sel1=Null - sel1=sel + If sellist.Count()=0 + sellist.AddLast(sel) Else - If sel1<>sel + If sel<>sellist.ValueAtIndex(0) mode=NORMAL_MODE - Designer.obj.AddLast(TDesLine.Create(TDesPoint(sel1),TDesPoint(sel))) + Designer.obj.AddLast(TDesLine.Create(TDesPoint(sellist.ValueAtIndex(0)),TDesPoint(sel))) + sellist.Clear() EndIf EndIf EndIf Case LINE_TO_LINE_MODE If IsPoint(sel) - If sel1=Null - sel1=sel + If sellist.Count()=0 + sellist.AddLast(sel) Else - If sel1<>sel - Designer.obj.AddLast(TDesLine.Create(TDesPoint(sel1),TDesPoint(sel))) - sel1=sel + If sel<>sellist.ValueAtIndex(0) + Designer.obj.AddLast(TDesLine.Create(TDesPoint(sellist.ValueAtIndex(0)),TDesPoint(sel))) + sellist.Clear() EndIf EndIf EndIf + Case NORMAL_MODE + If KeyDown(KEY_LSHIFT) Or KeyDown(KEY_RSHIFT) + If IsPoint(sel) And Not sellist.Contains(sel) + sellist.AddLast(sel) + EndIf + Else + sellist.Clear() + sellist.AddLast(sel) + EndIf End Select + Else + If Not KeyDown(KEY_LSHIFT) And Not KeyDown(KEY_RSHIFT) + sellist.Clear() + EndIf EndIf - If drag + + For Local o:TDesObj=EachIn sellist + o.DrawSelect() + Next + + If drag=DRAG_SINGLE sel.Drag(x/scale,y/scale,True) + ElseIf drag=DRAG_MULTI + For Local o:TDesPoint=EachIn sellist + o.DragDelta((x-dragx)/scale,(y-dragy)/scale) + Next EndIf SetOrigin(0,0) ' ' **** END CENTRED - If Not drag And mode=NORMAL_MODE + If drag=DRAG_NONE And mode=NORMAL_MODE Designer.gui.EventLoop() EndIf If mode=NORMAL_MODE And KeyHit(KEY_MOUSERIGHT) - If sel<>Null - If IsPoint(sel) - Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) - Case 0 - sel.Snap() - Case 1 - Designer.obj.Remove(sel) + If sellist.Count()>0 + Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) + Case 0 + For Local o:TDesPoint=EachIn sellist + o.Snap() + Next + sellist.Clear() + Case 1 + For Local o:TDesPoint=EachIn sellist + Designer.obj.Remove(o) For Local d:TDesLine=EachIn Designer.obj - If d<>Null And (d.p1=sel Or d.p2=sel) + If d<>Null And (d.p1=o Or d.p2=o) Designer.obj.Remove(d) EndIf Next - End Select + Next + sellist.Clear() + EndSelect + Else + If sel<>Null + If IsPoint(sel) + Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) + Case 0 + sel.Snap() + Case 1 + Designer.obj.Remove(sel) + + For Local d:TDesLine=EachIn Designer.obj + If d<>Null And (d.p1=sel Or d.p2=sel) + Designer.obj.Remove(d) + EndIf + Next + End Select + Else + Local l:TDesLine=TDesLine(sel) + Select GUIMenu("Line Menu",["Edit","Snap to grid","Flip","Delete"],MouseX(),MouseY(),pointer) + Case 0 + l.Edit() + Case 1 + l.Snap() + Case 2 + l.FlipNormal() + Case 3 + Designer.obj.Remove(l) + End Select + EndIf Else - Local l:TDesLine=TDesLine(sel) - Select GUIMenu("Line Menu",["Edit","Snap to grid","Flip","Delete"],MouseX(),MouseY(),pointer) + Select GUIMenu("Create Menu",["Create Point","Create Line","Create Points","Create Points (Snapped)","Create Lines"],MouseX(),MouseY(),pointer) Case 0 - l.Edit() + Designer.obj.AddLast(TDesPoint.Create(x/scale,y/scale)) Case 1 - l.Snap() + sellist.Clear() + sel=Null + mode=LINE_MODE Case 2 - l.FlipNormal() + sellist.Clear() + sel=Null + mode=DOT_TO_DOT_MODE Case 3 - Designer.obj.Remove(l) + sellist.Clear() + sel=Null + mode=DOT_TO_DOT_SNAP_MODE + Case 4 + sellist.Clear() + sel=Null + mode=LINE_TO_LINE_MODE End Select - EndIf - Else - Select GUIMenu("Create Menu",["Create Point","Create Line","Create Points","Create Points (Snapped)","Create Lines"],MouseX(),MouseY(),pointer) - Case 0 - Designer.obj.AddLast(TDesPoint.Create(x/scale,y/scale)) - Case 1 - sel1=Null - sel=Null - mode=LINE_MODE - Case 2 - sel1=Null - sel=Null - mode=DOT_TO_DOT_MODE - Case 3 - sel1=Null - sel=Null - mode=DOT_TO_DOT_SNAP_MODE - Case 4 - sel1=Null - sel=Null - mode=LINE_TO_LINE_MODE - End Select + EndIf + sel=Null EndIf - sel=Null EndIf SetColor(255,255,255) Select mode Case NORMAL_MODE - If Not drag - If KeyDown(KEY_MOUSELEFT) And sel<>Null - mode=NORMAL_MODE - drag=True + If drag=DRAG_NONE + If KeyDown(KEY_MOUSELEFT) + If sel<>Null And Not KeyDown(KEY_LSHIFT) And Not KeyDown(KEY_RSHIFT) + drag=DRAG_SINGLE + ElseIf (KeyDown(KEY_LSHIFT) Or KeyDown(KEY_RSHIFT)) And sellist.Count()>0 + drag=DRAG_MULTI + dragx=x + dragy=y + EndIf EndIf Else If Not KeyDown(KEY_MOUSELEFT) - drag=False + If drag=DRAG_MULTI + For Local o:TDesPoint=EachIn sellist + o.CompleteDragDelta() + Next + EndIf + + drag=DRAG_NONE EndIf EndIf Case LINE_MODE - If Not sel1 + If sellist.Count()=0 Tip("Move to first point") Else Tip("Move to second point") @@ -624,7 +707,7 @@ Function DoDesigner() EndIf Case LINE_TO_LINE_MODE - If Not sel1 + If sellist.Count()=0 Tip("Move to first point") Else Tip("Move to next point") |