X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2Ff_main.pas;h=53bf85da742cf26b936bb5276e2694763f6bc7ea;hb=dd6a8c0ae0c61fbd1d070e83b5d54c41edeb6df8;hp=69f29d3e4efaaa098f8a0b699664f4c7691a91fa;hpb=3c82d66d2cc9d0ea466a0129c1455b2fa194c810;p=d2df-editor.git diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas index 69f29d3..53bf85d 100644 --- a/src/editor/f_main.pas +++ b/src/editor/f_main.pas @@ -215,6 +215,7 @@ type procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); procedure FormWindowStateChange(Sender: TObject); + procedure miRecentFileExecute(Sender: TObject); procedure miMacRecentClearClick(Sender: TObject); procedure miMacZoomClick(Sender: TObject); procedure lbTextureListClick(Sender: TObject); @@ -407,8 +408,7 @@ const type TUndoRec = record - UndoType: Byte; - case Byte of + case UndoType: Byte of UNDO_DELETE_PANEL: (Panel: ^TPanel); UNDO_DELETE_ITEM: (Item: TItem); UNDO_DELETE_AREA: (Area: TArea); @@ -429,9 +429,8 @@ type end; TCopyRec = record - ObjectType: Byte; ID: Cardinal; - case Byte of + case ObjectType: Byte of OBJECT_PANEL: (Panel: ^TPanel); OBJECT_ITEM: (Item: TItem); OBJECT_AREA: (Area: TArea); @@ -2559,32 +2558,17 @@ end; //Закончились вспомогательные процедуры //---------------------------------------- -type - TRecentHandler = class - private - FForm: TMainForm; - FPath: String; - public - constructor Create (form: TMainForm; path: String); - procedure Execute (Sender: TObject); - end; - -constructor TRecentHandler.Create (form: TMainForm; path: String); -begin - Assert(form <> nil); - FForm := form; - FPath := path; -end; - -procedure TRecentHandler.Execute (Sender: TObject); - var fn: AnsiString; +procedure TMainForm.miRecentFileExecute (Sender: TObject); +var + s, fn: AnsiString; begin - fn := g_ExtractWadName(FPath); + s := RecentFiles[(Sender as TMenuItem).Tag]; + fn := g_ExtractWadName(s); if FileExists(fn) then - OpenMap(fn, g_ExtractFilePathName(FPath)) + OpenMap(fn, g_ExtractFilePathName(s)) else Application.MessageBox('', 'File not available anymore', MB_OK); -// if Application.MessageBox(PChar(MsgMsgDelRecentPromt), PChar(MsgMsgDelRecent), MB_ICONQUESTION or MB_YESNO) = idYes then +// if Application.MessageBox(PChar(MsgMsgDelRecentPrompt), PChar(MsgMsgDelRecent), MB_ICONQUESTION or MB_YESNO) = idYes then // begin // RecentFiles.Delete(n); // RefreshRecentMenu(); @@ -2592,40 +2576,35 @@ begin end; procedure TMainForm.RefillRecentMenu (menu: TMenuItem; start: Integer; fmt: AnsiString); - var i: Integer; MI: TMenuItem; cb: TMethod; h: TRecentHandler; s: AnsiString; + var i: Integer; MI: TMenuItem; s: AnsiString; begin Assert(menu <> nil); Assert(start >= 0); Assert(start <= menu.Count); - // clear all recent entries from menu + // clear all the recent entries from menu i := start; while i < menu.Count do begin MI := menu.Items[i]; - cb := TMethod(MI.OnClick); - if cb.Code = @TRecentHandler.Execute then + if @MI.OnClick <> @TMainForm.miRecentFileExecute then + i += 1 + else begin - // this is recent menu entry - // remove it and free callback handler - h := TRecentHandler(cb.Data); menu.Delete(i); - MI.Free(); - h.Free(); - end - else - Inc(i); + MI.Destroy(); + end; end; // fill with a new ones - for i := 0 to RecentFiles.Count - 1 do + for i := 0 to RecentFiles.Count-1 do begin - s := RecentFiles[i]; - h := TRecentHandler.Create(self, s); MI := TMenuItem.Create(menu); - MI.Caption := Format(fmt, [i + 1, g_ExtractWadNameNoPath(s), g_ExtractFilePathName(s)]); - MI.OnClick := h.Execute; - menu.Insert(start + i, MI); + s := RecentFiles[i]; + MI.Caption := Format(fmt, [i+1, g_ExtractWadNameNoPath(s), g_ExtractFilePathName(s)]); + MI.OnClick := miRecentFileExecute; + MI.Tag := i; + menu.Insert(start + i, MI); // transfers ownership end; end; @@ -2647,7 +2626,7 @@ begin begin // Reconstruct Windows-like recent list start := miMenuFile.IndexOf(miWinRecent); - if start < 0 then start := miMenuFile.Count else start := start + 1; + if start < 0 then start := miMenuFile.Count else start += 1; RefillRecentMenu(miMenuFile, start, '%0:d %1:s:%2:s'); miWinRecent.Enabled := False; miWinRecent.Visible := RecentFiles.Count = 0; @@ -4373,7 +4352,7 @@ end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin - CanClose := Application.MessageBox(PChar(MsgMsgExitPromt), + CanClose := Application.MessageBox(PChar(MsgMsgExitPrompt), PChar(MsgMsgExit), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON1) = idYes; @@ -4541,7 +4520,7 @@ begin end end; - if Key = Ord('V') then + if Key = Ord('I') then begin // Поворот монстров и областей: if (SelectedObjects <> nil) then begin @@ -4912,7 +4891,7 @@ begin if OpenedMap = '' then Exit; - if Application.MessageBox(PChar(MsgMsgReopenMapPromt), + if Application.MessageBox(PChar(MsgMsgReopenMapPrompt), PChar(MsgMenuFileReopen), MB_ICONQUESTION or MB_YESNO) <> idYes then Exit; @@ -5542,7 +5521,7 @@ begin if i = -1 then Exit; - if Application.MessageBox(PChar(Format(MsgMsgDelTexturePromt, + if Application.MessageBox(PChar(Format(MsgMsgDelTexturePrompt, [SelectedTexture()])), PChar(MsgMsgDelTexture), MB_ICONQUESTION or MB_YESNO or @@ -5568,7 +5547,7 @@ end; procedure TMainForm.aNewMapExecute(Sender: TObject); begin - if Application.MessageBox(PChar(MsgMsgClearMapPromt), PChar(MsgMsgClearMap), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON1) = mrYes then + if Application.MessageBox(PChar(MsgMsgClearMapPrompt), PChar(MsgMsgClearMap), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON1) = mrYes then FullClear(); end; @@ -5715,7 +5694,7 @@ begin QuickSortCopyBuffer(0, b); end; -// Пестановка ссылок триггеров: +// Постановка ссылок триггеров: for a := 0 to Length(CopyBuffer)-1 do if CopyBuffer[a].ObjectType = OBJECT_TRIGGER then begin @@ -5820,21 +5799,33 @@ var swad, ssec, sres: String; NoTextureID: DWORD; pmin: TPoint; + xadj, yadj: LongInt; begin CopyBuffer := nil; NoTextureID := 0; + pmin.X := High(pmin.X); pmin.Y := High(pmin.Y); StringToCopyBuffer(ClipBoard.AsText, CopyBuffer, pmin); - rel := not(ssShift in GetKeyShiftState()); - if CopyBuffer = nil then Exit; + rel := not(ssShift in GetKeyShiftState()); + h := High(CopyBuffer); RemoveSelectFromObjects(); - h := High(CopyBuffer); + if h > 0 then + begin + xadj := Floor((-pmin.X - MapOffset.X + 32) / DotStep) * DotStep; + yadj := Floor((-pmin.Y - MapOffset.Y + 32) / DotStep) * DotStep; + end + else + begin + xadj := DotStep; + yadj := DotStep; + end; + for a := 0 to h do with CopyBuffer[a] do begin @@ -5844,8 +5835,8 @@ begin begin if rel then begin - Panel^.X := Panel^.X - pmin.X - MapOffset.X + 32; - Panel^.Y := Panel^.Y - pmin.Y - MapOffset.Y + 32; + Panel^.X += xadj; + Panel^.Y += yadj; end; Panel^.TextureID := TEXTURE_SPECIAL_NONE; @@ -5903,8 +5894,8 @@ begin begin if rel then begin - Item.X := Item.X - pmin.X - MapOffset.X + 32; - Item.Y := Item.Y - pmin.Y - MapOffset.Y + 32; + Item.X += xadj; + Item.Y += yadj; end; ID := AddItem(Item); @@ -5916,8 +5907,8 @@ begin begin if rel then begin - Monster.X := Monster.X - pmin.X - MapOffset.X + 32; - Monster.Y := Monster.Y - pmin.Y - MapOffset.Y + 32; + Monster.X += xadj; + Monster.Y += yadj; end; ID := AddMonster(Monster); @@ -5929,8 +5920,8 @@ begin begin if rel then begin - Area.X := Area.X - pmin.X - MapOffset.X + 32; - Area.Y := Area.Y - pmin.Y - MapOffset.Y + 32; + Area.X += xadj; + Area.Y += yadj; end; ID := AddArea(Area); @@ -5943,42 +5934,34 @@ begin if rel then with Trigger do begin - X := X - pmin.X - MapOffset.X + 32; - Y := Y - pmin.Y - MapOffset.Y + 32; + X += xadj; + Y += yadj; case TriggerType of TRIGGER_TELEPORT: begin - Data.TargetPoint.X := - Data.TargetPoint.X - pmin.X - MapOffset.X + 32; - Data.TargetPoint.Y := - Data.TargetPoint.Y - pmin.Y - MapOffset.Y + 32; + Data.TargetPoint.X += xadj; + Data.TargetPoint.Y += yadj; end; TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF: begin - Data.tX := Data.tX - pmin.X - MapOffset.X + 32; - Data.tY := Data.tY - pmin.Y - MapOffset.Y + 32; + Data.tX += xadj; + Data.tY += yadj; end; TRIGGER_SPAWNMONSTER: begin - Data.MonPos.X := - Data.MonPos.X - pmin.X - MapOffset.X + 32; - Data.MonPos.Y := - Data.MonPos.Y - pmin.Y - MapOffset.Y + 32; + Data.MonPos.X += xadj; + Data.MonPos.Y += yadj; end; TRIGGER_SPAWNITEM: begin - Data.ItemPos.X := - Data.ItemPos.X - pmin.X - MapOffset.X + 32; - Data.ItemPos.Y := - Data.ItemPos.Y - pmin.Y - MapOffset.Y + 32; + Data.ItemPos.X += xadj; + Data.ItemPos.Y += yadj; end; TRIGGER_SHOT: begin - Data.ShotPos.X := - Data.ShotPos.X - pmin.X - MapOffset.X + 32; - Data.ShotPos.Y := - Data.ShotPos.Y - pmin.Y - MapOffset.Y + 32; + Data.ShotPos.X += xadj; + Data.ShotPos.Y += yadj; end; end; end; @@ -6429,7 +6412,7 @@ begin Exit; MapName := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex]; - if Application.MessageBox(PChar(Format(MsgMsgDeleteMapPromt, [MapName, OpenDialog.FileName])), PChar(MsgMsgDeleteMap), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) <> mrYes then + if Application.MessageBox(PChar(Format(MsgMsgDeleteMapPrompt, [MapName, OpenDialog.FileName])), PChar(MsgMsgDeleteMap), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) <> mrYes then Exit; g_DeleteResource(FileName, '', MapName, res); @@ -6440,7 +6423,7 @@ begin end; Application.MessageBox( - PChar(Format(MsgMsgMapDeletedPromt, [MapName])), + PChar(Format(MsgMsgMapDeletedPrompt, [MapName])), PChar(MsgMsgMapDeleted), MB_ICONINFORMATION or MB_OK or MB_DEFBUTTON1 );