Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2013-05-24 18:52:52 ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

ofxUI : récupérer l'ID d'un bouton dans un canvas précis



hello,

J'ai concu une interface avec ofxUI. A gauche j'ai une interface générale. A droite une palette de canvas. Un pour chaque projecteur géré.

Le problème c'est que les boutons ont les même noms. Par exemple, si j'ai 4 projecteurs, j'ai 4 canvas avec dedans chaque fois un bouton "POWER ON".

Du coup j'aimerais quand je clique sur le bouton ON du projecteur 2 allumer le projecteur 2 et passer le bouton du projecteur 2 en TRUE. Mais comment préciser que je travaille sur le bouton du canvas 2 ? Car les boutons ont le même nom.

ci joint une image pour que ça vous parle plus :

http://codelab.fr/up/Capture-d-ecran-2013-05-24-a-18.33.32.png

Hors ligne

 

#2 2013-05-24 19:51:20 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

_thierry_
membre
Date d'inscription: 2011-03-08
Messages: 34

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Salut,

a priori si tu as plusieurs canvas, tu les déclares avec avec chaque fois un nom différent. Un truc dans le genre :

dans un .h


    ofxUICanvas *gui1;      
    ofxUICanvas *gui2;     

puis

gui1 = new ofxUICanvas(0,0,gui1Width, gui1Height);     

puis

gui2 = new ofxUICanvas(0,0,gui2Width, gui2Height);

Donc pour atteindre les bonnes widgets il te suffit de

Hors ligne

 

#3 2013-05-24 20:12:04 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

_thierry_
membre
Date d'inscription: 2011-03-08
Messages: 34

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Je viens de loser avec la touche tab!

Je viens aussi d'essayer de mettre deux noms identiques pour des widgets appartenant à des canvas différent et malheureusement cela pose effectivement problème.

Je ne sais pas vraiment comment résoudre ça à part effectivement changer le nom des widgets. Tu pourrais mettre ProjecteurX BlocY, mais j'imagine que tu y as déjà pensé.

Ce qu'il faudrait c'est avoir un champ d'affichage différent du tag de la widget.

C'est peut être possible mais à l'instant je n'ai pas la réponse...

Désolé !

Hors ligne

 

#4 2013-05-24 22:48:33 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Bonjour,

Je n'ai jamais utilisé ofxUI, mais en regardant le tutoriel, je pense qu'il faudrait pour chaque ofxUICanvas créer une nouvelle méthode de gestion des event :

ofAddListener(gui1->newGUIEvent, this, &testApp::gui1Event);

ofAddListener(gui2->newGUIEvent, this, &testApp::gui2Event);

Comme la reconnaissance se fait par comparaison des chaînes de caractères …

Dernière modification par Mushussu (2013-05-25 01:10:41)

Hors ligne

 

#5 2013-05-25 01:10:14 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Après avoir essayer cela semble fonctionner si j'ai bien compris ton souhait :

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){
	gui1 = new ofxUICanvas(0,0,320,320);
	gui1->addWidgetDown(new ofxUILabel("PROJECTEUR 1", OFX_UI_FONT_LARGE));
	gui1->addWidgetDown(new ofxUIToggle(32, 32, false, "POWER ON"));
	ofAddListener(gui1->newGUIEvent, this, &testApp::gui1Event);
	
	gui2 = new ofxUICanvas(340,0,320,320);
	gui2->addWidgetDown(new ofxUILabel("PROJECTEUR 2", OFX_UI_FONT_LARGE));
	gui2->addWidgetDown(new ofxUIToggle(32, 32, false, "POWER ON"));
	ofAddListener(gui2->newGUIEvent, this, &testApp::gui2Event);

}

void testApp::exit() {
    delete gui1;
    delete gui2;
}

void testApp::gui1Event(ofxUIEventArgs &e) {
	if(e.widget->getName() == "POWER ON") {
        ofxUIToggle *toggle = (ofxUIToggle *) e.widget;
        cout << "GUI 1 : " << toggle->getValue() << "\n";
    }
}

void testApp::gui2Event(ofxUIEventArgs &e) {
	if(e.widget->getName() == "POWER ON") {
        ofxUIToggle *toggle = (ofxUIToggle *) e.widget;
        cout << "GUI 2 : " << toggle->getValue() << "\n";
    }
}

Hors ligne

 

#6 2013-05-25 02:36:22 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

lilive
membre
Lieu: Toulouse
Date d'inscription: 2011-06-24
Messages: 52
Site web

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Bonjour,

_thierry_ a écrit:

Ce qu'il faudrait c'est avoir un champ d'affichage différent du tag de la widget.

On dirait bien qu'on peut oui:

void ofxUILabelToggle::setLabelText(string labeltext){

Hors ligne

 

#7 2013-05-25 10:30:15 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Bonjour à tous et merci pour toutes ces pistes !

@Mushussu : bien vu ton astuce, ça peut effectivement fonctionner. Le problème c'est que j'ai une gestion dynamique des projecteurs, je ne peut donc pas prévoir une fonction event pour chaque projecteur à l'avance. Mais c'est une bonne piste.

dans l'idéal il faudrait pouvoir effectivement dissocier l'ID du widget (son nom) de son label. Certains widgets le permettent il me semble, comme les labelButton ou LabelToggle. Mais pour les autres, les noms sont aussi les identifiants des widgets ce qui est compliqué.

Pour ma part je ne crée pas de gui1, gui2 etc... j'ai un vecteur de gui.
Je fais donc

        ofxUICanvas *gui = new ofxUICanvas(300,0,length-xInit,150);		// command interface

puis

	gui->addLabel("Lamp status : " + proj->getLampStatus(), OFX_UI_FONT_SMALL);
	gui->addWidgetDown(new ofxUILabel("Error status : " + proj->getErrorStatus(), OFX_UI_FONT_SMALL));
	gui->autoSizeToFitWidgets();

	commandGUI.push_back(gui);

en petit aparté, ça peut vous mettre sur une piste, si vous regardez l'image jointe dans mon premier post, il y a en colonne de gauche un bouton "SELECT ALL" et "SELECT NONE" qui permettent une sélection/désélection de tous les projecteurs. J'y arrive en passant en revue tous les projecteurs. Mais pour en sélectionner un seul c'est plus compliqué :

void testApp::guiEvent(ofxUIEventArgs &e)
{
	if(e.widget->getName() == "SELECT ALL")
	{	
		int i = 0;
		vector<ofxUICanvas *>::iterator it;
		for(it = commandGUI.begin(); it != commandGUI.end(); it++)
		{			
			ofxUILabelButton *btn = (ofxUILabelButton *)(*it)->getWidget((projectors[i]->getProjectorName()));
			btn->setValue(true);
			projectors[i]->setSelectedValue(true);
			i++;
		}
		
	}
	else if(e.widget->getName() == "SELECT NONE")
	{	
		int i = 0;
		vector<ofxUICanvas *>::iterator it;
		for(it = commandGUI.begin(); it != commandGUI.end(); it++)
		{			
			ofxUILabelButton *btn = (ofxUILabelButton *)(*it)->getWidget((projectors[i]->getProjectorName()));
			btn->setValue(false);
			projectors[i]->setSelectedValue(false);
			i++;
		}
	}
}

Dernière modification par Marty (2013-05-25 10:44:39)

Hors ligne

 

#8 2013-05-25 12:50:46 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

_thierry_
membre
Date d'inscription: 2011-03-08
Messages: 34

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Cool Mushussu !

Hors ligne

 

#9 2013-05-25 13:47:23 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

_thierry_
membre
Date d'inscription: 2011-03-08
Messages: 34

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Marty a écrit:

Pour ma part je ne crée pas de gui1, gui2 etc... j'ai un vecteur de gui.

Une solution est peut être de donner un tag à tes ofxUILabelButton et Toggle qui contienne le numéro de gui auxquels ils appartiennent ( style "allumeProj1", "allumeProj2", ...).

Pour ça il faut que tu concatènes les chaines de caractère "allumeProj" et la chaine de caractère qui correspond au numero de la gui ( y'a sprintf pour ça, genre char* chaine; chaine = sprintf("%d",numero); ou numero est un int) et tu fais un setName de cette chaine.

Ensuite, pour traiter les évènements tu fais une boucle qui teste tous les "allumeProjX" en concaténant de la même manière une chaine de caractères.

Good luck !

Hors ligne

 

#10 2013-05-25 14:08:30 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

lilive
membre
Lieu: Toulouse
Date d'inscription: 2011-06-24
Messages: 52
Site web

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Dans ofxUICanvas.h, à la fin de la méthode addWidget(ofxUIWidget *widget) on lit:

widget->setParent(this);

Et il y a une méthode ofxUIWidget *getParent()

Donc un truc à tester pourrait être:

Hors ligne

 

#11 2013-05-25 16:01:33 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



@_thierry_ : oui j'y ai pensé, mais le problème reste le même : le nom du widget reste l'identifiant qui sert à l'appeler et il faudrai alors utiliser un nom différent par bouton.

@lilive : hummmm... moui... ya peut être un truc à creuser de ce côté la...

Hors ligne

 

#12 2013-05-25 16:11:27 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

lilive
membre
Lieu: Toulouse
Date d'inscription: 2011-06-24
Messages: 52
Site web

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Marty a écrit:

@lilive : hummmm... moui... ya peut être un truc à creuser de ce côté la...

Je te laisse faire, je n'ai pas voulu me créer un projet avec plusieur canvas pour tester, mais à priori, si ça marche, ça me semble convenir exactement à ton problème, non ?

Dernière modification par lilive (2013-05-25 16:11:44)

Hors ligne

 

#13 2013-05-25 16:44:29 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Oui je vais tester ça tout à l'heure, ça fait un peu bidouille mais j'espère que ça pourra être concluant.

Ce qui me fait dire que c'est de la bidouille, c'est qu'on soit obligé de parcourir toute la liste de projecteurs pour avoir notre info...

parallèlement je réfléchis à un autre moyen : je me demande si il ne serait pas possible d'avoir une variable de plus par projecteur, genre int projectorID; et de dire "si on est sur projectorID, envoi la commande POWER ON à l'adresse IP du projectorID" mais je sèche aussi de ce côté la. pas sur que ce soit une bonne piste... wink

Dernière modification par Marty (2013-05-25 16:50:25)

Hors ligne

 

#14 2013-05-25 17:13:52 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

lilive
membre
Lieu: Toulouse
Date d'inscription: 2011-06-24
Messages: 52
Site web

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



Tu pourrais modifier ta classe des projecteur pour qu'ils s'occupent de leur GUI.
Voici un exemple possible, non testé, qui ne reprend pas exactement ton organisation, c'est juste pour donner une idée:

// Projector.h
class Projector {
	public:
		void createGUI();
		void guiEvent(ofxUIEventArgs &e);
		void powerOn();
		void powerOff();
	protected:
		void power(bool pow);
		ofxUICanvas * gui;
}


// Projector.cpp
void Projector::createGUI(){
	gui = new ofxUICanvas();
	gui->addLabelToggle("PWR ON");
	ofAddListener(gui->newGUIEvent, this, &Projector::guiEvent); 
}

void Projector::guiEvent(ofxUIEventArgs &e){
	string name = e.widget->getName();
	if (name == "PWR ON) {
		ofxLabelToggle * btn = (ofxLabelToggle *) e.widget;
		power( btn->getValue() );
	}
}

void Projector::powerOn(){
	( (ofxLabelToggle *) gui->getWidget("PWR ON") )->setValue(true);
	power(true);
}

void Projector::powerOff(){
	( (ofxLabelToggle *) gui->getWidget("PWR ON") )->setValue(false);
	power(false);
}

void Projector::power(bool pow){
	// Eteindre ou allumer le projecteur selon la valeur de pow
}


// testApp.cpp
void testApp::guiEvent(ofxUIEventArgs &e){
	
	if(e.widget->getName() == "POWER ON ALL")
	{	
		for (int i = 0; i < projectors.size(); ++i){
			projectors[i]->powerOn();
		}
		
	}
	else if(e.widget->getName() == "POWER OFF ALL")
	{	
		for (int i = 0; i < projectors.size(); ++i){
			projectors[i]->powerOff();
		}
		
	}
}

Dernière modification par lilive (2013-05-26 09:47:34)

Hors ligne

 

#15 2013-05-25 17:38:43 Re : ofxUI : récupérer l'ID d'un bouton dans un canvas précis

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: ofxUI : récupérer l'ID d'un bouton dans un canvas précis



oui j'y avais pensé, mais pas en rapport avec le problème actuel. ça me semblait une solution parfaite à un moment donné et totalement logique puisqu'on ne crée pas de projecteur sans son GUI, ça ne sert à rien. J'avais donc inclus le GUI dans le projecteur. mais j'ai abandonné je ne sais plus trop pourquoi... de mémoire cela posait d'autres problèmes ou il y avait des choses qui m'échappaient et dont je n'avais pas de solution envisageable. Mais maintenant que tu repointe la chose cela pourrait être aussi une solution. Ca simplifierait effectivement les traitements...

au passage, plutôt que de vous laisser dans le flou, autant publier le code ! je le joint donc à ce post. (xcode sous macos 10.6.8)

merci encore pour toutes ces pistes qui vont bien finir par aboutir !

Dernière modification par Marty (2013-05-25 21:32:44)

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024