IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

[Ruby] Placement fenêtre popup


Sujet :

GTK+

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut [Ruby] Placement fenêtre popup
    Bonjour à tous!

    Je suis nouveau sur le forum. Je développe un petit lecteur audio en ruby/gtk pour débuter en programmation. Le lecteur fonctionne bien pour l'instant mais il me reste beaucoup de boulot.

    Je recherche de la documentation sur le fenêtre de type popup (Gtk::Window.new(Gtk::Window:OPUP)). En particulier, comment placer la fenêtre proche du bouton "cliqué" commandant son apparition et comment la faire disparaître lors d'un clic lointain.
    Le but ici est de pouvoir changer le volume du lecteur.

    Un petit bout de code qui illustre où j'en suis avec cette fonction.
    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
    #!/usr/bin/ruby
     
    require 'gtk2'
    Gtk.init
    Pdir='/home/instable/Desktop/rub'
     
    label=Gtk::Label.new("Essai\nEssai\nEssai");label.show
    wvol=Gtk::Window.new(Gtk::Window::POPUP)
    wvol.add(label)
    ivol=Gtk::Image.new(File.join(Pdir,'volume.xpm'))
    bvol=Gtk::Button.new
    bvol.image=ivol
    bvol.signal_connect('clicked'){wvol.show}
     
    window=Gtk::Window.new
    window.signal_connect("destroy"){Gtk.main_quit}
    window.add(bvol)
    window.show_all
     
    Gtk.main
    ZiK un lecteur audio et son blog.

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    J'ai fait quelque chose de similaire en C pour une popup qui s'ouvre prêt du curseur (pour un système d'auto-complétion).

    J'ai commencé par surcharger la méthode move de la fenêtre afin qu'elle ne sorte pas de l'écran :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #define MARGIN 15
     
    void gtk_completion_window_move (GtkCompletionWindow *this, gint x, gint y)
    {
      GdkScreen *screen = NULL;
      gint width = -1;
      gint height = -1;
      gint ch = -1;
      gint cw = -1;
     
      g_return_if_fail (this != NULL);
      g_return_if_fail (GTK_IS_COMPLETION_WINDOW (this));
     
      screen = gtk_widget_get_screen (GTK_WIDGET (this));
      width = gdk_screen_get_width (screen);
      height = gdk_screen_get_height (screen);
     
      gtk_window_get_size (GTK_WINDOW (this), &cw, &ch);
     
      if (x + cw > width)
      {
        x = width - cw - MARGIN;
      }
      else if (x < MARGIN)
      {
        x = MARGIN;
      }
      if (y + ch > height)
      {
        y = height - ch - MARGIN;
      }
      else if (y < MARGIN)
      {
        y = MARGIN;
      }
      gtk_window_move (GTK_WINDOW (this), x, y);
    }
    Et ensuite il ne te reste plus qu'à récupérer, soit les coordonnées du curseur, soit celles du bouton, lorsque l'utilisateur clique sur le bouton placer la fenêtre en conséquence

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci Gege.
    Je regarderai ta méthode pour surcharger la méthode move.

    Je cherchais comment avoir la position du bouton (pas trouvé ) et comment cacher le popup.
    Cependant j'ai trouvé plusieurs choses intéressantes en cherchant:
    • récupérer la position de la souris,
    • ajouter la gestion d'événements à des widgets.


    Du coup j'ai réussi à avoir le comportement que je souhaitais. Exemple:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/bin/env ruby
     
    require 'gtk2'
    Gtk.init
     
    #ascenseur qui permet d'ajuster le volume
    scale_vol=Gtk::VScale.new(0,100,1)
    scale_vol.value=75
    scale_vol.show
    #fenêtre pop-up
    wvol=Gtk::Window.new(Gtk::Window::POPUP)
    wvol.set_default_size(40,200)
    wvol.add(scale_vol)
     
    #Bouton "volume" qui contrôle l'apparition de 
    bvol=Gtk::Button.new
    bvol.label='Volume'
     
    box=Gtk::VBox.new(true)
    box.pack_start(bvol)
    box.pack_start(Gtk::Label.new('Fenêtre principale'))
    window=Gtk::Window.new
    window.signal_connect("destroy"){Gtk.main_quit}
    window.add(box)
    window.show_all
     
     
    bvol.signal_connect('clicked'){
    #Déplacer et afficher la fenêtre popup
    	position=window.position+window.pointer
    	wvol.move(position[0]+position[2]-20,position[1]+position[3])#postion de la fenêtre principale + position du bouton volume
    	wvol.show
    #Cacher la fenêtre popup lors d'un clic dans la fenêtre principal
    	mask=window.events#sauvegarde du masque événements de la fenêtre principale
    	window.add_events(Gdk::Event::BUTTON_PRESS_MASK)#Surveiller les clics dans la fenêtre principale
    	window.signal_connect("button_press_event"){
    		wvol.hide
    		window.events=mask#Restaurer le masque par défaut
    	}
    }
     
    Gtk.main
    Deux petites questions encore.
    1. Est-ce correct de restaurer le masque des événements comme je le fais ci-dessus?
    2. J'aimerai que l'ascenseur aille du bas (volume=0) vers le haut(volume=100), est-ce possible?
    ZiK un lecteur audio et son blog.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    Je cherchais comment avoir la position du bouton (pas trouvé )
    Il faut fouiller du côté de Gtk::Widget::allocation

    Citation Envoyé par vinc-mai Voir le message
    comment cacher le popup.
    Pour ça, je fait simplement un hide de la fenêtre lorsqu'elle perd le focus (événement focus-event-out).

    Citation Envoyé par vinc-mai Voir le message
    Est-ce correct de restaurer le masque des événements comme je le fais ci-dessus?
    Pas forcement utile

    Citation Envoyé par vinc-mai Voir le message
    J'aimerai que l'ascenseur aille du bas (volume=0) vers le haut(volume=100), est-ce possible?
    Je ne sais pas, essaye :
    Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    scale_vol=Gtk::VScale.new(100,0,1)
    Ou
    Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    scale_vol=Gtk::VScale.new(100,0,-1)

    A tester

    Je ne sais pas à quelle version est le binding python mais en C, on a GtkVolumeButton depuis GTK+ 2.12.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Il faut fouiller du côté de Gtk::Widget::allocation
    Tout simplement merci.

    Pour ça, je fait simplement un hide de la fenêtre lorsqu'elle perd le focus (événement focus-event-out).
    "focus-out-event" semble plus approprié. Cependant la fenêtre popup semble ignorer le signal. Il faut que je penche sur la question.

    scale_vol=Gtk::VScale.new(100,0,+/-1)
    Déjà essayé mais j'obtiens une erreur du au fait que 100 > 0.
    Citation Envoyé par vinc-mai
    Est-ce correct de restaurer le masque des événements comme je le fais ci-dessus?
    Pas forcement utile
    Je voulais juste éviter de récupérer les signaux lorsque j'en ai pas besoin.
    Je ne sais pas à quelle version est le binding python mais en C, on a GtkVolumeButton depuis GTK+ 2.12.
    Je dévellope en ruby pas en python
    Un Gtk::Volume::Button (ainsi que Gtk::Button::Volume) renvoie des erreurs. J'utilise libgtk2 en version 2.12. Le "binding" ne serait tarder je pense. En attendant je découvre le fonctionnement de Gtk
    ZiK un lecteur audio et son blog.

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    Tout simplement merci.
    Enfin simplement je ne sais pas, tu obtiens les coordonnées relatif au widget parent, il me semble.


    Citation Envoyé par vinc-mai Voir le message
    "focus-out-event" semble plus approprié. Cependant la fenêtre popup semble ignorer le signal. Il faut que je penche sur la question.
    Ouais dans le bon ordre, c'est bien

    La configuration de la fenêtre popup n'est pas triviale, il faut l'ajouter au groupe de fenêtre. Voici le code en C :
    Code C : 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
    static void gtk_completion_window_init (GtkCompletionWindow *this)
    {
      GtkCompletionWindowPrivate *priv = NULL;
     
      g_return_if_fail (this != NULL);
     
      gtk_window_set_keep_above (GTK_WINDOW (this), TRUE);
      gtk_window_set_decorated (GTK_WINDOW (this), FALSE);
      gtk_window_set_skip_taskbar_hint (GTK_WINDOW (this), TRUE);
      gtk_window_set_skip_pager_hint (GTK_WINDOW (this), TRUE);
      {
        GtkWindow *active = NULL;
        GtkWindowGroup *group = NULL;
     
        active = get_active_window ();
        group = gtk_window_get_group (active);
        gtk_window_group_add_window (group, GTK_WINDOW (this));
        gtk_window_set_transient_for (GTK_WINDOW (this), active);
      }
      gtk_window_set_resizable (GTK_WINDOW (this), FALSE);
      gtk_widget_set_size_request (GTK_WIDGET (this), 200, 300);
    }
    Si tu connais le C, tout le code est ici : http://subversion.developpez.com/pro...pletion/trunk/

    Citation Envoyé par vinc-mai Voir le message
    Je dévellope en ruby pas en python
    C'est pareil Désolé, c'est l'habitude

    Citation Envoyé par vinc-mai Voir le message
    Un Gtk::Volume::Button (ainsi que Gtk::Button::Volume) renvoie des erreurs. J'utilise libgtk2 en version 2.12. Le "binding" ne serait tarder je pense. En attendant je découvre le fonctionnement de Gtk
    Il semblerai qu'il en soit à GTK+ 2.10 mais pas complètement implémenté : Status of Ruby/GTK

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Enfin simplement je ne sais pas, tu obtiens les coordonnées relatif au widget parent, il me semble.
    Oui c'est celà mais ce n'est point un problème.

    J'ai essayé de crééer un groupe (Gtk::WindowGroup.new) et d'y ajouter mes 2 fenêtres (la principale et la popup) sans plus de succès au niveau de la récupération du signal. Il semblerait que la fenêtre popup n'obtienne jamais le focus (d'après mes essais).

    PS: le C, je connais pas trop même si j'ai eu 2h de cours dessus et 10h de tp. Le prof et moi, on ne se comprenait pas! Je trouvais c'est cours imbitable et lui ne comprenait pas la logique de mes programmes (Un bien grand mot). Tout çà pour dire que je ne suis pas informaticien!
    J'arrive tout de même à lire le bout de code que tu as posté.
    ZiK un lecteur audio et son blog.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Je pense avoir contourner le problème.
    J'arrive à connecter le signal "focus-out-event" sur une fenêtre de type "TOPLEVEL".
    Je modifie ensuite cette fenêtre pour quelle ressemble à une fenêtre popup (cf: le code C de Gege plus haut).

    Merci à bien pour l'aide Gege .
    ZiK un lecteur audio et son blog.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Petite précison, j'ai utilisé la méthode inverted= afin d'avoir le 0 de l'ascenceur (Gtk::Vscale) en bas.
    ZiK un lecteur audio et son blog.

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    Petite précison, j'ai utilisé la méthode inverted= afin d'avoir le 0 de l'ascenceur (Gtk::Vscale) en bas.
    Super, merci pour l'info

    Pour info, en ruby : Gtk::Range#inverted= et en C : gtk_range_set_inverted


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2006, 12h29
  2. [HTML] Fenêtre popup
    Par titoumimi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/01/2006, 17h04
  3. Erreur sur l'ouverture d'une fenêtre popup
    Par misa dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/11/2005, 16h21
  4. [Javascript] Problème avec une fenêtre popup.
    Par mika0102 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/05/2005, 11h50
  5. Fenêtre popup modale. Est-ce possible ?
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/02/2005, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo