void QClipAnimator::setClip(QAbstractAnimationClip *clip) { Q_D(QClipAnimator); if (d->m_clip == clip) return; if (d->m_clip) d->unregisterDestructionHelper(d->m_clip); if (clip && !clip->parent()) clip->setParent(this); d->m_clip = clip; // Ensures proper bookkeeping if (d->m_clip) d->registerDestructionHelper(d->m_clip, &QClipAnimator::setClip, d->m_clip); emit clipChanged(clip); }
void CAnimMixer::processMove(sInt cursorX, sInt cursorY) { updateThisClip(); if (m_thisClip && m_moveElement != -1) { sInt nsFrame = fr::maximum(0.0f, m_baseRelStart + (cursorX - m_dragPoint.x) / m_frameStep); sInt nTrack = fr::clamp(m_baseTrack + sInt(cursorY - m_dragPoint.y) / 22, 0, m_maxTrack); frAnimationClip::element& elem = m_thisClip->m_elements[m_moveElement]; nsFrame = performSnap(m_moveElement, nsFrame); if (nsFrame != elem.relStart || nTrack != elem.trackID) { elem.updateLen(); CRect rc1, rc2; getElemRect(m_moveElement, rc1); elem.relStart = nsFrame; elem.trackID = nTrack; getElemRect(m_moveElement, rc2); CRgn rgn1, rgn2; rgn1.CreateRectRgnIndirect(&rc1); rgn2.CreateRectRgnIndirect(&rc2); rgn1.CombineRgn(rgn1, rgn2, RGN_DIFF); InvalidateRgn(rgn1, TRUE); UpdateWindow(); // erasebackground is a per-region flag, so we need to paint twice InvalidateRect(&rc2, FALSE); UpdateWindow(); clipChanged(); } } }
LRESULT CAnimMixer::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { RECT rcElem; updateThisClip(); switch (wParam) { case VK_SPACE: { CMenu dragMenu; dragMenu.CreatePopupMenu(); typedef std::vector<fr::string> stringVec; typedef stringVec::iterator stringVecIt; typedef stringVec::const_iterator stringVecCIt; stringVec clipNames; for (frClipContainer::nameMapCIt nit = g_graph->m_clips->m_names.begin(); nit != g_graph->m_clips->m_names.end(); ++nit) clipNames.push_back(nit->first); std::sort(clipNames.begin(), clipNames.end()); for (sInt i = 0; i < clipNames.size(); i++) { if (clipNames[i] != m_thisClip->getName() && clipNames[i] != fr::string("Timeline")) dragMenu.AppendMenu(MF_STRING, i + 1, clipNames[i]); } CPoint ptCursor; ::GetCursorPos(&ptCursor); sInt res = dragMenu.TrackPopupMenu(TPM_CENTERALIGN | TPM_RETURNCMD | TPM_VCENTERALIGN | TPM_NONOTIFY, ptCursor.x, ptCursor.y, m_hWnd); if (res) // clip selected { const fr::string selClipName = clipNames[res - 1]; ScreenToClient(&ptCursor); const sInt startFrame = (m_startPixel + ptCursor.x) / m_frameStep; const sInt trackNum = (ptCursor.y - 48) / 22; m_thisClip->addElement(startFrame, fr::minimum(trackNum, getMaxTrackNumber() + 1), selClipName); const sInt lastElem = m_thisClip->m_elements.size() - 1; m_thisClip->m_elements.back().relStart = performSnap(lastElem, startFrame); getElemRect(lastElem, rcElem); clipChanged(); InvalidateRect(&rcElem, FALSE); UpdateWindow(); } } break; case VK_BACK: case VK_DELETE: getElemRect(m_curElem, rcElem); m_thisClip->deleteElement(m_curElem); if (m_moveElement == m_curElem) m_moveElement = -1; m_curElem = -1; clipChanged(); InvalidateRect(&rcElem, TRUE); UpdateWindow(); break; default: bHandled = FALSE; } return 0; }
void dummyClip::changed2() { clipChanged(QClipboard::Selection); }
void dummyClip::changed1() { clipChanged(QClipboard::Clipboard); }