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