////////////////////////////////////////////////////////////////////// // Called when a mouse button is pressed ////////////////////////////////////////////////////////////////////// void CPlotter::mousePressEvent(QMouseEvent * event) { QPoint pt = event->pos(); if (NONE == m_CursorCaptured) { if (isPointCloseTo(pt.x(), m_DemodFreqX, m_CursorCaptureDelta)) { //in move demod box center frequency region m_CursorCaptured = CENTER; m_GrabPosition = pt.x()-m_DemodFreqX; } else if (isPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { // filter low cut m_CursorCaptured = LEFT; m_GrabPosition = pt.x()-m_DemodLowCutFreqX; } else if (isPointCloseTo(pt.x(), m_DemodHiCutFreqX, m_CursorCaptureDelta)) { // filter high cut m_CursorCaptured = RIGHT; m_GrabPosition = pt.x()-m_DemodHiCutFreqX; } else { if (event->buttons() == Qt::LeftButton) { //if cursor not captured set demod frequency and start demod box capture m_DemodCenterFreq = roundFreq(freqFromX(pt.x()),m_ClickResolution ); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); //save initial grab postion from m_DemodFreqX //setCursor(QCursor(Qt::CrossCursor)); m_CursorCaptured = CENTER; m_GrabPosition = 1; //m_GrabPosition = pt.x()-m_DemodFreqX; drawOverlay(); } else if (event->buttons() == Qt::MidButton) { // set center freq m_CenterFreq = roundFreq(freqFromX(pt.x()), m_ClickResolution); m_DemodCenterFreq = m_CenterFreq; emit newCenterFreq(m_CenterFreq); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); } } } else { if (m_CursorCaptured == YAXIS) // get ready for moving Y axis m_Yzero = pt.y(); else if (m_CursorCaptured == XAXIS) m_Xzero = pt.x(); } }
////////////////////////////////////////////////////////////////////// // Called when a mouse button is pressed ////////////////////////////////////////////////////////////////////// void CPlotter::mousePressEvent(QMouseEvent * event) { QPoint pt = event->pos(); if (NONE == m_CursorCaptured) { if (isPointCloseTo(pt.x(), m_DemodFreqX, m_CursorCaptureDelta)) { //in move demod box center frequency region m_CursorCaptured = CENTER; m_GrabPosition = pt.x()-m_DemodFreqX; } else if (isPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { // filter low cut m_CursorCaptured = LEFT; m_GrabPosition = pt.x()-m_DemodLowCutFreqX; } else if (isPointCloseTo(pt.x(), m_DemodHiCutFreqX, m_CursorCaptureDelta)) { // filter high cut m_CursorCaptured = RIGHT; m_GrabPosition = pt.x()-m_DemodHiCutFreqX; } else { if (event->buttons() == Qt::LeftButton) { int best=-1; if(m_PeakDetection>0) best = getNearestPeak(pt); if(best!=-1) m_DemodCenterFreq = freqFromX(best); else m_DemodCenterFreq = roundFreq(freqFromX(pt.x()),m_ClickResolution ); //if cursor not captured set demod frequency and start demod box capture emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); //save initial grab postion from m_DemodFreqX //setCursor(QCursor(Qt::CrossCursor)); m_CursorCaptured = CENTER; m_GrabPosition = 1; //m_GrabPosition = pt.x()-m_DemodFreqX; drawOverlay(); } else if (event->buttons() == Qt::MidButton) { // set center freq m_CenterFreq = roundFreq(freqFromX(pt.x()), m_ClickResolution); m_DemodCenterFreq = m_CenterFreq; emit newCenterFreq(m_CenterFreq); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); } } } else { if (m_CursorCaptured == YAXIS) // get ready for moving Y axis m_Yzero = pt.y(); else if (m_CursorCaptured == XAXIS) m_Xzero = pt.x(); else if(m_CursorCaptured==BOOKMARK) { for(int i=0; i<m_BookmarkTags.size(); i++) { if(m_BookmarkTags[i].first.contains(event->pos())) { m_DemodCenterFreq = m_BookmarkTags[i].second; emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); break; } } } } }
////////////////////////////////////////////////////////////////////// // Called when mouse moves and does different things depending //on the state of the mouse buttons for dragging the demod bar or // filter edges. ////////////////////////////////////////////////////////////////////// void CPlotter::mouseMoveEvent(QMouseEvent* event) { QPoint pt = event->pos(); /* mouse enter / mouse leave events */ if (m_OverlayPixmap.rect().contains(pt)) { //is in Overlay bitmap region if (event->buttons() == Qt::NoButton) { //if no mouse button monitor grab regions and change cursor icon if (isPointCloseTo(pt.x(), m_DemodFreqX, m_CursorCaptureDelta)) { //in move demod box center frequency region if (CENTER != m_CursorCaptured) setCursor(QCursor(Qt::SizeHorCursor)); m_CursorCaptured = CENTER; } else if (isPointCloseTo(pt.x(), m_DemodHiCutFreqX, m_CursorCaptureDelta)) { //in move demod hicut region if (RIGHT != m_CursorCaptured) setCursor(QCursor(Qt::SizeFDiagCursor)); m_CursorCaptured = RIGHT; } else if (isPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { //in move demod lowcut region if (LEFT != m_CursorCaptured) setCursor(QCursor(Qt::SizeBDiagCursor)); m_CursorCaptured = LEFT; } else if (isPointCloseTo(pt.x(), m_YAxisWidth/2, m_YAxisWidth/2)) { if (YAXIS != m_CursorCaptured) setCursor(QCursor(Qt::OpenHandCursor)); m_CursorCaptured = YAXIS; } else if (isPointCloseTo(pt.y(), m_XAxisYCenter, m_CursorCaptureDelta+5)) { if (XAXIS != m_CursorCaptured) setCursor(QCursor(Qt::OpenHandCursor)); m_CursorCaptured = XAXIS; } else { //if not near any grab boundaries if (NONE != m_CursorCaptured) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } m_GrabPosition = 0; } } else { //not in Overlay region if (event->buttons() == Qt::NoButton) { if (NONE != m_CursorCaptured) setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; m_GrabPosition = 0; } } // process mouse moves while in cursor capture modes if (YAXIS == m_CursorCaptured) { if (event->buttons() & Qt::LeftButton) { setCursor(QCursor(Qt::ClosedHandCursor)); // move Y scale up/down double delta_px = m_Yzero - pt.y(); double delta_db = delta_px * abs(m_MindB-m_MaxdB)/(double)m_OverlayPixmap.height(); m_MindB -= delta_db; m_MaxdB -= delta_db; if (m_Running) m_DrawOverlay = true; else drawOverlay(); m_Yzero = pt.y(); } } else if (XAXIS == m_CursorCaptured) { if (event->buttons() & (Qt::LeftButton | Qt::MidButton)) { setCursor(QCursor(Qt::ClosedHandCursor)); // pan viewable range or move center frequency int delta_px = m_Xzero - pt.x(); qint64 delta_hz = delta_px * m_Span / m_OverlayPixmap.width(); if (event->buttons() & Qt::MidButton) { m_CenterFreq += delta_hz; m_DemodCenterFreq += delta_hz; emit newCenterFreq(m_CenterFreq); } else { setFftCenterFreq(m_FftCenter + delta_hz); } if (m_Running) m_DrawOverlay = true; else drawOverlay(); m_Xzero = pt.x(); } } else if (LEFT == m_CursorCaptured) { // moving in demod lowcut region if (event->buttons() & (Qt::LeftButton|Qt::RightButton)) { //moving in demod lowcut region with left button held if (m_GrabPosition != 0) { m_DemodLowCutFreq = freqFromX(pt.x()-m_GrabPosition ) - m_DemodCenterFreq; m_DemodLowCutFreq = roundFreq(m_DemodLowCutFreq, m_FilterClickResolution); if (m_symetric && (event->buttons() & Qt::LeftButton)) // symetric adjustment { m_DemodHiCutFreq = -m_DemodLowCutFreq; } clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update oiverlay now } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodLowCutFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else if (RIGHT == m_CursorCaptured) { // moving in demod highcut region if (event->buttons() & (Qt::LeftButton|Qt::RightButton)) { // moving in demod highcut region with right button held if (m_GrabPosition != 0) { m_DemodHiCutFreq = freqFromX( pt.x()-m_GrabPosition ) - m_DemodCenterFreq; m_DemodHiCutFreq = roundFreq(m_DemodHiCutFreq, m_FilterClickResolution); if (m_symetric && (event->buttons() & Qt::LeftButton)) // symetric adjustment { m_DemodLowCutFreq = -m_DemodHiCutFreq; } clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update oiverlay now } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodHiCutFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else if (CENTER == m_CursorCaptured) { // moving inbetween demod lowcut and highcut region if (event->buttons() & Qt::LeftButton) { // moving inbetween demod lowcut and highcut region with left button held if (m_GrabPosition != 0) { m_DemodCenterFreq = roundFreq(freqFromX(pt.x()-m_GrabPosition), m_ClickResolution ); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update oiverlay now } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else //if cursor not captured { m_GrabPosition = 0; } if (!this->rect().contains(pt)) { if(NONE != m_CursorCaptured) setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } }
////////////////////////////////////////////////////////////////////// // Called when mouse moves and does different things depending //on the state of the mouse buttons for dragging the demod bar or // filter edges. ////////////////////////////////////////////////////////////////////// void CPlotter::mouseMoveEvent(QMouseEvent* event) { QPoint pt = event->pos(); /* mouse enter / mouse leave events */ if (m_OverlayPixmap.rect().contains(pt)) { //is in Overlay bitmap region if (event->buttons() == Qt::NoButton) { bool onTag=false; if(pt.y()<15*3) //FIXME { for(int i=0; i<m_BookmarkTags.size() && !onTag; i++) { if(m_BookmarkTags[i].first.contains(event->pos())) onTag=true; } } //if no mouse button monitor grab regions and change cursor icon if(onTag) { setCursor(QCursor(Qt::PointingHandCursor)); m_CursorCaptured=BOOKMARK; } else if (isPointCloseTo(pt.x(), m_DemodFreqX, m_CursorCaptureDelta)) { //in move demod box center frequency region if (CENTER != m_CursorCaptured) setCursor(QCursor(Qt::SizeHorCursor)); m_CursorCaptured = CENTER; if (m_TooltipsEnabled) QToolTip::showText(event->globalPos(), QString("Demod: %1 kHz") .arg(m_DemodCenterFreq/1.e3f, 0, 'f', 3), this, rect()); } else if (isPointCloseTo(pt.x(), m_DemodHiCutFreqX, m_CursorCaptureDelta)) { //in move demod hicut region if (RIGHT != m_CursorCaptured) setCursor(QCursor(Qt::SizeFDiagCursor)); m_CursorCaptured = RIGHT; if (m_TooltipsEnabled) QToolTip::showText(event->globalPos(), QString("High cut: %1 Hz") .arg(m_DemodHiCutFreq), this, rect()); } else if (isPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { //in move demod lowcut region if (LEFT != m_CursorCaptured) setCursor(QCursor(Qt::SizeBDiagCursor)); m_CursorCaptured = LEFT; if (m_TooltipsEnabled) QToolTip::showText(event->globalPos(), QString("Low cut: %1 Hz") .arg(m_DemodLowCutFreq), this, rect()); } else if (isPointCloseTo(pt.x(), m_YAxisWidth/2, m_YAxisWidth/2)) { if (YAXIS != m_CursorCaptured) setCursor(QCursor(Qt::OpenHandCursor)); m_CursorCaptured = YAXIS; if (m_TooltipsEnabled) QToolTip::hideText(); } else if (isPointCloseTo(pt.y(), m_XAxisYCenter, m_CursorCaptureDelta+5)) { if (XAXIS != m_CursorCaptured) setCursor(QCursor(Qt::OpenHandCursor)); m_CursorCaptured = XAXIS; if (m_TooltipsEnabled) QToolTip::hideText(); } else { //if not near any grab boundaries if (NONE != m_CursorCaptured) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } if (m_TooltipsEnabled) QToolTip::showText(event->globalPos(), QString("F: %1 kHz") .arg(freqFromX(pt.x())/1.e3f, 0, 'f', 3), this, rect()); } m_GrabPosition = 0; } } else { //not in Overlay region if (event->buttons() == Qt::NoButton) { if (NONE != m_CursorCaptured) setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; m_GrabPosition = 0; } if (m_TooltipsEnabled) QToolTip::showText(event->globalPos(), QString("F: %1 kHz") .arg(freqFromX(pt.x())/1.e3f, 0, 'f', 3), this, rect()); } // process mouse moves while in cursor capture modes if (YAXIS == m_CursorCaptured) { if (event->buttons() & Qt::LeftButton) { setCursor(QCursor(Qt::ClosedHandCursor)); // move Y scale up/down float delta_px = m_Yzero - pt.y(); float delta_db = delta_px * fabs(m_MindB-m_MaxdB)/(float)m_OverlayPixmap.height(); m_MindB -= delta_db; m_MaxdB -= delta_db; if (m_Running) m_DrawOverlay = true; else drawOverlay(); m_PeakHoldValid = false; m_Yzero = pt.y(); } } else if (XAXIS == m_CursorCaptured) { if (event->buttons() & (Qt::LeftButton | Qt::MidButton)) { setCursor(QCursor(Qt::ClosedHandCursor)); // pan viewable range or move center frequency int delta_px = m_Xzero - pt.x(); qint64 delta_hz = delta_px * m_Span / m_OverlayPixmap.width(); if (event->buttons() & Qt::MidButton) { m_CenterFreq += delta_hz; m_DemodCenterFreq += delta_hz; emit newCenterFreq(m_CenterFreq); } else { setFftCenterFreq(m_FftCenter + delta_hz); } if (m_Running) m_DrawOverlay = true; else drawOverlay(); m_PeakHoldValid = false; m_Xzero = pt.x(); } } else if (LEFT == m_CursorCaptured) { // moving in demod lowcut region if (event->buttons() & (Qt::LeftButton|Qt::RightButton)) { //moving in demod lowcut region with left button held if (m_GrabPosition != 0) { m_DemodLowCutFreq = freqFromX(pt.x()-m_GrabPosition ) - m_DemodCenterFreq; m_DemodLowCutFreq = roundFreq(m_DemodLowCutFreq, m_FilterClickResolution); if (m_symetric && (event->buttons() & Qt::LeftButton)) // symetric adjustment { m_DemodHiCutFreq = -m_DemodLowCutFreq; } clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update overlay now } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodLowCutFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else if (RIGHT == m_CursorCaptured) { // moving in demod highcut region if (event->buttons() & (Qt::LeftButton|Qt::RightButton)) { // moving in demod highcut region with right button held if (m_GrabPosition != 0) { m_DemodHiCutFreq = freqFromX( pt.x()-m_GrabPosition ) - m_DemodCenterFreq; m_DemodHiCutFreq = roundFreq(m_DemodHiCutFreq, m_FilterClickResolution); if (m_symetric && (event->buttons() & Qt::LeftButton)) // symetric adjustment { m_DemodLowCutFreq = -m_DemodHiCutFreq; } clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update oiverlay now } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodHiCutFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else if (CENTER == m_CursorCaptured) { // moving inbetween demod lowcut and highcut region if (event->buttons() & Qt::LeftButton) { // moving inbetween demod lowcut and highcut region with left button held if (m_GrabPosition != 0) { m_DemodCenterFreq = roundFreq(freqFromX(pt.x()-m_GrabPosition), m_ClickResolution ); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); if (m_Running) m_DrawOverlay = true; // schedule update of overlay during draw() else drawOverlay(); // not running so update oiverlay now m_PeakHoldValid = false; } else { //save initial grab postion from m_DemodFreqX m_GrabPosition = pt.x()-m_DemodFreqX; } } else if (event->buttons() & ~Qt::NoButton) { setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } } else //if cursor not captured { m_GrabPosition = 0; } if (!this->rect().contains(pt)) { if(NONE != m_CursorCaptured) setCursor(QCursor(Qt::ArrowCursor)); m_CursorCaptured = NONE; } }