ADD: Sort buttons on toolbar by drag&drop (patch by Fuhrer)

This commit is contained in:
Alexander Koblov 2011-02-14 05:36:40 +00:00
commit 5fa7490df0
3 changed files with 124 additions and 34 deletions

View file

@ -41,6 +41,7 @@ type
TOnToolButtonDragOver = procedure(Sender, Source: TObject; X,Y: Integer;
State: TDragState; var Accept: Boolean; NumberOfButton: Integer) of object;
TOnToolButtonDragDrop = procedure(Sender, Source: TObject; X,Y: Integer; NumberOfButton: Integer) of object;
TOnToolButtonEndDrag = procedure(Sender, Target: TObject; X,Y: Integer; NumberOfButton: Integer) of object;
TOnLoadButtonGlyph = function (sIconFileName: String; iIconSize: Integer; clBackColor: TColor): TBitmap of object;
{ TKASToolButton }
@ -79,6 +80,7 @@ type
FOnToolButtonMouseMove: TOnToolButtonMouseMove;
FOnToolButtonDragOver: TOnToolButtonDragOver;
FOnToolButtonDragDrop: TOnToolButtonDragDrop;
FOnToolButtonEndDrag: TOnToolButtonEndDrag;
FOnLoadButtonGlyph: TOnLoadButtonGlyph;
FKASToolBarFlags: TToolBarFlags;
FResizeButtonsNeeded: Boolean;
@ -100,6 +102,7 @@ type
procedure ToolButtonMouseMove(Sender: TObject; Shift:TShiftState; X,Y:Integer);
procedure ToolButtonDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
procedure ToolButtonDragDrop(Sender, Source: TObject; X,Y: Integer);
procedure ToolButtonEndDrag(Sender, Target: TObject; X, Y: Integer);
procedure UpdateButtonsTags;
protected
{ Protected declarations }
@ -128,6 +131,7 @@ type
procedure Clear;
procedure RemoveButton(Index: Integer);
procedure MoveButton(ButtonIndex, MovePosition: integer);
procedure UncheckAllButtons;
function GetButtonX(Index: Integer; What: TInfor): String;
@ -153,6 +157,7 @@ type
property OnToolButtonMouseUp: TOnToolButtonMouseUpDown read FOnToolButtonMouseUp write FOnToolButtonMouseUp;
property OnToolButtonMouseMove: TOnToolButtonMouseMove read FOnToolButtonMouseMove write FOnToolButtonMouseMove;
property OnToolButtonDragDrop: TOnToolButtonDragDrop read FOnToolButtonDragDrop write FOnToolButtonDragDrop;
property OnToolButtonEndDrag: TOnToolButtonEndDrag read FOnToolButtonEndDrag write FOnToolButtonEndDrag;
property OnToolButtonDragOver: TOnToolButtonDragOver read FOnToolButtonDragOver write FOnToolButtonDragOver;
property OnLoadButtonGlyph : TOnLoadButtonGlyph read FOnLoadButtonGlyph write FOnLoadButtonGlyph;
property RadioToolBar: Boolean read FRadioToolBar write FRadioToolBar default False;
@ -478,13 +483,39 @@ end;
procedure TKASToolBar.ToolButtonDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
begin
if Assigned(FOnToolButtonDragOver) then
FOnToolButtonDragOver(Sender, Source, X,Y, State, Accept, (Source as TSpeedButton).Tag);
FOnToolButtonDragOver(Sender, Source, X,Y, State, Accept, (Sender as TSpeedButton).Tag);
end;
procedure TKASToolBar.ToolButtonDragDrop(Sender, Source: TObject; X,Y: Integer);
begin
if Assigned(FOnToolButtonDragDrop) then
FOnToolButtonDragDrop(Sender, Source, X,Y, (Source as TSpeedButton).Tag)
FOnToolButtonDragDrop(Sender, Source, X,Y, (Sender as TSpeedButton).Tag)
end;
procedure TKASToolBar.ToolButtonEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
if Assigned(FOnToolButtonEndDrag) then
FOnToolButtonEndDrag(Sender, Target, X,Y, (Sender as TSpeedButton).Tag)
end;
procedure TKASToolBar.MoveButton(ButtonIndex, MovePosition: integer);
var
NewPosition: integer;
begin
if ButtonIndex > MovePosition then NewPosition:= MovePosition else NewPosition:= MovePosition + 1;
FBarFile.InsertButtonX(NewPosition, FBarFile.GetButtonX(ButtonIndex,ButtonX),
FBarFile.GetButtonX(ButtonIndex,CmdX),
FBarFile.GetButtonX(ButtonIndex,ParamX),
FBarFile.GetButtonX(ButtonIndex,PathX),
FBarFile.GetButtonX(ButtonIndex,MenuX),
FBarFile.GetButtonX(ButtonIndex,MiskX));
FBarFile.SetButtonX(NewPosition, IconicX, FBarFile.GetButtonX(ButtonIndex,IconicX)); // Because IconicX is not set in InsertButtonX
ButtonList.Move(ButtonIndex, MovePosition);
if ButtonIndex > MovePosition then
FBarFile.RemoveButton(ButtonIndex + 1)
else
FBarFile.RemoveButton(ButtonIndex);
UpdateButtonsTags;
end;
procedure TKASToolBar.UpdateButtonsTags;
@ -679,6 +710,7 @@ begin
ToolButton.OnMouseMove:= @ToolButtonMouseMove;
ToolButton.OnDragDrop:= @ToolButtonDragDrop;
ToolButton.OnDragOver:= @ToolButtonDragOver;
ToolButton.OnEndDrag:= @ToolButtonEndDrag;
ToolButton.Glyph.Assign(Bitmap);

View file

@ -494,6 +494,12 @@ object frmConfigToolBar: TfrmConfigToolBar
TabOrder = 0
OnClick = ktbBarClick
OnToolButtonClick = ktbBarToolButtonClick
OnToolButtonMouseDown = ktbBarToolButtonMouseDown
OnToolButtonMouseUp = ktbBarToolButtonMouseUp
OnToolButtonMouseMove = ktbBarToolButtonMouseMove
OnToolButtonDragDrop = ktbBarToolButtonDragDrop
OnToolButtonEndDrag = ktbBarToolButtonEndDrag
OnToolButtonDragOver = ktbBarToolButtonDragOver
OnLoadButtonGlyph = ktbBarLoadButtonGlyph
RadioToolBar = True
GlyphSize = 16

View file

@ -91,6 +91,18 @@ type
procedure ktbBarToolButtonClick(Sender: TObject; NumberOfButton : Integer);
procedure btnDeleteButtonClick(Sender: TObject);
procedure btnOpenFileClick(Sender: TObject);
procedure ktbBarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer;
NumberOfButton: Integer);
procedure ktbBarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
procedure ktbBarToolButtonEndDrag(Sender, Target: TObject; X, Y: Integer;
NumberOfButton: Integer);
procedure ktbBarToolButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
procedure ktbBarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer; NumberOfButton: Integer);
procedure ktbBarToolButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
procedure miAddSubBarClick(Sender: TObject);
procedure miAddSubMenuClick(Sender: TObject);
procedure sbIconExampleClick(Sender: TObject);
@ -102,11 +114,12 @@ type
FBarFileName: UTF8String;
LastToolButton : Integer;
DefaultEditBarsColor : TColor; // Because real color depends on compilation switches
ToolButtonMouseX, ToolButtonMouseY, ToolDragButtonNumber: integer; // For dragging
procedure FillActionLists;
procedure WakeSleepControls();
procedure ClearControls;
procedure LoadButton(NumberOfButton: Integer);
procedure CopyButton(SourceButton, DestinationButton: Integer);
procedure Save;
function GetSelectedButton: Integer;
procedure InsertButton(InsertAt: Integer);
@ -177,34 +190,20 @@ begin
finally
FreeThenNil(IniBarFile);
end;
with pnlToolBarFileName do
begin
Caption:= MinimizeFilePath(FBarFileName, Canvas, Width);
Hint:= FBarFileName;
end;
if ktbBar.Tag >= 0 then
begin
ktbBar.Buttons[ktbBar.Tag].Click;
ktbBar.Buttons[ktbBar.Tag].Down := True;
end;
// Next section is commented and should be deleted.
// The reason is this: user does not need to have
// any buttons selected if he has just opened the dialog.
// If user wants to have have some button selected,
// he just edits that button.
// This text should also be deleted.
//
//else
// begin
// if ktbBar.ButtonCount > 0 then
// begin
// ktbBar.Buttons[ktbBar.ButtonCount-1].Down := True;
// LoadButton(ktbBar.ButtonCount-1);
// LastToolButton := ktbBar.ButtonCount-1;
// end;
// end;
ToolDragButtonNumber := -1;
WakeSleepControls;
ktbBar.GlyphSize := trbIconSize.Position*2;
ktbBar.SetButtonSize(trbBarSize.Position*2,trbBarSize.Position*2);
@ -214,7 +213,7 @@ end;
procedure TfrmConfigToolBar.cbFlatButtonsChange(Sender: TObject);
begin
// ktbBar.Flat := cbFlatButtons.Checked;
end;
procedure TfrmConfigToolBar.cbIsSeparatorChange(Sender: TObject);
@ -296,13 +295,11 @@ begin
SelectedIndex := GetSelectedButton;
if SelectedIndex > -1 then
begin
Save; // Save currently selected button
LastToolButton := ktbBar.InsertButtonX(SelectedIndex, '', '', '', '', '', '', '');
ktbBar.SetButtonX(LastToolButton, ButtonX, kedtIconFileName.Text);
Save; // Save newly created button
LastToolButton := LastToolButton + 1;
ktbBar.Buttons[LastToolButton].Down := True;
end;
Save;
CopyButton(SelectedIndex,SelectedIndex);
LastToolButton := LastToolButton + 1;
ktbBar.Buttons[LastToolButton].Down := True;
end;
end;
procedure TfrmConfigToolBar.btnHelpClick(Sender: TObject);
@ -355,7 +352,6 @@ end;
(*Select button on panel*)
procedure TfrmConfigToolBar.ktbBarToolButtonClick(Sender: TObject; NumberOfButton : Integer);
begin
Save;
LoadButton(NumberOfButton);
ktbBar.Buttons[NumberOfButton].Down:=True;
LastToolButton := NumberOfButton;
@ -420,19 +416,26 @@ end;
procedure TfrmConfigToolBar.LoadButton(NumberOfButton: Integer);
begin
// cbCommand.Text := ktbBar.Commands[NumberOfButton];
cbCommand.Text := ktbBar.GetButtonX(NumberOfButton,CmdX);
// kedtIconFileName.Text := ktbBar.Icons[NumberOfButton];
kedtIconFileName.Text := ktbBar.GetButtonX(NumberOfButton,ButtonX);
// edtToolTip.Text := ktbBar.Buttons[NumberOfButton].Hint;
edtToolTip.Text := ktbBar.GetButtonX(NumberOfButton,MenuX);
sbIconExample.Glyph := ktbBar.Buttons[NumberOfButton].Glyph;
edtParams.Text:= ktbBar.GetButtonX(NumberOfButton,ParamX);
edtStartPath.Text:= ktbBar.GetButtonX(NumberOfButton,PathX);
end;
procedure TfrmConfigToolBar.CopyButton(SourceButton, DestinationButton: Integer);
begin
ktbBar.InsertButtonX(DestinationButton,
'',
ktbBar.GetButtonX(SourceButton,CmdX),
ktbBar.GetButtonX(SourceButton,ParamX),
ktbBar.GetButtonX(SourceButton,PathX),
ktbBar.GetButtonX(SourceButton,MenuX),
ktbBar.GetButtonX(SourceButton,MiskX),
ktbBar.GetButtonX(SourceButton,ButtonX));
end;
(*Save current button*)
procedure TfrmConfigToolBar.Save;
begin
@ -493,6 +496,55 @@ begin
end;
end;
procedure TfrmConfigToolBar.ktbBarToolButtonDragDrop(Sender, Source: TObject;
X, Y: Integer; NumberOfButton: Integer);
begin
ktbBar.MoveButton((Source as TSpeedButton).Tag, (Sender as TSpeedButton).Tag);
tbScrollBoxClick(Sender);
ktbBarToolButtonClick(Sender, NumberOfButton)
end;
procedure TfrmConfigToolBar.ktbBarToolButtonDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
begin
// Some type checks to be here
if ((Sender as TSpeedButton).Tag) <> ((Source as TSpeedButton).Tag) then
Accept:=True;
end;
procedure TfrmConfigToolBar.ktbBarToolButtonEndDrag(Sender, Target: TObject; X,
Y: Integer; NumberOfButton: Integer);
begin
end;
procedure TfrmConfigToolBar.ktbBarToolButtonMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer;
NumberOfButton: Integer);
begin
Save;
ToolButtonMouseX:=X;
ToolButtonMouseY:=Y;
end;
procedure TfrmConfigToolBar.ktbBarToolButtonMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
begin
if (ssLeft in Shift) and (ToolDragButtonNumber = -1) then
if (abs(ToolButtonMouseX-X)>10) or (abs(ToolButtonMouseY-Y)>10) then
begin
ToolDragButtonNumber:=NumberOfButton;
ktbBar.Buttons[NumberOfButton].BeginDrag(false,5);
end;
end;
procedure TfrmConfigToolBar.ktbBarToolButtonMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer;
NumberOfButton: Integer);
begin
ToolDragButtonNumber := -1;
end;
procedure TfrmConfigToolBar.miAddSubBarClick(Sender: TObject);
var
sFileName: UTF8String;