private void SetHeaderColumns() { var valueNames = masterController.GetValueNames(); var columns = new MultiColumnHeaderState.Column[valueNames.Length]; for (var i = 0; i < valueNames.Length; i++) { var valueName = valueNames[i]; var valueType = masterController.GetValueType(valueName); var labelContent = new GUIContent(valueName, valueType.GetFormattedName()); var size = EditorStyles.label.CalcSize(labelContent); var column = new MultiColumnHeaderState.Column() { headerContent = labelContent, headerTextAlignment = TextAlignment.Center, canSort = false, autoResize = false, width = size.x + 50f, }; columns[i] = column; } var columnHeader = new ColumnHeader(new MultiColumnHeaderState(columns)); columnHeader.Initialize(); columnHeader.OnChangeVisibilityAsObservable() .Subscribe(_ => { RefreshCustomRowHeights(); }) .AddTo(lifetimeDisposable.Disposable); multiColumnHeader = columnHeader; Reload(); }
protected override void DrawContent(int index, object content) { var current = Event.current; var valueNames = masterController.GetValueNames(); var fieldAreaInfos = new List <Tuple <Rect, string> >(); using (new EditorGUILayout.HorizontalScope()) { for (var i = 0; i < valueNames.Length; i++) { var valueName = valueNames[i]; var value = masterController.GetValue(content, valueName); var valueType = masterController.GetValueType(valueName); Action <object> onUpdateValue = x => { masterController.UpdateValue(content, valueName, x); if (onChangeRecord != null) { onChangeRecord.OnNext(Unit.Default); } }; var color = masterController.IsChanged(content, valueName) ? Color.yellow : Color.white; var fieldWidth = masterController.FieldWidth[i]; using (new BackgroundColorScope(color)) { if (EditorRecordFieldUtility.IsArrayType(valueType)) { var builder = new StringBuilder(); foreach (var item in (IEnumerable)value) { builder.AppendFormat("{0},", item); } var text = builder.ToString().TrimEnd(','); GUILayout.Label(text, EditorStyles.textField, GUILayout.Width(fieldWidth)); var fieldRect = GUILayoutUtility.GetLastRect(); // メニュー表示と干渉するのでGUILayout.Buttonを使わない. if (fieldRect.Contains(current.mousePosition) && current.type == EventType.MouseDown && current.button == 0) { var mouseRect = new Rect(current.mousePosition, Vector2.one); var arrayFieldPopupWindow = new ArrayFieldPopupWindow(); arrayFieldPopupWindow.SetContents(valueType, value); arrayFieldPopupWindow.OnUpdateElementsAsObservable() .Subscribe(x => onUpdateValue(x)) .AddTo(lifetimeDisposable.Disposable); PopupWindow.Show(mouseRect, arrayFieldPopupWindow); current.Use(); } } else { EditorGUI.BeginChangeCheck(); value = EditorRecordFieldUtility.DrawRecordField(value, valueType, GUILayout.Width(fieldWidth)); if (EditorGUI.EndChangeCheck()) { onUpdateValue(value); } } fieldAreaInfos.Add(Tuple.Create(GUILayoutUtility.GetLastRect(), valueName)); } } } // 右クリックでメニュー表示. if (current.type == EventType.MouseDown && current.button == 1) { var fieldAreaInfo = fieldAreaInfos.FirstOrDefault(x => x.Item1.Contains(current.mousePosition)); if (fieldAreaInfo != null) { var valueName = fieldAreaInfo.Item2; if (masterController.IsChanged(content, valueName)) { var menu = new GenericMenu(); GenericMenu.MenuFunction onResetMenuClick = () => { masterController.ResetValue(content, valueName); }; menu.AddItem(new GUIContent("Reset"), false, onResetMenuClick); menu.ShowAsContext(); current.Use(); } } } }
void OnGUI() { if (masterController == null) { Close(); return; } // Toolbar. using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar, GUILayout.Height(15f))) { // 検索. Action <string> onChangeSearchText = x => { searchText = x; recordScrollView.Contents = GetDisplayRecords(); EditorApplication.delayCall += () => { Repaint(); }; }; Action onSearchCancel = () => { searchText = string.Empty; recordScrollView.Contents = GetDisplayRecords(); EditorApplication.delayCall += () => { Repaint(); }; }; EditorLayoutTools.DrawDelayedToolbarSearchTextField(searchText, onChangeSearchText, onSearchCancel, GUILayout.Width(250f)); } var scrollBaseRect = GUILayoutUtility.GetLastRect(); using (var scrollViewScope = new EditorGUILayout.ScrollViewScope(scrollPosition)) { // RecordView. var valueNames = masterController.GetValueNames(); GUILayout.Space(3f); using (new EditorGUILayout.HorizontalScope()) { GUILayout.Space(3f); controlRects.Clear(); for (var i = 0; i < valueNames.Length; i++) { var valueName = valueNames[i]; var fieldWidth = masterController.FieldWidth[i]; EditorGUILayout.LabelField(valueName, EditorStyles.miniButton, GUILayout.Width(fieldWidth), GUILayout.Height(15f)); GetResizeHorizontalRect(); } GUILayout.Space(3f); } GUILayout.Space(3f); using (new LabelWidthScope(0f)) { recordScrollView.Draw(); } scrollPosition = scrollViewScope.scrollPosition; } // Event Handling. var ev = Event.current; switch (ev.type) { case EventType.MouseUp: { focusedControl = -1; Event.current.Use(); Repaint(); } break; case EventType.MouseDown: { mousDownPosition = ev.mousePosition; var controlPosition = new Vector2() { x = scrollPosition.x + mousDownPosition.x, y = mousDownPosition.y - (scrollBaseRect.y + scrollBaseRect.height), }; focusedControl = GetControlNum(controlPosition); GUI.FocusControl(string.Empty); Event.current.Use(); Repaint(); } break; case EventType.MouseDrag: { if (focusedControl == -1) { break; } var diff = (int)(ev.mousePosition.x - mousDownPosition.x); mousDownPosition = ev.mousePosition; masterController.FieldWidth[focusedControl] = Mathf.Max(50f, masterController.FieldWidth[focusedControl] + diff); Repaint(); } break; } }
private object[] GetSearchedRecords(string searchText) { const char SearchValueSeparator = ':'; if (string.IsNullOrEmpty(searchText)) { return(null); } var list = new List <object>(); var searchTextKeywords = searchText; var searchValueName = string.Empty; if (searchText.Contains(SearchValueSeparator)) { var texts = searchText.Split(new char[] { SearchValueSeparator }, StringSplitOptions.RemoveEmptyEntries); searchValueName = texts.Select(x => x.Trim()).FirstOrDefault(); } if (!string.IsNullOrEmpty(searchValueName)) { searchValueName = searchValueName.ToLower(); var searchValueNameIndex = searchText.IndexOf(SearchValueSeparator); searchTextKeywords = searchText.SafeSubstring(searchValueNameIndex + 1); } var keywords = searchTextKeywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < keywords.Length; ++i) { keywords[i] = keywords[i].Trim().ToLower(); } var records = masterController.Records; var valueNames = masterController.GetValueNames(); foreach (var record in records) { foreach (var valueName in valueNames) { if (!string.IsNullOrEmpty(searchValueName)) { if (searchValueName != valueName.ToLower()) { continue; } } var value = masterController.GetValue(record, valueName); if (value != null) { var valueStr = value.ToString().ToLower(); // or 検索なのでIsMatchを使わない. if (keywords.Any(x => valueStr.Contains(x))) { list.Add(record); break; } } } } return(list.ToArray()); }