From 80d41a2e594b1b360c3c036cae5e5a4838bac84e Mon Sep 17 00:00:00 2001 From: Thimo Braker Date: Thu, 9 Nov 2017 21:21:00 +0100 Subject: [PATCH 1/2] Adds creation of flags and nodes via double-click and Drag&Drop --- Utils/Campaign builder/Unit1.dfm | 134 ++++++++++++++++++++++++++++++- Utils/Campaign builder/Unit1.pas | 89 ++++++++++++++++++++ 2 files changed, 219 insertions(+), 4 deletions(-) diff --git a/Utils/Campaign builder/Unit1.dfm b/Utils/Campaign builder/Unit1.dfm index dbc7630e7e..711aca46af 100644 --- a/Utils/Campaign builder/Unit1.dfm +++ b/Utils/Campaign builder/Unit1.dfm @@ -56,6 +56,12 @@ object Form1: TForm1 Width = 154 Height = 2 end + object Bevel3: TBevel + Left = 8 + Top = 496 + Width = 154 + Height = 2 + end object tvList: TTreeView Left = 8 Top = 128 @@ -131,8 +137,6 @@ object Form1: TForm1 item Width = 200 end> - ExplicitTop = 447 - ExplicitWidth = 689 end object ScrollBox1: TScrollBox Left = 168 @@ -141,14 +145,14 @@ object Form1: TForm1 Height = 777 Anchors = [akLeft, akTop, akRight, akBottom] TabOrder = 7 - ExplicitWidth = 513 - ExplicitHeight = 426 object Image1: TImage Left = 0 Top = 0 Width = 1024 Height = 768 Stretch = True + OnDragDrop = Image1DragDrop + OnDragOver = Image1DragOver end object imgBlackFlag: TImage Left = 0 @@ -386,6 +390,128 @@ object Form1: TForm1 TabOrder = 10 OnClick = cbShowNodeNumbersClick end + object GroupBox1: TGroupBox + Left = 8 + Top = 512 + Width = 154 + Height = 77 + Hint = 'Double click to quick-add'#13#10'Drag&Drop to add to mouse position.' + Caption = 'New chart objects' + ParentShowHint = False + ShowHint = True + TabOrder = 11 + object imgNewFlag: TImage + Left = 18 + Top = 26 + Width = 23 + Height = 29 + Hint = 'New Flag' + AutoSize = True + ParentShowHint = False + Picture.Data = { + 07544269746D61705E080000424D5E0800000000000036000000280000001700 + 00001D0000000100180000000000280800000000000000000000000000000000 + 00002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B35566D + 372B2C35566D2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF + 2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2B + FF2B2BFF2B37393D355757372B2C15234535566D2BFF2B2BFF2B2BFF2B2BFF2B + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF + 2B2BFF2B2BFF2B2BFF2B2BFF2B37393D344C3B0012090C0E1E0C0E1E35566D2B + FF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B35566D0C0E1E3557570C0E1E0C0E + 1E0C0E1E0C0E1E0C0E1E15234535566D2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B00 + 00002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B1523450C0E1E372B2C + 3864570012090C0E1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E35566D2BFF + 2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B35 + 566D0C0E1E37393D3557570012090C0E1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E + 0C0E1E15234535566D2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF + 2B2BFF2B2BFF2B2BFF2B152345372B2C1F616D0012090C0E1E0C0E1E0C0E1E0C + 0E1E0C0E1E0C0E1E0C0E1E15234515234535566D2BFF2B0000002BFF2B2BFF2B + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B35566D372B2C1F616D0012090C0E + 1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E0C0E1E15234515234535566D00 + 00002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B372B2C + 344C3B00120935566D35566D35566D35566D35566D35566D35566D35566D3556 + 6D35566D35566D0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2B + FF2B2BFF2B0012090012090012092BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B2BFF2B2BFF + 2B2BFF2B355757001209001209001209001209001209372B2C3557572BFF2B2B + FF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B + 2BFF2B2BFF2B355757001209372B2C002B7B002B7B002B7B002B7B002B7B002B + 7B372B2C0012090012093557572BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B00 + 00002BFF2B2BFF2B2BFF2B355757372B2C002B7B002B7B002B7B002B7B002B7B + 002B7B002B7B002B7B002B7B002B7B002B7B372B2C3557572BFF2B2BFF2B2BFF + 2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B001209002B7B00338B002B7B00 + 276B002B7B00338B002B7B002B7B00276B002B7B002B7B002B7B002B7B001209 + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B0012090033 + 8B00338B00276B002B7B00338B00338B002B7B00276B00276B00338B002B7B00 + 2B7B002B7B0012092BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B + 35575737393D00338B00338B00276B00338B00338B002B7B00276B00276B002B + 7B002B7B00338B002B7B002B7B0012092BFF2B2BFF2B2BFF2B2BFF2B2BFF2B00 + 00002BFF2B2BFF2B372B2C002B7B002B7B00338B002B7B00338B002B7B002B7B + 002B7B002B7B002B7B002B7B00338B00338B002B7B37393D3557572BFF2B2BFF + 2B2BFF2B2BFF2B0000002BFF2B2BFF2B00120900379B002B7B002B7B002B7B00 + 338B00276B002B7B00338B00379B00338B00338B002B7B00338B002B7B002B7B + 0012092BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B00120900379B0033 + 8B002B7B002B7B002B7B00276B002B7B002B7B00338B003FAF003FAF00338B00 + 2B7B00338B002B7B0012092BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B + 00120900379B00338B002B7B002B7B00276B00276B002B7B002B7B002B7B0033 + 8B00379B003FAF00379B002B7B002B7B372B2C2BFF2B2BFF2B2BFF2B2BFF2B00 + 00002BFF2B2BFF2B00120900338B00338B002B7B00276B00276B002B7B002B7B + 00338B00379B00338B002B7B00379B003FAF00338B002B7B372B2C2BFF2B2BFF + 2B2BFF2B2BFF2B0000002BFF2B2BFF2B00120900379B00338B00276B00276B00 + 276B0D2F430D2F430D2F430D2F43002B7B00379B00338B00379B003FAF00338B + 372B2C2BFF2B2BFF2B2BFF2B2BFF2B0000002BFF2B2BFF2B372B2C00379B002B + 7B00276B0D2F430D2F432BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0D2F430D2F4300 + 2B7B00379B00379B372B2C2BFF2B2BFF2B2BFF2B2BFF2B000000355757001209 + 001209002B7B0D2F431C56540012092BFF2B2BFF2B37393D37393D0012092BFF + 2B2BFF2B1C56540012090D2F4300338B0012090012093557572BFF2B2BFF2B00 + 0000001209344C3B001209001209001209001209001209001209001209001209 + 001209001209001209001209001209001209001209001209001209344C3B0012 + 092BFF2B2BFF2B0000000012093557571F616D1F616D3274781F616D1F616D32 + 74783274781F616D3557573A4E603274781F616D3A4E603274781F616D3A4E60 + 3557573557570012092BFF2B2BFF2B0000003557570012090012090012090012 + 0900120900120900120900120900120900120900120900120900120900120900 + 12090012090012090012090012093557572BFF2B2BFF2B0000002BFF2B2BFF2B + 2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B0012091F616D37393D0012092BFF + 2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B00 + 00002BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B355757001209 + 0012093557572BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF2B2BFF + 2B2BFF2B2BFF2B000000} + ShowHint = True + Transparent = True + OnDblClick = NewObjectImgDblClick + OnMouseDown = NewObjectImgMouseDown + end + object imgNewNode: TImage + Left = 59 + Top = 37 + Width = 11 + Height = 11 + Hint = 'New Node' + AutoSize = True + ParentShowHint = False + Picture.Data = { + 07544269746D6170C2010000424DC20100000000000036000000280000000B00 + 00000B00000001001800000000008C0100000000000000000000000000000000 + 00002BFF2B2BFF2B2BFF2B042042042042042042042042191E352BFF2B2BFF2B + 2BFF2B0000002BFF2B2BFF2B191E35003FAF003FAF003FAF003FAF002B7B191E + 352BFF2B2BFF2B0000002BFF2B191E35002B7B00379B00379B00338B00379B00 + 3FAF002B7B191E352BFF2B000000191E35002B7B003FAF00338B00338B00338B + 00338B00379B003FAF002B7B191E35000000042042003FAF00379B002B7B0027 + 6B002B7B002B7B00338B00379B003FAF042042000000042042003FAF00338B00 + 2B7B002B7B00276B002B7B00338B00338B003FAF042042000000042042003FAF + 00379B002B7B002B7B002B7B00276B00338B00379B003FAF0420420000000420 + 42003FAF003FAF00379B002B7B002B7B00338B00379B00379B003FAF04204200 + 00002BFF2B191E35002B7B003FAF00379B00338B00379B003FAF002B7B191E35 + 2BFF2B0000002BFF2B2BFF2B191E35003FAF003FAF003FAF003FAF002B7B191E + 352BFF2B2BFF2B0000002BFF2B2BFF2B2BFF2B04204204204204204204204219 + 1E352BFF2B2BFF2B2BFF2B000000} + ShowHint = True + Transparent = True + OnDblClick = NewObjectImgDblClick + OnMouseDown = NewObjectImgMouseDown + end + end object dlgOpenPicture: TOpenDialog Filter = 'Supported images (*.png)|*.png' Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofNoNetworkButton, ofEnableSizing] diff --git a/Utils/Campaign builder/Unit1.pas b/Utils/Campaign builder/Unit1.pas index e3466c1dc2..35de5fd49c 100644 --- a/Utils/Campaign builder/Unit1.pas +++ b/Utils/Campaign builder/Unit1.pas @@ -32,6 +32,10 @@ TForm1 = class(TForm) shpBriefing: TShape; Bevel2: TBevel; cbShowNodeNumbers: TCheckBox; + Bevel3: TBevel; + GroupBox1: TGroupBox; + imgNewFlag: TImage; + imgNewNode: TImage; procedure btnLoadPictureClick(Sender: TObject); procedure btnLoadCMPClick(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -46,6 +50,12 @@ TForm1 = class(TForm) procedure edtShortNameKeyPress(Sender: TObject; var Key: Char); procedure cbShowNodeNumbersClick(Sender: TObject); + procedure NewObjectImgDblClick(Sender: TObject); + procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer); + procedure NewObjectImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); private fExePath: string; fCampaignsPath: string; @@ -204,6 +214,85 @@ procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) end; +procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer); +var + curItem: Integer; +begin + if fUpdating then Exit; + + if Source = imgNewFlag then + begin + curItem := seMapCount.Value; + seMapCount.Value := curItem + 1; + C.MapCount := EnsureRange(seMapCount.Value, 1, MAX_CAMP_MAPS); + + C.Maps[C.MapCount - 1].Flag.X := (X - Image1.Left) - Integer(1 * (imgNewFlag.Width div 2)); + C.Maps[C.MapCount - 1].Flag.Y := (Y - Image1.Top) - Integer(1 * (imgNewFlag.Height div 2)); + + if fSelectedMap > C.MapCount - 1 then + fSelectedMap := -1; + end else if (fSelectedMap <> -1) and (Source = imgNewNode) then + begin + curItem := seNodeCount.Value; + seNodeCount.Value := curItem + 1; + C.Maps[fSelectedMap].NodeCount := EnsureRange(seNodeCount.Value, 0, MAX_CAMP_NODES); + + C.Maps[fSelectedMap].Nodes[curItem].X := (X - Image1.Left); + C.Maps[fSelectedMap].Nodes[curItem].Y := (Y - Image1.Top); + + if fSelectedNode > C.Maps[fSelectedMap].NodeCount - 1 then + fSelectedNode := -1; + end; + + UpdateList; + UpdateFlagCount; + UpdateNodeCount; + RefreshFlags; +end; + + +procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +begin + Accept := (Source = imgNewFlag) or + ((fSelectedMap <> -1) and (Source = imgNewNode)); +end; + + +procedure TForm1.NewObjectImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + TImage(Sender).BeginDrag(False, 5); +end; + + +procedure TForm1.NewObjectImgDblClick(Sender: TObject); +begin + if fUpdating then Exit; + + if Sender = imgNewFlag then + begin + seMapCount.Value := seMapCount.Value + 1; + C.MapCount := EnsureRange(seMapCount.Value, 1, MAX_CAMP_MAPS); + + if fSelectedMap > C.MapCount - 1 then + fSelectedMap := -1; + end else if (fSelectedMap <> -1) and (Sender = imgNewNode) then + begin + seNodeCount.Value := seNodeCount.Value + 1; + C.Maps[fSelectedMap].NodeCount := EnsureRange(seNodeCount.Value, 0, MAX_CAMP_NODES); + + if fSelectedNode > C.Maps[fSelectedMap].NodeCount - 1 then + fSelectedNode := -1; + end; + + UpdateList; + UpdateFlagCount; + UpdateNodeCount; + RefreshFlags; +end; + + procedure TForm1.FlagDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then From dceb8d522ec60da48ecf04b683e3944b6b50837e Mon Sep 17 00:00:00 2001 From: Thimo Braker Date: Wed, 15 Nov 2017 18:34:17 +0100 Subject: [PATCH 2/2] Adds fixes by @reyandme --- Utils/Campaign builder/Unit1.pas | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Utils/Campaign builder/Unit1.pas b/Utils/Campaign builder/Unit1.pas index 35de5fd49c..5334be894f 100644 --- a/Utils/Campaign builder/Unit1.pas +++ b/Utils/Campaign builder/Unit1.pas @@ -137,7 +137,7 @@ procedure TForm1.FormCreate(Sender: TObject); fSprites := TKMSpritePackEdit.Create(rxCustom, nil); seMapCountChange(nil); //Initialise it to 1 map - + if FileExists(ParamStr(1)) then LoadCmp(ParamStr(1)); end; @@ -226,11 +226,10 @@ procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer); seMapCount.Value := curItem + 1; C.MapCount := EnsureRange(seMapCount.Value, 1, MAX_CAMP_MAPS); - C.Maps[C.MapCount - 1].Flag.X := (X - Image1.Left) - Integer(1 * (imgNewFlag.Width div 2)); - C.Maps[C.MapCount - 1].Flag.Y := (Y - Image1.Top) - Integer(1 * (imgNewFlag.Height div 2)); + C.Maps[C.MapCount - 1].Flag.X := EnsureRange(X - Image1.Left, 0, 1024 - imgNewFlag.Width); + C.Maps[C.MapCount - 1].Flag.Y := EnsureRange(Y - Image1.Top, 0, 768 - imgNewFlag.Height); - if fSelectedMap > C.MapCount - 1 then - fSelectedMap := -1; + fSelectedMap := C.MapCount - 1; //Always select last, just added MapFlag end else if (fSelectedMap <> -1) and (Source = imgNewNode) then begin curItem := seNodeCount.Value; @@ -240,8 +239,7 @@ procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer); C.Maps[fSelectedMap].Nodes[curItem].X := (X - Image1.Left); C.Maps[fSelectedMap].Nodes[curItem].Y := (Y - Image1.Top); - if fSelectedNode > C.Maps[fSelectedMap].NodeCount - 1 then - fSelectedNode := -1; + fSelectedNode := C.Maps[fSelectedMap].NodeCount - 1; //Always select last, just added Node end; UpdateList;