Branch: master

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) **