void StickyNoteActor::launchEditDialog(bool selectExistingText) { _selectExistingText = selectExistingText; // NOTE: for the future, we may want QuickLook-like behaviour where // we follow the sticky notes as the user clicks around on the screen. // If so, then we should keep a reference to the existing dialog some // where and pass it into this launch process? // if one does not exist, create a new sticky not dialog // and center it if (!_editDialog) _editDialog = new StickyNoteEditDialog(); else { // close the dialog and disconnect all signals _editDialog->accept(); _editDialog->disconnect(); } // setup all the connections connect(_editDialog, SIGNAL(finished(int)), this, SLOT(finishedEditing())); connect(_editDialog, SIGNAL(accepted()), this, SLOT(finishedEditing())); connect(_editDialog, SIGNAL(rejected()), this, SLOT(finishedEditing())); // move it to the appropriate place const int marginLeftRight = 20; const int marginTopBottom = -20; Bounds b = this->getScreenBoundingBox(); POINT windowPos = {0, 0}; ClientToScreen(winOS->GetWindowsHandle(), &windowPos); Vec3 screenMin = b.getMin() + Vec3(windowPos.x, windowPos.y, 0); Vec3 screenMax = b.getMax() + Vec3(windowPos.x, windowPos.y, 0); Vec3 screenDims = Vec3(winOS->GetWindowWidth(), winOS->GetWindowHeight(), 0); Vec3 tr(NxMath::max(screenMin.x, screenMax.x), NxMath::min(screenMin.y, screenMax.y), 0); Vec3 tl(NxMath::min(screenMin.x, screenMax.x), NxMath::min(screenMin.y, screenMax.y), 0); int yBound = NxMath::min(NxMath::max((int) tr.y + marginTopBottom, windowPos.y + abs(marginTopBottom)), windowPos.y + (int) screenDims.y - abs(marginTopBottom) - _editDialog->height()); if ((tr.x + marginLeftRight + _editDialog->width()) <= (windowPos.x + screenDims.x - marginLeftRight)) { // put this note to the right of this actor _editDialog->move(tr.x + marginLeftRight, yBound); } else if ((tl.x - marginLeftRight - _editDialog->width()) >= marginLeftRight) { // put this note to the left of this actor _editDialog->move((tl.x - marginLeftRight - _editDialog->width()), yBound); } Mat34 finalPose; Vec3 finalDims; calculateDialogPoseDims(finalPose, finalDims); const int StickyNoteActorNumTempActorSteps = 13; const int StickyNoteActorNumStickySteps = 8; // create a new proxy actor assert(!_tmpAnimationActor); _tmpAnimationActor = new Actor(); _tmpAnimationActor->pushActorType(Temporary); _tmpAnimationActor->setObjectToMimic(this); _tmpAnimationActor->setFrozen(false); _tmpAnimationActor->setGravity(false); _tmpAnimationActor->setCollisions(false); _tmpAnimationActor->setAlphaAnim(0.0f, 1.0f, StickyNoteActorNumTempActorSteps); _tmpAnimationActor->setSizeAnim(lerpRange(getDims(), finalDims, StickyNoteActorNumTempActorSteps, SoftEase)); _tmpAnimationActor->setPoseAnim(slerpPose(getGlobalPose(), finalPose, StickyNoteActorNumTempActorSteps, SoftEase), (FinishedCallBack) EditStickyNoteAfterAnim, NULL); setAlphaAnim(getAlpha(), 0.4f, StickyNoteActorNumStickySteps); }