rt300@0: // rt300@0: // presetManager.mm rt300@0: // oscSenderExample rt300@0: // rt300@0: // Created by Robert Tubb on 07/11/2012. rt300@0: // rt300@0: // rt300@0: rt300@0: #include "presetManager.h" rt300@0: rt300@0: //--------------------------------------------------------------------------- rt300@3: extern Grid theGridView; rt300@0: PresetManager presetManager; rt300@8: extern EventLogger eventLogger; rt300@16: extern PresetAlertViewController *presetAlertViewController; rt300@8: //--------------------------------------------------------------------------- rt300@8: vector Preset::makePresetPicture(TwoVector coord){ rt300@8: // convert midi parameters to a nice piccy rt300@8: vector params = theGridView.calculateParamsFromCoord(coord); rt300@8: vector pixCols; rt300@8: rt300@8: ofColor col(255,0,0); rt300@8: for(int i=0; i<9;i++){ rt300@8: col.setHue(params[i]*2); rt300@8: pixCols.push_back(col); rt300@8: } rt300@8: return pixCols; rt300@8: } rt300@0: //--------------------------------------------------------------------------- rt300@5: void Preset::draw(){ rt300@8: // TODO bit stupid actually. make it a shaded ball / dot rt300@8: rt300@5: int sz = 2; rt300@5: TwoVector pos = theGridView.coordToPixel(coordinates); // euch -rely on grid view? rt300@5: rt300@5: if(pixVals.size() < 9){ rt300@5: cout << "NO PRESET PIC\n"; rt300@5: return; rt300@5: } rt300@5: //middle row rt300@5: // centre rt300@5: ofSetColor(pixVals[0]); rt300@5: ofRect(pos.x, pos.y,sz,sz); rt300@5: // right rt300@5: ofSetColor(pixVals[1]); rt300@5: ofRect(pos.x+sz, pos.y,sz,sz); rt300@5: // left rt300@5: ofSetColor(pixVals[2]); rt300@5: ofRect(pos.x-sz, pos.y,sz,sz); rt300@5: rt300@5: //top rt300@5: // centre rt300@5: ofSetColor(pixVals[3]); rt300@5: ofRect(pos.x, pos.y+sz,sz,sz); rt300@5: // right rt300@5: ofSetColor(pixVals[4]); rt300@5: ofRect(pos.x+sz, pos.y+sz,sz,sz); rt300@5: // left rt300@5: ofSetColor(pixVals[5]); rt300@5: ofRect(pos.x-sz, pos.y+sz,sz,sz); rt300@5: rt300@5: // bottom rt300@5: // centre rt300@5: ofSetColor(pixVals[6]); rt300@5: ofRect(pos.x, pos.y-sz,sz,sz); rt300@5: // right rt300@5: ofSetColor(pixVals[7]); rt300@5: ofRect(pos.x+sz, pos.y-sz,sz,sz); rt300@5: // left rt300@5: ofSetColor(pixVals[8]); rt300@5: ofRect(pos.x-sz, pos.y-sz,sz,sz); rt300@5: }; rt300@5: //--------------------------------------------------------------------------- rt300@8: Json::Value Preset::presetToJson(){ rt300@8: // create the string for this instance of Preset object rt300@8: rt300@8: Json::Value presetVal; rt300@8: rt300@8: presetVal["creatorUserName"] = creatorUserName; rt300@8: presetVal["creatorDeviceID"] = creatorDeviceID; rt300@8: presetVal["creationTime"] = creationTime; rt300@8: presetVal["name"] = name; rt300@8: presetVal["coordinates"]["x"] = coordinates.x; rt300@8: presetVal["coordinates"]["y"] = coordinates.y; rt300@8: rt300@8: rt300@8: return presetVal; rt300@8: } rt300@8: //--------------------------------------------------------------------------- rt300@0: PresetManager::PresetManager(){ rt300@3: timesOpened = 0; rt300@4: nextID = 0; rt300@8: rt300@7: string ts = ofGetTimestampString(); rt300@22: rt300@22: presetAlertShowing = false; rt300@22: rt300@22: rt300@7: cout << "ofGetTimestampString: " << ts << '\n'; rt300@4: } rt300@8: //--------------------------------------------------------------------------- rt300@8: Json::Value PresetManager::allPresetsToJson(){ rt300@8: Json::Value root; rt300@8: rt300@8: // use jsoncpp rt300@8: vector::iterator presetIter; rt300@8: rt300@8: int i = 0; rt300@8: for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ rt300@8: root["presets"][i] = (*presetIter)->presetToJson(); rt300@8: i++; rt300@8: } rt300@27: rt300@8: return root; rt300@8: } rt300@8: //--------------------------------------------------------------------------- rt300@8: void PresetManager::readJsonToPresets(const string &jsonFile){ rt300@8: Json::Value root; rt300@8: Json::Reader reader; rt300@8: rt300@8: rt300@8: ifstream theFile(jsonFile.c_str()); rt300@8: stringstream fileText; rt300@8: string line; rt300@8: if(!theFile){ rt300@8: cout<<"can't find preset file \n"; rt300@22: return; rt300@8: }else{ rt300@8: rt300@8: while(theFile){ rt300@8: theFile >> line; rt300@9: // cout << line << "\n"; // lots? rt300@8: fileText << line; rt300@8: rt300@8: } rt300@8: rt300@8: theFile.close(); rt300@8: } rt300@8: rt300@8: bool parsingSuccessful = reader.parse( fileText.str(), root ); rt300@8: rt300@8: if ( !parsingSuccessful ) rt300@8: { rt300@8: // report to the user the failure and their locations in the document. rt300@22: std::cout << "Failed to parse preset JSON: \n" rt300@8: << reader.getFormattedErrorMessages(); rt300@8: return; rt300@8: } rt300@8: rt300@8: // now put into variables rt300@8: const Json::Value jpresets = root["presets"]; rt300@8: rt300@8: for ( int index = 0; index < jpresets.size(); ++index ) thePresets.push_back(new Preset(jpresets[index])); rt300@8: rt300@8: //printAll(); rt300@8: rt300@8: } rt300@4: //--------------------------------------------------------------------------- rt300@4: void PresetManager::printAll(){ rt300@4: cout << "ALL PRESETS: \n"; rt300@4: vector::iterator presetIter; rt300@4: for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ rt300@5: cout << **presetIter; rt300@4: rt300@4: } rt300@0: } rt300@25: //--------------------------------------------------------------------------- rt300@9: void PresetManager::showNameDialog(){ rt300@29: if(!presetAlertViewController.alertShowing){ // this is to stop wierd infinite loop in ios5 (simulator) rt300@22: presetAlertShowing = true; rt300@22: [presetAlertViewController showPresetNamePrompt]; rt300@22: rt300@22: } rt300@22: rt300@9: } rt300@0: //--------------------------------------------------------------------------- rt300@8: // when save button pressed rt300@8: int PresetManager::addPreset(const string name){ rt300@3: rt300@22: presetAlertShowing = false; rt300@0: // check for same name rt300@0: vector::iterator iter; rt300@0: for(iter = thePresets.begin(); iter < thePresets.end(); iter++){ rt300@0: if ((*iter)->name == name){ rt300@0: cout << " Preset by that name exists\n"; rt300@0: rt300@0: // use exceptions! rt300@0: return -1; rt300@0: } rt300@0: } rt300@0: if(name == ""){ rt300@0: cout << "Please name preset\n"; rt300@0: return -2; rt300@0: rt300@0: } rt300@8: // yuk shouldn't have to know about eventlogger and grid view... rt300@8: thePresets.push_back(new Preset(theGridView.getCoord(), name,nextID, eventLogger.userName, eventLogger.deviceID)); rt300@0: rt300@9: // poke grid view to get it to show details rt300@9: theGridView.snapCheck(); rt300@0: // if ok rt300@0: return nextID++; rt300@0: } rt300@8: rt300@5: //--------------------------------------------------------------------------- rt300@4: rt300@4: int PresetManager::loadPreset(const TwoVector coord, const string name, long long stime){ rt300@8: thePresets.push_back(new Preset(coord, name,nextID, stime)); rt300@5: rt300@4: // if ok rt300@4: return nextID++; rt300@4: } rt300@4: //--------------------------------------------------------------------------- rt300@5: vector PresetManager::getPresetsInRange(const TwoVector min, const TwoVector max){ rt300@0: //return all the coordinates. oh and names (displayed at certain scales?). rt300@3: rt300@3: // TODO INEFFICIENT FOR LOTS OF PRESETS. CALLED EVERY GRAPHICS UPDATE! rt300@3: // so: put burden on saving rather than retrieving, make into list and index using coordinates rt300@3: rt300@5: vector results; rt300@3: vector::iterator presetIter; rt300@3: for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ rt300@3: if( ((*presetIter)->coordinates.x > min.x ) && ((*presetIter)->coordinates.y > min.y ) && ((*presetIter)->coordinates.x < max.x ) && ((*presetIter)->coordinates.y < max.y )){ rt300@5: results.push_back(*presetIter); rt300@3: } rt300@3: rt300@3: } rt300@3: return results; rt300@0: rt300@0: } rt300@5: rt300@5: rt300@5: //--------------------------------------------------------------------------- rt300@5: void PresetManager::drawPresetsInRange(const TwoVector min, const TwoVector max){ rt300@5: vector pInRange = getPresetsInRange(min, max); rt300@5: vector::iterator piter; rt300@5: int i = 0; rt300@5: for(piter = pInRange.begin(); piter < pInRange.end(); piter++){ rt300@5: rt300@5: (*piter)->draw(); rt300@5: i++; rt300@5: } rt300@5: rt300@5: } rt300@8: //----------------------------------------------cu----------------------------- rt300@3: void PresetManager::startupLoadAll(){ rt300@8: // get stuff from file rt300@3: // load file rt300@3: rt300@8: string fname = ofxiPhoneGetDocumentsDirectory() + PRESET_FILENAME; rt300@5: rt300@8: readJsonToPresets(fname); rt300@7: rt300@3: timesOpened++; rt300@3: } rt300@8: rt300@3: //--------------------------------------------------------------------------- rt300@3: void PresetManager::exitAndSaveAll(){ rt300@8: ofFile presetFile(ofxiPhoneGetDocumentsDirectory() +PRESET_FILENAME,ofFile::WriteOnly); rt300@4: rt300@8: // stick all the stuff in a json value rt300@8: Json::Value root = allPresetsToJson(); rt300@5: rt300@8: cout << root; rt300@8: presetFile << root; rt300@29: rt300@3: } rt300@5: rt300@5: //--------------------------------------------------------------------------- rt300@5: void PresetManager::clearAll(){ rt300@5: thePresets.clear(); rt300@5: } rt300@3: //--------------------------------------------------------------------------- rt300@0: //--------------------------------------------------------------------------- rt300@0: //--------------------------------------------------------------------------- rt300@0: //--------------------------------------------------------------------------- rt300@0: //---------------------------------------------------------------------------