ofxGuiPanel::ofxGuiPanel(const ofParameterGroup & parameters, const ofJson & config)
:ofxGuiPanel(parameters.getName()){

	addParametersFrom(parameters);
	_setConfig(config);

}
ofxGuiContainer::ofxGuiContainer(const ofParameterGroup & _parameters, const ofJson & config)
    :ofxGuiContainer(_parameters.getName()) {

    addParametersFrom(_parameters);
    _setConfig(config);

}
ofxGuiContainer::ofxGuiContainer(const ofParameterGroup & _parameters, const std::string& _filename, float x, float y)
    :ofxGuiContainer(_parameters.getName()) {

    filename = _filename;
    setPosition(x,y);
    addParametersFrom(_parameters);

}
ofxGuiPanel::ofxGuiPanel(const ofParameterGroup & parameters, const std::string& filename, float x, float y)
	:ofxGuiPanel(parameters.getName()){

	addParametersFrom(parameters);
//	config.filename = filename;
	// TODO set filename
	setPosition(x,y);

}
//infer uniform type from structure of ofParameterGroup g
//and set in shader from values in g.
//assumes shader->begin() has been called already
void ofxBaseShaderNode::setShaderParam(ofParameterGroup &g){
    size_t dim = g.size();

    //need to infer the uniform type from size of, and types in, this group
    //unfortunately g.getType(0) is weird and compiler dependent, so this.
    //weep for me, weep for c++
    string type = "";
    if(g.contains("0i"))
        type = "int";
    else if(g.contains("0f"))
        type = "float";

    string param_name = g.getName();

    // cout<<"node "<<name<<" setting "<<type<<" "<<dim<<" uniform "<<param_name<<endl;

    if(type=="float"){
        // cout<<g.getFloat("0f")<<endl;
        switch(dim){
            case 1:
                shader->setUniform1f(param_name, g.getFloat("0f"));
                break;
            case 2:
                shader->setUniform2f(param_name, g.getFloat("0f"), g.getFloat("1f"));
                break;
            case 3:
                shader->setUniform3f(param_name, g.getFloat("0f"), g.getFloat("1f"), g.getFloat("2f"));
                break;
            case 4:
                shader->setUniform4f(param_name, g.getFloat("0f"), g.getFloat("1f"), g.getFloat("2f"), g.getFloat("3f"));
        }
    }
    else if(type=="int"){
        switch(dim){
            case 1:
                shader->setUniform1i(param_name, g.getInt("0i"));
                break;
            case 2:
                shader->setUniform2i(param_name, g.getInt("0i"), g.getInt("1i"));
                break;
            case 3:
                shader->setUniform3i(param_name, g.getInt("0i"), g.getInt("1i"), g.getInt("2i"));
                break;
            case 4:
                shader->setUniform4i(param_name, g.getInt("0i"), g.getInt("1i"), g.getInt("2i"), g.getInt("3i"));
        }
    }
}
//--------------------------------------------------------------
void testApp::update()
{
	
	// get value directly
	
	string s;
	if (keyValue.get("/string_value", s))
	{
		cout << "/string_value: " << s << endl;
	}
	
	
	// get value as osc message
	
	ofxOscMessage m;
	if (keyValue.get("/test", m))
	{
		cout << "/test: " << m.getArgAsFloat(0) << endl;
	}
	
	
	// use Key-Value-Store style address

	keyValue.get("/myObject1.pos", myObject1.pos);
	keyValue.get("/myObject1.color", myObject1.color);


  for (int i = 0; i < params.size(); i++)
  {
    string name = "/"+params.getName(i);
    if ( keyValue.get( name, params.get(i) ) )
      cout << "update param " << name << " = " << params.get(i) << endl;
  }

	
	// FIFO queue access
	
	int value;
	while (keyValue.get("/uzi", value))
	{
		printf("%i\n", value);
	}

}