Страница 1 из 1

Переход между полями с помощью стрелок в EditorWindow

СообщениеДобавлено: 10 сен 2018, 16:25
AABB
По умолчанию можно переходить в соседнее поле с помощью Tab, а мне хотелось иметь возможность прыгать на строчку вверх или вниз, нажимая стрелки вверх/вниз на клавиатуре.

Попробовал сделать с помощью SetNextControlName и FocusTextInControl. Если есть варианты получше, дайте знать пжл.

А вот что у меня вышло. Это рабочий скрипт, можно повесить на ГО чтобы потестить. Эффект получился странный. Перемещение на др. строку работает, но при этом выделяет содержимое через раз. Почему?

Синтаксис:
Используется csharp
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class TestFocusNavigationEditor : EditorWindow
{
    enum Arrow { None, Up, Down }
    Arrow arrow;
    TestFocusNavigation main;

    void OnGUI()
    {
        if(!main)
            main = FindObjectOfType<TestFocusNavigation>();

        Event e = Event.current;

        for (int i = 0; i < main.testString.Length; i++)
        {
            GUILayout.BeginHorizontal();
            GUI.SetNextControlName(i + "_str");
            main.testString[i] = EditorGUILayout.TextField(main.testString[i], GUILayout.Width(100));
            GUI.SetNextControlName(i + "_int");
            main.testInt[i] = EditorGUILayout.IntField(main.testInt[i], GUILayout.Width(40));
            GUILayout.EndHorizontal();

            if(e.type == EventType.KeyUp && arrow == Arrow.None)
            {
                if (e.keyCode == KeyCode.DownArrow)
                    arrow = Arrow.Down;
                else if (e.keyCode == KeyCode.UpArrow)
                    arrow = Arrow.Up;
            }
        }

        if (arrow != Arrow.None)
        {
            string n = GUI.GetNameOfFocusedControl();
            int dividerId = n.IndexOf("_");
            int curLine = System.Convert.ToInt32(n.Substring(0, dividerId));

            if (arrow == Arrow.Down)
                curLine = (curLine + 1) % main.testString.Length;
            else if (arrow == Arrow.Up)
                curLine = (curLine - 1 + main.testString.Length) % main.testString.Length;

            EditorGUI.FocusTextInControl(curLine + n.Substring(dividerId));
            arrow = Arrow.None;
            Repaint();
        }
    }
}

[CustomEditor(typeof(TestFocusNavigation))]
public class TestFocusNavigationButton : Editor
{
    public override void OnInspectorGUI()
    {
        if (GUILayout.Button("Open editor"))
        {
            EditorWindow.GetWindow(typeof(TestFocusNavigationEditor), false, "Test Editor");
        }
    }
}

public class TestFocusNavigation : MonoBehaviour
{
    public string[] testString = new string[20];
    public int[] testInt = new int[20];
}
#endif

Re: Переход между полями с помощью стрелок в EditorWindow

СообщениеДобавлено: 10 сен 2018, 17:25
lawson
убрать перебор кнопок из цикла.

Re: Переход между полями с помощью стрелок в EditorWindow

СообщениеДобавлено: 10 сен 2018, 17:43
AABB
Это ничего не меняет.

Re: Переход между полями с помощью стрелок в EditorWindow

СообщениеДобавлено: 10 сен 2018, 18:26
AABB
В какой то момент написания скрипта нахождение внутри цикла давало более близкий к цели результат, поэтому частично так и осталось. Но на данном этапе это не играет роли.