Beispiel #1
0
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);
}