diff options
-rw-r--r-- | clients/tde/src/part/scope/part.cpp | 10 | ||||
-rw-r--r-- | clients/tde/src/widgets/tracewidget.cpp | 187 | ||||
-rw-r--r-- | clients/tde/src/widgets/tracewidget.h | 11 |
3 files changed, 177 insertions, 31 deletions
diff --git a/clients/tde/src/part/scope/part.cpp b/clients/tde/src/part/scope/part.cpp index ae27923..b0e72de 100644 --- a/clients/tde/src/part/scope/part.cpp +++ b/clients/tde/src/part/scope/part.cpp @@ -64,6 +64,16 @@ ScopePart::ScopePart( TQWidget *parentWidget, const char *widgetName, TQObject * m_updateTimeoutTimer = new TQTimer(this); connect(m_updateTimeoutTimer, SIGNAL(timeout()), this, SLOT(mainEventLoop())); + // Initialize data + m_hdivs = 0; + m_vdivs = 0; + for (int traceno=0; traceno<=MAXTRACES; traceno++) { + m_samplesInTrace[traceno] = 0; + m_channelActive[traceno] = false; + m_voltsDiv[traceno] = 0; + m_secsDiv[traceno] = 0; + } + // Create widgets m_base = new ScopeBase(widget()); m_traceWidget = m_base->traceWidget; diff --git a/clients/tde/src/widgets/tracewidget.cpp b/clients/tde/src/widgets/tracewidget.cpp index 10299e5..7ba4b6e 100644 --- a/clients/tde/src/widgets/tracewidget.cpp +++ b/clients/tde/src/widgets/tracewidget.cpp @@ -22,6 +22,8 @@ #define CURSOR_DARKNESS_FACTOR 200 #define ZOOM_SHADING_DARKNESS_FACTOR 200 +#define CURSOR_MOVE_CAPTURE_DISTANCE 0 + TQRectF::TQRectF() { m_valid = false; } @@ -227,6 +229,8 @@ void TraceData::resetVPosition() { CursorData::CursorData(TraceWidget* parent, TQWidget* labelParent) : TQObject(), parentWidget(parent) { color = TQColor(0, 255, 0); + highlightColor = TQColor(192, 255, 192); + highlighted = false; enabled = false; orientation = TQt::Vertical; position = 50; @@ -285,7 +289,12 @@ CursorData::~CursorData() { } void CursorData::drawCursor(TQPainter* p, int graticule_width, int graticule_height) { - p->setPen(color.dark(parentWidget->m_cursorDarkness)); + if (highlighted) { + p->setPen(highlightColor.dark(parentWidget->m_cursorDarkness)); + } + else { + p->setPen(color.dark(parentWidget->m_cursorDarkness)); + } if (orientation == TQt::Vertical) { int x = abs(((position)/(100.0))*(graticule_width)); @@ -388,8 +397,11 @@ void CursorData::moveNegMultiTicks() { GraticuleWidget::GraticuleWidget(TraceWidget* parent, const char* name) : TQWidget(parent, name), m_base(parent), m_graticulePixmap(0), - leftMouseDown(false), - middleMouseDown(false) { + m_leftMouseDown(false), + m_middleMouseDown(false), + m_closestCursor(-1), + m_closestCursorDistance(-1), + m_movingCursor(-1) { setBackgroundMode(NoBackground); setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); @@ -474,47 +486,62 @@ void GraticuleWidget::resizeEvent(TQResizeEvent *) { } void GraticuleWidget::mousePressEvent(TQMouseEvent *e) { - if ((e->button() == TQt::LeftButton) && (!leftMouseDown) && (!middleMouseDown)) { - m_prevCursorRect = m_base->zoomCursorBox(); - if (m_base->m_zoomBoxEnabled) { - leftMouseDown = true; + if ((e->button() == TQt::LeftButton) && (!m_leftMouseDown) && (!m_middleMouseDown)) { + if (m_closestCursorDistance <= CURSOR_MOVE_CAPTURE_DISTANCE) { m_prevDownPos = e->pos(); + m_movingCursor = m_closestCursor; + m_prevCursorPos = m_base->m_cursorArray[m_movingCursor]->position; + m_leftMouseDown = true; + } + else { + m_prevCursorRect = m_base->zoomCursorBox(); + if (m_base->m_zoomBoxEnabled) { + m_leftMouseDown = true; + m_prevDownPos = e->pos(); + } } } - else if ((e->button() == TQt::MidButton) && (!leftMouseDown) && (!middleMouseDown)) { + else if ((e->button() == TQt::MidButton) && (!m_leftMouseDown) && (!m_middleMouseDown)) { m_prevCursorRect = m_base->zoomCursorBox(); if (m_base->m_zoomBoxEnabled) { - middleMouseDown = true; + m_middleMouseDown = true; m_prevDownPos = e->pos(); } } } void GraticuleWidget::mouseReleaseEvent(TQMouseEvent *e) { - if (leftMouseDown) { + if (m_leftMouseDown) { if (e->button() == TQt::LeftButton) { - leftMouseDown = false; - - double x1 = m_prevDownPos.x(); - double y1 = m_prevDownPos.y(); - double x2 = e->x(); - double y2 = e->y(); - if ((x1 < width()) && (y1 < height()) && (x2 < width()) && (y2 < height()) && (x1 > 0) && (y1 > 0) && (x2 > 0) && (y2 > 0)) { - x1 = ((x1/width())*100.0); - y1 = ((y1/height())*100.0); - x2 = ((x2/width())*100.0); - y2 = ((y2/height())*100.0); - m_base->setZoomCursorBox(TQRectF(x1, y1, x2, y2)); + m_leftMouseDown = false; + + if (m_movingCursor >= 0) { + m_movingCursor = -1; } else { - // Reset original zoom box - m_base->setZoomCursorBox(m_prevCursorRect); + double x1 = m_prevDownPos.x(); + double y1 = m_prevDownPos.y(); + double x2 = e->x(); + double y2 = e->y(); + double pixelDiffX = fabs(x1-x2); + double pixelDiffY = fabs(y1-y2); + if ((x1 < width()) && (y1 < height()) && (x2 < width()) && (y2 < height()) && (x1 > 0) && (y1 > 0) && (x2 > 0) && (y2 > 0) && (pixelDiffX>0) && (pixelDiffY>0)) { + x1 = ((x1/width())*100.0); + y1 = ((y1/height())*100.0); + x2 = ((x2/width())*100.0); + y2 = ((y2/height())*100.0); + m_base->setZoomCursorBox(TQRectF(x1, y1, x2, y2)); + } + else { + // Reset original zoom box + m_base->setZoomCursorBox(m_prevCursorRect); + } } } } - else if (middleMouseDown) { + else if (m_middleMouseDown) { if (e->button() == TQt::MidButton) { - middleMouseDown = false; + m_middleMouseDown = false; double x1 = m_prevDownPos.x(); double y1 = m_prevDownPos.y(); @@ -531,6 +558,9 @@ void GraticuleWidget::mouseReleaseEvent(TQMouseEvent *e) { } } } + + updateGraticule(); + repaint(true); } void GraticuleWidget::mouseDoubleClickEvent(TQMouseEvent *) { @@ -538,6 +568,67 @@ void GraticuleWidget::mouseDoubleClickEvent(TQMouseEvent *) { } void GraticuleWidget::mouseMoveEvent(TQMouseEvent *e) { + // If we are within X pixels of a cursor, change icon to appopriate drag arrows and set up to drag the cursor instead of replacing the zoom box + // Replacing the zoom box might need to be assigned to the right mouse button... + bool cursorHighlightChanged = false; + m_closestCursor = -1; + m_closestCursorDistance = -1; + if ((!m_leftMouseDown) && (!m_middleMouseDown) && (m_movingCursor < 0)) { + for (uint cursor=0;cursor<m_base->m_cursorArray.count();cursor++) { + double scaledYPos = (e->y()*100.0)/height(); + double scaledXPos = (e->x()*100.0)/width(); + unsigned int pixelDistance; + if (m_base->m_cursorArray[cursor]->orientation == TQt::Horizontal) { + pixelDistance = (fabs(m_base->m_cursorArray[cursor]->position - scaledYPos)*height())/100.0; + if (pixelDistance < m_closestCursorDistance) { + m_closestCursorDistance = pixelDistance; + m_closestCursor = cursor; + } + } + else { + pixelDistance = (fabs(m_base->m_cursorArray[cursor]->position - scaledXPos)*width())/100.0; + if (pixelDistance < m_closestCursorDistance) { + m_closestCursorDistance = pixelDistance; + m_closestCursor = cursor; + } + } + // Ensure previous highlighting is cleared + // This is needed when two cursors are placed right next to one another + if (m_base->m_cursorArray[m_closestCursor]->highlighted) { + cursorHighlightChanged = true; + } + m_base->m_cursorArray[cursor]->highlighted = false; + } + if (m_closestCursor >= 0) { + if (m_closestCursorDistance <= CURSOR_MOVE_CAPTURE_DISTANCE) { + if (m_base->m_cursorArray[m_closestCursor]->orientation == TQt::Horizontal) { + setCursor(tqsizeVerCursor); + } + else { + setCursor(tqsizeHorCursor); + } + if (!m_base->m_cursorArray[m_closestCursor]->highlighted) { + cursorHighlightChanged = true; + } + m_base->m_cursorArray[m_closestCursor]->highlighted = true; + } + else { + setCursor(tqcrossCursor); + if (m_base->m_cursorArray[m_closestCursor]->highlighted) { + cursorHighlightChanged = true; + } + m_base->m_cursorArray[m_closestCursor]->highlighted = false; + } + } + else { + setCursor(tqcrossCursor); + if (m_base->m_cursorArray[m_closestCursor]->highlighted) { + cursorHighlightChanged = true; + } + m_base->m_cursorArray[m_closestCursor]->highlighted = false; + } + } + // Print current cursor location for all traces if ((e->x() < width()) && (e->y() < height())) { for (uint trace=0;trace<m_base->m_traceArray.count();trace++) { @@ -563,7 +654,7 @@ void GraticuleWidget::mouseMoveEvent(TQMouseEvent *e) { } } - if (leftMouseDown) { + if ((m_leftMouseDown) && (m_movingCursor < 0)) { double x1 = m_prevDownPos.x(); double y1 = m_prevDownPos.y(); double x2 = e->x(); @@ -576,11 +667,36 @@ void GraticuleWidget::mouseMoveEvent(TQMouseEvent *e) { m_base->setZoomCursorBox(TQRectF(x1, y1, x2, y2)); } } - else if (middleMouseDown) { + else if ((m_leftMouseDown) && (m_movingCursor >= 0)) { + TQPoint diff = e->pos() - m_prevDownPos; + diff = TQPoint(diff.x()*(100.0/width()), diff.y()*(100.0/height())); + if (m_base->m_cursorArray[m_movingCursor]->orientation == TQt::Horizontal) { + m_base->m_cursorArray[m_movingCursor]->position = m_prevCursorPos+diff.y(); + } + else { + m_base->m_cursorArray[m_movingCursor]->position = m_prevCursorPos+diff.x(); + } + if (m_base->m_cursorArray[m_movingCursor]->position < 0.0) { + m_base->m_cursorArray[m_movingCursor]->position = 0.0; + } + if (m_base->m_cursorArray[m_movingCursor]->position > 100.0) { + m_base->m_cursorArray[m_movingCursor]->position = 100.0; + } + updateGraticule(); + repaint(true); + cursorHighlightChanged = false; + } + else if (m_middleMouseDown) { TQPoint diff = e->pos() - m_prevDownPos; diff = TQPoint(diff.x()*(100.0/width()), diff.y()*(100.0/height())); m_base->setZoomCursorBox(TQRectF(m_prevCursorRect.x()+diff.x(), m_prevCursorRect.y()+diff.y(), m_prevCursorRect.width()+diff.x(), m_prevCursorRect.height()+diff.y())); } + + m_base->updateCursorText(); + if (cursorHighlightChanged) { + updateGraticule(); + repaint(true); + } } void GraticuleWidget::enterEvent(TQEvent *) { @@ -732,7 +848,20 @@ void TraceWidget::updateTraceText() { void TraceWidget::updateCursorText() { for (uint cursor=0;cursor<m_cursorArray.count();cursor++) { m_cursorArray[cursor]->paramLabel->setPaletteBackgroundColor(paletteBackgroundColor()); - m_cursorArray[cursor]->paramLabel->setPaletteForegroundColor(m_cursorArray[cursor]->color); + if (m_cursorArray[cursor]->highlighted) { + m_cursorArray[cursor]->paramLabel->setPaletteForegroundColor(m_cursorArray[cursor]->highlightColor); + m_cursorArray[cursor]->singleIncrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->highlightColor); + m_cursorArray[cursor]->singleDecrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->highlightColor); + m_cursorArray[cursor]->multiIncrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->highlightColor); + m_cursorArray[cursor]->multiDecrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->highlightColor); + } + else { + m_cursorArray[cursor]->paramLabel->setPaletteForegroundColor(m_cursorArray[cursor]->color); + m_cursorArray[cursor]->singleIncrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->color); + m_cursorArray[cursor]->singleDecrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->color); + m_cursorArray[cursor]->multiIncrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->color); + m_cursorArray[cursor]->multiDecrBtn->setPaletteForegroundColor(m_cursorArray[cursor]->color); + } TQString cursorText; cursorText = TQString("<qt><nobr>%1").arg(m_cursorArray[cursor]->cursorName); // If this is a horizontal cursor, list all vertical positions for all channels diff --git a/clients/tde/src/widgets/tracewidget.h b/clients/tde/src/widgets/tracewidget.h index 0dfaead..649077b 100644 --- a/clients/tde/src/widgets/tracewidget.h +++ b/clients/tde/src/widgets/tracewidget.h @@ -104,6 +104,8 @@ class CursorData : public TQObject private: TQColor color; + TQColor highlightColor; + bool highlighted; bool enabled; TQt::Orientation orientation; double position; @@ -116,6 +118,7 @@ class CursorData : public TQObject TraceWidget* parentWidget; friend class TraceWidget; + friend class GraticuleWidget; }; typedef TQMemArray<CursorData*> CursorList; @@ -144,8 +147,12 @@ class GraticuleWidget : public TQWidget private: TraceWidget* m_base; TQPixmap* m_graticulePixmap; - bool leftMouseDown; - bool middleMouseDown; + bool m_leftMouseDown; + bool m_middleMouseDown; + int m_closestCursor; + unsigned int m_closestCursorDistance; + int m_movingCursor; + double m_prevCursorPos; TQPoint m_prevDownPos; TQRectF m_prevCursorRect; |