void PopulateFrom(IEnumerable <InputAction> actionEnumerator, int categoryDisplayMask)
    {
        int index = 0;

        foreach (var inputAction in actionEnumerator)
        {
            if (inputAction.properties.hiddenInLists && !disablePropertyRestrictions)
            {
                continue;
            }

            // Not displaying these actions at the moment.
            if (((1 << inputAction.properties.category) & categoryDisplayMask) == 0)
            {
                continue;
            }

            if (index >= rowPool.Count)
            {
                ExtendActionRowPool(20);
            }

            ActionUIRow row = rowPool[index++];
            row.SetupFromAction(inputAction, actionEnumerator, lastKnownDisplayDevice, InvokeRebindState, disablePropertyRestrictions);
            row.SetActive(true);
        }

        for (int i = index; i < rowPool.Count; ++i)
        {
            ActionUIRow row = rowPool[i];
            row.SetActive(false);
        }

        UpdateRowLayout();
    }
    void ExtendActionRowPool(int extendBy)
    {
        Transform parent = transform;

        for (int i = 0; i < extendBy; ++i)
        {
            bool isActive = false;

            ActionUIRow row = new ActionUIRow();

            row.actionNameText = GameObject.Instantiate(actionNamePrefab, parent);

            for (int j = 0; j < row.actionInputButtons.Length; ++j)
            {
                row.actionInputButtons[j] = GameObject.Instantiate(actionInputPrefab, parent);
            }

            row.SetActive(isActive);

            rowPool.Add(row);
        }
    }
    void UpdateRowLayout()
    {
        float   columnStartPosition = leftSizePadding - rectTransform.sizeDelta.x / 2;
        Vector2 position            = new Vector2(columnStartPosition, 0);

        for (int i = 0; i < rowPool.Count; ++i)
        {
            ActionUIRow row = rowPool[i];
            if (!row.isActive)
            {
                continue;
            }

            RectTransform textTransform = row.actionNameText.GetComponent <RectTransform>();

            position.x += textTransform.sizeDelta.x / 2;
            textTransform.localPosition = position;

            position.x += textTransform.sizeDelta.x + xPaddingAfterName;

            foreach (var button in row.actionInputButtons)
            {
                RectTransform buttonTransform = button.GetComponent <RectTransform>();
                buttonTransform.localPosition = position;

                position.x += buttonTransform.sizeDelta.x + xPaddingBetweenInputButtons;
            }

            position.x  = columnStartPosition;
            position.y -= rowHeight;
        }

        if (content)
        {
            content.sizeDelta = new Vector2(content.sizeDelta.x, -position.y);
        }
    }