UPD: Creating menu toolbar buttons.

This commit is contained in:
cobines 2012-04-12 12:08:14 +00:00
commit 9ebbfccf78
4 changed files with 451 additions and 183 deletions

View file

@ -33,7 +33,7 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, ComCtrls,
Graphics, Dialogs, ExtCtrls, Buttons, FileUtil, Menus,
DCXmlConfig, KASToolItems, DCBasicTypes;
DCXmlConfig, KASToolItems;
type
TOnToolButtonClick = procedure (Sender: TObject) of object;
@ -48,17 +48,21 @@ type
TOnConfigLoadItem = function (Config: TXmlConfig; Node: TXmlNode): TKASToolItem of object;
TOnToolItemShortcutsHint = function (ToolItem: TKASNormalItem): String of object;
TKASToolBar = class;
{ TKASToolButton }
TKASToolButton = class(TSpeedButton)
strict private
FToolItem: TKASToolItem;
function GetToolBar: TKASToolBar;
protected
procedure CalculatePreferredSize(var PreferredWidth,
PreferredHeight: integer; WithThemeSpace: Boolean); override;
public
constructor Create(AOwner: TComponent; Item: TKASToolItem); reintroduce;
destructor Destroy; override;
property ToolBar: TKASToolBar read GetToolBar;
property ToolItem: TKASToolItem read FToolItem;
end;
@ -77,14 +81,16 @@ type
private
FButtonHeight: Integer;
FButtonWidth: Integer;
FRowHeight: Integer;
FUpdateCount: Integer;
FFlat: Boolean;
FGlyphSize: Integer;
FRadioToolBar: Boolean;
FRowHeight: Integer;
FShowDividerAsButton: Boolean;
FFlat: Boolean;
FToolPopupMenu: TPopupMenu;
FToolItemExecutors: TFPList;
FToolItems: TKASToolBarItems;
FToolPopupMenu: TPopupMenu;
FOwnsToolItems: Boolean;
FUpdateCount: Integer;
FOnToolButtonClick: TOnToolButtonClick;
FOnToolButtonMouseDown: TOnToolButtonMouseUpDown;
FOnToolButtonMouseUp: TOnToolButtonMouseUpDown;
@ -99,6 +105,7 @@ type
FResizeButtonsNeeded: Boolean;
procedure AssignToolButtonProperties(ToolButton: TKASToolButton);
procedure ClearExecutors;
function CreateButton(Item: TKASToolItem): TKASToolButton;
function DoExecuteToolItem(Item: TKASToolItem): Boolean;
function GetChangePath: String;
function GetEnvVar: String;
@ -143,12 +150,13 @@ type
procedure ClickItem(ToolItemID: String); overload;
function InsertButton(InsertAt: Integer; Item: TKASToolItem): TKASToolButton;
function InsertButton(InsertAt: TKASToolButton; Item: TKASToolItem): TKASToolButton;
procedure MoveButton(ButtonIndex, MovePosition: integer);
procedure MoveButton(ButtonIndex, MovePosition: Integer);
procedure RemoveButton(Index: Integer);
procedure RemoveButton(Button: TKASToolButton);
procedure RemoveToolItemExecutor(ExecuteFunction: TOnToolItemExecute);
procedure UncheckAllButtons;
procedure UpdateIcon(ToolButton: TKASToolButton);
procedure UseItems(AItems: TKASToolBarItems);
procedure LoadConfiguration(Config: TXmlConfig; RootNode: TXmlNode;
Loader: TKASToolBarLoader);
@ -217,8 +225,8 @@ begin
if InsertAt > ButtonList.Count then
InsertAt:= ButtonList.Count;
ToolButton.Parent:= Self;
ButtonList.Insert(InsertAt, ToolButton);
FToolItems.Insert(InsertAt, ToolButton.ToolItem);
UpdateButtonsTags;
ResizeButtons;
@ -614,14 +622,14 @@ begin
if FRadioToolBar and not Button.Down then
Button.Down := True;
if Button.ToolItem is TKASMenuItem then
if not DoExecuteToolItem(Button.ToolItem) then
begin
ShowMenu(Button);
end
else if not DoExecuteToolItem(Button.ToolItem) and
Assigned(FOnToolButtonClick) then
begin
FOnToolButtonClick(Button);
if Assigned(FOnToolButtonClick) then
FOnToolButtonClick(Button)
else if Button.ToolItem is TKASMenuItem then
begin
ShowMenu(Button);
end;
end;
end;
@ -671,9 +679,10 @@ begin
FOnToolButtonEndDrag(Sender, Target, X, Y);
end;
procedure TKASToolBar.MoveButton(ButtonIndex, MovePosition: integer);
procedure TKASToolBar.MoveButton(ButtonIndex, MovePosition: Integer);
begin
ButtonList.Move(ButtonIndex, MovePosition);
FToolItems.Move(ButtonIndex, MovePosition);
UpdateButtonsTags;
ResizeButtons;
end;
@ -706,6 +715,35 @@ begin
end;
end;
procedure TKASToolBar.UseItems(AItems: TKASToolBarItems);
var
i: Integer;
Button: TKASToolButton;
begin
if Assigned(AItems) then
begin
BeginUpdate;
Clear;
if FOwnsToolItems then
FToolItems.Free;
FToolItems := AItems;
FOwnsToolItems := False;
// Insert the existing items as buttons.
for i := 0 to FToolItems.Count - 1 do
begin
Button := CreateButton(FToolItems.Items[i]);
if Assigned(Button) then
ButtonList.Insert(ButtonCount, Button);
end;
UpdateButtonsTags;
ResizeButtons;
EndUpdate;
end;
end;
procedure TKASToolBar.Clear;
var
I: Integer;
@ -715,6 +753,8 @@ begin
for I := 0 to ButtonList.Count - 1 do
TKASToolButton(ButtonList.Items[I]).Free;
ButtonList.Clear;
if Assigned(FToolItems) then
FToolItems.Clear;
EndUpdate;
end;
@ -769,14 +809,56 @@ begin
FButtonHeight := 22;
FKASToolBarFlags := [];
FToolItemExecutors := TFPList.Create;
FToolItems := TKASToolBarItems.Create;
FOwnsToolItems := True;
end;
function TKASToolBar.CreateButton(Item: TKASToolItem): TKASToolButton;
begin
if Assigned(Item) then
begin
if FOwnsToolItems then
Item.SetToolOwner(Self);
if Item is TKASSeparatorItem then
begin
Result := TKASToolDivider.Create(Self, Item);
end
else
begin
Result := TKASToolButton.Create(Self, Item);
Result.ShowHint := True;
Result.Caption := Item.GetEffectiveText;
Result.Hint := Item.GetEffectiveHint;
end;
Result.Flat := FFlat;
if FRadioToolBar then
begin
Result.GroupIndex := 1;
Result.AllowAllUp := True;
end;
Result.ShowCaption := ShowCaptions;
UpdateIcon(Result);
AssignToolButtonProperties(Result);
Result.Parent := Self;
end
else
Result := nil;
end;
destructor TKASToolBar.Destroy;
begin
if not FOwnsToolItems then
FToolItems := nil; // Unassign before Clear so that items are not cleared.
Clear;
inherited Destroy;
ClearExecutors;
FToolItemExecutors.Free;
if FOwnsToolItems then
FToolItems.Free;
end;
function TKASToolBar.DoExecuteToolItem(Item: TKASToolItem): Boolean;
@ -841,35 +923,9 @@ end;
function TKASToolBar.InsertButton(InsertAt: Integer; Item: TKASToolItem): TKASToolButton;
begin
if Assigned(Item) then
begin
Item.SetToolOwner(Self);
if Item is TKASSeparatorItem then
begin
Result := TKASToolDivider.Create(Self, Item);
end
else
begin
Result := TKASToolButton.Create(Self, Item);
Result.ShowHint := True;
Result.Caption := Item.GetEffectiveText;
Result.Hint := Item.GetEffectiveHint;
end;
Result.Flat := FFlat;
if FRadioToolBar then
begin
Result.GroupIndex := 1;
Result.AllowAllUp := True;
end;
Result.ShowCaption := ShowCaptions;
UpdateIcon(Result);
AssignToolButtonProperties(Result);
Result := CreateButton(Item);
if Assigned(Result) then
InsertButton(InsertAt, Result);
end
else
Result := nil;
end;
procedure TKASToolBar.RemoveButton(Index: Integer);
@ -879,6 +935,7 @@ begin
Button := TKASToolButton(ButtonList.Items[Index]);
ButtonList.Delete(Index);
Button.Free;
FToolItems.Remove(Index);
UpdateButtonsTags;
Resize;
end;
@ -926,11 +983,9 @@ procedure TKASToolButton.CalculatePreferredSize(var PreferredWidth,
PreferredHeight: integer; WithThemeSpace: Boolean);
var
TextSize: TSize;
ToolBar: TKASToolBar;
begin
if Assigned(Parent) and (Parent is TKASToolBar) then
if Assigned(Parent) then
begin
ToolBar := TKASToolBar(Parent);
if ShowCaption and (Caption <> EmptyStr) then
begin
// Size to extent of the icon + caption.
@ -958,7 +1013,11 @@ end;
destructor TKASToolButton.Destroy;
begin
inherited Destroy;
FToolItem.Free;
end;
function TKASToolButton.GetToolBar: TKASToolBar;
begin
Result := Parent as TKASToolBar;
end;
{ TKASToolDivider }

View file

@ -138,6 +138,7 @@ type
function Add(Item: TKASToolItem): Integer;
procedure Clear;
function Insert(InsertAt: Integer; Item: TKASToolItem): Integer;
procedure Move(FromIndex, ToIndex: Integer);
procedure Remove(Index: Integer);
property Count: Integer read GetButtonCount;
property Items[Index: Integer]: TKASToolItem read GetButton write SetButton; default;
@ -490,6 +491,11 @@ begin
Result := InsertAt;
end;
procedure TKASToolBarItems.Move(FromIndex, ToIndex: Integer);
begin
FButtons.Move(FromIndex, ToIndex);
end;
function TKASToolBarItems.Add(Item: TKASToolItem): Integer;
begin
Result := FButtons.Add(Item);

View file

@ -142,33 +142,7 @@ inherited frmOptionsToolbar: TfrmOptionsToolbar
VertScrollBar.Page = 82
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6
ClientHeight = 82
ClientWidth = 834
TabOrder = 1
OnClick = sboxToolbarsClick
object ktbBar: TKASToolBar
Left = 1
Height = 24
Top = 0
Width = 832
AutoSize = True
BorderSpacing.Left = 1
BorderSpacing.Right = 1
Constraints.MinHeight = 24
TabOrder = 0
OnClick = ktbBarClick
OnToolItemShortcutsHint = ktbBarToolItemShortcutsHint
OnLoadButtonGlyph = ktbBarLoadButtonGlyph
OnToolButtonClick = ktbBarToolButtonClick
OnToolButtonMouseDown = ktbBarToolButtonMouseDown
OnToolButtonMouseUp = ktbBarToolButtonMouseUp
OnToolButtonMouseMove = ktbBarToolButtonMouseMove
OnToolButtonDragDrop = ktbBarToolButtonDragDrop
OnToolButtonDragOver = ktbBarToolButtonDragOver
RadioToolBar = True
GlyphSize = 16
ShowDividerAsButton = True
end
end
object pnlFullToolbarButtons: TPanel[2]
AnchorSideLeft.Control = Owner

View file

@ -31,7 +31,7 @@ uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, ExtCtrls, Buttons, fOptionsFrame, KASToolBar, KASToolItems,
uFormCommands, uHotkeyManager, DCBasicTypes,
fOptionsHotkeysEditHotkey;
fOptionsHotkeysEditHotkey, DCXmlConfig;
type
@ -53,7 +53,6 @@ type
edtToolTip: TEdit;
gbGroupBox: TGroupBox;
edtIconFileName: TEdit;
ktbBar: TKASToolBar;
lblInternalParameters: TLabel;
lblBarSize: TLabel;
lblBarSizeValue: TLabel;
@ -86,24 +85,21 @@ type
procedure cbInternalCommandSelect(Sender: TObject);
procedure cbFlatButtonsChange(Sender: TObject);
procedure edtIconFileNameChange(Sender: TObject);
procedure ktbBarClick(Sender: TObject);
function ktbBarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer;
function ToolbarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer;
clBackColor: TColor): TBitmap;
procedure ktbBarToolButtonClick(Sender: TObject);
procedure ktbBarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer;
NumberOfButton: Integer);
procedure ktbBarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer;
procedure ToolbarToolButtonClick(Sender: TObject);
procedure ToolbarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ToolbarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
procedure ktbBarToolButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
procedure ktbBarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
procedure ToolbarToolButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ToolbarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer; NumberOfButton: Integer);
procedure ktbBarToolButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
procedure ToolbarToolButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnOpenIconClick(Sender: TObject);
function ktbBarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
function ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
procedure rgToolItemTypeSelectionChanged(Sender: TObject);
procedure sboxToolbarsClick(Sender: TObject);
procedure trbBarSizeChange(Sender: TObject);
procedure trbIconSizeChange(Sender: TObject);
private
@ -111,12 +107,20 @@ type
FEditForm: TfrmEditHotkey;
FFormCommands: IFormCommands;
FToolButtonMouseX, FToolButtonMouseY, FToolDragButtonNumber: Integer; // For dragging
FUpdatingIconText: Boolean;
FUpdatingButtonType: Boolean;
FUpdatingIconText: Boolean;
function AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar;
procedure ApplyEditControls;
procedure CloseToolbarsBelowCurrentButton;
procedure CloseToolbar(Index: Integer);
function CreateToolbar(Items: TKASToolBarItems): TKASToolBar;
class function FindHotkey(NormalItem: TKASNormalItem; Hotkeys: THotkeys): THotkey;
class function FindHotkey(NormalItem: TKASNormalItem): THotkey;
function GetTopToolbar: TKASToolBar;
procedure LoadCurrentButton;
procedure LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode);
procedure MarkCurrentToolbar;
procedure PressButtonDown(Button: TKASToolButton);
procedure UpdateIcon(Icon: String);
protected
procedure Init; override;
@ -134,8 +138,8 @@ implementation
{$R *.lfm}
uses
LCLVersion,
DCStrUtils, uGlobs, uLng, DCXmlConfig, uOSForms, uDCUtils, uPixMapManager,
LCLVersion, Toolwin,
DCStrUtils, uGlobs, uLng, uOSForms, uDCUtils, uPixMapManager,
uKASToolItemsExtended,
fMain;
@ -165,7 +169,17 @@ begin
Result := rsOptionsEditorToolbar;
end;
function TfrmOptionsToolbar.GetTopToolbar: TKASToolBar;
begin
if sboxToolbars.ControlCount > 0 then
Result := sboxToolbars.Controls[0] as TKASToolBar
else
Result := nil;
end;
procedure TfrmOptionsToolbar.Init;
var
ToolBar: TKASToolBar;
begin
FFormCommands := frmMain as IFormCommands;
FFormCommands.GetCommandsList(cbInternalCommand.Items);
@ -179,12 +193,17 @@ begin
{$ELSE}
rgToolItemType.OnClick := @rgToolItemTypeSelectionChanged;
{$ENDIF}
ToolBar := CreateToolbar(nil);
if Assigned(ToolBar) then
// Put first one on top so that any other toolbars
// created before Show are put below it.
ToolBar.Top := 0;
end;
procedure TfrmOptionsToolbar.Load;
var
ToolBarLoader: TKASToolBarExtendedLoader;
ToolBarNode: TXmlNode;
ToolBar: TKASToolBar;
begin
trbBarSize.Position := gToolBarButtonSize div 2;
trbIconSize.Position := gToolBarIconSize div 2;
@ -193,21 +212,14 @@ begin
lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2);
lblIconSizeValue.Caption := IntToStr(trbIconSize.Position*2);
ktbBar.GlyphSize := gToolBarIconSize;
ktbBar.SetButtonSize(gToolBarButtonSize, gToolBarButtonSize);
ktbBar.Clear;
ToolBarLoader := TKASToolBarExtendedLoader.Create;
try
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False);
if Assigned(ToolBarNode) then
begin
ktbBar.LoadConfiguration(gConfig, ToolBarNode, ToolBarLoader);
if ktbBar.ButtonCount > 0 then
ktbBar.Buttons[0].Click;
end;
finally
ToolBarLoader.Free;
end;
FCurrentButton := nil;
CloseToolbarsBelowCurrentButton;
ToolBar := GetTopToolbar;
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False);
LoadToolbar(ToolBar, gConfig, ToolBarNode);
if ToolBar.ButtonCount > 0 then
PressButtonDown(ToolBar.Buttons[0]);
end;
procedure TfrmOptionsToolbar.LoadCurrentButton;
@ -226,6 +238,8 @@ begin
DisableAutoSizing;
try
CloseToolbarsBelowCurrentButton;
if Assigned(FCurrentButton) then
begin
ToolItem := FCurrentButton.ToolItem;
@ -264,7 +278,10 @@ begin
edtStartPath.Text := ProgramItem.StartPath;
end;
if ToolItem is TKASMenuItem then
begin
ButtonTypeIndex := 3;
AddNewSubToolbar(TKASMenuItem(ToolItem));
end;
end;
FUpdatingButtonType := True;
@ -294,13 +311,88 @@ begin
btnCloneButton.Visible := Assigned(FCurrentButton);
btnDeleteButton.Visible := Assigned(FCurrentButton);
rgToolItemType.Visible := Assigned(FCurrentButton);
MarkCurrentToolbar;
finally
EnableAutoSizing;
end;
end;
procedure TfrmOptionsToolbar.LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode);
var
ToolBarLoader: TKASToolBarExtendedLoader;
begin
ToolBarLoader := TKASToolBarExtendedLoader.Create;
try
if Assigned(RootNode) then
ToolBar.LoadConfiguration(Config, RootNode, ToolBarLoader);
finally
ToolBarLoader.Free;
end;
end;
procedure TfrmOptionsToolbar.MarkCurrentToolbar;
var
MarkToolBar, ToolBar, PrevToolBar: TKASToolBar;
i: Integer;
begin
if Assigned(FCurrentButton) then
MarkToolBar := FCurrentButton.ToolBar
else
MarkToolBar := GetTopToolbar;
if Assigned(MarkToolBar) then
begin
DisableAutoSizing;
try
PrevToolBar := nil;
for i := 0 to sboxToolbars.ControlCount - 1 do
begin
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
if ToolBar = MarkToolBar then
begin
if Assigned(PrevToolBar) then
begin
PrevToolBar.EdgeBorders := [ebBottom];
PrevToolBar.EdgeInner := esLowered;
PrevToolBar.EdgeOuter := esLowered;
end;
ToolBar.EdgeInner := esRaised;
ToolBar.EdgeOuter := esRaised;
ToolBar.EdgeBorders := [ebTop, ebBottom];
end
else if PrevToolBar = MarkToolBar then
begin
ToolBar.EdgeInner := esLowered;
ToolBar.EdgeOuter := esLowered;
ToolBar.EdgeBorders := [ebTop];
end
else
begin
ToolBar.EdgeInner := esNone;
ToolBar.EdgeOuter := esNone;
ToolBar.EdgeBorders := [];
end;
PrevToolBar := ToolBar;
end;
PrevToolBar.EdgeOuter := esRaised;
PrevToolBar.EdgeBorders := [ebBottom];
finally
EnableAutoSizing;
end;
end;
end;
procedure TfrmOptionsToolbar.PressButtonDown(Button: TKASToolButton);
begin
FUpdatingButtonType := True;
Button.Click;
FUpdatingButtonType := False;
end;
procedure TfrmOptionsToolbar.rgToolItemTypeSelectionChanged(Sender: TObject);
var
ToolBar: TKASToolBar;
ToolItem: TKASToolItem = nil;
NewButton: TKASToolButton;
begin
@ -314,12 +406,13 @@ begin
end;
if Assigned(ToolItem) then
begin
ToolBar := FCurrentButton.ToolBar;
// Copy what you can from previous button type.
ToolItem.Assign(FCurrentButton.ToolItem);
NewButton := ktbBar.InsertButton(FCurrentButton, ToolItem);
ktbBar.RemoveButton(FCurrentButton);
NewButton := ToolBar.InsertButton(FCurrentButton, ToolItem);
ToolBar.RemoveButton(FCurrentButton);
FCurrentButton := NewButton;
NewButton.Click;
PressButtonDown(NewButton);
end;
end;
end;
@ -327,6 +420,7 @@ end;
function TfrmOptionsToolbar.Save: TOptionsEditorSaveFlags;
var
ToolBarNode: TXmlNode;
ToolBar: TKASToolBar;
begin
ApplyEditControls;
@ -334,9 +428,13 @@ begin
gToolBarButtonSize := trbBarSize.Position * 2;
gToolBarIconSize := trbIconSize.Position * 2;
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', True);
gConfig.ClearNode(ToolBarNode);
ktbBar.SaveConfiguration(gConfig, ToolBarNode);
ToolBar := GetTopToolbar;
if Assigned(ToolBar) then
begin
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', True);
gConfig.ClearNode(ToolBarNode);
Toolbar.SaveConfiguration(gConfig, ToolBarNode);
end;
Result := [];
end;
@ -350,6 +448,41 @@ begin
edtIconFileName.Text := sFileName;
end;
function TfrmOptionsToolbar.CreateToolbar(Items: TKASToolBarItems): TKASToolBar;
begin
Result := TKASToolBar.Create(sboxToolbars);
Result.AutoSize := True;
Result.Constraints.MinHeight := 24;
Result.Flat := cbFlatButtons.Checked;
Result.GlyphSize := trbIconSize.Position * 2;
Result.RadioToolBar := True;
Result.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2);
Result.ShowDividerAsButton := True;
Result.OnLoadButtonGlyph := @ToolbarLoadButtonGlyph;
Result.OnToolButtonClick := @ToolbarToolButtonClick;
Result.OnToolButtonMouseDown := @ToolbarToolButtonMouseDown;
Result.OnToolButtonMouseUp := @ToolbarToolButtonMouseUp;
Result.OnToolButtonMouseMove := @ToolbarToolButtonMouseMove;
Result.OnToolButtonDragDrop := @ToolbarToolButtonDragDrop;
Result.OnToolButtonDragOver := @ToolbarToolButtonDragOver;
Result.OnToolItemShortcutsHint := @ToolbarToolItemShortcutsHint;
Result.BorderSpacing.Bottom := 2;
Result.EdgeInner := esNone;
Result.EdgeOuter := esNone;
Result.EdgeBorders := [];
Result.Top := MaxInt; // So that it is put under all existing toolbars (because of Align=alTop).
Result.UseItems(Items);
Result.Parent := sboxToolbars;
end;
function TfrmOptionsToolbar.AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar;
begin
Result := CreateToolbar(ToolItem.SubItems);
if Result.ButtonCount = 0 then
Result.AddButton(TKASCommandItem.Create);
end;
procedure TfrmOptionsToolbar.ApplyEditControls;
var
ToolItem: TKASToolItem;
@ -384,10 +517,22 @@ end;
(*Add new button on tool bar*)
procedure TfrmOptionsToolbar.btnInsertButtonClick(Sender: TObject);
var
ToolBar: TKASToolBar;
begin
ApplyEditControls;
FCurrentButton := ktbBar.InsertButton(FCurrentButton, TKASCommandItem.Create);
FCurrentButton.Click;
if Assigned(FCurrentButton) then
begin
ApplyEditControls;
ToolBar := FCurrentButton.ToolBar;
end
else
ToolBar := GetTopToolbar;
if Assigned(ToolBar) then
begin
FCurrentButton := ToolBar.InsertButton(FCurrentButton, TKASCommandItem.Create);
PressButtonDown(FCurrentButton);
end;
end;
procedure TfrmOptionsToolbar.btnRemoveHotKeyClick(Sender: TObject);
@ -425,29 +570,37 @@ var
SourceItem: TKASToolItem;
Button: TKASToolButton;
begin
ApplyEditControls;
SourceItem := FCurrentButton.ToolItem;
Button := ktbBar.InsertButton(FCurrentButton, SourceItem.Clone);
Button.Click;
if Assigned(FCurrentButton) then
begin
ApplyEditControls;
SourceItem := FCurrentButton.ToolItem;
Button := FCurrentButton.ToolBar.InsertButton(FCurrentButton, SourceItem.Clone);
PressButtonDown(Button);
end;
end;
(*Remove current button*)
procedure TfrmOptionsToolbar.btnDeleteButtonClick(Sender: TObject);
var
NextButton: Integer;
ToolBar: TKASToolBar;
begin
if Assigned(FCurrentButton) then
begin
ToolBar := FCurrentButton.ToolBar;
NextButton := FCurrentButton.Tag;
ktbBar.RemoveButton(FCurrentButton);
Toolbar.RemoveButton(FCurrentButton);
FCurrentButton := nil;
LoadCurrentButton;
if ktbBar.ButtonCount > 0 then
if Toolbar.ButtonCount > 0 then
begin
// Select next button or the last one.
if NextButton >= ktbBar.ButtonCount then
NextButton := ktbBar.ButtonCount - 1;
ktbBar.Buttons[NextButton].Click;
if NextButton >= Toolbar.ButtonCount then
NextButton := Toolbar.ButtonCount - 1;
PressButtonDown(Toolbar.Buttons[NextButton]);
end
else
begin
LoadCurrentButton;
end;
end;
end;
@ -522,9 +675,46 @@ begin
edtInternalParameters.HelpKeyword := '/cmds.html#' + Command;
end;
procedure TfrmOptionsToolbar.cbFlatButtonsChange(Sender: TObject);
procedure TfrmOptionsToolbar.CloseToolbarsBelowCurrentButton;
var
CloseFrom: Integer = 1;
i: Integer;
begin
ktbBar.Flat := cbFlatButtons.Checked;
if Assigned(FCurrentButton) then
begin
for i := 0 to sboxToolbars.ControlCount - 1 do
if sboxToolbars.Controls[i] = FCurrentButton.ToolBar then
begin
CloseFrom := i + 1;
Break;
end;
end;
for i := sboxToolbars.ControlCount - 1 downto CloseFrom do
CloseToolbar(i);
end;
procedure TfrmOptionsToolbar.CloseToolbar(Index: Integer);
var
ToolBar: TControl;
begin
if Index > 0 then
begin
ToolBar := sboxToolbars.Controls[Index];
sboxToolbars.RemoveControl(ToolBar);
RemoveComponent(ToolBar);
end;
end;
procedure TfrmOptionsToolbar.cbFlatButtonsChange(Sender: TObject);
var
i: Integer;
ToolBar: TKASToolBar;
begin
for i := 0 to sboxToolbars.ControlCount - 1 do
begin
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
ToolBar.Flat := cbFlatButtons.Checked;
end;
end;
procedure TfrmOptionsToolbar.edtIconFileNameChange(Sender: TObject);
@ -573,16 +763,40 @@ begin
end;
procedure TfrmOptionsToolbar.trbBarSizeChange(Sender: TObject);
var
ToolBar: TKASToolBar;
i: Integer;
begin
lblBarSizeValue.Caption:=IntToStr(trbBarSize.Position*2);
trbIconSize.Position:= trbBarSize.Position - (trbBarSize.Position div 5);
ktbBar.SetButtonSize(trbBarSize.Position*2,trbBarSize.Position*2);
DisableAutoSizing;
try
lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2);
trbIconSize.Position := trbBarSize.Position - (trbBarSize.Position div 5);
for i := 0 to sboxToolbars.ControlCount - 1 do
begin
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
ToolBar.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2);
end;
finally
EnableAutoSizing;
end;
end;
procedure TfrmOptionsToolbar.trbIconSizeChange(Sender: TObject);
var
ToolBar: TKASToolBar;
i: Integer;
begin
lblIconSizeValue.Caption := IntToStr(trbIconSize.Position*2);
ktbBar.GlyphSize := trbIconSize.Position*2;
DisableAutoSizing;
try
lblIconSizeValue.Caption := IntToStr(trbIconSize.Position * 2);
for i := 0 to sboxToolbars.ControlCount - 1 do
begin
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
ToolBar.GlyphSize := trbIconSize.Position * 2;
end;
finally
EnableAutoSizing;
end;
end;
procedure TfrmOptionsToolbar.UpdateIcon(Icon: String);
@ -596,16 +810,11 @@ begin
begin
NormalItem := TKASNormalItem(ToolItem);
NormalItem.Icon := Icon;
ktbBar.UpdateIcon(FCurrentButton);
FCurrentButton.ToolBar.UpdateIcon(FCurrentButton);
end;
end;
procedure TfrmOptionsToolbar.ktbBarClick(Sender: TObject);
begin
sboxToolbarsClick(Sender);
end;
function TfrmOptionsToolbar.ktbBarLoadButtonGlyph(ToolItem: TKASToolItem;
function TfrmOptionsToolbar.ToolbarLoadButtonGlyph(ToolItem: TKASToolItem;
iIconSize: Integer; clBackColor: TColor): TBitmap;
begin
if ToolItem is TKASSeparatorItem then // Paint 'separator' icon
@ -626,86 +835,106 @@ begin
end;
(*Select button on panel*)
procedure TfrmOptionsToolbar.ktbBarToolButtonClick(Sender: TObject);
procedure TfrmOptionsToolbar.ToolbarToolButtonClick(Sender: TObject);
var
ClickedButton: TKASToolButton;
begin
FCurrentButton := Sender as TKASToolButton;
ClickedButton := Sender as TKASToolButton;
if not FUpdatingButtonType then
ApplyEditControls;
if Assigned(FCurrentButton) then
begin
// If current toolbar has changed depress the previous button.
if FCurrentButton.ToolBar <> ClickedButton.ToolBar then
FCurrentButton.Down := False;
end;
FCurrentButton := ClickedButton;
LoadCurrentButton;
end;
(* Select button after it is dragged*)
procedure TfrmOptionsToolbar.ktbBarToolButtonDragDrop(Sender, Source: TObject;
X, Y: Integer; NumberOfButton: Integer);
procedure TfrmOptionsToolbar.ToolbarToolButtonDragDrop(Sender, Source: TObject;
X, Y: Integer);
begin
ktbBarToolButtonClick(Sender);
ToolbarToolButtonClick(Sender);
end;
(* Move button if it is dragged*)
procedure TfrmOptionsToolbar.ktbBarToolButtonDragOver(Sender, Source: TObject;
procedure TfrmOptionsToolbar.ToolbarToolButtonDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
var
SourceButton, TargetButton: TKASToolButton;
begin
if not (Source is TKASToolButton) then exit;
if (FToolDragButtonNumber <> (Sender as TKASToolButton).Tag) then
if Source is TKASToolButton then
begin
SourceButton := Source as TKASToolButton;
TargetButton := Sender as TKASToolButton;
// If moving on the same toolbar.
if SourceButton.ToolBar = TargetButton.ToolBar then
begin
ktbBar.MoveButton((Source as TKASToolButton).Tag, (Sender as TKASToolButton).Tag);
FToolDragButtonNumber := (Sender as TKASToolButton).Tag;
Accept:=True;
if FToolDragButtonNumber <> TargetButton.Tag then
begin
SourceButton.ToolBar.MoveButton(SourceButton.Tag, TargetButton.Tag);
FToolDragButtonNumber := TargetButton.Tag;
Accept := True;
end;
end;
end;
end;
(* Do not start drag in here, because oterwise button wouldn't be pushed down*)
procedure TfrmOptionsToolbar.ktbBarToolButtonMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer;
NumberOfButton: Integer);
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ApplyEditControls;
FToolButtonMouseX:=X;
FToolButtonMouseY:=Y;
FToolButtonMouseX := X;
FToolButtonMouseY := Y;
end;
(* Start dragging only if mbLeft if pressed and mouse moved.*)
procedure TfrmOptionsToolbar.ktbBarToolButtonMouseMove(Sender: TObject;
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
var
Button: TKASToolButton;
begin
if (ssLeft in Shift) and (FToolDragButtonNumber = -1) then
if (abs(FToolButtonMouseX-X)>10) or (abs(FToolButtonMouseY-Y)>10) then
begin
FToolDragButtonNumber:=NumberOfButton;
ktbBar.Buttons[NumberOfButton].BeginDrag(false,5);
end;
if Sender is TKASToolButton then
begin
if (ssLeft in Shift) and (FToolDragButtonNumber = -1) then
if (abs(FToolButtonMouseX-X)>10) or (abs(FToolButtonMouseY-Y)>10) then
begin
Button := TKASToolButton(Sender);
FToolDragButtonNumber := NumberOfButton;
Button.Toolbar.Buttons[NumberOfButton].BeginDrag(False, 5);
end;
end;
end;
(* End button drag*)
procedure TfrmOptionsToolbar.ktbBarToolButtonMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer;
NumberOfButton: Integer);
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FToolDragButtonNumber := -1;
end;
function TfrmOptionsToolbar.ktbBarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
function TfrmOptionsToolbar.ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
begin
Result := ShortcutsToText(GetShortcuts(ToolItem));
end;
// Deselect any selected button
procedure TfrmOptionsToolbar.sboxToolbarsClick(Sender: TObject);
begin
if Assigned(FCurrentButton) then
begin
ApplyEditControls;
if Assigned(FCurrentButton) then
FCurrentButton.Down := False;
FCurrentButton := nil;
LoadCurrentButton;
end;
end;
procedure TfrmOptionsToolbar.SelectButton(ButtonNumber: Integer);
var
ToolBar: TKASToolBar;
begin
if (ButtonNumber >= 0) and (ButtonNumber < ktbBar.ButtonCount) then
if sboxToolbars.ControlCount > 0 then
begin
FCurrentButton := ktbBar.Buttons[ButtonNumber];
FCurrentButton.Click;
ToolBar := sboxToolbars.Controls[0] as TKASToolBar;
if (ButtonNumber >= 0) and (ButtonNumber < Toolbar.ButtonCount) then
begin
FCurrentButton := Toolbar.Buttons[ButtonNumber];
PressButtonDown(FCurrentButton);
end;
end;
end;