////////////////////////////////////////////////////////////////////// // 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::MiddleButton) { // 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(); } }
void CPlotter::draw(float swide[], int i0) //draw() { int j,y2; float y; m_i0=i0; double gain = pow(10.0,0.05*(m_plotGain+7)); //move current data down one line (must do this before attaching a QPainter object) m_WaterfallPixmap.scroll(0,1,0,0,m_w,m_h1); QPainter painter1(&m_WaterfallPixmap); m_2DPixmap = m_OverlayPixmap.copy(0,0,m_w,m_h2); QPainter painter2D(&m_2DPixmap); painter2D.setPen(Qt::green); QPoint LineBuf[MAX_SCREENSIZE]; j=0; // int iz=XfromFreq(2000.0); int iz=XfromFreq(5000.0); m_fMax=FreqfromX(iz); for(int i=0; i<iz; i++) { if(i>iz) swide[i]=0; y=0.0; if(swide[i]>0.0) y = 10.0*log10(swide[i]); int y1 = 5.0*gain*y + 10*(m_plotZero-4); if (y1<0) y1=0; if (y1>254) y1=254; if (swide[i]>1.e29) y1=255; painter1.setPen(m_ColorTbl[y1]); painter1.drawPoint(i,0); y2=0; if(m_bCurrent) y2 = 0.4*gain*y - 15; if(m_bCumulative) { float sum=0.0; int j=m_binsPerPixel*i; for(int k=0; k<m_binsPerPixel; k++) { sum+=jt9com_.savg[j++]; } y2=gain*6.0*log10(sum/m_binsPerPixel) - 10.0; } y2 += m_plotZero; if(i==iz-1) painter2D.drawPolyline(LineBuf,j); LineBuf[j].setX(i); LineBuf[j].setY(m_h-(y2+0.8*m_h)); j++; } if(swide[0]>1.0e29) m_line=0; m_line++; if(m_line == 13) { UTCstr(); painter1.setPen(Qt::white); painter1.drawText(5,10,m_sutc); } update(); //trigger a new paintEvent }
void CPlotter::setTxFreq(int x, bool bf) //setTxFreq() { if(bf) { m_TxFreq=x; // x is freq in Hz m_xClick=XfromFreq(m_TxFreq); } else { if(x<0) x=0; // x is pixel number if(x>m_Size.width()) x=m_Size.width(); m_TxFreq = int(FreqfromX(x)+0.5); m_xClick=x; } DrawOverlay(); update(); }
////////////////////////////////////////////////////////////////////// // Called when a mouse wheel is turned ////////////////////////////////////////////////////////////////////// void CPlotter::wheelEvent(QWheelEvent * event) { QPoint pt = event->pos(); int numDegrees = event->delta() / 8; int numSteps = numDegrees / 15; /** FIXME: Only used for direction **/ /** FIXME: zooming could use some optimisation **/ if (m_CursorCaptured == YAXIS) { // Vertical zoom. Wheel down: zoom out, wheel up: zoom in // During zoom we try to keep the point (dB or kHz) under the cursor fixed float zoom_fac = event->delta() < 0 ? 1.1 : 0.9; float ratio = (float)pt.y() / (float)m_OverlayPixmap.height(); float db_range = (float)(m_MaxdB - m_MindB); float y_range = (float)m_OverlayPixmap.height(); float db_per_pix = db_range / y_range; float fixed_db = m_MaxdB - pt.y() * db_per_pix; db_range *= zoom_fac; m_MaxdB = fixed_db + ratio*db_range; m_MindB = m_MaxdB - db_range; } else if (m_CursorCaptured == XAXIS) { // calculate new range shown on FFT float zoom_factor = event->delta() < 0 ? 1.1 : 0.9; float new_range = (float)(m_Span) * zoom_factor; // Frequency where event occured is kept fixed under mouse float ratio = (float)pt.x() / (float)m_OverlayPixmap.width(); float fixed_hz = FreqfromX(pt.x()); float f_max = fixed_hz + (1.0 - ratio) * new_range; float f_min = f_max - new_range; qint64 fc = (qint64)(f_min + (f_max - f_min) / 2.0); SetFftCenterFreq(fc-m_CenterFreq); SetSpanFreq((quint32)new_range); zoom_factor = (float)m_SampleFreq/(float)m_Span; qDebug() << QString("Spectrum zoom: %1x").arg(zoom_factor, 0, 'f', 1); } else if (event->modifiers() & Qt::ControlModifier) { // filter width m_DemodLowCutFreq -= numSteps*m_ClickResolution; m_DemodHiCutFreq += numSteps*m_ClickResolution; ClampDemodParameters(); emit NewFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); } else if (event->modifiers() & Qt::ShiftModifier) { // filter shift m_DemodLowCutFreq += numSteps*m_ClickResolution; m_DemodHiCutFreq += numSteps*m_ClickResolution; ClampDemodParameters(); emit NewFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); } else { // inc/dec demod frequency m_DemodCenterFreq += (numSteps*m_ClickResolution); m_DemodCenterFreq = RoundFreq(m_DemodCenterFreq, m_ClickResolution ); emit NewDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); } if (m_Running) m_DrawOverlay = true; else DrawOverlay(); }
////////////////////////////////////////////////////////////////////// // 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::CrossCursor)); m_CursorCaptured = CENTER; } else if (IsPointCloseTo(pt.x(), m_DemodHiCutFreqX, m_CursorCaptureDelta)) { //in move demod hicut region if (RIGHT != m_CursorCaptured) setCursor(QCursor(Qt::SizeHorCursor)); m_CursorCaptured = RIGHT; } else if (IsPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { //in move demod lowcut region if (LEFT != m_CursorCaptured) setCursor(QCursor(Qt::SizeHorCursor)); 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 int delta_px = m_Yzero - pt.y(); int delta_db = delta_px * abs(m_MindB-m_MaxdB)/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::MiddleButton)) { 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::MiddleButton) { m_CenterFreq += delta_hz; m_DemodCenterFreq += delta_hz; emit NewCenterFreq(m_CenterFreq); } else { 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) { //if no mouse button monitor grab regions and change cursor icon if (IsPointCloseTo(pt.x(), (m_DemodHiCutFreqX+m_DemodLowCutFreqX)/2, 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::SizeHorCursor)); m_CursorCaptured = RIGHT; } else if (IsPointCloseTo(pt.x(), m_DemodLowCutFreqX, m_CursorCaptureDelta)) { //in move demod lowcut region if (LEFT != m_CursorCaptured) setCursor(QCursor(Qt::SizeHorCursor)); m_CursorCaptured = LEFT; } 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 (LEFT == m_CursorCaptured) { //moving in demod lowcut region if (event->buttons() & Qt::LeftButton) { //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); //DrawOverlay(); if (m_symetric) { m_DemodHiCutFreq = -m_DemodLowCutFreq; //emit NewHighCutFreq(m_DemodHiCutFreq); } //emit NewLowCutFreq(m_DemodLowCutFreq); emit NewFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); DrawOverlay(); } 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) { //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); DrawOverlay(); if (m_symetric) { m_DemodLowCutFreq = -m_DemodHiCutFreq; //emit NewLowCutFreq(m_DemodLowCutFreq); } //emit NewHighCutFreq(m_DemodHiCutFreq); emit NewFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); } 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); DrawOverlay(); } 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; } }