bc7497f2 | 2014-03-03 18:36:33 | Timothy Pearson |
Fix slow TraceWidget redraw Add proper horizontal scrolling to TraceWidget |
||
M clients/tde/src/part/logicanalyzer/layout.ui M clients/tde/src/part/logicanalyzer/part.cpp M clients/tde/src/part/scope/layout.ui M clients/tde/src/part/scope/part.cpp M clients/tde/src/widgets/tracewidget.cpp M clients/tde/src/widgets/tracewidget.h |
||
diff --git a/clients/tde/src/part/logicanalyzer/layout.ui b/clients/tde/src/part/logicanalyzer/layout.ui index 9175fa5..8b10ded 100644 --- a/clients/tde/src/part/logicanalyzer/layout.ui +++ b/clients/tde/src/part/logicanalyzer/layout.ui @@ -63,9 +63,6 @@ <height>0</height> </size> </property> - <property name="resizePolicy"> - <enum>AutoOneFit</enum> - </property> </widget> </widget> </grid> diff --git a/clients/tde/src/part/logicanalyzer/part.cpp b/clients/tde/src/part/logicanalyzer/part.cpp index 2cc62a3..28f2c3f 100644 --- a/clients/tde/src/part/logicanalyzer/part.cpp +++ b/clients/tde/src/part/logicanalyzer/part.cpp @@ -122,6 +122,7 @@ m_traceControlWidgetGrid = new TQGridLayout(m_base->traceControlLayoutWidget); m_traceWidget = m_base->traceScrollWidget->traceWidget(); m_base->traceScrollWidget->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); + m_base->traceScrollWidget->setResizePolicy(TQScrollView::AutoOneFit); m_base->traceScrollWidget->setHScrollBarMode(TQScrollView::Auto); m_base->traceScrollWidget->setVScrollBarMode(TQScrollView::Auto); m_traceWidget->showLeftTraceInfoArea(true); diff --git a/clients/tde/src/part/scope/layout.ui b/clients/tde/src/part/scope/layout.ui index ae22434..b81f97b 100644 --- a/clients/tde/src/part/scope/layout.ui +++ b/clients/tde/src/part/scope/layout.ui @@ -63,9 +63,6 @@ <height>0</height> </size> </property> - <property name="resizePolicy"> - <enum>AutoOneFit</enum> - </property> </widget> <widget class="TraceWidget" row="1" column="0" colspan="1"> <property name="name"> diff --git a/clients/tde/src/part/scope/part.cpp b/clients/tde/src/part/scope/part.cpp index 3277e0a..52851c0 100644 --- a/clients/tde/src/part/scope/part.cpp +++ b/clients/tde/src/part/scope/part.cpp @@ -204,6 +204,7 @@ m_traceWidget = m_base->traceScrollWidget->traceWidget(); connect(m_traceWidget, SIGNAL(cursorDragged(uint, double)), this, SLOT(cursorLevelChanged(uint, double))); m_base->traceScrollWidget->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); + m_base->traceScrollWidget->setResizePolicy(TQScrollView::AutoOneFit); m_base->traceScrollWidget->setHScrollBarMode(TQScrollView::AlwaysOff); m_base->traceScrollWidget->setVScrollBarMode(TQScrollView::AlwaysOff); m_traceWidget->setNumberOfCursors(5); diff --git a/clients/tde/src/widgets/tracewidget.cpp b/clients/tde/src/widgets/tracewidget.cpp index 04a2a00..b0d2e6e 100644 --- a/clients/tde/src/widgets/tracewidget.cpp +++ b/clients/tde/src/widgets/tracewidget.cpp @@ -378,7 +378,7 @@ // } -void TraceData::drawTrace(TQPainter* p, int graticule_width, int graticule_height) { +void TraceData::drawTrace(TQPainter* p, int graticule_width, int graticule_height, int virtual_width, int virtual_height) { p->save(); p->setPen(color); @@ -387,18 +387,22 @@ unsigned int n; unsigned int incr; unsigned int activeSamples; - int x,y,x2,y2; + int x,y,x2,y2,horizoffset; + + // Obtain horizontal scrolling offset + horizoffset = parentWidget->horizScrollOffset(); + // Determine how many samples are actually being displayed if ((leftEdgeIndex < 0) || (rightEdgeIndex < 0)) { for (n=0; n<numberOfSamples; n++) { - x = (((positionArray[n]-leftEdge)/(rightEdge-leftEdge))*(graticule_width)); + x = (((positionArray[n]-leftEdge)/(rightEdge-leftEdge))*(virtual_width)); if (leftEdgeIndex < 0) { if (x >= 0) { leftEdgeIndex = n; } } else { - if (x >= graticule_width) { + if (x >= virtual_width) { rightEdgeIndex = n; break; } @@ -409,22 +413,30 @@ } } activeSamples = abs(rightEdgeIndex-leftEdgeIndex); - incr = (activeSamples/graticule_width)+1; + incr = (activeSamples/virtual_width)+1; for (n=leftEdgeIndex; n<numberOfSamples-incr; n=n+incr) { - x = (((positionArray[n]-leftEdge)/(rightEdge-leftEdge))*(graticule_width)); - y = ((((sampleArray[n]+offset)-topEdge)/(bottomEdge-topEdge))*(graticule_height)); - x2 = (((positionArray[n+incr]-leftEdge)/(rightEdge-leftEdge))*(graticule_width)); - y2 = ((((sampleArray[n+incr]+offset)-topEdge)/(bottomEdge-topEdge))*(graticule_height)); + x = (((positionArray[n]-leftEdge)/(rightEdge-leftEdge))*(virtual_width))-horizoffset; + y = ((((sampleArray[n]+offset)-topEdge)/(bottomEdge-topEdge))*(virtual_height)); + x2 = (((positionArray[n+incr]-leftEdge)/(rightEdge-leftEdge))*(virtual_width))-horizoffset; + y2 = ((((sampleArray[n+incr]+offset)-topEdge)/(bottomEdge-topEdge))*(virtual_height)); - if (x < 0) x = 0; - if (x > graticule_width) x = graticule_width; + // Do not draw lines that are placed fully off the screen + if ((x < 0) && (x2 < 0)) continue; + if ((y < 0) && (y2 < 0)) continue; + if ((x > graticule_width) && (x2 > graticule_width)) continue; + if ((y > graticule_height) && (y2 > graticule_height)) continue; + + // Clip lines to screen borders + if (x < (0-horizoffset)) x = (0-horizoffset); + if (x > (virtual_width-horizoffset)) x = (virtual_width-horizoffset); if (y < 0) y = 0; - if (y > graticule_height) y = graticule_height; - if (x2 < 0) x2 = 0; - if (x2 > graticule_width) x2 = graticule_width; + if (y > virtual_height) y = virtual_height; + if (x2 < (0-horizoffset)) x2 = (0-horizoffset); + if (x2 > (virtual_width-horizoffset)) x2 = (virtual_width-horizoffset); if (y2 < 0) y2 = 0; - if (y2 > graticule_height) y2 = graticule_height; + if (y2 > virtual_height) y2 = virtual_height; + // Draw line! p->drawLine(x, y, x2, y2); } @@ -580,7 +592,7 @@ // } -void CursorData::drawCursor(TQPainter* p, int graticule_width, int graticule_height) { +void CursorData::drawCursor(TQPainter* p, int graticule_width, int graticule_height, int virtual_width, int virtual_height, int offset) { if (enabled) { if (highlighted) { p->setPen(highlightColor.dark(parentWidget->m_cursorDarkness)); @@ -590,11 +602,13 @@ } if (orientation == TQt::Vertical) { - int x = abs(((position)/(100.0))*(graticule_width)); - p->drawLine(x, 0, x, graticule_height); + int x = (abs(((position)/(100.0))*(virtual_width))-offset); + if ((x >= 0) && (x < graticule_width)) { + p->drawLine(x, 0, x, graticule_height); + } } else { - int y = abs(((position)/(100.0))*(graticule_height)); + int y = abs(((position)/(100.0))*(virtual_height)); p->drawLine(0, y, graticule_width, y); } } @@ -606,7 +620,7 @@ increment = 100.0/parentWidget->m_graticuleWidget->height(); } else { - increment = 100.0/parentWidget->m_graticuleWidget->width(); + increment = 100.0/parentWidget->m_graticuleWidget->virtualWidth(); } if (orientation == TQt::Horizontal) { position -= increment; @@ -629,7 +643,7 @@ increment = 100.0/parentWidget->m_graticuleWidget->height(); } else { - increment = 100.0/parentWidget->m_graticuleWidget->width(); + increment = 100.0/parentWidget->m_graticuleWidget->virtualWidth(); } if (orientation == TQt::Horizontal) { position += increment; @@ -652,7 +666,7 @@ increment = 100.0/parentWidget->m_graticuleWidget->height(); } else { - increment = 100.0/parentWidget->m_graticuleWidget->width(); + increment = 100.0/parentWidget->m_graticuleWidget->virtualWidth(); } if (orientation == TQt::Horizontal) { position -= (increment*10.0); @@ -675,7 +689,7 @@ increment = 100.0/parentWidget->m_graticuleWidget->height(); } else { - increment = 100.0/parentWidget->m_graticuleWidget->width(); + increment = 100.0/parentWidget->m_graticuleWidget->virtualWidth(); } if (orientation == TQt::Horizontal) { position += (increment*10.0); @@ -715,6 +729,8 @@ GraticuleWidget::GraticuleWidget(TraceWidget* parent, const char* name) : TQWidget(parent, name), m_base(parent), m_graticulePixmap(0), + m_prevWidgetWidth(-1), + m_virtualWidth(0), m_leftMouseDown(false), m_middleMouseDown(false), m_closestCursor(-1), @@ -737,8 +753,41 @@ return TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding, true, true); } +int GraticuleWidget::virtualWidth() { + int widgetWidth = width(); + if (widgetWidth != m_prevWidgetWidth) { + m_virtualWidth = widgetWidth; + int minimumHorizWidth = m_base->m_horizDivs * m_base->m_minimumPixelsPerHorizDiv; + if (m_virtualWidth < minimumHorizWidth) { + m_virtualWidth = minimumHorizWidth; + } + + if (m_base->m_horizScrollBar) { + int offScreenPixels = m_virtualWidth - widgetWidth; + if (offScreenPixels > 0) { + m_base->m_horizScrollBar->setMinValue(0); + m_base->m_horizScrollBar->setMaxValue(offScreenPixels); + m_base->m_horizScrollBar->show(); + } + else { + m_base->m_horizScrollBar->hide(); + m_base->m_horizScrollBar->setMinValue(0); + m_base->m_horizScrollBar->setMaxValue(0); + } + } + } + + return m_virtualWidth; +} + +void GraticuleWidget::horizScrollValueChanged(int) { + updateGraticule(); + repaint(false); +} + void GraticuleWidget::updateGraticule() { unsigned int d,s,x,y; + int rx; if (m_graticulePixmap) { delete m_graticulePixmap; @@ -754,7 +803,10 @@ s = m_graticulePixmap->width() / m_base->m_horizDivs; x = 0; for (d=0; d<m_base->m_horizDivs; d++) { ** Diff limit reached (max: 250 lines) ** |