ofDocsexamples ios xmlSettingsExample src ofApp.mm
#include "ofApp.h"


//--------------------------------------------------------------
void ofApp::setup(){
	ofSetOrientation(OF_ORIENTATION_90_RIGHT);//Set iOS to Orientation Landscape Right

	ofBackground(255,255,255);

	//-----------
	//the string is printed at the top of the app
	//to give the user some feedback
	message = "loading mySettings.xml";

	//we load our settings file
	//initially we do this from the data/ folder
	//but when we save we are saving to the documents folder which is the only place we have write access to
	//thats why we check if the file exists in the documents folder. 
	
	if( XML.loadFile(ofxiOSGetDocumentsDirectory() + "mySettings.xml") ){
		message = "mySettings.xml loaded from documents folder!";
	}else if( XML.loadFile("mySettings.xml") ){
		message = "mySettings.xml loaded from data folder!";
	}else{
		message = "unable to load mySettings.xml check data/ folder";
	}
	
	//read the colors from XML
	//if the settings file doesn't exist we assigns default values (170, 190, 240)
	red		= XML.getValue("BACKGROUND:COLOR:RED", 170);
	green	= XML.getValue("BACKGROUND:COLOR:GREEN", 190);
	blue	= XML.getValue("BACKGROUND:COLOR:BLUE", 240);

	/*
		"BACKGROUND:COLOR:RED" referes to a structure like this:

		<BACKGROUND>
			<COLOR>
				<RED>101.103516</RED>
			</COLOR>
		</BACKGROUND>
	*/

	//we initalize some of our variables
	lastTagNumber	= 0;
	pointCount		= 0;
	lineCount		= 0;


	//-------
	//this is a more advanced use of ofXMLSettings
	//we are going to be reading multiple tags with the same name

	//lets see how many <STROKE> </STROKE> tags there are in the xml file
	int numDragTags = XML.getNumTags("STROKE:PT");

	//if there is at least one <STROKE> tag we can read the list of points
	//and then try and draw it as a line on the screen
	if(numDragTags > 0){

		//we push into the last STROKE tag
		//this temporarirly treats the tag as
		//the document root.
		XML.pushTag("STROKE", numDragTags-1);

			//we see how many points we have stored in <PT> tags
			int numPtTags = XML.getNumTags("PT");

			if(numPtTags > 0){

				//We then read those x y values into our
				//array - so that we can then draw the points as
				//a line on the screen

				//we have only allocated a certan amount of space for our array
				//so we don't want to read more than that amount of points
				int totalToRead = MIN(numPtTags, NUM_PTS);

				for(int i = 0; i < totalToRead; i++){
					//the last argument of getValue can be used to specify
					//which tag out of multiple tags you are refering to.
					int x = XML.getValue("PT:X", 0, i);
					int y = XML.getValue("PT:Y", 0, i);
					dragPts[i].set(x, y);
					pointCount++;
				}
			}

		//this pops us out of the STROKE tag
		//sets the root back to the xml document
		XML.popTag();
	}

	//load a monospaced font
	//which we will use to show part of the xml structure
	TTF.load("mono.ttf", 7);
}

//--------------------------------------------------------------
void ofApp::update(){
	//we change the background color here based on the values
	//affected by the mouse position
	ofBackground((int)red,(int)green,(int)blue);

}

//--------------------------------------------------------------
void ofApp::draw(){

	string drawString = "How the data is stored:\n\n";
	if(xmlStructure.size() > 0){
		ofEnableAlphaBlending();
		ofSetColor(255-red, 255-green, 255-blue, 180);	
		drawString += xmlStructure+"</STROKE>";
		TTF.drawString(drawString, 5, 60);
	}
	
	//---------
	//Lets draw the stroke as a continous line
	ofSetHexColor(0x222222);
	ofNoFill();
	ofBeginShape();
	for(int i = 0; i < pointCount; i++){
		ofVertex(dragPts[i].x, dragPts[i].y);
	}
	ofEndShape(false);

    ofFill();

	//the message bars at the top and bottom of the app
	//ofSetHexColor(0xDDDDDD);
	ofEnableAlphaBlending();
	ofSetColor(0, 0, 0, 200);

	ofDrawRectangle(0, 0, ofGetWidth(), 36);
	ofDrawRectangle(0, ofGetHeight()-20, ofGetWidth(), 20);

	//we draw our status message at the top
	//ofSetColor(210, 90, 100);
	ofSetColor(240, 240, 240);
	TTF.drawString("Settings are automatically saved to app documents folder\nmouse drag changes background color and records stroke", 10, 15);

	//instructions at the bottom
	TTF.drawString("Status: "+message, 10, ofGetHeight() - 9);
}

//--------------------------------------------------------------
void ofApp::exit(){
    
}

//--------------------------------------------------------------
void ofApp::touchDown(ofTouchEventArgs & touch){

	if( touch.id == 0 ){
		//we can also add tags with the same name.
		//here we are just adding an empty tag
		//and when the user drags their mouse
		//we will store the pts in this tag
		lastTagNumber	= XML.addTag("STROKE");
		xmlStructure	= "<STROKE>\n";

		//We start a new stroke
		lineCount		= 0;
		pointCount		= 0;
	}

}

//--------------------------------------------------------------
void ofApp::touchMoved(ofTouchEventArgs & touch){

	if( touch.id == 0 ){

		//-------
		//we change the background color based on
		//the two mouse coords coming in
		float xpct = (float)touch.x / ofGetWidth();
		float ypct = (float)touch.y / ofGetHeight();
		red			= xpct * 255.0;
		green		= ypct * 255.0;
		blue		= (int)(red - green) % 255;


		//-------------
		//we also want to record the stroke

		//lets store the drag of the user.
		//we will push into the most recent
		//<STROKE> tag - add the mouse points
		//then pop out
		if( XML.pushTag("STROKE", lastTagNumber) ){

			//now we will add a pt tag - with two
			//children - X and Y

			int tagNum = XML.addTag("PT");
			XML.setValue("PT:X", touch.x, tagNum);
			XML.setValue("PT:Y", touch.y, tagNum);

			XML.popTag();
		}

		//-------------
		//here we make a string of text that looks like how the xml data
		//is stored in the settings file - this is just so people can
		//visually see how the data is stored.

		//if the text is about to go off screen
		if(lineCount > 64){
			//we find the first <PT> tag with the
			//x and y data and we remove it from the begining
			//this way the displayed text always shows the newest data
			//without going offscreen.
			int pos = xmlStructure.find("</PT>");
			xmlStructure = xmlStructure.substr(pos+6);
		}

		//here we add the most recent point to our fake xml string
		xmlStructure += "    <PT>\n        <X>"+ofToString(touch.x)+"</X>\n        <Y>"+ofToString(touch.y)+"</Y>\n    </PT>\n";
		lineCount+=4; //we have added 4 lines so increment by 4

		//------------
		//we also record the x y points into an array - so we can draw it
		if(pointCount < NUM_PTS -1){
			dragPts[pointCount].set(touch.x, touch.y);
			pointCount++;
		}
	
	}

}

//--------------------------------------------------------------
void ofApp::touchUp(ofTouchEventArgs & touch){
	//update the colors to the XML structure when the mouse is released
	XML.setValue("BACKGROUND:COLOR:RED", red);
	XML.setValue("BACKGROUND:COLOR:GREEN", green);
	XML.setValue("BACKGROUND:COLOR:BLUE", blue);

	XML.saveFile( ofxiOSGetDocumentsDirectory() + "mySettings.xml" );
	message = "mySettings.xml saved to app documents folder";
}

//--------------------------------------------------------------
void ofApp::touchDoubleTap(ofTouchEventArgs & touch){

}

//--------------------------------------------------------------
void ofApp::touchCancelled(ofTouchEventArgs & touch){

}

//--------------------------------------------------------------
void ofApp::lostFocus(){
    
}

//--------------------------------------------------------------
void ofApp::gotFocus(){
    
}

//--------------------------------------------------------------
void ofApp::gotMemoryWarning(){
    
}

//--------------------------------------------------------------
void ofApp::deviceOrientationChanged(int newOrientation){
    
}