[C#] OnMouseOver sur une liste de bouton

Questions à propos du GUI, y compris la partie script.
Répondre
bakman23
Messages : 79
Inscription : 21 Déc 2012 15:48

[C#] OnMouseOver sur une liste de bouton

Message par bakman23 » 18 Juil 2013 10:28

Bonjour j'essaye de détecter correctement l'évènement OnMouseOver et OnMouseOut sur un menu.
Le but de la manoeuvre c'est d'ouvrir une box quand je positionne la souris sur le bouton et fermer la box quand la souris n'est plus sur le bouton.
Le code que ci-dessous fonctionne mais il ne marche que pour un bouton de la liste.

Code : Tout sélectionner

 GUILayout.BeginVertical();

        foreach (Item item in itemList)
        {
                           
                if (GUILayout.Button(item .name))
                {
           
                    // Do something
                }
           
            }

         if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
        {
            isPreviewing = true;
            // Open the box
        }
        else if ((Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition) == false))
        {
            isPreviewing = false;
            // Close the box
        }

        GUILayout.EndVertical();
    
Si quelqu'un connait une solution :D
Merci

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OnMouseOver sur une liste de bouton

Message par artemisart » 18 Juil 2013 10:39

Salut,

Il faut que tu mette les conditions dans la boucle, ex :

Code : Tout sélectionner

GUILayout.BeginVertical ();

foreach (Item item in itemList)
{
	if (GUILayout.Button (item.name))
		// do something
	if (Event.current.type == EventType.Repaint)
		isPreviewing = GUILayoutUtility.GetLastRect ().Contains (Event.current.mousePosition);
}

GUILayout.EndVertical ();

bakman23
Messages : 79
Inscription : 21 Déc 2012 15:48

Re: [C#] OnMouseOver sur une liste de bouton

Message par bakman23 » 18 Juil 2013 11:28

J'ai essayé deja mais cela me donne le même résultat :cry:

Il m'affiche la box seulement quand je suis sur le dernier élément de la liste


bakman23
Messages : 79
Inscription : 21 Déc 2012 15:48

Re: [C#] OnMouseOver sur une liste de bouton

Message par bakman23 » 18 Juil 2013 11:36

Dans le OnGUI() s'est la variable isPreviewing = true qui déclanche la condition pour afficher la box


bakman23
Messages : 79
Inscription : 21 Déc 2012 15:48

Re: [C#] OnMouseOver sur une liste de bouton

Message par bakman23 » 18 Juil 2013 11:45

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class ImportGUI : MonoBehaviour {


    private Vector2 scrollPosition = Vector2.zero;
    public bool isPreviewing = false;
    public Texture2D imagePreview;
    

	// Use this for initialization
	void Start () {
  
	}

	
	// Update is called once per frame
	void Update () {
	
	}

    void OnGUI()
    {

       
            GUI.Window(1, new Rect(Screen.width / 64, Screen.height / 32, Screen.width / 4, Screen.height / 2), SubMenu, "Items");
      
        if (isPreviewing)
        {
            GUI.Box(new Rect(Screen.width / 2 - (Screen.width / 4) / 2, Screen.height / 2 - (Screen.height / 4) / 2, Screen.width / 4, Screen.height / 4), imagePreview);
        }
      
    }

    

    private void SubMenu(int id)
    {

        GUILayout.BeginVertical();

        foreach (Item item Item.itemList)
        {
                GUI.SetNextControlName(product.name);
                if (GUILayout.Button(item.name))
                {
                   
                    isPreviewing = false;
                    // Do something    
                }

                if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
                {
                    isPreviewing = true;
                    imagePreview = Resources.Load("img/" + item.urlImg) as Texture2D;

                }
                else if ((Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition) == false))
                {
                    isPreviewing = false;

                }
     
            }

        }

  

        if (GUILayout.Button("Retour"))
        {
            isPreviewing = false;
        }

        GUILayout.EndVertical();
    
    }

}


Voilou

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OnMouseOver sur une liste de bouton

Message par artemisart » 18 Juil 2013 12:04

J'ai pas testé mais normalement ça devrais le faire :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ImportGUI : MonoBehaviour
{
	private Vector2 scrollPosition = Vector2.zero;
	public bool isPreviewing = false;
	public Texture2D imagePreview;

	void OnGUI()
	{
		GUI.Window(1, new Rect(Screen.width / 64, Screen.height / 32, Screen.width / 4, Screen.height / 2), SubMenu, "Items");

		if (isPreviewing)
			GUI.Box (new Rect (Screen.width / 2 - Screen.width / 8, Screen.height / 2 - Screen.height / 8, Screen.width / 4, Screen.height / 4), imagePreview);
	}

	private void SubMenu (int id)
	{
		GUILayout.BeginVertical();

		isPreviewing = false;
		foreach (Item item Item.itemList)
		{
			// product vient d'ou ?
			//GUI.SetNextControlName (product.name);
			
			if (GUILayout.Button(item.name))
			{
				// tout changement de isPreviewing ici sera annulé après, donc on enlève isPreviewing = false
				// si tu fais rien ici autant remplacer par GUILayout.Box
			}
			
			if (!isPreviewing &&
				Event.current.type == EventType.Repaint &&
				GUILayoutUtility.GetLastRect ().Contains (Event.current.mousePosition)
				)
			{
				isPreviewing = true;
				imagePreview = Resources.Load("img/" + item.urlImg) as Texture2D;
				// le ressources load est pas super beau :/ surtout en OnGUI
				// il faudrait mettre les textures dans les objets Item de préférence
			}
		}
		
		// a voir si c'est vraiment utile :
		if (GUILayout.Button ("Retour"))
			isPreviewing = false;
			
		GUILayout.EndVertical ();
	}
}

bakman23
Messages : 79
Inscription : 21 Déc 2012 15:48

Re: [C#] OnMouseOver sur une liste de bouton

Message par bakman23 » 18 Juil 2013 12:26

// product vient d'ou ?
//GUI.SetNextControlName (product.name);
Oublie de ma part s'est item.name.
// il faudrait mettre les textures dans les objets Item de préférence
d'accord avec toi surtout que j'avais vu un tuto de burgzerd qui fesait comme cela. tu ma rafraîchi la mémoire :D

J'ouvre la box preview au survol des bouton elle reste ouverte jusqu'à ce qu'on clique sur un bouton.
Même si ce n'est pas l'effet escompté je vais m'en contenter ;)
Merci pour ton aide artemisart

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OnMouseOver sur une liste de bouton

Message par artemisart » 18 Juil 2013 12:42

bakman23 a écrit :J'ouvre la box preview au survol des bouton elle reste ouverte jusqu'à ce qu'on clique sur un bouton.
Bizarre, pourtant elle devrait se refermer dès qu'on sort d'un bouton avec le isPreviewing = false avant le foreach.

Répondre

Revenir vers « L'interface GUI »