X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2Ff_main.pas;h=d40610abd027e358c38bd3916a6ba3f53c979e57;hb=HEAD;hp=bf92c229531d27eacc2a0bb83561c9ed3bcb9dd4;hpb=65146e985a7cb6ab434f1bd4594211f09e1a9409;p=d2df-editor.git diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas index bf92c22..d40610a 100644 --- a/src/editor/f_main.pas +++ b/src/editor/f_main.pas @@ -271,6 +271,7 @@ type procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private + LastDrawTime: UInt64; procedure Draw(); procedure OnIdle(Sender: TObject; var Done: Boolean); procedure RefillRecentMenu (menu: TMenuItem; start: Integer; fmt: AnsiString); @@ -1825,16 +1826,28 @@ begin end; UndoBuffer[i, ii].AddID := ID; - MainForm.miUndo.Enabled := UndoBuffer <> nil; end; +procedure DiscardUndoBuffer(); +var + i, k: Integer; +begin + for i := 0 to High(UndoBuffer) do + for k := 0 to High(UndoBuffer[i]) do + with UndoBuffer[i][k] do + if UndoType = UNDO_DELETE_PANEL then + Dispose(Panel); + + UndoBuffer := nil; +end; + procedure FullClear(); begin RemoveSelectFromObjects(); ClearMap(); LoadSky(gMapInfo.SkyName); - UndoBuffer := nil; + DiscardUndoBuffer(); slInvalidTextures.Clear(); MapCheckForm.lbErrorList.Clear(); MapCheckForm.mErrorDescription.Clear(); @@ -2541,13 +2554,15 @@ end; procedure TMainForm.miRecentFileExecute (Sender: TObject); var s, fn: AnsiString; + n: LongInt; begin - s := RecentFiles[(Sender as TMenuItem).Tag]; + n := (Sender as TMenuItem).Tag; + s := RecentFiles[n]; fn := g_ExtractWadName(s); if FileExists(fn) then OpenMap(fn, g_ExtractFilePathName(s)) else - Application.MessageBox('', 'File not available anymore', MB_OK); + Application.MessageBox('File not available anymore', '', MB_OK); // if Application.MessageBox(PChar(MsgMsgDelRecentPrompt), PChar(MsgMsgDelRecent), MB_ICONQUESTION or MB_YESNO) = idYes then // begin // RecentFiles.Delete(n); @@ -2572,7 +2587,7 @@ begin else begin menu.Delete(i); - MI.Destroy(); + Application.ReleaseComponent(MI); end; end; @@ -2671,6 +2686,7 @@ var s: String; begin Randomize(); + LastDrawTime := 0; {$IFDEF DARWIN} miApple.Enabled := True; @@ -2891,6 +2907,7 @@ var ObjCount: Word; aX, aY, aX2, aY2, XX, ScaleSz: Integer; begin + LastDrawTime := GetTickCount64(); ID := 0; PID := 0; Width := 0; @@ -3403,7 +3420,7 @@ begin else begin item.ItemType := lbItemList.ItemIndex + ITEM_MEDKIT_SMALL; - if item.ItemType >= ITEM_WEAPON_KASTET then + if item.ItemType >= ITEM_WEAPON_IRONFIST then item.ItemType := item.ItemType + 2; item.X := MousePos.X-MapOffset.X; item.Y := MousePos.Y-MapOffset.Y; @@ -4432,7 +4449,8 @@ begin config.SaveFile(CfgFileName); config.Free(); - slInvalidTextures.Free; + slInvalidTextures.Free(); + DiscardUndoBuffer(); end; procedure TMainForm.FormDropFiles(Sender: TObject; @@ -4683,8 +4701,7 @@ begin end; // Удалить выделенные объекты: - if (Key = VK_DELETE) and (SelectedObjects <> nil) and - RenderPanel.Focused() then + if (Key = VK_DELETE) and (SelectedObjects <> nil) and RenderPanel.Focused() then DeleteSelectedObjects(); // Снять выделение: @@ -5583,7 +5600,7 @@ begin UNDO_DELETE_PANEL: begin AddPanel(Panel^); - Panel := nil; + Dispose(Panel); end; UNDO_DELETE_ITEM: AddItem(Item); UNDO_DELETE_AREA: AddArea(Area); @@ -5598,9 +5615,7 @@ begin end; SetLength(UndoBuffer, Length(UndoBuffer)-1); - RemoveSelectFromObjects(); - miUndo.Enabled := UndoBuffer <> nil; end; @@ -6224,7 +6239,7 @@ begin if ShowModal() = mrOK then begin b := lbTypeSelect.ItemIndex + ITEM_MEDKIT_SMALL; - if b >= ITEM_WEAPON_KASTET then + if b >= ITEM_WEAPON_IRONFIST then b := b + 2; Values[Key] := ItemToStr(b); vleObjectPropertyApply(Sender); @@ -6719,8 +6734,15 @@ begin end; procedure TMainForm.OnIdle(Sender: TObject; var Done: Boolean); + const MaxFPS = 60; var f: AnsiString; begin + // TODO: move refresh to user actions (ask to repaint only when something changed) + if GetTickCount64() - LastDrawTime >= 1000 div MaxFPS then + begin + PanelMap.Refresh; + end; + if StartMap <> '' then begin f := StartMap;