/** * \brief 要素を無効にする。 * \param elements [in] 無効化する要素 */ protected void ToDisableElements(RecycleElement elements) { enableElements.Remove(elements.Index); elements.gameObject.SetActive(false); elements.transform.SetParent(recycleTransform); elements.transform.localPosition = Vector3.zero; elements.Enabled = false; elements.Recycle = true; disableElements.Add(elements); if (onDisableElements != null) { onDisableElements(elements); } }
/** * \brief 要素のトランスフォーム情報を更新します。 * \param index [in] 項目のインデックス * \param elements [in] トランスフォーム情報を更新する要素 * \param bEnabled [in] 既に有効な状態だった場合 true が渡されます。 */ protected override void OnUpdateElementTransform(int index, RecycleElement elements, bool bEnabled) { float x = GetColumnsPositionByIndex(index); float y = GetRowsPositionByIndex(index); var rectTransform = elements.transform as RectTransform; rectTransform.localPosition = new Vector3(x, y, 0.0f); rectTransform.sizeDelta = new Vector2(viewportSize.x, sizes[index]); if (bEnabled == false) { rectTransform.localScale = Vector3.one; elements.Relocation = true; } }
void OnEnableElements(RecycleElement elements, System.Action callback) { Log log; lock ( logs) { log = logs[elements.Index]; } if (elements.GetComponentInChildren <Text>() is Text component) { string text = log.text; if (text.Length > 14000) { text = text.Substring(0, 14000); text += "\n<message truncated>"; } logTextSettings.ApplyComponent(component, text, log.color); } callback(); }
/** * \brief 要素を有効にする。 * \param index [in] 有効化する項目のインデックス * \return 有効化した要素が返ります。 */ protected RecycleElement ToEnableElements(int index) { RecycleElement elements = null; if (index < itemCount) { if (enableElements.TryGetValue(index, out elements) != false) { if (bUpdateTransform != false) { OnUpdateElementTransform(index, elements, true); } } else { /* 未使用要素からリサイクル可能なモノを検索 */ foreach (RecycleElement e in disableElements) { if (e.Recycle != false) { elements = e; break; } } /* リサイクル可能な要素が見つかった場合は再使用する */ if (elements != null) { elements.transform.SetParent(transform); elements.gameObject.SetActive(true); disableElements.Remove(elements); } /* リサイクル可能な要素が見つからなかった場合は新規作成する */ else { var newObject = Instantiate(elementPrefab); elements = newObject.GetComponent <RecycleElement>(); elements.transform.SetParent(transform); if (elements.transform is RectTransform rc) { rc.pivot = new Vector2(0.0f, 1.0f); } } #if UNITY_EDITOR elements.name = index.ToString(); #endif elements.Index = index; elements.Recycle = false; OnUpdateElementTransform(index, elements, false); enableElements.Add(index, elements); if (onEnableElements == null) { elements.Enabled = true; } else { onEnableElements(elements, () => { elements.Enabled = true; }); } } } return(elements); }
/** * \brief 要素のトランスフォーム情報を更新します。 * \param index [in] 項目のインデックス * \param elements [in] トランスフォーム情報を更新する要素 * \param bEnabled [in] 既に有効な状態だった場合 true が渡されます。 */ protected abstract void OnUpdateElementTransform(int index, RecycleElement elements, bool bEnabled);