topical media & game development
lib-of-vs-apps-addonsExamples-xmlSettingsExample-src-testApp.cpp / cpp
include <testApp.h>
//--------------------------------------------------------------
void testApp::setup(){
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
//if it doesn't exist we can still make one
//by hitting the 's' key
if( XML.loadFile("mySettings.xml") ){
message = "mySettings.xml loaded!";
}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.loadFont("mono.ttf", 7);
}
//--------------------------------------------------------------
void testApp::update(){
//we change the background color here based on the values
//affected by the mouse position
ofBackground((int)red,(int)green,(int)blue);
}
//--------------------------------------------------------------
void testApp::draw(){
//---------
//Lets draw the stroke as a continous line
ofSetColor(0x222222);
ofNoFill();
ofBeginShape();
for(int i = 0; i < pointCount; i++){
ofVertex(dragPts[i].x, dragPts[i].y);
}
ofEndShape(false);
ofFill();
//--------
//we make a black area on the left
//which we can print the xml text on
ofEnableAlphaBlending();
ofSetColor(0, 0, 0, 200);
ofRect(0, 0, 160, ofGetHeight());
ofDisableAlphaBlending();
//our text that shows how the <STROKE> data looks in the xml file
ofSetColor(240, 240, 240);
string drawString = "How the data is stored:\n\n";
if(xmlStructure.size() > 0) drawString += xmlStructure+"</STROKE>";
TTF.drawString(drawString, 5, 40);
//the message bars at the top and bottom of the app
//ofSetColor(0xDDDDDD);
ofEnableAlphaBlending();
ofSetColor(0, 0, 0, 200);
ofRect(160, 0, ofGetWidth()-160, 20);
ofRect(160, ofGetHeight()-20, ofGetWidth()-160, 20);
//we draw our status message at the top
//ofSetColor(210, 90, 100);
ofSetColor(240, 240, 240);
TTF.drawString("Save settings to XML hit 's' key status: "+message, 170, 12);
//instructions at the bottom
TTF.drawString("mouse drag changes background color and records stroke", 168, ofGetHeight() - 9);
}
//--------------------------------------------------------------
void testApp::keyPressed (int key){
//no data gets saved unless you hit the s key
if(key == 's'){
XML.saveFile("mySettings.xml");
message ="settings saved to xml!";
}
}
//--------------------------------------------------------------
void testApp::keyReleased(int key){
}
//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){
}
//--------------------------------------------------------------
void testApp::mouseDragged(int x, int y, int button){
//-------
//we change the background color based on
//the two mouse coords coming in
float xpct = (float)x / ofGetWidth();
float ypct = (float)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", x, tagNum);
XML.setValue("PT:Y", 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(x)+"</X>\n <Y>"+ofToString(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(x, y);
pointCount++;
}
}
//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
//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 testApp::mouseReleased(int x, int y, int button){
//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);
}
//--------------------------------------------------------------
void testApp::windowResized(int w, int h){
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.