mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
ui(main): fix DPI layout and theme switching
This commit is contained in:
+24
-12
@@ -32,9 +32,11 @@ type
|
||||
FItemBtns: array of TFlatButton;
|
||||
FItemIndex: Integer;
|
||||
FColumns: Integer;
|
||||
FItemBtnH: Integer;
|
||||
FItemBtnH96: Integer;
|
||||
FRightInset96: Integer;
|
||||
FIsOpen: Boolean;
|
||||
FStyleProc: TButtonStyleProc;
|
||||
FPanelColor: TColor;
|
||||
FOnSelect: TDropDownSelectEvent;
|
||||
procedure ItemClick(Sender: TObject);
|
||||
procedure PositionPopup;
|
||||
@@ -61,15 +63,17 @@ begin
|
||||
inherited Create;
|
||||
FAnchor := AAnchor;
|
||||
FPopupParent := APopupParent;
|
||||
FColumns := ACols;
|
||||
FItemBtnH := ABtnH;
|
||||
FColumns := Max(1, ACols);
|
||||
FItemBtnH96 := Max(1, ABtnH);
|
||||
FRightInset96 := Max(0, ARightInset96);
|
||||
FItemIndex := 0;
|
||||
FIsOpen := False;
|
||||
FStyleProc := nil;
|
||||
FPanelColor := TColor($00181818);
|
||||
FPopup := TPanel.Create(nil);
|
||||
FPopup.Parent := APopupParent;
|
||||
FPopup.BevelOuter := bvNone;
|
||||
FPopup.Color := TColor($00181818);
|
||||
FPopup.Color := FPanelColor;
|
||||
FPopup.Visible := False;
|
||||
end;
|
||||
|
||||
@@ -81,7 +85,7 @@ end;
|
||||
|
||||
procedure TFlatDropDown.SetItems(const ANames: array of string);
|
||||
var
|
||||
I, Count, BtnW, PopW: Integer;
|
||||
I, Count, BtnW, PopW, ItemBtnH, EdgePad, ItemGap: Integer;
|
||||
B: TFlatButton;
|
||||
begin
|
||||
while FPopup.ControlCount > 0 do
|
||||
@@ -93,17 +97,22 @@ begin
|
||||
// при каждом наполнении: SetItems бывает и до, и после DPI-scale формы.
|
||||
PopW := Max(1, FPopupParent.ClientWidth -
|
||||
FPopupParent.Scale96ToForm(FRightInset96));
|
||||
BtnW := (PopW - 4) div FColumns;
|
||||
ItemBtnH := FPopupParent.Scale96ToForm(FItemBtnH96);
|
||||
EdgePad := FPopupParent.Scale96ToForm(2);
|
||||
ItemGap := FPopupParent.Scale96ToForm(2);
|
||||
BtnW := Max(1, (PopW - 2 * EdgePad) div FColumns);
|
||||
FPopup.SetBounds(0, 0, PopW,
|
||||
((Count + FColumns - 1) div FColumns) * FItemBtnH);
|
||||
((Count + FColumns - 1) div FColumns) * ItemBtnH);
|
||||
for I := 0 to Count - 1 do
|
||||
begin
|
||||
B := MakeFlatBtn(FPopup, ANames[I],
|
||||
2 + (I mod FColumns) * BtnW,
|
||||
(I div FColumns) * FItemBtnH,
|
||||
BtnW - 2, FItemBtnH, @ItemClick);
|
||||
EdgePad + (I mod FColumns) * BtnW,
|
||||
(I div FColumns) * ItemBtnH,
|
||||
Max(1, BtnW - ItemGap), ItemBtnH, @ItemClick);
|
||||
B.Tag := I;
|
||||
B.Active := (I = FItemIndex);
|
||||
if Assigned(FStyleProc) then
|
||||
FStyleProc(B, B.Active);
|
||||
FItemBtns[I] := B;
|
||||
end;
|
||||
end;
|
||||
@@ -141,9 +150,10 @@ var
|
||||
begin
|
||||
P := FAnchor.ClientToScreen(Point(0, FAnchor.Height));
|
||||
P := FPopupParent.ScreenToClient(P);
|
||||
Y0 := P.Y + 2;
|
||||
Y0 := P.Y + FPopupParent.Scale96ToForm(2);
|
||||
if Y0 + FPopup.Height > FPopupParent.ClientHeight then
|
||||
Y0 := P.Y - FAnchor.Height - FPopup.Height - 2;
|
||||
Y0 := P.Y - FAnchor.Height - FPopup.Height -
|
||||
FPopupParent.Scale96ToForm(2);
|
||||
if Y0 < 0 then Y0 := 0;
|
||||
FPopup.Top := Y0;
|
||||
FPopup.Left := 0;
|
||||
@@ -173,6 +183,8 @@ procedure TFlatDropDown.ApplyStyle(AStyleProc: TButtonStyleProc; APanelColor: TC
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
FStyleProc := AStyleProc;
|
||||
FPanelColor := APanelColor;
|
||||
FPopup.Color := APanelColor;
|
||||
for I := 0 to High(FItemBtns) do
|
||||
if FItemBtns[I] <> nil then
|
||||
|
||||
Reference in New Issue
Block a user