X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2Ff_main.pas;h=5d8635099881daf655c9a2c27798bd14e8971b1c;hb=e9f9c625878cee4daeaee333f2f9834826b175d9;hp=eb7dfdd4fe2877a77d8e5fab92beb419ccbd5349;hpb=c65e1ff1d13495a265aacb8e42954a7a731edec2;p=d2df-editor.git diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas index eb7dfdd..5d86350 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,29 +2558,14 @@ 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 @@ -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; @@ -4541,7 +4520,7 @@ begin end end; - if Key = Ord('V') then + if Key = Ord('I') then begin // Поворот монстров и областей: if (SelectedObjects <> nil) then begin @@ -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 @@ -5836,8 +5815,16 @@ begin h := High(CopyBuffer); RemoveSelectFromObjects(); - xadj := -pmin.X - Floor((MapOffset.X - 32) / DotStep) * DotStep; - yadj := -pmin.Y - Floor((MapOffset.Y - 32) / DotStep) * DotStep; + 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