X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2Ff_main.pas;h=578d950a500a77af475424140529b87e717e5bba;hb=0e5a86d302a0ec44376743ca4df574d1bda1e12d;hp=82bd18dec1de2ee47bb2044fb12b491f2c8e6527;hpb=fe7bb30e30aa2c6d52bb6ad641b5f0ae10de329e;p=d2df-editor.git diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas index 82bd18d..578d950 100644 --- a/src/editor/f_main.pas +++ b/src/editor/f_main.pas @@ -266,6 +266,7 @@ type public procedure RefreshRecentMenu(); procedure OpenMapFile(FileName: String); + function RenderMousePos(): TPoint; end; const @@ -2947,8 +2948,9 @@ begin g_GetTexture('NOTEXTURE', ID); g_GetTextureSizeByID(ID, Width, Height); with DrawRect^ do - e_DrawFill(ID, Min(Left, Right), Min(Top, Bottom), Abs(Right-Left) div Width, - Abs(Bottom-Top) div Height, 0, True, False); + if (Abs(Right-Left) >= Width) and (Abs(Bottom-Top) >= Height) then + e_DrawFill(ID, Min(Left, Right), Min(Top, Bottom), Abs(Right-Left) div Width, + Abs(Bottom-Top) div Height, 64, True, False); end; // Прямоугольник выделения: @@ -2957,7 +2959,8 @@ begin e_DrawQuad(Left, Top, Right-1, Bottom-1, 255, 255, 255); // Чертим мышью панель/триггер или меняем мышью их размер: - if (MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER, MOUSEACTION_RESIZE]) and + if (((MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER]) and + not(ssCtrl in GetKeyShiftState())) or (MouseAction = MOUSEACTION_RESIZE)) and (DrawPanelSize) then begin e_DrawFillQuad(MousePos.X, MousePos.Y, MousePos.X+88, MousePos.Y+33, 192, 192, 192, 127); @@ -2967,7 +2970,7 @@ begin begin // Чертим новый PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH], [Abs(MousePos.X-MouseLDownPos.X)]), gEditorFont); - PrintBlack(MousePos.X+2, MousePos.Y+14, Format(_glc[I_HINT_HEIGHT], + PrintBlack(MousePos.X+2, MousePos.Y+16, Format(_glc[I_HINT_HEIGHT], [Abs(MousePos.Y-MouseLDownPos.Y)]), gEditorFont); end else // Растягиваем существующий @@ -2986,7 +2989,7 @@ begin PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH], [Width]), gEditorFont); - PrintBlack(MousePos.X+2, MousePos.Y+14, Format(_glc[I_HINT_HEIGHT], [Height]), + PrintBlack(MousePos.X+2, MousePos.Y+16, Format(_glc[I_HINT_HEIGHT], [Height]), gEditorFont); end; end; @@ -3610,6 +3613,8 @@ var IDArray: DWArray; rRect: TRectWH; rSelectRect: Boolean; + wWidth, wHeight: Word; + TextureID: DWORD; begin if Button = mbLeft then MouseLDown := False; @@ -3618,14 +3623,18 @@ begin DrawRect := nil; ResizeType := RESIZETYPE_NONE; + TextureID := 0; if Button = mbLeft then // Left Mouse Button begin if MouseAction <> MOUSEACTION_NONE then begin // Было действие мышью - // Мышь сдвинулась во время удержания клавиши: - if (MousePos.X <> MouseLDownPos.X) and - (MousePos.Y <> MouseLDownPos.Y) then + // Мышь сдвинулась во время удержания клавиши, + // либо активирован режим быстрого рисования: + if ((MousePos.X <> MouseLDownPos.X) and + (MousePos.Y <> MouseLDownPos.Y)) or + ((MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER]) and + (ssCtrl in Shift)) then case MouseAction of // Рисовали панель: MOUSEACTION_DRAWPANEL: @@ -3655,8 +3664,25 @@ begin Panel.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X); Panel.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y); - Panel.Width := Abs(MousePos.X-MouseLDownPos.X); - Panel.Height := Abs(MousePos.Y-MouseLDownPos.Y); + if ssCtrl in Shift then + begin + wWidth := DotStep; + wHeight := DotStep; + if (lbTextureList.ItemIndex <> -1) and + (not IsSpecialTextureSel()) then + begin + if not g_GetTexture(SelectedTexture(), TextureID) then + g_GetTexture('NOTEXTURE', TextureID); + g_GetTextureSizeByID(TextureID, wWidth, wHeight); + end; + Panel.Width := wWidth; + Panel.Height := wHeight; + end + else + begin + Panel.Width := Abs(MousePos.X-MouseLDownPos.X); + Panel.Height := Abs(MousePos.Y-MouseLDownPos.Y); + end; // Лифты, блокМон или отсутствие текстуры - пустая текстура: if (lbPanelType.ItemIndex in [9, 10, 11, 12, 13]) or @@ -3698,8 +3724,18 @@ begin begin trigger.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X); trigger.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y); - trigger.Width := Abs(MousePos.X-MouseLDownPos.X); - trigger.Height := Abs(MousePos.Y-MouseLDownPos.Y); + if ssCtrl in Shift then + begin + wWidth := DotStep; + wHeight := DotStep; + trigger.Width := wWidth; + trigger.Height := wHeight; + end + else + begin + trigger.Width := Abs(MousePos.X-MouseLDownPos.X); + trigger.Height := Abs(MousePos.Y-MouseLDownPos.Y); + end; trigger.Enabled := True; trigger.TriggerType := lbTriggersList.ItemIndex+1; @@ -3962,14 +3998,22 @@ begin Draw(); end; +function TMainForm.RenderMousePos(): Types.TPoint; +begin + Result := RenderPanel.ScreenToClient(Mouse.CursorPos); +end; + procedure TMainForm.RenderPanelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var sX, sY: Integer; dWidth, dHeight: Integer; _id: Integer; + TextureID: DWORD; + wWidth, wHeight: Word; begin _id := GetFirstSelected(); + TextureID := 0; // Рисуем панель с текстурой, сетка - размеры текстуры: if (MouseAction = MOUSEACTION_DRAWPANEL) and @@ -4090,10 +4134,29 @@ begin begin if DrawRect = nil then New(DrawRect); - DrawRect.Top := MouseLDownPos.y; - DrawRect.Left := MouseLDownPos.x; - DrawRect.Bottom := MousePos.y; - DrawRect.Right := MousePos.x; + if ssCtrl in Shift then + begin + wWidth := DotStep; + wHeight := DotStep; + if (lbTextureList.ItemIndex <> -1) and (not IsSpecialTextureSel()) and + (MouseAction = MOUSEACTION_DRAWPANEL) then + begin + if not g_GetTexture(SelectedTexture(), TextureID) then + g_GetTexture('NOTEXTURE', TextureID); + g_GetTextureSizeByID(TextureID, wWidth, wHeight); + end; + DrawRect.Top := MouseLDownPos.y; + DrawRect.Left := MouseLDownPos.x; + DrawRect.Bottom := DrawRect.Top + wHeight; + DrawRect.Right := DrawRect.Left + wWidth; + end + else + begin + DrawRect.Top := MouseLDownPos.y; + DrawRect.Left := MouseLDownPos.x; + DrawRect.Bottom := MousePos.y; + DrawRect.Right := MousePos.x; + end; end else // Двигаем карту: if MouseAction = MOUSEACTION_MOVEMAP then @@ -4293,7 +4356,7 @@ begin if (MouseLDown or MouseRDown) and (Position >= DotStep) then begin Dec(WASDOffset.Y, DotStep); - RenderPanelMouseMove(Sender, Shift, LastMovePoint.X, LastMovePoint.Y); + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; Position := IfThen(Position > DotStep, Position-DotStep, 0); MapOffset.Y := -Round(Position/16) * 16; @@ -4304,7 +4367,7 @@ begin if (MouseLDown or MouseRDown) and (Position+DotStep <= Max) then begin Inc(WASDOffset.Y, DotStep); - RenderPanelMouseMove(Sender, Shift, LastMovePoint.X, LastMovePoint.Y); + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; Position := IfThen(Position+DotStep < Max, Position+DotStep, Max); MapOffset.Y := -Round(Position/16) * 16; @@ -4319,7 +4382,7 @@ begin if (MouseLDown or MouseRDown) and (Position >= DotStep) then begin Dec(WASDOffset.X, DotStep); - RenderPanelMouseMove(Sender, Shift, LastMovePoint.X, LastMovePoint.Y); + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; Position := IfThen(Position > DotStep, Position-DotStep, 0); MapOffset.X := -Round(Position/16) * 16; @@ -4330,7 +4393,7 @@ begin if (MouseLDown or MouseRDown) and (Position+DotStep <= Max) then begin Inc(WASDOffset.X, DotStep); - RenderPanelMouseMove(Sender, Shift, LastMovePoint.X, LastMovePoint.Y); + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; Position := IfThen(Position+DotStep < Max, Position+DotStep, Max); MapOffset.X := -Round(Position/16) * 16; @@ -4345,6 +4408,7 @@ begin if Key = Ord('V') then aPasteObjectExecute(Sender); end; + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; end; @@ -6698,6 +6762,7 @@ begin if PreviewMode = 2 then PreviewMode := 0; end; + RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y); end; end.