예제 #1
0
        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();
        }
예제 #2
0
        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();
                    }
                }
            }
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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());
        }