예제 #1
0
void MediaNodePanel::layoutChanged(
	int32 layout)
{
	D_METHOD(("MediaNodePanel::layoutChanged()\n"));

	BPoint p = Frame().LeftTop();
	if (m_alternatePosition == s_invalidPosition)
	{
		m_alternatePosition = dynamic_cast<MediaRoutingView *>
							  (view())->findFreePositionFor(this);
	}
	moveTo(m_alternatePosition);
	m_alternatePosition = p;

	resizeTo(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT);
	for (uint32 i = 0; i < CountItems(); i++)
	{
		MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
		jack->layoutChanged(layout);
	}
	_updateIcon(layout);
	_prepareLabel();
	arrangeIOJacks();
	_updateBitmap();
}
예제 #2
0
void MediaNodePanel::MessageDropped(
	BPoint point,
	BMessage *message)
{
	D_METHOD(("MediaNodePanel::MessageDropped()\n"));

	// +++ REALLY BAD WORKAROUND
	MediaJack *jack = dynamic_cast<MediaJack *>(ItemUnder(point));
	if (jack)
	{
		jack->MessageDropped(point, message);
		return;
	}
	else
	{
		be_app->SetCursor(B_HAND_CURSOR);
	}
}
예제 #3
0
void MediaNodePanel::updateIOJacks()
{
	D_METHOD(("MediaNodePanel::updateIOJacks()\n"));

	// remove all free inputs/outputs, they may be outdated
	for (uint32 i = 0; i < CountItems(); i++)
	{
		MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
		if (jack && !jack->isConnected())
		{
			RemoveItem(jack);
			delete jack;
			i--; // account for reindexing in the BList
		}
	}

	// add free inputs
	if (ref->kind() & B_BUFFER_CONSUMER)
	{
		vector<media_input> freeInputs;
		ref->getFreeInputs(freeInputs);
		for (uint32 i = 0; i < freeInputs.size(); i++)
		{
			MediaJack *jack;
			AddItem(jack = new MediaJack(freeInputs[i]));
		}
	}

	// add free outputs
	if (ref->kind() & B_BUFFER_PRODUCER)
	{
		vector<media_output> freeOutputs;
		ref->getFreeOutputs(freeOutputs);
		for (uint32 i = 0; i < freeOutputs.size(); i++)
		{
			MediaJack *jack;
			AddItem(jack = new MediaJack(freeOutputs[i]));
		}
	}

	// the supported media types might have changed -> this could
	// require changing the icon
	_updateIcon(dynamic_cast<MediaRoutingView *>(view())->getLayout());
}
예제 #4
0
DiagramWire *MediaRoutingView::createWire(
	DiagramEndPoint *fromWhich,
	DiagramEndPoint *toWhich)
{
	D_METHOD(("MediaRoutingView::createWire()\n"));

	MediaJack *outputJack, *inputJack;
	MediaJack *jack = dynamic_cast<MediaJack *>(fromWhich);
	if (jack && jack->isOutput())
	{
		outputJack = jack;
		inputJack = dynamic_cast<MediaJack *>(toWhich);
		if (!inputJack || !inputJack->isInput())
		{
			return 0;
		}
	}
	else
	{
		inputJack = jack;
		outputJack = dynamic_cast<MediaJack *>(toWhich);
		if (!outputJack || !outputJack->isOutput())
		{
			return 0;
		}
	}
	if (!outputJack->isConnected() && !inputJack->isConnected())
	{
		media_output output;
		media_input input;
		if ((outputJack->getOutput(&output) == B_OK)
		 && (inputJack->getInput(&input) == B_OK))
		{
			status_t error;
			Connection connection;
			error = manager->connect(output, input, &connection);
/*			if (error)
			{
				showErrorMessage("Could not connect", error);
			}
*/		}
	}
	return 0;
}
예제 #5
0
DiagramWire *MediaRoutingView::createWire(
	DiagramEndPoint *fromWhich)
{
	D_METHOD(("MediaRoutingView::createWire(temp)\n"));

	MediaJack *jack = dynamic_cast<MediaJack *>(fromWhich);
	if (jack)
	{
		if (jack->isOutput()) // this is the start point
		{
			return new MediaWire(jack, true);
		}
		else
		{
			return new MediaWire(jack, false);
		}
	}
	return 0;
}
예제 #6
0
void MediaNodePanel::MouseDown(
	BPoint point,
	uint32 buttons,
	uint32 clicks)
{
	D_METHOD(("MediaNodePanel::MouseDown()\n"));

	_inherited::MouseDown(point, buttons, clicks);

	// +++ REALLY BAD WORKAROUND
	MediaJack *jack = dynamic_cast<MediaJack *>(_LastItemUnder());
	if (jack && jack->Frame().Contains(point))
	{
		return;
	}

	switch (buttons) {
		case B_PRIMARY_MOUSE_BUTTON:
		{
			if (clicks == 2) {
				if (ref->kind() & B_CONTROLLABLE) {
					BMessage message(MediaRoutingView::M_NODE_TWEAK_PARAMETERS);
					DiagramView* v = view();
					BMessenger(v).SendMessage(&message);
				}
			}
			break;
		}
		case B_SECONDARY_MOUSE_BUTTON:
		{
			if (clicks == 1) {
				showContextMenu(point);
			}
			break;
		}
	}
}
예제 #7
0
void MediaNodePanel::arrangeIOJacks()
{
	D_METHOD(("MediaNodePanel::arrangeIOJacks()\n"));
	SortItems(DiagramItem::M_ENDPOINT, &compareTypeAndID);

	switch (dynamic_cast<MediaRoutingView *>(view())->getLayout())
	{
		case MediaRoutingView::M_ICON_VIEW:
		{
			BRegion updateRegion;
			float align = 1.0;
			view()->GetItemAlignment(0, &align);

			// adjust this panel's size
			int32 numInputs = 0, numOutputs = 0;
			for (uint32 i = 0; i < CountItems(); i++)
			{
				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
				if (jack)
				{
					if (jack->isInput())
					{
						numInputs++;
					}
					if (jack->isOutput())
					{
						numOutputs++;
					}
				}
			}
			float minHeight = MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP;
			minHeight *= numInputs > numOutputs ? numInputs : numOutputs;
			minHeight += m_labelRect.Height();
			minHeight += 2 * MediaJack::M_DEFAULT_GAP;
			minHeight = ((int)minHeight / (int)align) * align + align;
			if ((Frame().Height() < minHeight)
			 || ((Frame().Height() > minHeight)
			 && (minHeight >= MediaNodePanel::M_DEFAULT_HEIGHT)))
			{
				updateRegion.Include(Frame());
				resizeTo(Frame().Width(), minHeight);
				updateRegion.Include(Frame());
				_prepareLabel();		
			}

			// adjust the placement of the jacks
			BRect r = m_bodyRect;
			r.bottom -= M_BODY_V_MARGIN;
			float inputOffset = 0.0, outputOffset = 0.0;
			float center = Frame().top + r.top + (r.Height() / 2.0);
			center += MediaJack::M_DEFAULT_GAP - (MediaJack::M_DEFAULT_HEIGHT / 2.0);
			center = ((int)center / (int)align) * align;
			if (numInputs)
			{
				if (numInputs % 2) // odd number of inputs
				{
					inputOffset = center - (numInputs / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
				}
				else // even number of inputs
				{
					inputOffset = center - ((numInputs + 1) / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
				}
			}
			if (numOutputs)
			{
				if (numOutputs % 2) // odd number of outputs
				{
					outputOffset = center - (numOutputs / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
				}
				else // even number of outputs
				{
					outputOffset = center - ((numOutputs + 1) / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
				}
			}
			for (uint32 i = 0; i < CountItems(); i++)
			{
				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
				if (jack)
				{
					if (jack->isInput())
					{
						jack->setPosition(inputOffset, Frame().left, Frame().right, &updateRegion);
						inputOffset += jack->Frame().Height() + MediaJack::M_DEFAULT_GAP;
					}
					if (jack->isOutput())
					{
						jack->setPosition(outputOffset, Frame().left, Frame().right, &updateRegion);
						outputOffset += jack->Frame().Height() + MediaJack::M_DEFAULT_GAP;
					}
				}
			}
			for (int32 i = 0; i < updateRegion.CountRects(); i++)
			{
				view()->Invalidate(updateRegion.RectAt(i));
			}
			break;
		}
		case MediaRoutingView::M_MINI_ICON_VIEW:
		{
			BRegion updateRegion;
			float align = 1.0;
			view()->GetItemAlignment(&align, 0);

			// adjust this panel's size
			int32 numInputs = 0, numOutputs = 0;
			for (uint32 i = 0; i < CountItems(); i++)
			{
				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
				if (jack)
				{
					if (jack->isInput())
					{
						numInputs++;
					}
					if (jack->isOutput())
					{
						numOutputs++;
					}
				}
			}
			float minWidth = MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP;
			minWidth *= numInputs > numOutputs ? numInputs : numOutputs;
			minWidth += m_bodyRect.Width();
			minWidth += 2 * MediaJack::M_DEFAULT_GAP;
			minWidth = ((int)minWidth / (int)align) * align + align;
			if ((Frame().Width() < minWidth)
			 || ((Frame().Width() > minWidth)
			 && (minWidth >= MediaNodePanel::M_DEFAULT_WIDTH)))
			{
				updateRegion.Include(Frame());
				resizeTo(minWidth, Frame().Height());
				updateRegion.Include(Frame());
				_prepareLabel();
			}
			// adjust the placement of the jacks
			float inputOffset = 0.0, outputOffset = 0.0;
			float center = Frame().left + m_labelRect.left + (m_labelRect.Width() / 2.0);
			center += MediaJack::M_DEFAULT_GAP - (MediaJack::M_DEFAULT_WIDTH / 2.0);
			center = ((int)center / (int)align) * align;
			if (numInputs)
			{
				if (numInputs % 2) // odd number of inputs
				{
					inputOffset = center - (numInputs / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
				}
				else // even number of inputs
				{
					inputOffset = center - ((numInputs + 1) / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
				}
			}
			if (numOutputs)
			{
				if (numOutputs % 2) // odd number of outputs
				{
					outputOffset = center - (numOutputs / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
				}
				else // even number of outputs
				{
					outputOffset = center - ((numOutputs + 1) / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
				}
			}
			for (uint32 i = 0; i < CountItems(); i++)
			{
				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
				if (jack)
				{
					if (jack->isInput())
					{
						jack->setPosition(inputOffset, Frame().top, Frame().bottom, &updateRegion);
						inputOffset += jack->Frame().Width() + MediaJack::M_DEFAULT_GAP;
					}
					if (jack->isOutput())
					{
						jack->setPosition(outputOffset, Frame().top, Frame().bottom, &updateRegion);
						outputOffset += jack->Frame().Width() + MediaJack::M_DEFAULT_GAP;
					}
				}
			}
			for (int32 i = 0; i < updateRegion.CountRects(); i++)
			{
				view()->Invalidate(updateRegion.RectAt(i));
			}
			break;
		}		
	}
	_updateBitmap();
}