From 679345511985d64fee8c668f60754363b3d7074a Mon Sep 17 00:00:00 2001 From: Sven Eberhardt Date: Sun, 20 Nov 2016 11:39:17 -0500 Subject: [PATCH] Add drag_finished parameter to EditCursorMoved callback --- src/control/C4Control.cpp | 6 +++--- src/control/C4Control.h | 5 +++-- src/editor/C4EditCursor.cpp | 17 +++++++++++------ src/editor/C4EditCursor.h | 4 ++-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/control/C4Control.cpp b/src/control/C4Control.cpp index c22aa343d..a7b7e8e32 100644 --- a/src/control/C4Control.cpp +++ b/src/control/C4Control.cpp @@ -1220,9 +1220,9 @@ void C4ControlJoinPlayer::CompileFunc(StdCompiler *pComp) // *** C4ControlEMMoveObject C4ControlEMMoveObject::C4ControlEMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, - int32_t iObjectNum, int32_t *pObjects, const char *szScript) + int32_t iObjectNum, int32_t *pObjects, const char *szScript, bool drag_finished) : eAction(eAction), tx(tx), ty(ty), iTargetObj(pTargetObj ? pTargetObj->Number : 0), - iObjectNum(iObjectNum), pObjects(pObjects), StringParam(szScript, true) + iObjectNum(iObjectNum), pObjects(pObjects), StringParam(szScript, true), drag_finished(drag_finished) { } @@ -1252,7 +1252,7 @@ void C4ControlEMMoveObject::MoveObject(C4Object *moved_object, bool move_forced) moved_object->ForcePosition(moved_object->fix_x + tx, moved_object->fix_y + ty); moved_object->xdir = moved_object->ydir = 0; moved_object->Mobile = false; - C4AulParSet pars(C4VInt(old_x), C4VInt(old_y)); + C4AulParSet pars(C4VInt(old_x), C4VInt(old_y), C4VBool(drag_finished)); if (moved_object->Call(PSF_EditCursorMoved, &pars)) { ::Console.EditCursor.InvalidateSelection(); diff --git a/src/control/C4Control.h b/src/control/C4Control.h index 7ccd6e543..133d6bc35 100644 --- a/src/control/C4Control.h +++ b/src/control/C4Control.h @@ -460,9 +460,9 @@ enum C4ControlEMObjectAction class C4ControlEMMoveObject : public C4ControlPacket // sync { public: - C4ControlEMMoveObject() : eAction(EMMO_Move), tx(Fix0), ty(Fix0), iTargetObj(0), iObjectNum(0), pObjects(nullptr) { } + C4ControlEMMoveObject() : eAction(EMMO_Move), tx(Fix0), ty(Fix0), iTargetObj(0), iObjectNum(0), pObjects(nullptr), drag_finished(false) { } C4ControlEMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, - int32_t iObjectNum = 0, int32_t *pObjects = nullptr, const char *szScript = nullptr); + int32_t iObjectNum = 0, int32_t *pObjects = nullptr, const char *szScript = nullptr, bool drag_finished = false); static C4ControlEMMoveObject *CreateObject(const C4ID &id, C4Real x, C4Real y, C4Object *container); ~C4ControlEMMoveObject(); protected: @@ -472,6 +472,7 @@ protected: int32_t iObjectNum; // number of objects moved int32_t *pObjects; // pointer on array of objects moved StdStrBuf StringParam; // script to execute, or ID of object to create + bool drag_finished; // Movement only: Set when mouse drag operation concluded (i.e. mouse up) private: void MoveObject(C4Object *moved_object, bool move_forced) const; public: diff --git a/src/editor/C4EditCursor.cpp b/src/editor/C4EditCursor.cpp index 2ce8f5f54..a04c62f6d 100644 --- a/src/editor/C4EditCursor.cpp +++ b/src/editor/C4EditCursor.cpp @@ -148,7 +148,7 @@ void C4EditCursor::Execute() case C4CNS_ModeEdit: // Hold selection if (Hold) - EMMoveObject(fShiftWasDown ? EMMO_MoveForced : EMMO_Move, Fix0, Fix0, nullptr, &selection); + EMMoveObject(fShiftWasDown ? EMMO_MoveForced : EMMO_Move, Fix0, Fix0, nullptr, &selection, false); break; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - case C4CNS_ModeDraw: @@ -249,7 +249,7 @@ bool C4EditCursor::Move(float iX, float iY, float iZoom, DWORD dwKeyState) // Hold if (!DragFrame && Hold && !DragShape && !DragTransform) { - MoveSelection(ftofix(xoff),ftofix(yoff)); + MoveSelection(ftofix(xoff),ftofix(yoff), false); UpdateDropTarget(dwKeyState); } // Update target @@ -488,6 +488,11 @@ bool C4EditCursor::LeftButtonUp(DWORD dwKeyState) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - case C4CNS_ModeEdit: + // Finish object drag + if (!DragFrame && Hold && !DragShape && !DragTransform) + { + MoveSelection(Fix0, Fix0, true); + } if (DragFrame) FrameSelection(); if (DropTarget) PutContents(); break; @@ -934,9 +939,9 @@ void C4EditCursor::DrawSelectMark(C4Facet &cgo, FLOAT_RECT frame, float width, u } -void C4EditCursor::MoveSelection(C4Real XOff, C4Real YOff) +void C4EditCursor::MoveSelection(C4Real XOff, C4Real YOff, bool drag_finished) { - EMMoveObject(fShiftWasDown ? EMMO_MoveForced : EMMO_Move, XOff, YOff, nullptr, &selection); + EMMoveObject(fShiftWasDown ? EMMO_MoveForced : EMMO_Move, XOff, YOff, nullptr, &selection, nullptr, drag_finished); } void C4EditCursor::FrameSelection() @@ -1361,7 +1366,7 @@ void C4EditCursor::ApplyToolPicker() Hold=false; } -void C4EditCursor::EMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs, const char *szScript) +void C4EditCursor::EMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs, const char *szScript, bool drag_finished) { // construct object list int32_t iObjCnt = 0; int32_t *pObjIDs = nullptr; @@ -1382,7 +1387,7 @@ void C4EditCursor::EMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Re } // execute control - EMControl(CID_EMMoveObj, new C4ControlEMMoveObject(eAction, tx, ty, pTargetObj, iObjCnt, pObjIDs, szScript)); + EMControl(CID_EMMoveObj, new C4ControlEMMoveObject(eAction, tx, ty, pTargetObj, iObjCnt, pObjIDs, szScript, drag_finished)); } diff --git a/src/editor/C4EditCursor.h b/src/editor/C4EditCursor.h index f175b1d8b..48a81b02c 100644 --- a/src/editor/C4EditCursor.h +++ b/src/editor/C4EditCursor.h @@ -130,8 +130,8 @@ protected: void DrawSelectMark(C4Facet &cgo, FLOAT_RECT r, float width, uint32_t color = 0xffffffff); bool HasTransformMarker(float *x, float *y, float zoom) const; void FrameSelection(); - void MoveSelection(C4Real iXOff, C4Real iYOff); - void EMMoveObject(enum C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs = nullptr, const char *szScript = nullptr); + void MoveSelection(C4Real iXOff, C4Real iYOff, bool drag_finished); + void EMMoveObject(enum C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs = nullptr, const char *szScript = nullptr, bool drag_finished = false); void DoContextObjCommand(C4Object *, const char *cmd); void ObjselectDelItems();