diff base/View.cpp @ 31:4afaf0df4d51

* Add TextModel and TextLayer types * Make View refresh work better when editing a model (previously edits might not be refreshed if their visible changed area extended beyond the strict frame range that was being modified in the model) * Add phase-adjusted instantaneous frequency display to spectrogram layer (still a work in progress) * Pull maths aliases out into a separate header in dsp/maths so MathUtilities can be included without introducing them
author Chris Cannam
date Mon, 20 Feb 2006 13:33:36 +0000
parents 8460b3bf8f04
children 51e158b505da
line wrap: on
line diff
--- a/base/View.cpp	Fri Feb 17 18:11:08 2006 +0000
+++ b/base/View.cpp	Mon Feb 20 13:33:36 2006 +0000
@@ -414,8 +414,26 @@
 #ifdef DEBUG_VIEW_WIDGET_PAINT
     std::cerr << "View(" << this << ")::modelChanged()" << std::endl;
 #endif
-    delete m_cache;
-    m_cache = 0;
+    
+    // If the model that has changed is not used by any of the cached
+    // layers, we won't need to recreate the cache
+    
+    bool recreate = false;
+
+    bool discard;
+    LayerList scrollables = getScrollableBackLayers(false, discard);
+    for (LayerList::const_iterator i = scrollables.begin();
+	 i != scrollables.end(); ++i) {
+	if (*i == obj || (*i)->getModel() == obj) {
+	    recreate = true;
+	    break;
+	}
+    }
+
+    if (recreate) {
+	delete m_cache;
+	m_cache = 0;
+    }
 
     checkProgress(obj);
 
@@ -443,8 +461,25 @@
 	return;
     }
 
-    delete m_cache;
-    m_cache = 0;
+    // If the model that has changed is not used by any of the cached
+    // layers, we won't need to recreate the cache
+    
+    bool recreate = false;
+
+    bool discard;
+    LayerList scrollables = getScrollableBackLayers(false, discard);
+    for (LayerList::const_iterator i = scrollables.begin();
+	 i != scrollables.end(); ++i) {
+	if (*i == obj || (*i)->getModel() == obj) {
+	    recreate = true;
+	    break;
+	}
+    }
+
+    if (recreate) {
+	delete m_cache;
+	m_cache = 0;
+    }
 
     if (long(startFrame) < myStartFrame) startFrame = myStartFrame;
     if (endFrame > myEndFrame) endFrame = myEndFrame;
@@ -455,7 +490,8 @@
 
     checkProgress(obj);
 
-    update(x0, 0, x1 - x0 + 1, height());
+    update();
+//!!    update(x0, 0, x1 - x0 + 1, height());
 }    
 
 void
@@ -695,7 +731,7 @@
 }
 
 View::LayerList
-View::getScrollableBackLayers(bool &changed) const
+View::getScrollableBackLayers(bool testChanged, bool &changed) const
 {
     changed = false;
 
@@ -704,7 +740,7 @@
 	if ((*i)->isLayerDormant()) continue;
 	if ((*i)->isLayerScrollable()) scrollables.push_back(*i);
 	else {
-	    if (scrollables != m_lastScrollableBackLayers) {
+	    if (testChanged && scrollables != m_lastScrollableBackLayers) {
 		m_lastScrollableBackLayers = scrollables;
 		changed = true;
 	    }
@@ -721,7 +757,7 @@
 	scrollables.clear();
     }
 
-    if (scrollables != m_lastScrollableBackLayers) {
+    if (testChanged && scrollables != m_lastScrollableBackLayers) {
 	m_lastScrollableBackLayers = scrollables;
 	changed = true;
     }
@@ -729,10 +765,10 @@
 }
 
 View::LayerList
-View::getNonScrollableFrontLayers(bool &changed) const
+View::getNonScrollableFrontLayers(bool testChanged, bool &changed) const
 {
     changed = false;
-    LayerList scrollables = getScrollableBackLayers(changed);
+    LayerList scrollables = getScrollableBackLayers(testChanged, changed);
     LayerList nonScrollables;
 
     // Everything in front of the first non-scrollable from the back
@@ -748,7 +784,7 @@
 	nonScrollables.push_back(*i);
     }
 
-    if (nonScrollables != m_lastNonScrollableBackLayers) {
+    if (testChanged && nonScrollables != m_lastNonScrollableBackLayers) {
 	m_lastNonScrollableBackLayers = nonScrollables;
 	changed = true;
     }
@@ -897,8 +933,8 @@
     // are, we should store only those in the cache
 
     bool layersChanged = false;
-    LayerList scrollables = getScrollableBackLayers(layersChanged);
-    LayerList nonScrollables = getNonScrollableFrontLayers(layersChanged);
+    LayerList scrollables = getScrollableBackLayers(true, layersChanged);
+    LayerList nonScrollables = getNonScrollableFrontLayers(true, layersChanged);
     bool selectionCacheable = nonScrollables.empty();
     bool haveSelections = m_manager && !m_manager->getSelections().empty();
     bool selectionDrawn = false;