diff grid.mm @ 44:a1e75b94c505

Snap to eval points. Double tap to go to preset (doesn't quite work yet). Coloured locks. Changed Question 2. Fixed some leaks.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Mon, 22 Apr 2013 18:32:34 +0100
parents b91a1859829a
children c2fffc8ea84d
line wrap: on
line diff
--- a/grid.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/grid.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -25,6 +25,7 @@
 
 }
 void Grid::init(){
+    presetWasTapped = false;
     maxValue = pow(2.0,paramsPerDim*paramBitDepth)-1;
     interpolateMode = NO_INTERPOLATION;
     
@@ -222,21 +223,21 @@
             if(colCycle == 0){
                 ofSetColor(255,255,255,alpha);
             }else if(colCycle == 1){
-                ofSetColor(255,0,0,alpha);
+                ofSetColor(75,0,130,alpha);
             }else if(colCycle == 2){
                 ofSetColor(0,0,255,alpha);
             }else if(colCycle == 3){
                 ofSetColor(0,255,0,alpha);
             }else if(colCycle == 4){
-                ofSetColor(255,0,255,alpha);
+                ofSetColor(255,255,0,alpha);
             }else if(colCycle == 5){
-                ofSetColor(0,255,255,alpha);
+                ofSetColor(255,127,0,alpha);
             }else if(colCycle == 6){
-                ofSetColor(255,255,0,alpha);
+                ofSetColor(255,0,0,alpha);
             }else if(colCycle == 7){
-                ofSetColor(255,255,255,alpha);
+                ofSetColor(255,255,255,255);
             }else{
-                ofSetColor(255,255,255,alpha);
+                ofSetColor(255,255,255,255);
                 cout << "colour cycle > 7\n";
             }
             
@@ -364,14 +365,23 @@
     return pix;
     
 }
+//-----------------------------------------------------------------------
+TwoVector Grid::pixelToCoord(TwoVector pixel){
 
+    return pixel*scale + topLeft;
+    
+}
 //-----------------------------------------------------------------------
 void Grid::drawPresets(){
     presetManager.drawPresetsInRange(topLeft, topLeft + size);
     // draw snapped preset info
-    if(snapped && closestPreset != NULL){
-        ofDrawBitmapString( closestPreset->displayTextDescription(), pixSize.x/2+10, pixSize.y/2+10 );
+    if(tappedPreset && tappedPreset != NULL){
+        TwoVector presetPos = coordToPixel(tappedPreset->coordinates);
+        ofDrawBitmapString( tappedPreset->displayTextDescription(), presetPos.x, presetPos.y );
+    }else if( (snapped) && closestPreset != NULL){
+        ofDrawBitmapString( closestPreset->displayTextDescription(), pixSize.x/2 +10, pixSize.y/2+10 );
     }
+
     
 }
 
@@ -421,6 +431,36 @@
 
 
 }
+//--------------------------------------------------------------
+void Grid::tap(TwoVector pixel){
+    static Preset * lastTappedPreset;
+
+    // search nearby for preset
+    TwoVector tapCoord = pixelToCoord(pixel);
+    
+    vector<Preset *> closePresets = presetManager.getPresetsInRange(tapCoord - snapDist*2*scale, tapCoord + snapDist*2*scale);
+    if(closePresets.size() > 0){
+        tappedPreset = getClosestPresetOf(closePresets);
+        //interpolateTo(coordinates);
+        cout << "tapped preset: " << tappedPreset->name << "\n";
+        presetWasTapped = true;
+        
+        if(lastTappedPreset == tappedPreset){
+            cout << "DOUBLE tapped preset: " << tappedPreset->name << "\n";
+            
+            //TODO interpolate to this! exciting!
+            setCoord(tappedPreset->coordinates); // should just go there and do all the calcs
+            ((testApp *)ofGetAppPtr())->setAllGUISliders(getParams());
+            eventLogger.logEvent(PRESET_DOUBLE_TAPPED, getCoord(), scale);
+            
+                                
+        }
+                                 
+        lastTappedPreset = tappedPreset;
+    }else{
+        // nothing ?
+    }
+}
 
 //--------------------------------------------------------------
 
@@ -478,8 +518,23 @@
     
 }
 //--------------------------------------------------------------
+Preset * Grid::getClosestPresetOf(vector<Preset *> somepresets){
+    double dist, mindist = maxValue;
+    Preset * cPreset = somepresets[0];
+    
+    for(vector<Preset *>::iterator piter = somepresets.begin(); piter < somepresets.end(); piter++){
+        dist = (*piter)->coordinates.distanceTo(centre);
+        
+        if(dist < mindist){
+            mindist = dist;
+            cPreset = (*piter);
+        }
+    }
+    return cPreset;
+}
+//--------------------------------------------------------------
 void Grid::snapCheck(){
-    
+    lEvent *closestEvalPt;
     if(interpolateMode == INTERPOLATE_GRID){
         snapped = false;
         closestPreset = NULL;
@@ -488,31 +543,50 @@
     } // no presets visible
     
     // check environs for presets.
+    
     vector<Preset *> closePresets = presetManager.getPresetsInRange(centre - snapDist*scale, centre + snapDist*scale);
     if(closePresets.size() > 0){
         snapped = true;
-        // find closest
-        double dist, mindist = maxValue;
-        closestPreset = closePresets[0];
-        
-        for(vector<Preset *>::iterator piter = closePresets.begin(); piter < closePresets.end(); piter++){
-            dist = (*piter)->coordinates.distanceTo(centre);
-            
-            if(dist < mindist){
-                mindist = dist;
-                closestPreset = *piter;
-            }
-        }
+        presetWasTapped = false;
+        closestPreset = getClosestPresetOf(closePresets);
         snapCentre = closestPreset->coordinates;
         eventLogger.logEvent(SNAPPED_TO_PRESET, getCoord(),closestPreset->creationTime );
-        //cout << "SNAPPED CHECK\n";
-        
-        // causes too many problems just move it
+
        
     }else{
-        snapped = false;
-        closestPreset = NULL;
-        snapCentre = centre;
+        // do an evaluation snap check . duplicate code >:[
+
+        vector<lEvent *> closeEvalPoints = eventLogger.getEvaluationPointsInRange(centre - snapDist*scale, centre + snapDist*scale);
+        if(closeEvalPoints.size() > 0){
+            snapped = true;
+            
+            double dist, mindist = maxValue;
+            closestEvalPt = closeEvalPoints[0];
+            
+            for(vector<lEvent *>::iterator eiter = closeEvalPoints.begin(); eiter < closeEvalPoints.end(); eiter++){
+                TwoVector coord = TwoVector((*eiter)->val1,(*eiter)->val2);
+                dist = coord.distanceTo(centre);
+                
+                if(dist < mindist){
+                    mindist = dist;
+                    closestEvalPt = (*eiter);
+                    snapCentre = coord;
+                }
+                
+            }
+            
+            eventLogger.logEvent(SNAPPED_TO_EVALPT, getCoord() );
+         
+        }else{
+            snapped = false;
+            closestPreset = NULL;
+            closestEvalPt = NULL;
+            tappedPreset = NULL;
+            snapCentre = centre;
+        }
+
+
+
     }