Browse Source

handle focus, init bidi mode

Unknown 6 years ago
parent
commit
7fc9fad59f
2 changed files with 46 additions and 23 deletions
  1. 3 0
      vectoredit/umain.lfm
  2. 43 23
      vectoredit/umain.pas

+ 3 - 0
vectoredit/umain.lfm

@@ -24,6 +24,9 @@ object Form1: TForm1
     Color = clGray
     Color = clGray
     ParentColor = False
     ParentColor = False
     TabOrder = 0
     TabOrder = 0
+    TabStop = True
+    OnEnter = BGRAVirtualScreen1Enter
+    OnExit = BGRAVirtualScreen1Exit
     OnMouseDown = BGRAVirtualScreen1MouseDown
     OnMouseDown = BGRAVirtualScreen1MouseDown
     OnMouseMove = BGRAVirtualScreen1MouseMove
     OnMouseMove = BGRAVirtualScreen1MouseMove
     OnMouseUp = BGRAVirtualScreen1MouseUp
     OnMouseUp = BGRAVirtualScreen1MouseUp

+ 43 - 23
vectoredit/umain.pas

@@ -116,6 +116,8 @@ type
     UpDownPenWidth: TBCTrackbarUpdown;
     UpDownPenWidth: TBCTrackbarUpdown;
     procedure BCPanelToolbarResize(Sender: TObject);
     procedure BCPanelToolbarResize(Sender: TObject);
     procedure BCPanelToolChoiceResize(Sender: TObject);
     procedure BCPanelToolChoiceResize(Sender: TObject);
+    procedure BGRAVirtualScreen1Enter(Sender: TObject);
+    procedure BGRAVirtualScreen1Exit(Sender: TObject);
     procedure BGRAVirtualScreen1MouseWheel(Sender: TObject; {%H-}Shift: TShiftState;
     procedure BGRAVirtualScreen1MouseWheel(Sender: TObject; {%H-}Shift: TShiftState;
       WheelDelta: Integer; {%H-}MousePos: TPoint; var {%H-}Handled: Boolean);
       WheelDelta: Integer; {%H-}MousePos: TPoint; var {%H-}Handled: Boolean);
     procedure EditCopyExecute(Sender: TObject);
     procedure EditCopyExecute(Sender: TObject);
@@ -150,6 +152,8 @@ type
     procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
     procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
     procedure ToolButtonClick(Sender: TObject);
     procedure ToolButtonClick(Sender: TObject);
   private
   private
+    FSpecialKeyPressed: array[TSpecialKey] of boolean;
+
     FPenWidth: single;
     FPenWidth: single;
     FPenStyle: TBGRAPenStyle;
     FPenStyle: TBGRAPenStyle;
     FPenJoinStyle: TPenJoinStyle;
     FPenJoinStyle: TPenJoinStyle;
@@ -191,6 +195,7 @@ type
     procedure LoadVectorImages;
     procedure LoadVectorImages;
     procedure OnClickSplineStyleItem(ASender: TObject);
     procedure OnClickSplineStyleItem(ASender: TObject);
     procedure OnEditingChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
     procedure OnEditingChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
+    procedure OnEditorFocusChange(Sender: TObject);
     procedure OnOriginalChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
     procedure OnOriginalChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
     procedure OnPhongBorderSizeChange(Sender: TObject; AByUser: boolean);
     procedure OnPhongBorderSizeChange(Sender: TObject; AByUser: boolean);
     procedure OnPhongShapeAltitudeChange(Sender: TObject; AByUser: boolean);
     procedure OnPhongShapeAltitudeChange(Sender: TObject; AByUser: boolean);
@@ -342,6 +347,7 @@ begin
   img.LayerOriginalMatrix[vectorLayer] := AffineMatrixScale(1,1);
   img.LayerOriginalMatrix[vectorLayer] := AffineMatrixScale(1,1);
   vectorOriginal.OnSelectShape:= @OnSelectShape;
   vectorOriginal.OnSelectShape:= @OnSelectShape;
   img.OnOriginalEditingChange:= @OnEditingChange;
   img.OnOriginalEditingChange:= @OnEditingChange;
+  img.OnEditorFocusChanged:=@OnEditorFocusChange;
   img.OnOriginalChange:= @OnOriginalChange;
   img.OnOriginalChange:= @OnOriginalChange;
 
 
   zoom := AffineMatrixScale(1,1);
   zoom := AffineMatrixScale(1,1);
@@ -430,6 +436,7 @@ var
   cur: TOriginalEditorCursor;
   cur: TOriginalEditorCursor;
   handled: boolean;
   handled: boolean;
 begin
 begin
+  if not BGRAVirtualScreen1.Focused then BGRAVirtualScreen1.SetFocus;
   mouseState:= Shift;
   mouseState:= Shift;
   imgPtF := VirtualScreenToImgCoord(X,Y);
   imgPtF := VirtualScreenToImgCoord(X,Y);
   SetEditorGrid(ssCtrl in Shift);
   SetEditorGrid(ssCtrl in Shift);
@@ -565,6 +572,8 @@ begin
       vectorOriginal.OnSelectShape:= @OnSelectShape;
       vectorOriginal.OnSelectShape:= @OnSelectShape;
       img.OnOriginalEditingChange:= @OnEditingChange;
       img.OnOriginalEditingChange:= @OnEditingChange;
       img.OnOriginalChange:= @OnOriginalChange;
       img.OnOriginalChange:= @OnOriginalChange;
+      img.EditorFocused := BGRAVirtualScreen1.Focused;
+      img.OnEditorFocusChanged:=@OnEditorFocusChange;
       filename:= OpenDialog1.FileName;
       filename:= OpenDialog1.FileName;
       UpdateTitleBar;
       UpdateTitleBar;
       ImageChangesCompletely;
       ImageChangesCompletely;
@@ -632,6 +641,16 @@ begin
   BCPanelToolChoice.Width := ToolbarTools.Width+3;
   BCPanelToolChoice.Width := ToolbarTools.Width+3;
 end;
 end;
 
 
+procedure TForm1.BGRAVirtualScreen1Enter(Sender: TObject);
+begin
+  if Assigned(img) then img.EditorFocused:= true;
+end;
+
+procedure TForm1.BGRAVirtualScreen1Exit(Sender: TObject);
+begin
+  if Assigned(img) then img.EditorFocused:= false;
+end;
+
 procedure TForm1.BGRAVirtualScreen1MouseWheel(Sender: TObject;
 procedure TForm1.BGRAVirtualScreen1MouseWheel(Sender: TObject;
   Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
   Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
   var Handled: Boolean);
   var Handled: Boolean);
@@ -775,10 +794,13 @@ end;
 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
 var
 var
   AHandled: boolean;
   AHandled: boolean;
+  sk: TSpecialKey;
 begin
 begin
-  if Assigned(img) then
+  if Assigned(img) and img.EditorFocused then
   begin
   begin
-    img.KeyDown(Shift, LCLKeyToSpecialKey(Key, Shift), AHandled);
+    sk := LCLKeyToSpecialKey(Key, Shift);
+    FSpecialKeyPressed[sk] := true;
+    img.KeyDown(Shift, sk, AHandled);
     if AHandled then
     if AHandled then
     begin
     begin
       Key := 0;
       Key := 0;
@@ -811,10 +833,13 @@ end;
 procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
 procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
 var
 var
   AHandled: boolean;
   AHandled: boolean;
+  sk: TSpecialKey;
 begin
 begin
-  if Assigned(img) then
+  sk := LCLKeyToSpecialKey(Key, Shift);
+  if Assigned(img) and FSpecialKeyPressed[sk] then
   begin
   begin
-    img.KeyUp(Shift, LCLKeyToSpecialKey(Key, Shift), AHandled);
+    img.KeyUp(Shift, sk, AHandled);
+    FSpecialKeyPressed[sk] := false;
     if AHandled then
     if AHandled then
     begin
     begin
       Key:= 0;
       Key:= 0;
@@ -826,7 +851,7 @@ end;
 procedure TForm1.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
 procedure TForm1.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
 var AHandled: boolean;
 var AHandled: boolean;
 begin
 begin
-  if Assigned(img) then
+  if Assigned(img) and img.EditorFocused then
   begin
   begin
     img.KeyPress(UTF8Key, AHandled);
     img.KeyPress(UTF8Key, AHandled);
     if AHandled then
     if AHandled then
@@ -977,6 +1002,11 @@ begin
   UpdateView(EmptyRect);
   UpdateView(EmptyRect);
 end;
 end;
 
 
+procedure TForm1.OnEditorFocusChange(Sender: TObject);
+begin
+  UpdateView(EmptyRect);
+end;
+
 procedure TForm1.OnOriginalChange(ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
 procedure TForm1.OnOriginalChange(ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
 var
 var
   slowShape: boolean;
   slowShape: boolean;
@@ -1013,24 +1043,9 @@ begin
   if ASender <> vectorOriginal then exit;
   if ASender <> vectorOriginal then exit;
   UpdateToolbarFromShape(AShape);
   UpdateToolbarFromShape(AShape);
   case currentTool of
   case currentTool of
-    ptMoveBackFillPoint:
-    begin
-      if Assigned(AShape) and (vsuEditBackFill in AShape.Usermodes) and
-         AShape.BackFill.IsEditable then
-        AShape.Usermode:= vsuEditBackFill
-      else
-        currentTool:= ptHand;
-    end;
-    ptMovePenFillPoint:
-    begin
-      if Assigned(AShape) and (vsuEditPenFill in AShape.Usermodes) and
-         AShape.PenFill.IsEditable then
-        AShape.Usermode:= vsuEditPenFill
-      else
-        currentTool:= ptHand;
-    end;
+    ptMoveBackFillPoint: if AShape.Usermode <> vsuEditBackFill then currentTool := ptHand;
+    ptMovePenFillPoint: if AShape.Usermode <> vsuEditPenFill then currentTool := ptHand;
   end;
   end;
-
   UpdateShapeActions(AShape);
   UpdateShapeActions(AShape);
   RemoveShapeIfEmpty(APreviousShape);
   RemoveShapeIfEmpty(APreviousShape);
 end;
 end;
@@ -1529,7 +1544,12 @@ begin
       BorderSizePercent:= FPhongBorderSize;
       BorderSizePercent:= FPhongBorderSize;
     end;
     end;
   end;
   end;
-  if result is TTextShape then TTextShape(result).FontEmHeight:= FTextFontHeight;
+  if result is TTextShape then
+  begin
+    TTextShape(result).FontEmHeight:= FTextFontHeight;
+    TTextShape(result).FontBidiMode:= FTextDirection;
+    TTextShape(result).UserMode := vsuEditText;
+  end;
   result.QuickDefine(APoint1,APoint2);
   result.QuickDefine(APoint1,APoint2);
   if vsfBackFill in result.Fields then
   if vsfBackFill in result.Fields then
   begin
   begin