Bonjour a tous!

Je suis entrain de développer une librairie d'interface graphique opengl opensource (https://github.com/3dsman/snice_ui) qui avance bien mais je viens de tomber sur un problème que je n'avais pas anticipé dans mon architecture...

En gros quand je rée un bouton par exemple je peut créer une fonction de callback pour exécuter différentes actions (ici je me contente d'afficher le bouton enfoncé):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
// fonction de callback du bouton
void test(W_button* caller)
{
    caller->SetPressed(true);
    std::cout<<"le bouton a été appuyé";
};
 
int main(int argc, char *argv[])
{
    // creation de la fenetre avec un viewport par default
    pSnice_UI = new Snice_UI(800,600,50);
 
    // recuperaion du viewport
    pViewport = pSnice_UI->GetViewport();
 
    // creation d'un bouton
    pValid = new W_button(200,100, 120,20, "COOL");
 
    // attache du bouton au viewport
    pViewport->AddChild(pValid);
 
    //signalisation de la fonction de callback
    pValid->OnClick(test);
 
    [...]
}
Dans la classe W_button j'ai (en version tres tres epurée ):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
class W_button : public UI_widget
{
protected
  void (*onClick)(W_button* caller) = NULL;
 
public:
void W_button::OnClick(void (*function)(W_button* caller))
{
    onClick = function;
}
 
UI_base* W_button::OnLButtonUp(int x, int y)
{
        if (Hittest(x,y))
        {
            if(onClick) onClick(this);
        }
    return 0;
}
}
Tout ca marche tres bien dans le ca ou je crée tous les boutons a la main mais j'aimerais bieen maintenant avoir des dialog boxes (un widget de texte et deux boutons par exemple).
Le probleme c'est que mes fonctions de callback ne pointent pas sur des fonctions de classe.
Je ne peut donc pas par exemple avoir une classe D_toto qui aurait une fonction test pour recuperer le callback du bouton...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
void D_toto::D_toto()
{
    // creation d'un bouton
    pValid = new W_button(200,100, 120,20, "COOL");
 
    // attache du bouton a ma dialogbox
    AddChild(pValid);
 
    //signalisation de la fonction de callback
    pValid->OnClick(this->test);
}
 
void D_toto::test(W_button* caller)
{
    caller->SetPressed(true);
    std::cout<<"le bouton a été appuyé";
};
Je vois bien que j'ai fait une erreur d'architecture mais je ne vois pas de solution pour contourner le problème...
Comment ca se fait ce genre de trucs en général?

Merci d'avance de vos réponses.