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; }
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; }
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(); }