umac.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit UMac;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, Menus, Controls, Spin, ActnList;
  7. procedure CheckQuitMenu(MenuItem_Quit : TMenuItem;
  8. MenuItem_QuitSeparator : TMenuItem);
  9. procedure CheckOKCancelBtns(OKBtn: TControl);
  10. procedure CheckOKCancelBtns(OKBtn : TControl;
  11. CancelBtn : TControl);
  12. procedure CheckSpinEdit(SpinEdit: TSpinEdit);
  13. procedure CheckFloatSpinEdit(SpinEdit: TFloatSpinEdit);
  14. procedure CheckActions(List: TActionList);
  15. implementation
  16. uses LCLType;
  17. {$hints off}
  18. procedure CheckQuitMenu(MenuItem_Quit : TMenuItem;
  19. MenuItem_QuitSeparator : TMenuItem);
  20. begin
  21. end;
  22. {$hints on}
  23. {$hints off}
  24. procedure CheckOKCancelBtns(OKBtn: TControl);
  25. begin
  26. {$IFDEF DARWIN}
  27. OKBtn.BringToFront;
  28. {$ENDIF}
  29. end;
  30. procedure CheckOKCancelBtns(OKBtn : TControl;
  31. CancelBtn : TControl);
  32. {Swap OK and Cancel button positions on Mac.}
  33. {$IFDEF DARWIN}
  34. var
  35. Margin, MarginRight : Integer;
  36. {$ENDIF}
  37. begin
  38. {$IFDEF DARWIN}
  39. if OKBtn.Left < CancelBtn.Left then
  40. begin
  41. Margin := CancelBtn.Left - OKBtn.Left - OKBtn.Width;
  42. if OKBtn.Left < Margin then
  43. MarginRight := OKBtn.Left
  44. else
  45. MarginRight := Margin;
  46. OKBtn.Left := OkBtn.Parent.ClientWidth-MarginRight-OkBtn.Width;
  47. CancelBtn.Left := OkBtn.Left-Margin-CancelBtn.Width;
  48. OKBtn.Anchors := OKBtn.Anchors - [akLeft] + [akRight];
  49. CancelBtn.Anchors := CancelBtn.Anchors - [akLeft] + [akRight];
  50. end;
  51. {$ENDIF}
  52. end;
  53. {$hints on}
  54. {$IFDEF LINUX}
  55. type
  56. TSpinEditFix = class
  57. procedure SpinEdit_KeyPressFix(Sender: TObject; var Key: char);
  58. end;
  59. var
  60. SpinEditFix: TSpinEditFix;
  61. procedure TSpinEditFix.SpinEdit_KeyPressFix(Sender: TObject; var Key: char);
  62. var se: TSpinEdit;
  63. begin
  64. se := Sender as TSpinEdit;
  65. if (Key in ['1'..'9']) and (se.SelStart = 0) and (se.SelLength = length(se.Text)) then
  66. begin
  67. se.Value := ord(Key) - ord('0');
  68. se.SelStart := length(se.Text);
  69. se.SelLength:= 0;
  70. Key := #0;
  71. end;
  72. end;
  73. {$ENDIF}
  74. {$hints off}
  75. procedure CheckSpinEdit(SpinEdit: TSpinEdit);
  76. begin
  77. {$IFDEF DARWIN}
  78. SpinEdit.Left := SpinEdit.Left + 3;
  79. SpinEdit.Width := SpinEdit.Width - 4;
  80. {$ENDIF}
  81. {$IFDEF LINUX}
  82. if SpinEdit.OnKeyPress = nil then
  83. SpinEdit.OnKeyPress:= @SpinEditFix.SpinEdit_KeyPressFix;
  84. {$ENDIF}
  85. end;
  86. {$hints on}
  87. {$hints off}
  88. procedure CheckFloatSpinEdit(SpinEdit: TFloatSpinEdit);
  89. begin
  90. {$IFDEF DARWIN}
  91. SpinEdit.Left := SpinEdit.Left + 3;
  92. SpinEdit.Width := SpinEdit.Width - 4;
  93. {$ENDIF}
  94. end;
  95. {$hints on}
  96. {$hints off}
  97. procedure CheckActions(List: TActionList);
  98. {$IFDEF DARWIN}
  99. var i: integer;
  100. action: TAction;
  101. hasCmd: boolean;
  102. begin
  103. for i := 0 to List.ActionCount-1 do
  104. begin
  105. action := List.Actions[i] as TAction;
  106. hasCmd := (action.ShortCut and scCtrl) <> 0;
  107. if hasCmd then
  108. action.ShortCut := (action.ShortCut and not scCtrl) or scMeta;
  109. end;
  110. end;
  111. {$ELSE}
  112. begin
  113. end;
  114. {$ENDIF}
  115. {$hints on}
  116. initialization
  117. {$IFDEF LINUX}
  118. SpinEditFix := TSpinEditFix.Create;
  119. {$ENDIF}
  120. finalization
  121. {$IFDEF LINUX}
  122. SpinEditFix.Free;
  123. {$ENDIF}
  124. end.