예제 #1
0
 public void ClearMultiSelection()
 {
     while (MultiSelection.Count > 0)
     {
         MultiSelection.First().IsMultiSelected = false;
     }
 }
예제 #2
0
 private void DrawSelection(MultiSelection selection, Color color)
 {
     foreach (var tile in selection.Tiles)
     {
         DrawSelection(CenterOfSelection(tile), selection.Face, color);
     }
 }
예제 #3
0
 private void DrawSelection(MultiSelection selection, Color faceColor, Color outlineColor)
 {
     foreach (var tile in selection.Tiles)
     {
         DrawSelection(CenterOfSelection(tile), selection.Face, faceColor, outlineColor);
     }
 }
예제 #4
0
    void OnUndoRedo()
    {
        var tar = target as Tile3D;

        selected = null;
        hover    = null;
        // After an undo the underlying block dictionary is out of sync with
        // the blocks list. Blocks have been removed, dictionary hasn't been
        // updated yet which causes artifacts during rebuild. So - update it.
        tar.RebuildBlockMap();
        tar.Rebuild();
    }
    public void Move(IInputElement element, NavigationDirection direction, KeyModifiers keyModifiers = KeyModifiers.None)
    {
        switch (direction)
        {
        case NavigationDirection.Next:
            MoveCursorNext();
            break;

        case NavigationDirection.Previous:
            MoveCursorPrevious();
            break;

        case NavigationDirection.First:
            SelectedRowIndex  = 0;
            SelectedCellIndex = 0;
            break;

        case NavigationDirection.Last:
            SelectedRowIndex  = Rows?.Count - 1 ?? -1;
            SelectedCellIndex = ColumnsCount - 1;
            break;

        case NavigationDirection.Left:
            MoveCursorLeft();
            break;

        case NavigationDirection.Right:
            MoveCursorNext();
            break;

        case NavigationDirection.Up:
            MoveCursorUp();
            break;

        case NavigationDirection.Down:
            MoveCursorDown();
            break;

        case NavigationDirection.PageUp:
            MoveCursorUp();
            break;

        case NavigationDirection.PageDown:
            MoveCursorDown();
            break;

        default:
            throw new ArgumentOutOfRangeException(nameof(direction), direction, null);
        }
        MultiSelection.Clear();
        MultiSelection.Add(SelectedRowIndex);
    }
예제 #6
0
    private Vector3 CenterOfSelection(MultiSelection selection)
    {
        var tile = Vector3.zero;

        foreach (var t in selection.Tiles)
        {
            tile += new Vector3(t.x + 0.5f, t.y + 0.5f, t.z + 0.5f);
        }
        tile /= selection.Tiles.Count;
        tile += origin;

        return(tile);
    }
예제 #7
0
        private Vector3 CenterOfSelection(MultiSelection selection)
        {
            var median = Vector3.zero;

            foreach (var t in selection.Tiles)
            {
                median += new Vector3(t.x + 0.5f, t.y + 0.5f, t.z + 0.5f);
            }
            median /= selection.Tiles.Count;
            median += origin;

            return(median);
        }
 static public MultiSelection SetNearest(this MultiSelection selection, bool nearest)
 {
     selection.Nearest = nearest;
     return(selection);
 }
예제 #9
0
    protected virtual void OnSceneGUI()
    {
        var e             = Event.current;
        var invokeRepaint = false;
        var draggingBlock = false;
        var interacting   = (!e.control && !e.alt && e.button == 0);

        // overlay gui
        Handles.BeginGUI();
        {
            // mode toolbar
            toolMode = (ToolModes)GUI.Toolbar(new Rect(10, 10, 200, 30), (int)toolMode, new[] { "Move", "Build", "Paint" });
            if (toolMode == ToolModes.Painting)
            {
                selected = null;
            }

            // tileset
            if (toolMode == ToolModes.Painting)
            {
                GUI.Window(0, new Rect(10, 70, 200, 400), PaintingWindow, "Tiles");
            }
        }
        Handles.EndGUI();

        // cancel everything if in "move" mode
        if (toolMode == ToolModes.Transform)
        {
            if (Tools.current == Tool.None)
            {
                Tools.current = Tool.Move;
            }
            return;
        }

        // override default control
        Tools.current = Tool.None;
        HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

        // Selecting & Dragging Blocks
        if (toolMode == ToolModes.Building)
        {
            // drag block in / out
            if (selected != null)
            {
                Handles.color = Color.blue;
                EditorGUI.BeginChangeCheck();

                var start  = CenterOfSelection(selected) + selected.Face * 0.5f;
                var pulled = Handles.Slider(start, selected.Face);

                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(target, "EditMesh");

                    draggingBlock = true;
                    if (hover != null)
                    {
                        hover         = null;
                        invokeRepaint = true;
                    }

                    // get distance and direction
                    var distance = (pulled - start).magnitude;
                    var outwards = (int)Mathf.Sign(Vector3.Dot(pulled - start, selected.Face));

                    // create or destroy a block (depending on direction)
                    if (distance > 1f)
                    {
                        var newTiles = new List <Vector3Int>();
                        foreach (var tile in selected.Tiles)
                        {
                            var was  = tile;
                            var next = tile + selected.Face.Int() * outwards;

                            if (outwards > 0)
                            {
                                tiler.Create(next, was);
                            }
                            else
                            {
                                tiler.Destroy(was);
                            }
                            tiler.Rebuild();

                            newTiles.Add(next);
                        }

                        selected.Tiles = newTiles;
                        tiler.Rebuild();
                    }
                }
            }

            // select tiles
            if (!draggingBlock && interacting)
            {
                if (e.type == EventType.MouseDown && !e.shift)
                {
                    if (hover == null)
                    {
                        selected = null;
                    }
                    else
                    {
                        selected = new MultiSelection(hover);
                    }
                    invokeRepaint = true;
                }
                else if (e.type == EventType.MouseDrag && selected != null && hover != null && !selected.Tiles.Contains(hover.Tile))
                {
                    selected.Tiles.Add(hover.Tile);
                    invokeRepaint = true;
                }
            }
        }

        // active hover
        if ((e.type == EventType.MouseMove || e.type == EventType.MouseDrag) && interacting && !draggingBlock)
        {
            var next = GetSelectionAt(e.mousePosition);
            if ((hover == null && next != null) || (hover != null && next == null) || (hover != null && next != null && (hover.Tile != next.Tile || hover.Face != next.Face)))
            {
                invokeRepaint = true;
            }
            hover = next;
        }

        // painting
        if (toolMode == ToolModes.Painting && (e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && interacting && hover != null)
        {
            var block = tiler.At(hover.Tile);
            if (block != null)
            {
                // paint single tile
                if (paintMode == PaintModes.Brush)
                {
                    if (SetBlockFace(block, hover.Face, brush))
                    {
                        tiler.Rebuild();
                    }
                }
                // paint bucket
                else if (paintMode == PaintModes.Fill)
                {
                    var face = GetBlockFace(block, hover.Face);
                    if (FillBlockFace(block, face))
                    {
                        tiler.Rebuild();
                    }
                }
            }
        }

        // right-click to rotate face
        if (toolMode == ToolModes.Painting && (e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && e.button == 1 && !e.control && !e.alt && hover != null)
        {
            brush.Rotation = (brush.Rotation + 1) % 4;

            var cell = tiler.At(hover.Tile);
            if (cell != null && SetBlockFace(cell, hover.Face, brush))
            {
                tiler.Rebuild();
            }
        }

        // Drawing
        {
            // draw hovers / selected outlines
            if (hover != null)
            {
                DrawSelection(hover, Color.magenta);
            }
            if (selected != null)
            {
                DrawSelection(selected, Color.blue);
            }

            // force repaint
            if (invokeRepaint)
            {
                Repaint();
            }
        }

        // always keep the tiler selected for now
        // later should detect if something is being grabbed or hovered
        Selection.activeGameObject = tiler.transform.gameObject;
    }
예제 #10
0
    //=========================================================================
    //
    //  MeshTool
    //
    //=========================================================================
    //-----------------------------------------------------
    // Building
    //-----------------------------------------------------
    void MeshToolBuild()
    {
        // 複数選択されている場合
        if (selected != null)
        {
            Handles.color = Color.blue;
            EditorGUI.BeginChangeCheck();

            var start  = CenterOfSelection(selected) + selected.Face * 0.5f;
            var pulled = Handles.Slider(start, selected.Face);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "EditMesh");

                draggingBlock = true;
                if (hover != null)
                {
                    hover         = null;
                    invokeRepaint = true;
                }

                // get distance and direction
                var distance = (pulled - start).magnitude;
                var outwards = (int)Mathf.Sign(Vector3.Dot(pulled - start, selected.Face));

                // create or destroy a block (depending on direction)
                if (distance > 1f)
                {
                    var newTiles = new List <Vector3Int>();
                    foreach (var tile in selected.Tiles)
                    {
                        var was  = tile;
                        var next = tile + selected.Face.Int() * outwards;

                        if (outwards > 0)
                        {
                            tiler.Create(next, was);
                        }
                        else
                        {
                            tiler.Destroy(was);
                        }
                        tiler.Rebuild();

                        newTiles.Add(next);
                    }

                    selected.Tiles = newTiles;
                    tiler.Rebuild();
                }
            }
        }
        // select tiles
        if (!draggingBlock && interacting)
        {
            if (e.type == EventType.MouseDown && !e.shift)
            {
                if (hover == null)
                {
                    selected = null;
                }
                else
                {
                    selected = new MultiSelection(hover);
                }
                invokeRepaint = true;
            }
            else if (e.type == EventType.MouseDrag && selected != null && hover != null && !selected.Tiles.Contains(hover.Tile))
            {
                selected.Tiles.Add(hover.Tile);
                invokeRepaint = true;
            }
        }

        ActiveHover();
    }
예제 #11
0
    protected virtual void OnSceneGUI()
    {
        // 選択状況の保存データ
        SelectInitialize();

        // overlay gui
        Handles.BeginGUI();
        {
            toolMode = (ToolMode)GUI.Toolbar(new Rect(10, 10, 200, 20), (int)toolMode, new[] { "Move", "Mesh", "Data" });

            // meshTool
            if (toolMode == ToolMode.Mesh)
            {
                meshTool = (MeshTool)GUI.Toolbar(new Rect(10, 35, 200, 20), (int)meshTool, new[] { "Build", "Paint" });
                if (meshTool == MeshTool.Painting)
                {
                    selected = null;
                }

                // tileset
                if (meshTool == MeshTool.Painting)
                {
                    GUI.Window(0, new Rect(10, 80, 200, 300), PaintingWindow, "Tiles");
                }
            }
            else
            if (toolMode == ToolMode.Stage)
            {
                stageTool = (StageTool)GUI.Toolbar(new Rect(10, 35, 200, 20), (int)stageTool, new[] { "Data", "Gimick", "Back" });

                // Data
                if (stageTool == StageTool.Data)
                {
                    GUI.Window(0, new Rect(10, 80, 200, 300), DataWindow, "Data");
                }

                // Gimick
                if (stageTool == StageTool.Gimick)
                {
                    GUI.Window(0, new Rect(10, 80, 200, 300), GimickWindow, "Gimick");
                }

                // Back
                if (stageTool == StageTool.BackPoint)
                {
                    GUI.Window(0, new Rect(10, 80, 200, 300), BackWindow, "BackPoint");
                }
            }
        }
        Handles.EndGUI();

        if (toolMode == ToolMode.Transform)
        {
            TransformMove();
            return;
        }

        DefaultControll();

        if (toolMode == ToolMode.Mesh)
        {   // Mesh作成
            switch (meshTool)
            {
            case MeshTool.Building: MeshToolBuild(); break;

            case MeshTool.Painting: MeshToolPaint(); break;
            }
        }
        else
        if (toolMode == ToolMode.Stage)
        {   // 情報の登録
            //ActiveHover();

            switch (stageTool)
            {
            case StageTool.Data: StageToolData(); break;

            case StageTool.Gimick: StageToolGimick(); break;

            case StageTool.BackPoint: StageToolBackPoint(); break;
            }
        }
        // 描画
        Drawing();

        // 塗りなおし
        if (invokeRepaint)
        {
            Repaint();
        }

        // always keep the tiler selected for now
        // later should detect if something is being grabbed or hovered
        Selection.activeGameObject = tiler.transform.gameObject;
    }
예제 #12
0
 public MultiSelectorProxy(MultiSelector element) : base(element)
 {
     multiSelection = new MultiSelection();
     multiSelection.AttachTo(element);
 }
예제 #13
0
 public void Clear()
 {
     RootLevelNodes.Clear();
     MultiSelection.Clear();
     Current = null;
 }
 public ViewModel()
 {
     Ints = new MultiSelection<int>();
     Strings = new MultiSelection<string>();
     Days = new MultiSelection<DayOfWeek>();
 }