Пример #1
0
void DiagramEndPoint::mouseDown(
	BPoint point,
	uint32 buttons,
	uint32 clicks)
{
	D_MOUSE(("DiagramEndPoint::mouseDown()\n"));
	if (clicks == 1)
	{
		if (isSelectable())
		{
			BMessage selectMsg(M_SELECTION_CHANGED);
			if (modifiers() & B_SHIFT_KEY)
			{
				selectMsg.AddBool("replace", false);
			}
			else
			{
				selectMsg.AddBool("replace", true);
			}
			selectMsg.AddPointer("item", reinterpret_cast<void *>(this));
			DiagramView* v = view();
			BMessenger(v).SendMessage(&selectMsg);
		}
		if (isDraggable() && (buttons == B_PRIMARY_MOUSE_BUTTON))
		{
			BMessage dragMsg(M_WIRE_DRAGGED);
			dragMsg.AddPointer("from", static_cast<void *>(this));
			view()->DragMessage(&dragMsg, BRect(0.0, 0.0, -1.0, -1.0), view());
			view()->messageDragged(point, B_INSIDE_VIEW, &dragMsg);
		}
	}
}
Пример #2
0
void DiagramBox::mouseDown(
	BPoint point,
	uint32 buttons,
	uint32 clicks)
{
	D_MOUSE(("DiagramBox::mouseDown()\n"));
	DiagramItem *item = itemUnder(point);
	if (item)
	{
		item->mouseDown(point, buttons, clicks);
	}
	else if (clicks == 1)
	{
		if (isSelectable())
		{
			BMessage selectMsg(M_SELECTION_CHANGED);
			if (modifiers() & B_SHIFT_KEY)
			{
				selectMsg.AddBool("replace", false);
			}
			else
			{
				selectMsg.AddBool("replace", true);
			}
			selectMsg.AddPointer("item", reinterpret_cast<void *>(this));
			DiagramView* v = view();
			BMessenger(v).SendMessage(&selectMsg);
		}
		if (isDraggable() && (buttons == B_PRIMARY_MOUSE_BUTTON))
		{
			BMessage dragMsg(M_BOX_DRAGGED);
			dragMsg.AddPointer("item", static_cast<void *>(this));
			dragMsg.AddPoint("offset", point - frame().LeftTop());
			view()->DragMessage(&dragMsg, BRect(0.0, 0.0, -1.0, -1.0), view());
		}
	}
}
void BasicInteractiveObject::updateMtTransform(){
	if(!mtscoperunning) return;
	if (!isDraggable() && !isRotateable() && !isScaleable()) return;
	
	bool matrixNeedsUpdate = false;
	
	mttransform = getCurrentMtTransform();
	mttransformmatrix.makeIdentityMatrix();
	
	if(getNumActiveTouches() > 1){
		
		mttransformmatrix.translate(-(mttranslatestart+mtpivot));
		matrixNeedsUpdate = true;
		
		if(isScaleable()){
			
			mtscalespeed	= mtscale;
			
			float endscale	= (float)mttransform.length() / mttransformstart.length();
			mtscale			+= (endscale-mtscale)*scaledamp;
			
			mtscalespeed	= mtscale-mtscalespeed;
			mtscaledist		+= fabs(mtscalespeed);
			
			if (isscaling == false) {
				if(mtscaledist > scalethreshold){
					isscaling = true;
					MultiTouchEvent params(this);
					ofNotifyEvent(scaleStartEvent,params,this);
				}
			}
			
			if(isScaleAuto() && isscaling){
				mttransformmatrix.scale(mtscale, mtscale, mtscale);
			}
		}
		
		if(isRotateable()){
			mtrotatespeed = mtrotate;
			
			ofQuaternion newrotate;
			newrotate.makeRotate(mttransformstart, mttransform);
			mtrotate.slerp(rotatedamp, mtrotate, newrotate);
			mtrotatespeed	=  mtrotate*mtrotatespeed.inverse();
			mtrotatedist	+= fabs(mtrotatespeed.getEuler().z);
            
			if (isrotating == false) {
				if(mtrotatedist > rotatethreshold){
					isrotating = true;
					MultiTouchEvent params(this);
					ofNotifyEvent(rotateStartEvent, params, this);
				}
			}
			
			if(isRotateAuto() && isrotating){
				mttransformmatrix.rotate(mtrotate);
			}
        }
		mttransformmatrix.translate(mttranslatestart + mtpivot);
	}
	
	bool stAlsoOk=true;
	
	if(getNumActiveTouches() == 1 ){
		if(!isStDraggable()){
			stAlsoOk = false;
		}
	}
	
	if(isDraggable() && stAlsoOk){
		
		mttranslatespeed.set(mttranslate);
		mttranslate.interpolate(getCurrentMtTranslate() - mtpivot - mttranslatestart, dragdamp);
		mttranslatespeed	=	mttranslate-mttranslatespeed;
		mttranslatedist		+=	mttranslatespeed.length();
		
		if (isdragging == false) {
			if(mttranslatedist > dragthreshold){
				isdragging = true;
				MultiTouchEvent params(this);
				ofNotifyEvent(dragStartEvent,params,this);
			}
		}
		
		if(isDragAuto() && isdragging){
			mttransformmatrix.translate(mttranslate);
			matrixNeedsUpdate = true;
		}
	}
	
	// only affect current matrix if we're actual
	if (matrixNeedsUpdate && (isDraggable() || isRotateable() || isScaleable())) {
		ofMatrix4x4 currentmatrix;
	
		currentmatrix.set(mttransformmatrixstart);
		currentmatrix.postMult(mttransformmatrix);
	
		mttarget->setTransformMatrix(currentmatrix);
	}
	
    MultiTouchEvent params(this);
	ofNotifyEvent(updateMultiTouchScopeEvent, params, this);
	
}