public void ClearMultiSelection() { while (MultiSelection.Count > 0) { MultiSelection.First().IsMultiSelected = false; } }
private void DrawSelection(MultiSelection selection, Color color) { foreach (var tile in selection.Tiles) { DrawSelection(CenterOfSelection(tile), selection.Face, color); } }
private void DrawSelection(MultiSelection selection, Color faceColor, Color outlineColor) { foreach (var tile in selection.Tiles) { DrawSelection(CenterOfSelection(tile), selection.Face, faceColor, outlineColor); } }
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); }
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); }
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); }
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; }
//========================================================================= // // 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(); }
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; }
public MultiSelectorProxy(MultiSelector element) : base(element) { multiSelection = new MultiSelection(); multiSelection.AttachTo(element); }
public void Clear() { RootLevelNodes.Clear(); MultiSelection.Clear(); Current = null; }
public ViewModel() { Ints = new MultiSelection<int>(); Strings = new MultiSelection<string>(); Days = new MultiSelection<DayOfWeek>(); }