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