changeset 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
files IntroViewController.xib Question.m QuestionnaireViewController.mm ServerComms.mm SliderViewController.mm SliderViewController.xib TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib eventLogger.h eventLogger.mm grid.h grid.mm presetManager.h presetManager.mm testApp.h testApp.mm
diffstat 17 files changed, 324 insertions(+), 173 deletions(-) [+]
line wrap: on
line diff
--- a/IntroViewController.xib	Fri Apr 19 18:50:04 2013 +0100
+++ b/IntroViewController.xib	Mon Apr 22 18:32:34 2013 +0100
@@ -42,7 +42,6 @@
 						<string key="NSFrame">{{326, 881}, {116, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -120,14 +119,14 @@
 bG9jayIgYnV0dG9ucy4gQWZ0ZXIgdGhpcyBhIHNob3J0IHF1ZXN0aW9ubmFpcmUgd2lsbCBhcHBlYXIg
 dGhhdCB3aWxsIGhlbHAgdXMgYXNzZXNzIHRoZSBpbnRlcmZhY2UgZnVydGhlci4gQWZ0ZXIgdGhhdCwg
 cGxlYXNlIGZlZWwgZnJlZSB0byB1c2UgaXQgc29tZSBtb3JlOiB0aGUgbW9yZSBkYXRhIHdlIGdldCB0
-aGUgYmV0dGVyLiDigKjigKhQTEVBU0UgTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLCBh
-bmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHkuICBI
-b3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVjdGVk
-LCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBpcyBo
-aWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0IHdo
-aWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAgc3Bh
-Y2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVlIiBi
-ZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes>
+aGUgYmV0dGVyLiDigKjigKjigKhQTEVBU0UgTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2Vk
+LCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHku
+ICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVj
+dGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBp
+cyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0
+IHdoaWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAg
+c3BhY2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVl
+IiBiZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes>
 						</object>
 						<object class="NSColor" key="IBUITextColor">
 							<int key="NSColorSpace">1</int>
--- a/Question.m	Fri Apr 19 18:50:04 2013 +0100
+++ b/Question.m	Mon Apr 22 18:32:34 2013 +0100
@@ -44,18 +44,19 @@
     if(type == AGREE_DISAGREE){
         [Question setCount:NUM_CHOICES];
         
-        // potential leak
-        return [[NSArray alloc] initWithObjects:
+        NSArray *answers =  [[[NSArray alloc] initWithObjects:
                      @"Strongly agree",@"Agree", @"Neither agree nor disagree",
-                     @"Disagree",@"Strongly disagree", nil];
-        
+                     @"Disagree",@"Strongly disagree", nil] autorelease];
+
+        return answers;
         
     }else if(type == SLIDERS_ZOOMER){
         [Question setCount:NUM_CHOICES];
-        // potential leak
-        return [[NSArray alloc] initWithObjects:
+        NSArray *answers =   [[[NSArray alloc] initWithObjects:
                  @"definitely the Sliders", @"maybe the Sliders", @"Neither/Both equal",
-                @"maybe the Zoomer", @"definitely the Zoomer", nil];
+                @"maybe the Zoomer", @"definitely the Zoomer", nil] autorelease];
+
+        return answers;
     }else{
         return nil;
     }
--- a/QuestionnaireViewController.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/QuestionnaireViewController.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -76,21 +76,11 @@
 //----------------------------------------------------------------
 - (void)dealloc {
 
-    [_questionText release];
-    [_questionArray release];
-    [_titleText release];
-    [_finishButton release];
-    [_nextButton release];
-    [_previousButton release];
-    [_commentText release];
-    [_numberChooser release];
-    [_interfacePreferenceOptions release];
-    [_lickertOptions release];
-    [_pleaseAnswer release];
     [super dealloc];
 }
 //----------------------------------------------------------------
 - (void)viewDidUnload {
+    [self.questionArray release];
     [self setQuestionText:nil];
     [self setTitleText:nil];
     [self setFinishButton:nil];
@@ -211,7 +201,7 @@
 // potential leak
     self.questionArray = [NSArray arrayWithObjects:
                           [[Question alloc] initWithTextAndType:@"I am familiar with music software and sound synthesis.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"The best interface to get a feel for the possibilities of the synth was...":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The ability to retrace my steps using the history path was useful...":AGREE_DISAGREE],
                           [[Question alloc] initWithTextAndType:@"The best interface for discovering interesting sounds quickly was...":SLIDERS_ZOOMER],
                           [[Question alloc] initWithTextAndType:@"The best interface for fine tuning a sound was...":SLIDERS_ZOOMER],
                           [[Question alloc] initWithTextAndType:@"The correspondence between the sliders and the grid was understandable.":AGREE_DISAGREE],
@@ -224,6 +214,7 @@
                           [[Question alloc] initWithTextAndType:@"The interface better for performing live would be...":SLIDERS_ZOOMER],
                           [[Question alloc] initWithTextAndType:@"The Zoomer was an improvement on just using a randomiser.":AGREE_DISAGREE],
                           [[Question alloc] initWithTextAndType:@"The combination of Zoomer and Sliders was better than either individually.":AGREE_DISAGREE],
+                          [[Question alloc] initWithTextAndType:@"I enjoy 'happy accidents' in the creative process.":AGREE_DISAGREE],
                           [[Question alloc] initWithTextAndType:@"Overall, the interface I preferred using was...":SLIDERS_ZOOMER], // ??????
                           nil];
  // The zoomer seemed more appropriate to explore the synth sound controls (red) than the note sequence controls (blue)
--- a/ServerComms.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/ServerComms.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -52,6 +52,7 @@
     [request setHTTPBody:postData ];
 
     NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
+    [theConnection release];
     self.requestInProgress = YES;
     return YES;
     //  asynchronous one??
--- a/SliderViewController.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/SliderViewController.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -30,8 +30,8 @@
 - (void)viewDidLoad
 {
     int left = 22;
-    int top = 3;
-    const int height = 62;
+    int top = 10;
+    const int height = 50;
     const int width = 337;
     
     [super viewDidLoad];
@@ -39,7 +39,7 @@
     for(int i=0;i<10;i++){
         
         if(i==5){
-            top = 0;
+            top = 10;
             left = left*3 + width;
         }
         SliderController * sliderV	= [[SliderController alloc] initWithNibName:@"SliderController" bundle:nil delegate:self pID:i];
@@ -51,6 +51,9 @@
         NSLog(@"setting name to %@", self.paramNames[i]);
         [sliderV changeLabel:self.paramNames[i] ];
         [sliderV setParamValue:44];
+        if(i>=5){
+            [sliderV makeRed];
+        }
         top += height;
         
         [self.sliderArray addObject:sliderV]; // not working
@@ -96,7 +99,6 @@
     ((testApp *)self.theOFAppRef)->sliderMoved(which,value);
 }
 - (void)setSlider:(int)which to:(float)value{
-    NSLog(@"set slider to");
     [[self.sliderArray objectAtIndex:which] setParamValue:value];
 }
 - (void)populateParamNames{
--- a/SliderViewController.xib	Fri Apr 19 18:50:04 2013 +0100
+++ b/SliderViewController.xib	Mon Apr 22 18:32:34 2013 +0100
@@ -51,7 +51,7 @@
 					<object class="IBUIView" id="703174665">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{0, 6}, {6, 313}}</string>
+						<string key="NSFrame">{{0, 6}, {6, 272}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="579598868"/>
@@ -65,7 +65,7 @@
 					<object class="IBUIView" id="579598868">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{762, 6}, {6, 313}}</string>
+						<string key="NSFrame">{{762, 6}, {6, 272}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="577336253"/>
@@ -79,10 +79,9 @@
 					<object class="IBUIView" id="577336253">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{0, 319}, {768, 6}}</string>
+						<string key="NSFrame">{{0, 272}, {768, 6}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<object class="NSColor" key="IBUIBackgroundColor">
 							<int key="NSColorSpace">1</int>
@@ -91,7 +90,7 @@
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 					</object>
 				</array>
-				<string key="NSFrameSize">{768, 325}</string>
+				<string key="NSFrameSize">{768, 278}</string>
 				<reference key="NSSuperview"/>
 				<reference key="NSWindow"/>
 				<reference key="NSNextKeyView" ref="868794118"/>
@@ -143,9 +142,9 @@
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
 							<reference ref="868794118"/>
-							<reference ref="577336253"/>
 							<reference ref="703174665"/>
 							<reference ref="579598868"/>
+							<reference ref="577336253"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
--- a/TopButtonViewController.h	Fri Apr 19 18:50:04 2013 +0100
+++ b/TopButtonViewController.h	Mon Apr 22 18:32:34 2013 +0100
@@ -21,6 +21,10 @@
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *pauseButton;
 @property (retain, strong, nonatomic) IBOutlet UIBarButtonItem *qButton;
 @property (retain, strong,nonatomic) IBOutlet UIBarButtonItem *newUserButton;
+@property (retain, nonatomic) IBOutlet UIBarButtonItem *lockXButton;
+@property (retain, nonatomic) IBOutlet UIBarButtonItem *lockYButton;
+
+
 - (IBAction)nextSequence:(id)sender;
 - (IBAction)smoothSwitchChanged:(id)sender;
 
--- a/TopButtonViewController.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/TopButtonViewController.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -85,11 +85,17 @@
     presetManager.showNameDialog();
 }
 
+// this is crap
 - (IBAction)lockSequencePressed:(id)sender {
     UIBarButtonItem *button = (UIBarButtonItem *)sender;
     if([button.title isEqualToString:@"Lock X"]){
         ((testApp *)self.theOFAppRef)->lockSequencerPressed(true);
         button.title = @"Unlock X";
+        // if other one is locked , ulock it
+        if([self.lockYButton.title isEqualToString:@"Unlock Y"]){
+            ((testApp *)self.theOFAppRef)->lockSynthPressed(false);
+            self.lockYButton.title = @"Lock Y";
+        }
     }else if([button.title isEqualToString:@"Unlock X"]){
         ((testApp *)self.theOFAppRef)->lockSequencerPressed(false);
         button.title = @"Lock X";
@@ -103,6 +109,12 @@
     if([button.title isEqualToString:@"Lock Y"]){
         ((testApp *)self.theOFAppRef)->lockSynthPressed(true);
         button.title = @"Unlock Y";
+        // if other one is locked , ulock it
+        if([self.lockXButton.title isEqualToString:@"Unlock X"]){
+            ((testApp *)self.theOFAppRef)->lockSequencerPressed(false);
+            self.lockXButton.title = @"Lock X";
+        }
+        
     }else if([button.title isEqualToString:@"Unlock Y"]){
         ((testApp *)self.theOFAppRef)->lockSynthPressed(false);
         button.title = @"Lock Y";
@@ -165,6 +177,8 @@
     [_smoothSwitch release];
     [_smoothToggle release];
     [_savePresetButton release];
+    [_lockXButton release];
+    [_lockYButton release];
     [super dealloc];
 }
 - (void)viewDidUnload {
@@ -176,6 +190,8 @@
     [self setSmoothSwitch:nil];
     [self setSmoothToggle:nil];
     [self setSavePresetButton:nil];
+    [self setLockXButton:nil];
+    [self setLockYButton:nil];
     [super viewDidUnload];
 }
 @end
--- a/TopButtonViewController.xib	Fri Apr 19 18:50:04 2013 +0100
+++ b/TopButtonViewController.xib	Mon Apr 22 18:32:34 2013 +0100
@@ -95,6 +95,7 @@
 								<int key="IBUISystemItemIdentifier">18</int>
 							</object>
 							<object class="IBUIBarButtonItem" id="552018169">
+								<bool key="IBUIEnabled">NO</bool>
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
@@ -121,12 +122,20 @@
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
+								<object class="NSColor" key="IBUITintColor">
+									<int key="NSColorSpace">1</int>
+									<bytes key="NSRGB">MC4wOTM2MTE4Njg3NiAwLjE1MTc4MTc4MzUgMC43MDI5OTc2MjIzAA</bytes>
+								</object>
 							</object>
 							<object class="IBUIBarButtonItem" id="597523981">
 								<string key="IBUITitle">Lock Y</string>
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
+								<object class="NSColor" key="IBUITintColor">
+									<int key="NSColorSpace">1</int>
+									<bytes key="NSRGB">MC42MzU1MDg2NjE3IDAuMDcwMjA0OTU5ODMgMC4wNjI3MTI1NTE4MwA</bytes>
+								</object>
 							</object>
 							<object class="IBUIBarButtonItem" id="680653375">
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -147,7 +156,6 @@
 						<string key="NSFrame">{{59, 11}, {59, 21}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<bool key="IBUIClipsSubviews">YES</bool>
@@ -276,6 +284,22 @@
 					<int key="connectionID">51</int>
 				</object>
 				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">lockXButton</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="189059998"/>
+					</object>
+					<int key="connectionID">56</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">lockYButton</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="597523981"/>
+					</object>
+					<int key="connectionID">57</int>
+				</object>
+				<object class="IBConnectionRecord">
 					<object class="IBCocoaTouchEventConnection" key="connection">
 						<string key="label">savePressed:</string>
 						<reference key="source" ref="996249183"/>
@@ -532,7 +556,7 @@
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">55</int>
+			<int key="maxID">57</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -604,6 +628,8 @@
 						</object>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="lockXButton">UIBarButtonItem</string>
+						<string key="lockYButton">UIBarButtonItem</string>
 						<string key="newUserButton">UIBarButtonItem</string>
 						<string key="pauseButton">UIBarButtonItem</string>
 						<string key="playButton">UIBarButtonItem</string>
@@ -614,6 +640,14 @@
 						<string key="smoothToggle">UISwitch</string>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="lockXButton">
+							<string key="name">lockXButton</string>
+							<string key="candidateClassName">UIBarButtonItem</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="lockYButton">
+							<string key="name">lockYButton</string>
+							<string key="candidateClassName">UIBarButtonItem</string>
+						</object>
 						<object class="IBToOneOutletInfo" key="newUserButton">
 							<string key="name">newUserButton</string>
 							<string key="candidateClassName">UIBarButtonItem</string>
--- a/eventLogger.h	Fri Apr 19 18:50:04 2013 +0100
+++ b/eventLogger.h	Mon Apr 22 18:32:34 2013 +0100
@@ -63,7 +63,9 @@
     EVALUATION_POINT,       // 21
     EMPTY_EVENT,            // 22
     SMOOTHING_ON,           // 23
-    SMOOTHING_OFF};          // 24
+    SMOOTHING_OFF,          // 24
+    SNAPPED_TO_EVALPT,       // 25
+    PRESET_DOUBLE_TAPPED};
 
 //---------------------------------------------------------------------------
 
@@ -175,6 +177,7 @@
     void saveSessionToFile();
     void drawTrail(const TwoVector min, const TwoVector max);
     vector<lEvent> getDrawableEventsInRange(const TwoVector min, const TwoVector max);
+    vector<lEvent *> getEvaluationPointsInRange(const TwoVector min, const TwoVector max);
     vector<TwoVector> getRecentPath(int numEvents);
     
     void clearTrail();
@@ -217,7 +220,8 @@
     
 };
 
-
+    lEvent * e;
+    
     //---------------------------------------------------------------------------
    
 
--- a/eventLogger.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/eventLogger.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -303,6 +303,25 @@
     eventsToDraw.clear();
 }
 //----------------------------------------------------------------------------
+vector<lEvent *> EventLogger::getEvaluationPointsInRange(const TwoVector min, const TwoVector max){
+    vector<lEvent *> results;
+    if(eventsToDraw.size() <= 0){
+        return results;
+        
+    }
+    
+    deque<lEvent>::iterator eiter;
+    deque<lEvent>::iterator preveiter;
+    for(eiter = --eventsToDraw.end(); eiter >= eventsToDraw.begin(); eiter--){
+        if((*eiter).eventType == EVALUATION_POINT){
+            if( ((*eiter).val1 > min.x ) && ((*eiter).val2 > min.y ) && ((*eiter).val1 < max.x ) && ((*eiter).val2 < max.y )){
+                results.push_back(&(*eiter));
+            }
+        }
+    }
+    return results;
+}
+//----------------------------------------------------------------------------
 void EventLogger::drawTrail(const TwoVector min, const TwoVector max){
     if(eventsToDraw.size() <= 0){
         return;
@@ -322,7 +341,11 @@
     for(eiter = --eventsToDraw.end(); eiter >= eventsToDraw.begin(); eiter--){
 
         //cout << i << '\n';
-        if( (*eiter).eventType == SCROLL || (*eiter).eventType == EVALUATION_POINT){
+        if( (*eiter).eventType == SCROLL
+           || (*eiter).eventType == EVALUATION_POINT
+           || (*eiter).eventType == RANDOMISE
+           || (*eiter).eventType == CHANGE_SLIDER)
+        {
             i++;
             if(i > SCROLL_TRAIL_LENGTH){
                 return;
@@ -542,6 +565,14 @@
         case SWAP_VIEW:
             theEvents.push_back(lEvent(evtType,0.0 , 0.0 , sliderID)); // slider ID is which view
             break;
+        // these cases are move events that need to be put in events to draw
+        case RANDOMISE:
+            theEvents.push_back(lEvent(evtType,centre.x,centre.y));
+            eventsToDraw.push_back(lEvent(evtType,centre.x,centre.y));
+            if(eventsToDraw.size() > SCROLL_TRAIL_LENGTH){
+                eventsToDraw.pop_front();
+            }
+            break;
         default:
             // default is just an event type with no values
             theEvents.push_back(lEvent(evtType));
--- a/grid.h	Fri Apr 19 18:50:04 2013 +0100
+++ b/grid.h	Mon Apr 22 18:32:34 2013 +0100
@@ -19,13 +19,12 @@
 using namespace std;
 class Preset;
 
-
-
 class Grid {
     
 public:
     bool snapped;
-    
+    bool automatedMovement;
+    bool presetWasTapped;
     Hilbert hilbert;
     
     Grid();
@@ -34,6 +33,8 @@
     void move(TwoVector moveP); // shift view by pixels
     void zoom(float factor);
 
+    void tap(TwoVector pixel); // user has tapped a point
+    
     typedef enum{NO_INTERPOLATION, INTERPOLATE_GRID, INTERPOLATE_PRESET} interpolateModeType;
     interpolateModeType interpolateMode;
     void snapCheck();
@@ -49,11 +50,16 @@
     void setMinZoom();
     void setMaxZoom();
     void setInterpolation(interpolateModeType mode);
+    
+    Preset * getClosestPresetOf(vector<Preset *> closePresets);
+    void interpolateTo(TwoVector coord);
     // HILBERT now does each coord for this
     vector<int> calculateParamsFromCoord(TwoVector coord);
     TwoVector calculateCoordFromParams(vector<int> params);
     vector<int> calculateInterpolatedParamsFromCoord(TwoVector coord);
     TwoVector coordToPixel(TwoVector coord);
+    TwoVector pixelToCoord(TwoVector pixel);
+    
     void setScale(double scaleLevel);
     // the inverse stuff
     void setParams(vector<int>);
@@ -81,7 +87,7 @@
     TwoVector snapCentre;
     TwoVector snapDist; // number of pixels to snap to GUI
     Preset * closestPreset; // pointer to the currently selected (snapped to ) preset.. NULL if none.
-    
+    Preset * tappedPreset; // pointer to currently highlighted (tapped) 
     bool maxZoom, minZoom;
 
     vector<int> midiCC; // the actual params
@@ -103,6 +109,7 @@
     void setCoord(TwoVector coord);
     void drawCrossHairs();
     
+    
     double calculateInterpolateLevel();
     vector<int> interpVector(vector<int> upper, vector<int> lower, float frac);
     vector<int> interpHilbert(int bitlevel, TwoVector coord);
--- 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;
+        }
+
+
+
     }
 
     
--- a/presetManager.h	Fri Apr 19 18:50:04 2013 +0100
+++ b/presetManager.h	Mon Apr 22 18:32:34 2013 +0100
@@ -104,7 +104,7 @@
     // names values
     // check if already there
     // find and return all(?) presets within a certain coordinate range
-    vector<Preset *> thePresets; 
+    vector<Preset> thePresets; 
     
     int addPreset(string name);
     int loadPreset(const TwoVector coord, const string name, long long stime);
--- a/presetManager.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/presetManager.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -107,13 +107,13 @@
     Json::Value root;
  
     // use jsoncpp
-    vector<Preset *>::iterator presetIter;
+    vector<Preset>::iterator presetIter;
     
     int i = 0;
     for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){
         // only save the preset to file if it was ours... (other users and defaults saved elewhere)
-        if((*presetIter)->creatorDeviceID == eventLogger.deviceID){
-            root["presets"][i] = (*presetIter)->presetToJson();
+        if((*presetIter).creatorDeviceID == eventLogger.deviceID){
+            root["presets"][i] = (*presetIter).presetToJson();
             i++;
         }
     }
@@ -157,7 +157,7 @@
     // now put into variables
     const Json::Value jpresets = root["presets"];
     
-    for ( int index = 0; index < jpresets.size(); ++index ) thePresets.push_back(new Preset(jpresets[index]));
+    for ( int index = 0; index < jpresets.size(); ++index ) thePresets.push_back(Preset(jpresets[index]));
     
     //printAll();
      
@@ -205,7 +205,7 @@
     TwoVector coord = theGridView.getCoordForPresetSave();
     
     
-    thePresets.push_back(new Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID));
+    thePresets.push_back(Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID));
     eventLogger.logEvent(SAVE_PRESET, coord);
     // poke grid view to get it to show details
     theGridView.snapCheck();
@@ -216,7 +216,7 @@
 //---------------------------------------------------------------------------
 
 int PresetManager::loadPreset(const TwoVector coord, const string name, long long stime){
-    thePresets.push_back(new Preset(coord, name,nextID, stime));
+    thePresets.push_back(Preset(coord, name,nextID, stime));
    
      // if ok
     return nextID++;
@@ -229,10 +229,10 @@
     // so: put burden on saving rather than retrieving, make into list and index using coordinates
     
     vector<Preset *> results;
-    vector<Preset *>::iterator presetIter;
+    vector<Preset>::iterator presetIter;
     for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){
-        if( ((*presetIter)->coordinates.x > min.x ) && ((*presetIter)->coordinates.y > min.y ) && ((*presetIter)->coordinates.x < max.x ) && ((*presetIter)->coordinates.y < max.y )){
-            results.push_back(*presetIter);
+        if( ((*presetIter).coordinates.x > min.x ) && ((*presetIter).coordinates.y > min.y ) && ((*presetIter).coordinates.x < max.x ) && ((*presetIter).coordinates.y < max.y )){
+            results.push_back(&(*presetIter));
         }
 
     }
--- a/testApp.h	Fri Apr 19 18:50:04 2013 +0100
+++ b/testApp.h	Mon Apr 22 18:32:34 2013 +0100
@@ -116,6 +116,7 @@
     void gotMemoryWarning();
     void deviceOrientationChanged(int newOrientation);
     
+    bool tapFlag;
     ofxOscSender sender;
     void sendOSCParams();
     
--- a/testApp.mm	Fri Apr 19 18:50:04 2013 +0100
+++ b/testApp.mm	Mon Apr 22 18:32:34 2013 +0100
@@ -43,16 +43,16 @@
     
     // now do things that will affect the start up state of the app
     
-    /*
-    if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode
+    if(true){
+    // if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode
         
         freeUseMode();
     }else{
         // then we're in timed session mode
         showIntro();
     }
-    */
-    freeUseMode();
+
+    //freeUseMode();
     // GO
     paused = false;
     eventLogger.logEvent(APP_STARTED);
@@ -109,8 +109,8 @@
     
     
     //SLIDER
-    setupSliderGui();
-    sliderGUI->setVisible(false);
+    //setupSliderGui();
+    //sliderGUI->setVisible(false);
     
     // initial slider vals
     for(int i=0; i<10;i++){
@@ -134,22 +134,24 @@
     [topButtonViewController show:(id)this];
     topButtonViewController.view.frame = CGRectMake(0,0,getWidth(),44);
     
-    usernameAlertViewController = [[UsernameAlertViewController alloc] init];
-    [usernameAlertViewController setAppRef:(id)this];
+
+    
+    //SLIDER
+    
+    sliderViewController	= [[SliderViewController alloc] initWithNibName:@"SliderViewController" bundle:nil];
+    [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view];
+    [sliderViewController setAppRef:(id)this];
+    sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 278,getWidth(),278);
+    [sliderViewController show:(id)this];
     
     helpViewController	= [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];
     [ofxiPhoneGetGLParentView() addSubview:helpViewController.view];
     [helpViewController setAppRef:(id)this];
     helpViewController.view.hidden = YES;
     
-    //SLIDER
-    
-     sliderViewController	= [[SliderViewController alloc] initWithNibName:@"SliderViewController" bundle:nil];
-     [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view];
-     [sliderViewController setAppRef:(id)this];
-     sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 325,getWidth(),325);
-     [sliderViewController show:(id)this];
-     
+
+    usernameAlertViewController = [[UsernameAlertViewController alloc] init];
+    [usernameAlertViewController setAppRef:(id)this];
     
     setAllGUISliders(theGridView.getParams());
     
@@ -233,7 +235,7 @@
 	}
     
     //SLIDER
-    delete sliderGUI;
+    //delete sliderGUI;
     
     cout << "exit done \n";
 }
@@ -484,15 +486,15 @@
         sendOSCParams();
     }
     
-    eventLogger.logEvent(CHANGE_SLIDER, TwoVector(),0.0,which , value);
-    
+    eventLogger.logEvent(CHANGE_SLIDER, theGridView.getCoord(),0.0,which , value);
+
 }
 //--------------------------------------------------------------
 void testApp::setAllGUISliders(vector<int> vals){
-    //SLIDER
+
     // an update caused by zoomer view being moved
     for(int i = 0; i<NUM_PARAMS;i++){
-        sliders[i]->setValue(vals[i]);
+        //sliders[i]->setValue(vals[i]);
         sliderVals[i] = vals[i];
         
         [sliderViewController setSlider:i to:vals[i]];
@@ -521,7 +523,7 @@
     setAllGUISliders(sliderVals);
 
 
-    eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,0.0);
+    eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,theGridView.getScale());
     
 }
 //--------------------------------------------------------------
@@ -665,7 +667,7 @@
             setAllGUISliders(theGridView.getParams());
 
         }
-        
+        // MOVE MOMENTUM
         if(moveVel.norm() > 0.3){
             if(theGridView.snapped){
                 // stop it (snap check sends snap event)
@@ -720,23 +722,16 @@
 
 //--------------------------------------------------------------
 void testApp::touchDown(ofTouchEventArgs &touch){
-    // in slider gui area?
-    //SLIDER
-    if(whichInterfaceShowing == SLIDERS){
-        return;
-    }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){
-        return;
-        
-    }// otherwise we're good to let the zoomer handle touch
     
     numActiveTouches++;
     preventingMovePostScroll = false;
-    
+    tapFlag = false; // unless touch 0
     if(touch.id == 0){
         touch0.setCoord(touch.x,touch.y);
         prevTouch0 = touch0;
         // stop zoom
         zoomVel = 0.0;
+        tapFlag = true;
     }else if(touch.id == 1){
         
         touch1.setCoord(touch.x,touch.y);
@@ -760,18 +755,7 @@
 
 //--------------------------------------------------------------
 void testApp::touchMoved(ofTouchEventArgs &touch){
-    
-    // TODO check if in gui area!!!
-    //SLIDER
-    if(whichInterfaceShowing == SLIDERS){
-        return;
-    }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){
-        return;
-        
-    }
-    
-    // otherwise we're good to let the zoomer handle touch
-    
+    tapFlag = false;
     // which one? keep track of each touch point
     if(touch.id == 0){
         touch0.setCoord(touch.x,touch.y);
@@ -794,6 +778,53 @@
 }
 
 //--------------------------------------------------------------
+void testApp::touchUp(ofTouchEventArgs &touch){
+    if(numActiveTouches > 0) numActiveTouches--; // dirty
+    preventingMovePostScroll = false;
+    // TODO check if in gui area!!!
+    //SLIDER
+    if(whichInterfaceShowing == SLIDERS){
+        return;
+    }
+    
+    if(tapFlag){
+        cout << "TAP!!\n";
+        // look for close preset
+        theGridView.tap(TwoVector(touch.x,touch.y));
+    }
+    tapFlag = false;
+    // which one?
+    if(touch.id == 0){
+        // tricky situation - we tried to zoom but may have left non-move finger on
+        prevTouch0.setCoord(touch.x,touch.y);
+        
+    }else if(touch.id == 1){
+        
+        
+        prevTouch1.setCoord(0,0);
+        
+    }
+    if(numActiveTouches == 0){
+        // check time since last move
+        // check time since last move - if
+        unsigned int moveTime = ofGetSystemTimeMicros();
+        if(moveTime - lastMoveTime > 100000){
+            moveVel = TwoVector(); // zero
+        }else{
+            moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time
+            
+        }
+        lastMoveTime = moveTime;
+    }else if (numActiveTouches == 1){
+        // just zoomed , but now lifted one of the fingers
+        // can be bad if moved so create special mode to stop scroll  (special modes bad!)
+        preventingMovePostScroll = true;
+    }
+    
+}
+
+
+//--------------------------------------------------------------
 // handle a finger being dragged
 void testApp::handleScroll(){
     
@@ -854,50 +885,6 @@
     
 }
 //--------------------------------------------------------------
-void testApp::touchUp(ofTouchEventArgs &touch){
-    if(numActiveTouches > 0) numActiveTouches--; // dirty
-    preventingMovePostScroll = false;
-    // TODO check if in gui area!!!
-    //SLIDER
-    if(whichInterfaceShowing == SLIDERS){
-        return;
-    }else if (whichInterfaceShowing == BOTH && touch.x < 256){
-        return;
-        
-    }// otherwise we're good to let the zoomer handle touch
-    
-    
-    // which one?
-    if(touch.id == 0){
-        // tricky situation - we tried to zoom but may have left non-move finger on
-        prevTouch0.setCoord(touch.x,touch.y);
-        
-    }else if(touch.id == 1){
-        
-        
-        prevTouch1.setCoord(0,0);
-        
-    }
-    if(numActiveTouches == 0){
-        // check time since last move
-        // check time since last move - if
-        unsigned int moveTime = ofGetSystemTimeMicros();
-        if(moveTime - lastMoveTime > 100000){
-            moveVel = TwoVector(); // zero
-        }else{
-            moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time
-            
-        }
-        lastMoveTime = moveTime;
-    }else if (numActiveTouches == 1){
-        // just zoomed , but now lifted one of the fingers
-        // can be bad if moved so create special mode to stop scroll  (special modes bad!)
-        preventingMovePostScroll = true;
-    }
-    
-}
-
-//--------------------------------------------------------------
 void testApp::touchDoubleTap(ofTouchEventArgs &touch){
     // preset?
     
@@ -1244,7 +1231,7 @@
     vector<double> vals;
     
     for(int i = 0; i< N ; i++){
-        sliderVals = theGridView.calculateParamsFromCoord(presetManager.thePresets[i]->coordinates);
+        sliderVals = theGridView.calculateParamsFromCoord(presetManager.thePresets[i].coordinates);
         
         vals.push_back((sliderVals[0]+32)*8.); // DC offset
         for(int i=1; i<5;i++){