Mercurial > hg > soniczoomios
changeset 27:ae4d2c3ce5e0
Details. Zoom trailing finger move sorted. Qs rephrased.
author | Robert Tubb <rt300@eecs.qmul.ac.uk> |
---|---|
date | Wed, 13 Feb 2013 17:03:56 +0000 |
parents | 2e1fdac115af |
children | e2c62db1e265 |
files | AppCore.mm BottomTabViewController.mm HelpViewController.h HelpViewController.xib IntroViewController.xib Question.h Question.m QuestionnaireViewController.mm QuestionnaireViewController.xib TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib eventLogger.h eventLogger.mm grid.mm presetManager.h presetManager.mm testApp.h testApp.mm |
diffstat | 19 files changed, 358 insertions(+), 338 deletions(-) [+] |
line wrap: on
line diff
--- a/AppCore.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/AppCore.mm Wed Feb 13 17:03:56 2013 +0000 @@ -80,7 +80,9 @@ } //-------------------------------------------------------------- -void AppCore::exit() {} +void AppCore::exit() { + pd.stop(); +} //-------------------------------------------------------------- void AppCore::playTone(int pitch) {
--- a/BottomTabViewController.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/BottomTabViewController.mm Wed Feb 13 17:03:56 2013 +0000 @@ -27,7 +27,7 @@ { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. - self.interfaceSelector.selectedSegmentIndex = 1; + self.interfaceSelector.selectedSegmentIndex = 0; }
--- a/HelpViewController.h Fri Feb 01 18:31:43 2013 +0000 +++ b/HelpViewController.h Wed Feb 13 17:03:56 2013 +0000 @@ -9,8 +9,8 @@ #import <UIKit/UIKit.h> @interface HelpViewController : UIViewController - +@property (nonatomic, assign) id theOFAppRef; -(IBAction)hide:(id)sender; -(IBAction)show:(id)sender; - +-(void)setAppRef:(id)theOFApp; @end
--- a/HelpViewController.xib Fri Feb 01 18:31:43 2013 +0000 +++ b/HelpViewController.xib Wed Feb 13 17:03:56 2013 +0000 @@ -39,7 +39,7 @@ <object class="IBUITextView" id="992119782"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">274</int> - <string key="NSFrameSize">{768, 1024}</string> + <string key="NSFrameSize">{768, 933}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="519426224"/> @@ -52,175 +52,58 @@ <bool key="IBUIMultipleTouchEnabled">YES</bool> <string key="targetRuntimeIdentifier">IBIPadFramework</string> <bool key="IBUIShowsHorizontalScrollIndicator">NO</bool> - <bool key="IBUIEditable">NO</bool> - <object class="NSMutableString" key="IBUIText"> - <bytes key="NS.bytes">SW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUg + <bool key="IBUIUsesAttributedText">YES</bool> + <object class="NSAttributedString" key="IBUIAttributedText"> + <string type="base64-UTF8" key="NSString">SU5TVFJVQ1RJT05TDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUg c2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBzdG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBtb2Rlczog -Wk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBmb3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2FuIGFjY2Vz -cyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0NDVpPT01F -UiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jvc3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3Jl -ZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5n -IHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVy -ZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBv -ZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2ls -bCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNvdW5kcy9z -ZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2luZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0dG9uLiBB -IG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUgem9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUgdG8gdGhl -IHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtlciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFwIHRvIHRo -ZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwgYXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBwbGF5Lg1V -c2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVtZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3QgYXMgaW4g -YSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3VuZCB3aWxs -IGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3VuZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhlIHBsYXkg -YnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQgdGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2UgdG8gc3Rv -cC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9kZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJPVEggZm9y -IGFib3V0IDggbWludXRlcy4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhl -IGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1aT09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVkIGNyb3Nz -aGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQgb24gdGhl -IHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3RlbmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNlIHVuZGVy -IHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRpZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2RlIHlvdSB3 -aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZlY3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4gTGlrZXdp -c2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBvaW50IG9u -IHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3VuZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2UgdXNpbmcg -dGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRvbi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24gdGhlIHpv -b20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRvIHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBtYXJrZXIs -IHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3aWxsIGFw -cGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxheS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBtb3ZlbWVu -dCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFzIGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVyIHlvdSB6 -b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQgd2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBhcm91bmQu -IA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBwbGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0YXJ0IHRo -ZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRvIHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVlIG1vZGVz -OiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RIIGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBjYW4gYWNj -ZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gDQ0NWk9P -TUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBjcm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2YgdGhlIHNj -cmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9uIHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBsaXN0ZW5p -bmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8gYSBkaWZm -ZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUgZWZmZWN0 -IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExpa2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVyIHlvdSB3 -aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkgc291bmRz -L3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVzaW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBidXR0b24u -IEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRoZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92ZSB0byB0 -aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8g -dGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXku -DVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVzdCBhcyBp -biBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNvdW5kIHdp -bGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJvdW5kLiANSW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxh -eSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUgc2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBz -dG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBtb2RlczogWk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBm -b3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2FuIGFjY2VzcyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0 -aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0NDVpPT01FUiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jv -c3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0 -aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5k -ZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91 -IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtl -d2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQg -b24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNvdW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2lu +Zmlyc3QgdGhlIFNMSURFUlMsIHRoZW4gdGhlIFpPT01FUiBhbmQgdGhlbiBCT1RIIGZvciBhYm91dCA4 +IG1pbnV0ZXMgZWFjaC4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhlIGJv +dHRvbSBvZiB0aGUgc2NyZWVuLiANDU9QRVJBVElORyBUSEUgWk9PTUVS4oCoDVRoZSByZWQgY3Jvc3No +YWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUg +c3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIg +dGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdp +bGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lz +ZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24g +dGhlIHN1cmZhY2Uu4oCoDVNhdmUgYW55IHNvdW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2lu ZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0dG9uLiBBIG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUg -em9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUgdG8gdGhlIHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtl -ciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFwIHRvIHRoZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwg -YXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBwbGF5Lg1Vc2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVt -ZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3QgYXMgaW4gYSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91 -IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3VuZCB3aWxsIGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3Vu -ZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhlIHBsYXkgYnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQg -dGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2UgdG8gc3RvcC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9k -ZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJPVEggZm9yIGFib3V0IDggbWludXRlcy4gWW91IGNhbiBh -Y2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1a -T09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVkIGNyb3NzaGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUg -c2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQgb24gdGhlIHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3Rl -bmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNlIHVuZGVyIHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRp -ZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2RlIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZl -Y3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4gTGlrZXdpc2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91 -IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBvaW50IG9uIHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3Vu -ZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2UgdXNpbmcgdGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRv -bi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24gdGhlIHpvb20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRv -IHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBtYXJrZXIsIHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0 -byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3aWxsIGFwcGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxh -eS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBtb3ZlbWVudCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFz -IGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVyIHlvdSB6b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQg -d2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBhcm91bmQuIA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBw -bGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0YXJ0IHRoZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRv -IHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVlIG1vZGVzOiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RI -IGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBjYW4gYWNjZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0 -IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gDQ0NWk9PTUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBj -cm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2YgdGhlIHNjcmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9u -IHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBsaXN0ZW5pbmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1 -bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8gYSBkaWZmZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5 -b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExp -a2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVyIHlvdSB3aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2lu -dCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkgc291bmRzL3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVz -aW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBidXR0b24uIEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRo -ZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFy -a2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2ls -bCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXkuDVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92 +em9vbSBzdXJmYWNlLiBJZiB5b3UgbW92ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2Vy +LCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBh +cHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXkuDeKAqFVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92 ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVzdCBhcyBpbiBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5 b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNvdW5kIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJv -dW5kLiANSW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFy -dCB0aGUgc2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBzdG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBt -b2RlczogWk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBmb3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2Fu -IGFjY2VzcyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0N -DVpPT01FUiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jvc3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRo -ZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlz -dGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEg -ZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVm -ZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5 -b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNv -dW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2luZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0 -dG9uLiBBIG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUgem9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUg -dG8gdGhlIHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtlciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFw -IHRvIHRoZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwgYXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBw -bGF5Lg1Vc2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVtZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3Qg -YXMgaW4gYSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3Vu -ZCB3aWxsIGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3VuZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhl -IHBsYXkgYnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQgdGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2Ug -dG8gc3RvcC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9kZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJP -VEggZm9yIGFib3V0IDggbWludXRlcy4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMg -YXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1aT09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVk -IGNyb3NzaGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQg -b24gdGhlIHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3RlbmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNl -IHVuZGVyIHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRpZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2Rl -IHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZlY3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4g -TGlrZXdpc2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBv -aW50IG9uIHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3VuZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2Ug -dXNpbmcgdGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRvbi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24g -dGhlIHpvb20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRvIHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBt -YXJrZXIsIHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3 -aWxsIGFwcGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxheS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBt -b3ZlbWVudCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFzIGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVy -IHlvdSB6b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQgd2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBh -cm91bmQuIA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBwbGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0 -YXJ0IHRoZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRvIHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVl -IG1vZGVzOiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RIIGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBj -YW4gYWNjZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4g -DQ0NWk9PTUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBjcm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2Yg -dGhlIHNjcmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9uIHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBs -aXN0ZW5pbmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8g -YSBkaWZmZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUg -ZWZmZWN0IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExpa2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVy -IHlvdSB3aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkg -c291bmRzL3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVzaW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBi -dXR0b24uIEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRoZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92 -ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNu -YXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxs -IHBsYXkuDVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVz -dCBhcyBpbiBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNv -dW5kIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJvdW5kLiANA</bytes> +dW5kLiBGb3IgZXhhbXBsZSB0aGUgeWVsbG93IGxpbmVzIHRoYXQgYXBwZWFyIGF0IHRoZSBsYXJnZXN0 +IHNjYWxlIGNvcnJlc3BvbmQgdG8gdGhlIHNsaWRlcnMganVtcGluZyA2NCB1bml0cy4gVGhlIHdoaXRl +IGxpbmVzIGF0IHRoZSBzbWFsbGVzdCBzY2FsZSBjb3JyZXNwb25kIHRvIGp1bXBzIG9mIG9uZSB1bml0 +LiBUaGVyZSBhcmUgNyBsZXZlbHM64oCo4oCoWWVsbG93ID0gNjTigKhUZWFsID0gMzLigKhQdXJwbGUg +PSAxNuKAqEdyZWVuID0gOOKAqERhcmsgQmx1ZSA9IDTigKhSZWQgPSAy4oCoV2hpdGUgPSAx4oCo4oCo +TE9DS+KAqOKAqElmIHlvdSBmaW5kIGEgc2VxdWVuY2UgeW91IGxpa2UgYnV0IHdhbnQgdG8gY2hhbmdl +IHRoZSBzeW50aCBzb3VuZCB1c2UgdGhlICJMb2NrIFNlcXVlbmNlIChYKSIgYnV0dG9uLiBUaGlzIHdp +bGwgcHJldmVudCB5b3UgYWNjaWRlbnRhbGx5IG1vdmluZyBpbiBmcm9tIGxlZnQgdG8gcmlnaHQgYW5k +IG1lc3NpbmcgdXAgeW91ciBub3RlIHBhdHRlcm4uIFNpbWlsYXJseSBpZiB5b3UgZmluZCBhIHN5bnRo +IHNvdW5kIHRoYXQgeW91IGxpa2UsIGJ1dCB3YW50IHRvIGNoYW5nZSB0aGUgbm90ZSBzZXF1ZW5jZSwg +dXNlIHRoZSAiTG9jayBTeW50aCAoWSkiIGJ1dHRvbi4g4oCo4oCoUkFORE9NSVNF4oCo4oCoVXNlIHRo +ZSByYW5kb21pc2UgdG8ganVtcCB0byBhIHJhbmRvbSBwb2ludCBvbiB0aGUgZ3JpZC4g4oCoVEhFIFFV +RVNUSU9OTkFJUkXigKjigKgNDQ</string> + <dictionary key="NSAttributes"> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC4zMzgyNjY5OTg0IDAuOTA1MzMyMjM5OSAxAA</bytes> + </object> + <object class="NSFont" key="NSFont"> + <string key="NSName">Helvetica</string> + <double key="NSSize">15</double> + <int key="NSfFlags">16</int> + </object> + <object class="NSMutableParagraphStyle" key="NSParagraphStyle"> + <nil key="NSTabStops"/> + </object> + </dictionary> </object> - <object class="NSColor" key="IBUITextColor"> - <int key="NSColorSpace">1</int> - <bytes key="NSRGB">MC4zMzgyNjY5OTg0IDAuOTA1MzMyMjM5OSAxAA</bytes> - </object> + <bool key="IBUIEditable">NO</bool> <object class="IBUITextInputTraits" key="IBUITextInputTraits"> <int key="IBUIAutocapitalizationType">2</int> <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> </object> - <object class="IBUIFontDescription" key="IBUIFontDescription"> - <int key="type">1</int> - <double key="pointSize">15</double> - </object> - <object class="NSFont" key="IBUIFont"> - <string key="NSName">Helvetica</string> - <double key="NSSize">15</double> - <int key="NSfFlags">16</int> - </object> </object> <object class="IBUIButton" id="519426224"> <reference key="NSNextResponder" ref="766721923"/> @@ -328,8 +211,8 @@ <int key="objectID">2</int> <reference key="object" ref="766721923"/> <array class="NSMutableArray" key="children"> + <reference ref="519426224"/> <reference ref="992119782"/> - <reference ref="519426224"/> </array> <reference key="parent" ref="0"/> </object>
--- a/IntroViewController.xib Fri Feb 01 18:31:43 2013 +0000 +++ b/IntroViewController.xib Wed Feb 13 17:03:56 2013 +0000 @@ -42,6 +42,7 @@ <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> @@ -94,40 +95,42 @@ ZmFjdCB0aGVyZSBhcmUganVzdCBvdmVyIGEgYmlsbGlvbiB0cmlsbGlvbiBkaXN0aW5jdCBzZXR0aW5n cyEgV2UgYWltIHRvIGxvb2sgYXQgd2hhdCBwYXRocyBwZW9wbGUgdGFrZSBpbiB0aGlzIGh1Z2Ugc3Bh Y2UsIHdoYXQgcG9pbnRzIHRoZXkgbGlrZSBhbmQgZGlzbGlrZSwgYW5kIHVzZSB0aGUgZGF0YSB0byBj -cmVhdGUgc3ludGhzIHRoYXQgYXJlIGVhc2llciB0byBuYXZpZ2F0ZSwgb3IgdGhhdCBlbmNvdXJhZ2Ug -Y3JlYXRpdml0eS4NDVRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyBwcmVzZW50ZWQgaGVyZS4gVGhlIGZp -cnN0IGlzIG9uZSB5b3Ugd2lsbCBwcm9iYWJseSBiZSB1c2VkIHRvIGlmIHlvdSBhcmUgYSBtdXNpY2lh -bjogMTAgc2xpZGVycyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy4gVGhlIHNlY29uZCBpcyBzb21l -d2hhdCBuZXc6IGV2ZXJ5IG9uZSBvZiB0aGUgYmlsbGlvbiB0cmlsbGlvbiBwb2ludHMgaGFzIGJlZW4g -bWFwcGVkIHRvIGEgMkQgc3VyZmFjZSAoaWYgeW91IHJlYWxseSB3YW50IHRvIGtub3cgLSBlYWNoIHNx -dWFyZSB5b3Ugc2VlIGlzIGEgc3F1YXNoZWQgb3V0IDEwRCBoeXBlcmN1YmUsIGFuZCBhbGwgb2YgdGhl -IDEwMjQgc3ViLXNxdWFyZXMgYXJlIHRoZSDigJxjb3JuZXJz4oCdIG9mIHRoaXMgMTAtY3ViZSwgd2hp -Y2ggdGhlbXNlbHZlcyBhcmUgYnVpbHQgZnJvbSBzbWFsbGVyIGh5cGVyY3ViZXMgYW5kIHNvIG9u4oCm -KS4gQXMgZmFyIGFzIHBvc3NpYmxlLCB0aGUgZnVydGhlciB5b3UgdHJhdmVsIGFsb25nIHRoaXMgMkQg -c3VyZmFjZSwgdGhlIG1vcmUgZGlmZmVyZW50IHRoZSBzb3VuZCB3aWxsIGJlY29tZS4NDVVwIGRvd24g -bW92ZW1lbnQgY29udHJvbHMgdGhlIHN5bnRoIHRpbWJyZSwgbGVmdCByaWdodCBjb250cm9scyB0aGUg -c2VxdWVuY2VyLiBXaGVuIHlvdSBjbGljayDigJxzYXZlIHByZXNldOKAnSB5b3Ugd2lsbCBkcm9wIGEg -cGluIG9udG8gdGhlIHN1cmZhY2UsIGFuZCB5b3UgY2FuIHJldmlzaXQgdGhpcyBwb2ludCBhdCBhbnl0 -aW1lIGJ5IHNjcm9sbGluZyB0byBpdC4gVGhpbmsgb2YgaXQgbGlrZSBhICJHb29nbGUgTWFwcyIgZm9y -IHN5bnRoIHNvdW5kcy4uLg0NWW91IGNhbiB1c2UgYSBwaW5jaCBnZXN0dXJlIHRvIHpvb20gaW4gYW5k -IG91dCBvZiB0aGUgc3VyZmFjZS4gWm9vbWluZyBpbiB3aWxsIGVuYWJsZSB5b3UgdG8gZXhwbG9yZSBz -bWFsbGVyIGxvY2FsaXRpZXMgb2YgdGhlIHNvdW5kIHNwYWNlLiBab29taW5nIG91dCB3aWxsIGdpdmUg -eW91IGEgYmlnZ2VyIHBlcnNwZWN0aXZlLCBidXQgb2YgY291cnNlIHRoZSBzb3VuZCB3aWxsIGJlY29t -ZSBmYXIgbW9yZSByYW5kb20gYW5kIHVuY29udHJvbGxhYmxlIGFzIHlvdSBtb3ZlIGJpZ2dlciBkaXN0 -YW5jZXMuDQ1XaGF0IHdlIGFyZSBhc2tpbmcgeW91LCB0aGUgcGFydGljaXBhbnQsIHRvIGRvIGlzIHVz -ZSBib3RoIHRoZSB6b29tZXIgYW5kIHRoZSBzbGlkZXJzIGZvciBhYm91dCAxMCBtaW51dGVzIGVhY2gs -IGFuZCBzYXZlIGFueSBzb3VuZHMgdGhhdCB5b3UgbGlrZS4gQWZ0ZXIgYWJvdXQgMjAgbWludXRlcyBv -ZiBpbnRlcmFjdGlvbiBhIHByb21wdCB3aWxsIGFwcGVhciBmb3IgYSBzaG9ydCBxdWVzdGlvbm5haXJl -IHRoYXQgd2lsbCBoZWxwIHVzIGFzc2VzcyB0aGUgaW50ZXJmYWNlIGZ1cnRoZXIuICBBZnRlciB0aGF0 -LCBwbGVhc2UgZmVlbCBmcmVlIHRvIHVzZSBpdCBzb21lIG1vcmU6IHRoZSBtb3JlIGRhdGEgd2UgZ2V0 -IHRoZSBiZXR0ZXIuIE1vcmUgZXhjaXRpbmcgZmVhdHVyZXMgYXJlIHBsYW5uZWQgZm9yIHRoaXMgYXBw -LCBzbyBwbGVhc2Ugd2F0Y2ggb3V0IGZvciB1cGRhdGVzLg0NTk9URTogWW91ciBhY3Rpb25zIHdpbGwg -YmUgbG9nZ2VkLCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVu -aXZlcnNpdHkuICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwg -YmUgY29sbGVjdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFi -YXNlLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZp -IGludGVybmV0IHdoaWxzdCB1c2luZyB0aGlzIEFwcC4NVG8gY29uc2VudCB0byB0aGlzIHBsZWFzZSBw -cmVzcyAiQWdyZWUiIGJlbG93LiBUbyBkZWNsaW5lIGp1c3QgZXhpdCB0aGUgYXBwLg0</bytes> +cmVhdGUgc3ludGhzIHRoYXQgYXJlIGVhc2llciB0byBuYXZpZ2F0ZSwgYW5kIGhvcGVmdWxseSBlbmNv +dXJhZ2UgY3JlYXRpdml0eS4NDVRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyBwcmVzZW50ZWQgaGVyZS4g +VGhlIGZpcnN0IGlzIG9uZSB5b3Ugd2lsbCBwcm9iYWJseSBiZSB1c2VkIHRvIGlmIHlvdSBhcmUgYSBt +dXNpY2lhbjogMTAgc2xpZGVycyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy4gVGhlIHNlY29uZCBp +cyBzb21ld2hhdCBuZXc6IGV2ZXJ5IG9uZSBvZiB0aGUgYmlsbGlvbiB0cmlsbGlvbiBwb2ludHMgaGFz +IGJlZW4gbWFwcGVkIHRvIGEgMkQgc3VyZmFjZSAoaWYgeW91IHJlYWxseSB3YW50IHRvIGtub3cgLSBl +YWNoIHNxdWFyZSB5b3Ugc2VlIGlzIGEgc3F1YXNoZWQgb3V0IDEwRCBoeXBlcmN1YmUsIGFuZCBhbGwg +b2YgdGhlIDEwMjQgc3ViLXNxdWFyZXMgYXJlIHRoZSDigJxjb3JuZXJz4oCdIG9mIHRoaXMgMTAtY3Vi +ZSwgd2hpY2ggdGhlbXNlbHZlcyBhcmUgYnVpbHQgZnJvbSBzbWFsbGVyIGh5cGVyY3ViZXMgYW5kIHNv +IG9u4oCmKS4gQXMgZmFyIGFzIHBvc3NpYmxlLCB0aGUgZnVydGhlciB5b3UgdHJhdmVsIGFsb25nIHRo +aXMgMkQgc3VyZmFjZSwgdGhlIG1vcmUgZGlmZmVyZW50IHRoZSBzb3VuZCB3aWxsIGJlY29tZS4NDVVw +IGRvd24gbW92ZW1lbnQgY29udHJvbHMgdGhlIHN5bnRoIHRpbWJyZSwgbGVmdCByaWdodCBjb250cm9s +cyB0aGUgc2VxdWVuY2VyLiBXaGVuIHlvdSBjbGljayDigJxzYXZlIHByZXNldOKAnSB5b3Ugd2lsbCBk +cm9wIGEgcGluIG9udG8gdGhlIHN1cmZhY2UsIGFuZCB5b3UgY2FuIHJldmlzaXQgdGhpcyBwb2ludCBh +dCBhbnl0aW1lIGJ5IHNjcm9sbGluZyB0byBpdC4gVGhpbmsgb2YgaXQgbGlrZSBhICJHb29nbGUgTWFw +cyIgZm9yIHN5bnRoIHNvdW5kcy4uLg0NWW91IGNhbiB1c2UgYSBwaW5jaCBnZXN0dXJlIHRvIHpvb20g +aW4gYW5kIG91dCBvZiB0aGUgc3VyZmFjZS4gWm9vbWluZyBpbiB3aWxsIGVuYWJsZSB5b3UgdG8gZXhw +bG9yZSBzbWFsbGVyIGxvY2FsaXRpZXMgb2YgdGhlIHNvdW5kIHNwYWNlLiBab29taW5nIG91dCB3aWxs +IGdpdmUgeW91IGEgYmlnZ2VyIHBlcnNwZWN0aXZlLCBidXQgb2YgY291cnNlIHRoZSBzb3VuZCB3aWxs +IGJlY29tZSBmYXIgbW9yZSByYW5kb20gYW5kIHVuY29udHJvbGxhYmxlIGFzIHlvdSBtb3ZlIGJpZ2dl +ciBkaXN0YW5jZXMuDQ1XaGF0IHdlIGFyZSBhc2tpbmcgeW91LCB0aGUgcGFydGljaXBhbnQsIHRvIGRv +IGlzIHVzZSBib3RoIHRoZSB6b29tZXIgYW5kIHRoZSBzbGlkZXJzIGZvciBhYm91dCAxMCBtaW51dGVz +IGVhY2gsIGFuZCBzYXZlIGFueSBzb3VuZHMgdGhhdCB5b3UgbGlrZS4gQWxzbyB1c2UgdGhlICJyYW5k +b21pc2UiIGFuZCAibG9jayIgYnV0dG9ucy4gQWZ0ZXIgYWJvdXQgMjAgbWludXRlcyBvZiBpbnRlcmFj +dGlvbiBhIHByb21wdCB3aWxsIGFwcGVhciBmb3IgYSBzaG9ydCBxdWVzdGlvbm5haXJlIHRoYXQgd2ls +bCBoZWxwIHVzIGFzc2VzcyB0aGUgaW50ZXJmYWNlIGZ1cnRoZXIuICBBZnRlciB0aGF0LCBwbGVhc2Ug +ZmVlbCBmcmVlIHRvIHVzZSBpdCBzb21lIG1vcmU6IHRoZSBtb3JlIGRhdGEgd2UgZ2V0IHRoZSBiZXR0 +ZXIuIE1vcmUgZXhjaXRpbmcgZmVhdHVyZXMgYXJlIHBsYW5uZWQgZm9yIHRoaXMgYXBwLCBzbyBwbGVh +c2Ugd2F0Y2ggb3V0IGZvciB1cGRhdGVzLg0NTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2Vk +LCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHku +ICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVj +dGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBp +cyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0 +IHdoaWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAg +c3BhY2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVl +IiBiZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes> </object> <object class="NSColor" key="IBUITextColor"> <int key="NSColorSpace">1</int>
--- a/Question.h Fri Feb 01 18:31:43 2013 +0000 +++ b/Question.h Wed Feb 13 17:03:56 2013 +0000 @@ -5,6 +5,7 @@ // Created by Robert Tubb on 21/01/2013. // // included by Qviewcont +#define NUM_CHOICES 5 #import <Foundation/Foundation.h> typedef enum QuestionType{AGREE_DISAGREE, SLIDERS_ZOOMER} QuestionType;
--- a/Question.m Fri Feb 01 18:31:43 2013 +0000 +++ b/Question.m Wed Feb 13 17:03:56 2013 +0000 @@ -42,17 +42,17 @@ // get the set of answers depending on what type the q was // pseudo static variable if(type == AGREE_DISAGREE){ - [Question setCount:6]; + [Question setCount:NUM_CHOICES]; return [[NSArray alloc] initWithObjects: - @" ", @"Strongly disagree", @"Disagree", @"Neither", - @"Agree", @"Strongly agree", nil]; + @"Strongly agree",@"Agree", @"Neither agree nor disagree", + @"Disagree",@"Strongly disagree", nil]; }else if(type == SLIDERS_ZOOMER){ - [Question setCount:6]; + [Question setCount:NUM_CHOICES]; return [[NSArray alloc] initWithObjects: - @" ", @"Definitely Sliders", @"Maybe Sliders", @"Neither", - @"Maybe Zoomer", @"Definitely Zoomer", nil]; + @"definitely the Sliders", @"maybe the Sliders", @"neither", + @"maybe the Zoomer", @"definitely the Zoomer", nil]; }else{ return nil; }
--- a/QuestionnaireViewController.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/QuestionnaireViewController.mm Wed Feb 13 17:03:56 2013 +0000 @@ -166,7 +166,7 @@ NSLog(@"Prev answer answerInt %d", curQ.answer); - [picker selectRow:curQ.answer inComponent:0 animated:YES]; + [picker selectRow:2 inComponent:0 animated:YES]; } //---------------------------------------------------------------- @@ -174,22 +174,23 @@ self.questionArray = [NSArray arrayWithObjects: [[Question alloc] initWithTextAndType:@"I am familiar with music software and sound synthesis.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"The best way to get a feel for the possibilities of the synth was with:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"Interesting sounds could be discovered more quickly as a result of using:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"A sound could be fine tuned more easily using:":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"The best interface to get a feel for the possibilities of the synth was...":SLIDERS_ZOOMER], + [[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], [[Question alloc] initWithTextAndType:@"The interface that felt more familiar was:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"Scrolling a greater distance on the grid seemed to correspond to larger difference in the sound.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"The ability to see other presets on the grid was useful.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"The range of sounds was too limited to be able to judge the eventual usefulness of the interface.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"The interface better for generating new ideas was":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"The interface better for live performance would be:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"A specific type of sound could be found more quickly using:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"I felt more in control when using:":SLIDERS_ZOOMER], - [[Question alloc] initWithTextAndType:@"I felt more creative when using:":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"Scrolling a greater distance on the grid seemed to correspond to larger difference in the sound.":AGREE_DISAGREE], + [[Question alloc] initWithTextAndType:@"The interface that I felt more in control using was...":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"The ability to see other presets laid on the grid was useful.":AGREE_DISAGREE], // ???????? + [[Question alloc] initWithTextAndType:@"The interface that felt more creative was...":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"The range of sounds was too limited/poor quality to be able to judge the eventual usefulness of the interface.":AGREE_DISAGREE], + [[Question alloc] initWithTextAndType:@"The interface better for generating new ideas was...":SLIDERS_ZOOMER], + [[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 interface better for creating a specific sound I had in mind would be...":SLIDERS_ZOOMER], // not instructed ????? + [[Question alloc] initWithTextAndType:@"The combination of Zoomer and Sliders was better than either individually.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"Overall, I preferred using:":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"Overall, the interface I preferred using was...":SLIDERS_ZOOMER], // ?????? nil]; } @@ -207,7 +208,8 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - return 6; // always 6 + + return NUM_CHOICES; // always 6 } //---------------------------------------------------------------- - (NSString *)pickerView:(UIPickerView *)pickerView
--- a/QuestionnaireViewController.xib Fri Feb 01 18:31:43 2013 +0000 +++ b/QuestionnaireViewController.xib Wed Feb 13 17:03:56 2013 +0000 @@ -40,7 +40,7 @@ <object class="IBUIButton" id="871929113"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{315, 645}, {121, 44}}</string> + <string key="NSFrame">{{627, 933}, {121, 44}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <string key="NSReuseIdentifierKey">_NS:9</string> @@ -75,10 +75,10 @@ <object class="IBUILabel" id="783180915"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{91, 51}, {212, 53}}</string> + <string key="NSFrame">{{212, 226}, {212, 53}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="791686696"/> + <reference key="NSNextKeyView" ref="838658605"/> <string key="NSReuseIdentifierKey">_NS:9</string> <bool key="IBUIOpaque">NO</bool> <bool key="IBUIClipsSubviews">YES</bool> @@ -108,10 +108,10 @@ <object class="IBUILabel" id="838658605"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{91, 101}, {334, 125}}</string> + <string key="NSFrame">{{212, 276}, {334, 125}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="356964106"/> + <reference key="NSNextKeyView" ref="791686696"/> <string key="NSReuseIdentifierKey">_NS:9</string> <bool key="IBUIOpaque">NO</bool> <bool key="IBUIClipsSubviews">YES</bool> @@ -141,7 +141,7 @@ <object class="IBUIButton" id="960474577"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{315, 490}, {121, 44}}</string> + <string key="NSFrame">{{436, 706}, {121, 44}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="871929113"/> @@ -164,7 +164,7 @@ <object class="IBUIButton" id="356964106"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{97, 490}, {157, 44}}</string> + <string key="NSFrame">{{218, 706}, {157, 44}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="960474577"/> @@ -188,10 +188,10 @@ <object class="IBUIPickerView" id="791686696"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">290</int> - <string key="NSFrame">{{91, 234}, {334, 216}}</string> + <string key="NSFrame">{{212, 409}, {334, 216}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="838658605"/> + <reference key="NSNextKeyView" ref="356964106"/> <string key="NSReuseIdentifierKey">_NS:9</string> <string key="targetRuntimeIdentifier">IBIPadFramework</string> <bool key="IBUIShowsSelectionIndicator">YES</bool> @@ -352,12 +352,12 @@ <int key="objectID">2</int> <reference key="object" ref="766721923"/> <array class="NSMutableArray" key="children"> + <reference ref="871929113"/> <reference ref="783180915"/> <reference ref="838658605"/> + <reference ref="960474577"/> + <reference ref="356964106"/> <reference ref="791686696"/> - <reference ref="960474577"/> - <reference ref="871929113"/> - <reference ref="356964106"/> </array> <reference key="parent" ref="0"/> </object> @@ -413,7 +413,7 @@ <nil key="activeLocalization"/> <dictionary class="NSMutableDictionary" key="localizations"/> <nil key="sourceID"/> - <int key="maxID">60</int> + <int key="maxID">61</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <array class="NSMutableArray" key="referencedPartialClassDescriptions">
--- a/TopButtonViewController.h Fri Feb 01 18:31:43 2013 +0000 +++ b/TopButtonViewController.h Wed Feb 13 17:03:56 2013 +0000 @@ -12,7 +12,6 @@ @interface TopButtonViewController : UIViewController @property (nonatomic, assign) id theOFAppRef; -@property (nonatomic, strong) HelpViewController * helpViewController; @property (retain, nonatomic) IBOutlet UIBarButtonItem *playButton; @property (retain, nonatomic) IBOutlet UIBarButtonItem *pauseButton; @@ -29,5 +28,6 @@ - (IBAction)qPressed:(id)sender; - (IBAction)randomise:(id)sender; - (IBAction)helpPressed:(id)sender; +- (IBAction)newUser:(id)sender; @end
--- a/TopButtonViewController.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/TopButtonViewController.mm Wed Feb 13 17:03:56 2013 +0000 @@ -104,12 +104,12 @@ } - (IBAction)helpPressed:(id)sender { - [self.helpViewController.view show:self]; - - self.helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil]; - [self.view addSubview:self.helpViewController.view]; + ((testApp *)self.theOFAppRef)->showHelp(); - [self.helpViewController show:self]; +} + +- (IBAction)newUser:(id)sender { + ((testApp *)self.theOFAppRef)->setupNewUser(); } - (IBAction)show:(id)sender @@ -124,10 +124,10 @@ [helpViewController hide:(id)this]; */ - (void)dealloc { - [_helpViewController release]; [_playButton release]; [_pauseButton release]; [_qButton release]; + [super dealloc]; } - (void)viewDidUnload {
--- a/TopButtonViewController.xib Fri Feb 01 18:31:43 2013 +0000 +++ b/TopButtonViewController.xib Wed Feb 13 17:03:56 2013 +0000 @@ -59,8 +59,14 @@ <int key="IBUIStyle">1</int> <reference key="IBUIToolbar" ref="358683122"/> </object> + <object class="IBUIBarButtonItem" id="319053509"> + <string key="IBUITitle">New User</string> + <string key="targetRuntimeIdentifier">IBIPadFramework</string> + <int key="IBUIStyle">1</int> + <reference key="IBUIToolbar" ref="358683122"/> + </object> <object class="IBUIBarButtonItem" id="702923516"> - <string key="IBUITitle">Take Questionnaire</string> + <string key="IBUITitle">Questionnaire</string> <string key="targetRuntimeIdentifier">IBIPadFramework</string> <int key="IBUIStyle">1</int> <reference key="IBUIToolbar" ref="358683122"/> @@ -221,6 +227,14 @@ </object> <int key="connectionID">34</int> </object> + <object class="IBConnectionRecord"> + <object class="IBCocoaTouchEventConnection" key="connection"> + <string key="label">newUser:</string> + <reference key="source" ref="319053509"/> + <reference key="destination" ref="841351856"/> + </object> + <int key="connectionID">38</int> + </object> </array> <object class="IBMutableOrderedSet" key="objectRecords"> <array key="orderedObjects"> @@ -263,6 +277,7 @@ <reference ref="898331149"/> <reference ref="180077124"/> <reference ref="924591997"/> + <reference ref="319053509"/> </array> <reference key="parent" ref="766721923"/> </object> @@ -316,6 +331,11 @@ <reference key="object" ref="924591997"/> <reference key="parent" ref="358683122"/> </object> + <object class="IBObjectRecord"> + <int key="objectID">35</int> + <reference key="object" ref="319053509"/> + <reference key="parent" ref="358683122"/> + </object> </array> </object> <dictionary class="NSMutableDictionary" key="flattenedProperties"> @@ -332,6 +352,7 @@ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> <string key="30.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> <string key="33.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="35.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> <string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> <string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> @@ -340,7 +361,7 @@ <nil key="activeLocalization"/> <dictionary class="NSMutableDictionary" key="localizations"/> <nil key="sourceID"/> - <int key="maxID">34</int> + <int key="maxID">38</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <array class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -351,6 +372,7 @@ <string key="helpPressed:">id</string> <string key="lockSequencePressed:">id</string> <string key="lockSynthPressed:">id</string> + <string key="newUser:">id</string> <string key="pausePressed:">id</string> <string key="playPressed:">id</string> <string key="qPressed:">id</string> @@ -371,6 +393,10 @@ <string key="name">lockSynthPressed:</string> <string key="candidateClassName">id</string> </object> + <object class="IBActionInfo" key="newUser:"> + <string key="name">newUser:</string> + <string key="candidateClassName">id</string> + </object> <object class="IBActionInfo" key="pausePressed:"> <string key="name">pausePressed:</string> <string key="candidateClassName">id</string>
--- a/eventLogger.h Fri Feb 01 18:31:43 2013 +0000 +++ b/eventLogger.h Wed Feb 13 17:03:56 2013 +0000 @@ -56,7 +56,8 @@ SEQ_LOCKED, // 15 SYNTH_LOCKED, // 16 PLAY_PRESSED, // 17 - PAUSE_PRESSED}; // 18 + PAUSE_PRESSED, // 18 + HELP_PRESSED}; // 19 //--------------------------------------------------------------------------- @@ -132,26 +133,28 @@ public: int nextUploadNumber; bool loggingEnabled; + bool logUploadInProgress; bool serverConnectionOK; bool consentGiven; unsigned int deviceID; // unique get something from hardware?? unsigned int totalInteractionTime, savedInteractionTime, sessionTime, sessionStartTime; string userName; // not unique - + EventLogger(); void init(); void exitAndSave(); void setUsername(const char *u); + void newUser(); void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0); void questionnaireAnswersObtained(vector<int> answers); - + void urlResponse(ofHttpResponse & response); private: // what we need... /* time, type, value */ - + int currentHTTPRequestID; vector<lEvent> theEvents; @@ -167,12 +170,13 @@ bool questionnaireCompleted; bool questionnaireUploaded; + void checkLogFile(); - bool uploadEventLog(); + bool uploadEventLog(bool async); void firstEverAppOpen(); void readJsonToLog(const string &jsonFile); - bool uploadQuestionnaire(); - bool sendToServer(string functionName, Json::Value jsonData); + void uploadQuestionnaire(); + bool sendToServer(string functionName, Json::Value jsonData, bool async); Json::Value logsToJson(); Json::Value questionnaireToJson(); void printAll(){
--- a/eventLogger.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/eventLogger.mm Wed Feb 13 17:03:56 2013 +0000 @@ -20,12 +20,13 @@ serverConnectionOK = false; questionnaireCompleted = false; questionnaireUploaded = false; - - + currentHTTPRequestID = -1; + logUploadInProgress = false; ofxiPhoneDeviceType iOSdeviceType = ofxiPhoneGetDeviceType(); cout << "Device: " << iOSdeviceType << '\n'; nextUploadQty = UPLOAD_CHUNK_SIZE; // amount of data uploaded is always more than UPLOAD_CHUNK_SIZE events + } //--------------------------------------------------------------------------- // draw() - show path of last N scroll events - can be scrubbed along? @@ -50,15 +51,15 @@ } //--------------------------------------------------------------------------- -bool EventLogger::uploadQuestionnaire(){ +void EventLogger::uploadQuestionnaire(){ // show indicator cout << "^^^^^^^^ UPLOADING QUESTIONNAIRE ^^^^^^^^ \n"; - questionnaireUploaded = sendToServer("questionnaire", questionnaireToJson()); - return questionnaireUploaded; + sendToServer("questionnaire", questionnaireToJson(), true); + } //--------------------------------------------------------------------------- -bool EventLogger::sendToServer(string functionName, Json::Value jsonData){ +bool EventLogger::sendToServer(string functionName, Json::Value jsonData, bool async = false){ bool sent; string request; @@ -72,25 +73,63 @@ Json::FastWriter writer; string jsontext = writer.write( jsonData ); + // remove newline if (!jsontext.empty() && jsontext[jsontext.length()-1] == '\n') { jsontext.erase(jsontext.length()-1); } request.append(jsontext); + + if(!async){ + ofURLFileLoader fileLoader; + ofHttpResponse resp; + resp = fileLoader.get(request); - ofURLFileLoader fileLoader; - ofHttpResponse resp; - resp = fileLoader.get(request); - //fileLoader.getAsync(request); - cout << "HTTP STATUS " << resp.status << "\n"; - cout << "HTTP ERROR " << resp.error << "\n"; - cout << "HTTP DATA " << resp.data << "\n"; // ofBuffer + cout << "HTTP STATUS " << resp.status << "\n"; + cout << "HTTP ERROR " << resp.error << "\n"; + cout << "HTTP DATA " << resp.data << "\n"; // ofBuffer + + stringstream response; + response << resp.data; + + if (resp.status == 200){ + if(response.str() == "OK"){ + + sent = true; + }else{ + // not ok + // problem serverside + sent = false; + } + }else{ + + sent = false; + // SHOW AN ALERT TO USER? + } + + return sent; + }else{ // async + ofURLFileLoader fileLoader; + currentHTTPRequestID = ofLoadURLAsync(request, functionName); + ofRegisterURLNotification(this); + + return true; // ??? + } +} +//----------------------------- +void EventLogger::urlResponse(ofHttpResponse & response){ + cout << "gotHTTPRequestStatus\n"; + cout << "HTTP REQUEST NAME " << response.request.name << "\n"; + cout << "HTTP STATUS " << response.status << "\n"; + cout << "HTTP ERROR " << response.error << "\n"; + cout << "HTTP DATA " << response.data << "\n"; // ofBuffer - stringstream response; - response << resp.data; + bool sent; + stringstream respStr; + respStr << response.data; - if (resp.status == 200){ - if(response.str() == "OK"){ + if (response.status == 200){ + if(respStr.str() == "OK"){ sent = true; }else{ @@ -103,7 +142,36 @@ sent = false; // SHOW AN ALERT TO USER? } - return sent; + + // now do request specific stuff + if(response.request.name == "eventlog"){ + if(!sent){ + // try later + nextUploadQty += UPLOAD_CHUNK_SIZE; + }else{ + + // if success - clear memory + theEvents.clear(); + cout << "UPLOAD SUCCESS\n"; + nextUploadNumber++; + } + logUploadInProgress = false; + }else if(response.request.name == "questionnaire"){ + if(sent){ + questionnaireUploaded = true; + }else{ + questionnaireUploaded = false; // will try next time... when? + } + }else if(response.request.name == "testConnection"){ + + if (sent){ + cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n"; + serverConnectionOK = true; + }else{ + cout << "server connection ERROR \n"; + } + } + } //--------------------------------------------------------------------------- bool EventLogger::testConnection(){ @@ -111,12 +179,8 @@ root["test"] = "test"; - serverConnectionOK = sendToServer("testConnection", root); - if (serverConnectionOK){ - cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n"; - }else{ - cout << "server connection ERROR \n"; - } + sendToServer("testConnection", root, true); + } //--------------------------------------------------------------------------- void EventLogger::readJsonToLog(const string &jsonFile){ @@ -179,9 +243,9 @@ const Json::Value jlogs = root["events"]; for ( int index = 0; index < jlogs.size(); ++index ) theEvents.push_back(lEvent(jlogs[index])); - if(theEvents.size() > nextUploadQty){ + if(theEvents.size() > nextUploadQty && ! logUploadInProgress){ //try to upload - uploadEventLog(); + uploadEventLog(true); } // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time! cout << "Total interaction time: " << savedInteractionTime << '\n'; @@ -192,26 +256,31 @@ //--------------------------------------------------------------------------- -bool EventLogger::uploadEventLog(){ +bool EventLogger::uploadEventLog(bool async){ // show indicator - + logUploadInProgress = true; cout << "^^^^^^^^ ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n"; - - bool logUploaded = sendToServer("eventlog", logsToJson()); - if(!logUploaded){ - // try later - nextUploadQty += UPLOAD_CHUNK_SIZE; + if(!async){ + bool success = sendToServer("eventlog", logsToJson(), async); + if(!success){ + // try later + nextUploadQty += UPLOAD_CHUNK_SIZE; + }else{ + + // if success - clear memory + theEvents.clear(); + cout << "UPLOAD SUCCESS\n"; + nextUploadNumber++; + } + logUploadInProgress = false; + return success; }else{ - - // if success - clear memory - theEvents.clear(); - cout << "UPLOAD SUCCESS\n"; - nextUploadNumber++; + sendToServer("eventlog", logsToJson(), async); } - return logUploaded; - } //---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- //void EventLogger::deleteLogFile(){ //--------------------------------------------------------------------------- @@ -228,6 +297,17 @@ consentGiven = false; } +void EventLogger::newUser(){ + cout<<"setup new user\n"; + nextUploadNumber = 0; + deviceID = ofGetSystemTimeMicros(); + savedInteractionTime = 0; + questionnaireCompleted = false; + questionnaireUploaded = false; + consentGiven = true; // other wise we wouldn't be doing this + ((testApp *)ofGetAppPtr())->introHidden(true); // hacky + +} //--------------------------------------------------------------------------- // called from alertView OK in iViewController void EventLogger::setUsername(const char *u){ @@ -283,9 +363,9 @@ theEvents.push_back(lEvent(evtType)); break; } - if(theEvents.size() > nextUploadQty){ - //try to upload - uploadEventLog(); + if(theEvents.size() > nextUploadQty && !logUploadInProgress){ + //try to upload asynchronously + uploadEventLog(true); } //sessionTime = (ofGetSystemTime() - sessionStartTime); totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime); @@ -303,7 +383,7 @@ logEvent(CONSENT_DENIED); Json::Value jlogs = logsToJson(); // try to upload TODO (no - might hang and prevent exit???) - uploadEventLog(); + uploadEventLog(true); return; } logEvent(APP_EXITED); @@ -312,7 +392,8 @@ string fname = ofxiPhoneGetDocumentsDirectory() + EVENT_LOG_FILENAME; // try to upload TODO (no - might hang and prevent exit???) - uploadEventLog(); + // do it async because event list needs to be cleared to prevent saving on device + uploadEventLog(false); // write to file // json without the logs that were uploaded!
--- a/grid.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/grid.mm Wed Feb 13 17:03:56 2013 +0000 @@ -33,7 +33,7 @@ pixSize.setCoord(ofGetWidth(), ofGetHeight()); //set scale and position to mid way - scale = 5500.0; + scale = 15500.0; snapDist = TwoVector(9,9); snapped = false;
--- a/presetManager.h Fri Feb 01 18:31:43 2013 +0000 +++ b/presetManager.h Wed Feb 13 17:03:56 2013 +0000 @@ -104,9 +104,9 @@ // names values // check if already there // find and return all(?) presets within a certain coordinate range - vector<Preset *> thePresets; // we want vector ? or list? pointers using new? + vector<Preset *> thePresets; - int addPreset(string name); // returns id or negative error number + int addPreset(string name); int loadPreset(const TwoVector coord, const string name, long long stime); TwoVector recallPreset(int presetID); // by name ? id?
--- a/presetManager.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/presetManager.mm Wed Feb 13 17:03:56 2013 +0000 @@ -110,7 +110,7 @@ root["presets"][i] = (*presetIter)->presetToJson(); i++; } - + return root; } //---------------------------------------------------------------------------
--- a/testApp.h Fri Feb 01 18:31:43 2013 +0000 +++ b/testApp.h Wed Feb 13 17:03:56 2013 +0000 @@ -21,6 +21,7 @@ #import "QuestionnaireViewController.h" #import "BottomTabViewController.h" #import "IntroViewController.h" +#import "HelpViewController.h" #import "TopButtonViewController.h" #import "SliderViewController.h" #import "usernameAlertViewController.h" @@ -39,6 +40,11 @@ BottomTabViewController *bottomTabViewController; UsernameAlertViewController *usernameAlertViewController; HelpViewController *helpViewController; + QuestionnaireViewController * questionnaireViewController; + IntroViewController * introViewController; + TopButtonViewController * topButtonViewController; + SliderViewController * sliderViewController; + int prevTouchX; int prevTouchY; double prevDist; @@ -65,11 +71,9 @@ vector<int> freqIndexes; int numActiveTouches; - - QuestionnaireViewController * questionnaireViewController; - IntroViewController * introViewController; - TopButtonViewController * topButtonViewController; - SliderViewController * sliderViewController; + bool preventingMovePostScroll; + + // void setup(); @@ -99,6 +103,8 @@ ofxOscSender sender; void sendOSCParams(); + void setupNewUser(); + void lockSynthPressed(bool locked); void lockSequencerPressed(bool locked); @@ -108,6 +114,8 @@ void introHidden(bool OK); void interfaceSelected(int which); void seqStartStop(bool go); + void showHelp(); + void helpHidden(); void setupBottomGui(); void bottomGuiEvent();
--- a/testApp.mm Fri Feb 01 18:31:43 2013 +0000 +++ b/testApp.mm Wed Feb 13 17:03:56 2013 +0000 @@ -42,7 +42,7 @@ prevTouch1.setCoord(10,20); prevDist = 10; slowFactor = 0.98; - + preventingMovePostScroll = false; // the 5 harmonics for the frequencer freqIndexes.push_back(0); @@ -96,6 +96,11 @@ usernameAlertViewController = [[UsernameAlertViewController alloc] init]; + helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil]; + [ofxiPhoneGetGLParentView() addSubview:helpViewController.view]; + [helpViewController setAppRef:(id)this]; + helpViewController.view.hidden = YES; + /* sliderViewController = [[SliderViewController alloc] initWithNibName:@"SLiderViewController" bundle:nil]; [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view]; @@ -110,7 +115,8 @@ presetManager.startupLoadAll(); eventLogger.init(); - whichInterfaceShowing = BOTH; + whichInterfaceShowing = SLIDERS; + setAllGUISliders(theGridView.getParams()); // GO paused = false; @@ -187,12 +193,11 @@ // if(eventLogger.questionnaireCompleted) return; - paused = true; + paused = true; // need to set button + [topButtonViewController pausePressed:(id)this]; //stopSequencer - core.pd.startMessage(); - core.pd.addFloat(0); - core.pd.finishMessage("fromOF", "seqStartStop"); + seqStartStop(false); questionnaireViewController = [[QuestionnaireViewController alloc] initWithNibName:@"QuestionnaireViewController" bundle:nil]; [ofxiPhoneGetGLParentView() addSubview:questionnaireViewController.view]; @@ -211,11 +216,7 @@ // set "we've done questionnaire" to true in event logger paused = false; - - //startSequencer (TODO what about the toggle ? ?) - core.pd.startMessage(); - core.pd.addFloat(1); - core.pd.finishMessage("fromOF", "seqStartStop"); + whichInterfaceShowing = BOTH; // tell bottomtabviewcontroller @@ -239,7 +240,6 @@ //-------------------------------------------------------------- void testApp::introHidden(bool OK){ if(OK){ - paused = false; eventLogger.consentGiven = true; whichInterfaceShowing = BOTH; // show username prompt @@ -369,6 +369,19 @@ eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,0.0); } +//- +void testApp::showHelp(){ + paused = true; + seqStartStop(false); + [topButtonViewController pausePressed:(id)this]; + helpViewController.view.hidden = NO; + eventLogger.logEvent(HELP_PRESSED); +} +void testApp::helpHidden(){ + paused = false; + // start seq? + +} //-------------------------------------------------------------- void testApp::sendParametersToPD(){ // frequencer stuff to get 16 steps @@ -398,22 +411,18 @@ sendModFreq(sliderVals[9]); } +void testApp::setupNewUser(){ + // this function is for supervised trials with my ipad + eventLogger.newUser(); +} //-------------------------------------------------------------- #pragma mark STANDARD OF FUNCTIONS //-------------------------------------------------------------- void testApp::update(){ - //we do a heartbeat on iOS as the phone will shut down the network connection to save power - //this keeps the network alive as it thinks it is being used. + if(paused) return; - if( ofGetFrameNum() % 120 == 0 ){ - ofxOscMessage m; - m.setAddress( "/misc/heartbeat" ); - m.addIntArg( ofGetFrameNum() ); - sender.sendMessage( m ); - } - - // continiue to move at velocity, unless snapped + // continiue to move or zoom at velocity, unless snapped if (numActiveTouches == 0){ // no touches, use momentum @@ -484,14 +493,12 @@ break; } - } //-------------------------------------------------------------- void testApp::touchDown(ofTouchEventArgs &touch){ - - // TODO check if in gui area!!! + // in slider gui area? if(whichInterfaceShowing == SLIDERS){ return; }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ @@ -500,8 +507,8 @@ }// otherwise we're good to let the zoomer handle touch numActiveTouches++; - // absolute position doesn't matter - // which one? + preventingMovePostScroll = false; + if(touch.id == 0){ touch0.setCoord(touch.x,touch.y); prevTouch0 = touch0; @@ -515,6 +522,7 @@ moveVel.setCoord(0.0, 0.0); prevMove.setCoord(0.0, 0.0); prevMove2.setCoord(0.0, 0.0); + }else if(numActiveTouches == 2){ zoomVel = 0.0; prevZoom = 0.0; @@ -534,13 +542,9 @@ }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ return; - }// otherwise we're good to let the zoomer handle touch + } - - // check if in other gui area - if(touch.x > getWidth()-200 && touch.y < 300){ - return; - } + // otherwise we're good to let the zoomer handle touch // which one? keep track of each touch point if(touch.id == 0){ @@ -552,7 +556,7 @@ } if(numActiveTouches == 1){ - + if(preventingMovePostScroll) return; handleScroll(); }else if(numActiveTouches == 2){ handleZoom(); @@ -564,6 +568,7 @@ } //-------------------------------------------------------------- +// handle a finger being dragged void testApp::handleScroll(){ TwoVector move = touch0 - prevTouch0; @@ -596,6 +601,7 @@ sendParametersToPD(); } //-------------------------------------------------------------- +// handle pinch movememnt void testApp::handleZoom(){ // work out change in difference double dist = touch1.distanceTo(touch0); @@ -619,7 +625,7 @@ //-------------------------------------------------------------- void testApp::touchUp(ofTouchEventArgs &touch){ if(numActiveTouches > 0) numActiveTouches--; // dirty - + preventingMovePostScroll = false; // TODO check if in gui area!!! if(whichInterfaceShowing == SLIDERS){ return; @@ -651,6 +657,10 @@ } 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; } }