block::block(ofTag & cur,ofColor col):ofInterObj(-200,-200,150,TITLE_HEIGHT) { //********* This is the method by which all of the blocks are first generated from the xml files in the data root. //-------- TODO: get rid of the garbage with the color triples. blech. //-------- load the font for the arialHeader, at 10 pt. origTag=cur; arialHeader.loadFont(defaultFont); arialHeader.setMode(OF_FONT_MID); arialHeader.setSize(14); insertSpace=0; bGrabbed=false; //-------- color initialization if(cur.getAttribute("color").length()) color=ofColor(strtol(cur.getAttribute("color").c_str(),NULL,0)); else color=col; //-------- load name from the name of the xmlNode title=cur.getAttribute("name"); ttlSize.x=w; ttlSize.y=TITLE_HEIGHT; ddSelected=false; //cout << title << endl; //-------- init some variables, to prevent garbage from happening ddOpen=false; titlePos.x=10; type=BLK_DEFAULT; placeHolder=false; //-------- declare the map used for the switch map<string,int> list; list["seq"]=0; list["bracket"]=1; list["action"]=4; list["file"]=5; list["sibling"]=6; list["num"]=7; list["dropdown"]=8; list["blocksIn"]=9; list["blocksOn"]=10; for(int i=0;i<cur.size();i++){ string node[2]={cur[i].getLabel(),cur[i].getValue()}; //-- node[0] is the label, node[1] is the value if(list.find(node[0])!=list.end()){ switch (list.find(node[0])->second) { case 1: //-- bracket //-------- set type to bracket, and change size type=BLK_BRACKET; h=105; w=200; titlePos.x=30; break; case 5: // file //-- definitely not deprecated, used to store value of which file to write from filename=node[1]; break; case 6: // sibling //-- stores the name of the complement blocks sibling.push_back(node[1]); break; case 7: // num //-- set the statement block flag type=BLK_VAL; titlePos.x=0; ttlSize.x=w=90; ttlSize.y=h=20; break; case 8: // dropdown //-- add a new dropdown menu to the block ddGroup.push_back(dallasDrop(cur[i])); break; case 9: for (unsigned int j=0; j<cur[i].size(); j++) { if (cur[i][j].getLabel()=="block") { blocksIn.push_back(block(cur[i][j],color)); } } break; case 10: for (unsigned int j=0; j<cur[i].size(); j++) { if (cur[i][j].getLabel()=="block") { blocksOn.push_back(block(cur[i][j],color)); } } break; default: break; } } } parseTitle(); }
block::block(ofTag & cur,ofColor col, int _y):ofInterObj(300,100,150,45) { //********* This is the method by which all of the blocks are first generated from the xml files in the data root. //-------- TODO: get rid of the garbage with the color triples. blech. //-------- load the font for the arialHeader, at 10 pt. arialHeader.loadFont(defaultFont); arialHeader.setSize(14); //-------- color initialization if(cur.getAttribute("color").length()) color=ofColor(strtol(cur.getAttribute("color").c_str(),NULL,0)); else color=col; //-------- load name from the name of the xmlNode title=cur.getAttribute("name"); cout << title << endl; //-------- init some variables, to prevent garbage from happening cond=0; numBlock=ddOpen=deleteMe=false; titleDisp=10; y=_y; numHolder=false; placeHolder=false; bBase=false; bSeq=false; //-------- declare the vector for splitting the title string, and the map used for the switch vector<string> titleSplit; map<string,int> list; list["seq"]=0; list["cond"]=1; list["wid"]=2; list["hgt"]=3; list["ifblock"]=4; list["file"]=5; list["part"]=6; list["num"]=7; list["dropdown"]=8; list["blocksIn"]=9; for(int i=0;i<cur.size();i++){ string node[2]={cur[i].getLabel(),cur[i].getValue()}; //-- node[0] is the label, node[1] is the value switch (list.find(node[0])->second) { case 0: // indicates whether or not a block is a sequence of other blocks bSeq=true; break; case 1: //-- cond //-------- set cond=true, and change size cond=atoi(node[1].c_str()); h=105; w=200; titleDisp=30; break; case 2: //wid, deprecated, handled with routines below switch w=atoi(node[1].c_str()); break; case 3: // hgt, deprecated, same as above h=atoi(node[1].c_str()); break; case 4: //ifblock //-- sets the flag for being a numHolder //-- deprecated, i think, by %n in the title numHolder=true; break; case 5: // file //-- definitely not deprecated, used to store value of which file to write from filename=node[1]; break; case 6: // part //-- stores the name of the complement blocks part.push_back(node[1]); break; case 7: // num //-- set the statement block flag numBlock=true; titleDisp=0; h=20; w=90; break; case 8: // dropdown //-- add a new dropdown menu to the block ddGroup.push_back(ofDropDown(cur[i])); break; case 9: for (unsigned int j=0; j<cur[i].size(); j++) { if (cur[i][j].getLabel()=="block") { blocksIn.push_back(block(cur[i][j],color,0)); } } break; default: break; } } int ddNum=0; //-------- assign a default value to the xdis of each dd for (unsigned int i=0; i<ddGroup.size(); i++) { ddGroup[i].xdis=titleDisp; } //-------- change the font size if it is a statement block if(numBlock) arialHeader.setSize(7); //-------- split the title into words by looking for " ", and establish a baseline for the width with "." titleSplit = ofSplitString(title, " "); int sp=1; int spSize=arialHeader.stringWidth("."); int totalwidth=0; //-------- set the displacement for each object in the title, statement blocks and dropdowns for (unsigned int i=0; i<titleSplit.size(); i++) { if(!titleSplit[i].compare("%d")){ if(ddNum<ddGroup.size()){ //-------- augment the orginal positon with the current total width ddGroup[ddNum].xdis+=totalwidth+spSize; //-------- update total width totalwidth+=ddGroup[ddNum].w+spSize*2; //-------- if you have two dropdowns in a row, make sure they don't overlap if(i==titleSplit.size()-1||(i==titleSplit.size()-2&&!titleSplit[i+1].compare("%d"))){ ddGroup[ddNum].xdis+=spSize; } ddNum++; } } else if(!titleSplit[i].compare("%b")){ //-------- if we find a statement block, init it as a placeholder numHolder=true; int cur=numBlocks.size(); numBlocks.push_back(block()); numBlocks[cur].x=totalwidth+titleDisp; numBlocks[cur].xo=numBlocks[cur].x; numBlocks[cur].w=50; numBlocks[cur].h=20; if(h<=5+numBlocks[cur].h) h=5+numBlocks[cur].h; totalwidth+=50+spSize; } else { totalwidth+=arialHeader.stringWidth(titleSplit[i]); } } title=""; ddNum=0; for (unsigned int i=0; i<titleSplit.size(); i++) { if(!titleSplit[i].compare("%d")){ if(ddNum<ddGroup.size()){ sp=0; int origWid = arialHeader.stringWidth(title); while (arialHeader.stringWidth(title)+spSize*sp-origWid<ddGroup[ddNum].w) { sp++; title.append(" "); } ddNum++; } } else if(!titleSplit[i].compare("%b")){ sp=0; int origWid = arialHeader.stringWidth(title); while (arialHeader.stringWidth(title)+spSize*sp-origWid<50) { sp++; title.append(" "); } } else { title.append(titleSplit[i].c_str()); for (int k=0; k<sp; k++) { title.append(" "); } } } double newWid=totalwidth+20; if(!numBlock) w=max(w,newWid); else { w=newWid-10; } for(int i=0; i<ddGroup.size(); i++) ddGroup[i].changeSize(ddGroup[i].w, (ddGroup[i].arial.stringHeight("1")+4)); oH=h; }