示例#1
0
	public void OnSceneGUI()
	{
		// Always draw the outline
		DrawOutline();
		
		if (Application.isPlaying || !tileMap.AllowEdit)
			return;
		
		if (editorData.editMode == tk2dTileMapEditorData.EditMode.Settings)
		{
			return;
		}
		
		if (editorData.editMode != tk2dTileMapEditorData.EditMode.Paint && 
			editorData.editMode != tk2dTileMapEditorData.EditMode.Color)
			return;

		if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color &&
			!tileMap.HasColorChannel())
			return;

		if (Event.current.type == EventType.MouseMove || Event.current.type == EventType.MouseDrag)
			tooltipPos = Event.current.mousePosition;

		UpdateScratchpadTileSizes();

		// Scratchpad tilesort
		scratchpadGUI.SetTileSort(tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.TopLeft,
			tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomRight);

		// Spritedef vars
		if (tileMap != null) {
			var spriteDef = tileMap.SpriteCollectionInst.FirstValidDefinition;
			if (spriteDef != null) {
				curSpriteDefTexelSize = spriteDef.texelSize;
			}
		}

		// Working brush / tile or paint cursor (behind scratchpad)
		switch (editorData.editMode)
		{
		case tk2dTileMapEditorData.EditMode.Paint:
			if (!scratchpadGUI.workingHere) {
				if (Event.current.type == EventType.Repaint) {
					Matrix4x4 matrix = tileMap.transform.localToWorldMatrix;
					// Brush mesh is offset so origin is at bottom left. Do the reverse here...
					// Also add layer depth
					float layerDepth = GetLayerDepth(editorData.layer);
					matrix *= Matrix4x4.TRS (tileMapData.tileOrigin + new Vector3(0, 0, layerDepth), Quaternion.identity, Vector3.one);
					BrushRenderer.DrawBrushInScene(matrix, WorkingBrush, 1000000);
				}
				DrawTileCursor();
			}
			break;
		case tk2dTileMapEditorData.EditMode.Color:
			DrawPaintCursor();
			break;
		}

		// Toolbar and scratchpad
		if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint) {
			Handles.BeginGUI();
			GUILayout.BeginArea(new Rect(0, 0, Screen.width, Screen.height));

			Event ev = Event.current;
			bool mouseOverToolbar = false;
			bool mouseOverScratchpad = false;

			GUILayout.BeginVertical(tk2dEditorSkin.GetStyle("TilemapToolbarBG"), GUILayout.Width(20), GUILayout.Height(34));
			tk2dTileMapToolbar.ToolbarWindow();
			GUILayout.EndVertical();
			mouseOverToolbar = GUILayoutUtility.GetLastRect().Contains(ev.mousePosition);

			if (tk2dTileMapToolbar.scratchpadOpen) {
				GUILayout.BeginVertical(tk2dEditorSkin.GetStyle("TilemapToolbarBG"), GUILayout.Width(20), GUILayout.Height(Screen.height - 74));
				scratchpadGUI.DrawGUI();
				GUILayout.EndVertical();
				mouseOverScratchpad = GUILayoutUtility.GetLastRect().Contains(ev.mousePosition);
			}

			if (ev.type == EventType.MouseMove) {
				scratchpadGUI.workingHere = mouseOverToolbar || mouseOverScratchpad;
				if (scratchpadGUI.workingHere) ev.Use();
			}

			GUILayout.EndArea();
			Handles.EndGUI();
		} else {
			scratchpadGUI.workingHere = false;
		}

		// Draw Tooltip
		string curTooltip = "";
		if (tk2dTileMapToolbar.tooltip.Length > 0) curTooltip = tk2dTileMapToolbar.tooltip;
		if (scratchpadGUI.tooltip.Length > 0) curTooltip = scratchpadGUI.tooltip;
		if (curTooltip.Length > 0 && scratchpadGUI.workingHere) {
			Handles.BeginGUI();
			GUI.contentColor = Color.white;
			GUIContent tooltipContent = new GUIContent(curTooltip);
			Vector2 size = GUI.skin.GetStyle("label").CalcSize(tooltipContent);
			GUI.Label(new Rect(tooltipPos.x, tooltipPos.y + 20, size.x + 10, size.y + 5), curTooltip, "textarea");
			Handles.EndGUI();
		}

		if (tk2dTileMapToolbar.scratchpadOpen && !lastScratchpadOpen) {
			scratchpadGUI.FocusOnSearchFilter(openedScratchpadWithTab);
		}
		if (!tk2dTileMapToolbar.scratchpadOpen && lastScratchpadOpen) {
			openedScratchpadWithTab = false;
		}
		lastScratchpadOpen = tk2dTileMapToolbar.scratchpadOpen;

		int controlID = tileMapHashCode;

		if (tk2dTileMapToolbar.scratchpadOpen && scratchpadGUI.workingHere) {
			if (scratchpadGUI.doMouseDown) {
				GUIUtility.hotControl = controlID;
				Undo.RegisterUndo(editorData, "Edit scratchpad");
				randomSeed = Random.Range(0, int.MaxValue);

				cursorX0 = cursorX;
				cursorY0 = cursorY;

				PencilDrag();
				RectangleDragBegin();
			}
			if (scratchpadGUI.doMouseDrag) {
				UpdateCursorPosition();
				UpdateWorkingBrush();

				PencilDrag();
			}
			if (scratchpadGUI.doMouseUp) {
				RectangleDragEnd();

				cursorX0 = cursorX;
				cursorY0 = cursorY;
				UpdateWorkingBrush();

				GUIUtility.hotControl = 0;
			}
			if (scratchpadGUI.doMouseMove) {
				UpdateCursorPosition();
				cursorX0 = cursorX;
				cursorY0 = cursorY;
				UpdateWorkingBrush();
			}
		}
		else
		{
			EventType controlEventType = Event.current.GetTypeForControl(controlID);
			switch (controlEventType)
			{
			case EventType.MouseDown:
			case EventType.MouseDrag:
				if ((controlEventType == EventType.MouseDrag && GUIUtility.hotControl != controlID) ||
					(Event.current.button != 0 && Event.current.button != 1))
				{
					return;
				}

				// make sure we don't use up reserved combinations
				bool inhibitMouseDown = false;
				if (Application.platform == RuntimePlatform.OSXEditor) {
					if (Event.current.command && Event.current.alt) { // pan combination on mac
						inhibitMouseDown = true;
					}
				}
				
				if (Event.current.type == EventType.MouseDown && !inhibitMouseDown)
				{
					CheckVisible(editorData.layer);
					
					if (IsCursorInside() && !Event.current.shift)
					{
						if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
						{
							GUIUtility.hotControl = controlID;
							Undo.RegisterUndo(tileMap, "Edit tile map");
							randomSeed = Random.Range(0, int.MaxValue);

							PencilDrag();
							RectangleDragBegin();
						}
						if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color) {
							GUIUtility.hotControl = controlID;
							Undo.RegisterUndo(tileMap, "Paint tile map");
							if (tk2dTileMapToolbar.colorBlendMode != tk2dTileMapToolbar.ColorBlendMode.Eyedropper) {
								PaintColorBrush((float)vertexCursorX, (float)vertexCursorY);
								host.BuildIncremental();
							}
						}
					}
				}
			
				if (Event.current.type == EventType.MouseDrag && GUIUtility.hotControl == controlID)
				{
					UpdateCursorPosition();
					UpdateWorkingBrush();
					if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint) {
						PencilDrag();
					}
					if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color) {
						if (tk2dTileMapToolbar.colorBlendMode != tk2dTileMapToolbar.ColorBlendMode.Eyedropper) {
							PaintColorBrush((float)vertexCursorX, (float)vertexCursorY);
							host.BuildIncremental();
						}
					}
				}
				
				break;
				
			case EventType.MouseUp:
				if ((Event.current.button == 0 || Event.current.button == 1) && GUIUtility.hotControl == controlID)
				{
					GUIUtility.hotControl = 0;

					if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint) {
						RectangleDragEnd();
					}
					if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color) {
						if (tk2dTileMapToolbar.colorBlendMode == tk2dTileMapToolbar.ColorBlendMode.Eyedropper) {
							PickUpColor();
						}
					}

					cursorX0 = cursorX;
					cursorY0 = cursorY;
					UpdateWorkingBrush();
					
					HandleUtility.Repaint();
				}
				break;
				
			case EventType.Layout:
				//HandleUtility.AddDefaultControl(controlID);
				break;
				
			case EventType.MouseMove:
				UpdateCursorPosition();
				cursorX0 = cursorX;
				cursorY0 = cursorY;
				UpdateWorkingBrush();
				break;
			}
		}

		// Set cursor color based on toolbar main mode
		bool updateCursorColor = false;
		if (currentModeForBrushColor != (int)tk2dTileMapToolbar.mainMode) {
			currentModeForBrushColor = (int)tk2dTileMapToolbar.mainMode;
			updateCursorColor = true;
		}
		if (tk2dPreferencesEditor.CheckTilemapCursorColorUpdate()) {
			updateCursorColor = true;
		}
		if (updateCursorColor) {
			switch (tk2dTileMapToolbar.mainMode) {
			case tk2dTileMapToolbar.MainMode.Brush:
				tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_brush;
				break;
			case tk2dTileMapToolbar.MainMode.BrushRandom:
				tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_brushRandom;
				break;
			case tk2dTileMapToolbar.MainMode.Erase:
				tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_erase;
				break;
			case tk2dTileMapToolbar.MainMode.Eyedropper:
				tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_eyedropper;
				break;
			case tk2dTileMapToolbar.MainMode.Cut:
				tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_cut;
				break;
			}
			tileSelectionOutlineColor = (tileSelectionFillColor + Color.white) * new Color(0.5f, 0.5f, 0.5f, 1.0f);
		}

		// Hotkeys switch the static toolbar mode
		{
			bool pickupKeyDown = (Application.platform == RuntimePlatform.OSXEditor)?Event.current.control:Event.current.alt;
			if (Event.current.button == 1) pickupKeyDown = true;
			bool eraseKeyDown = false;
			if (Application.platform == RuntimePlatform.OSXEditor)
			{
				if (Event.current.command && !Event.current.alt)
					eraseKeyDown = true;
			}
			else eraseKeyDown = Event.current.control;
			bool hotkeysPressed = pickupKeyDown || eraseKeyDown;

			if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint) {

				if (!pencilDragActive) {
					if (hotkeysPressed) {
						if (!hotkeyModeSwitchActive) {
							// Push mode
							pushedToolbarMainMode = tk2dTileMapToolbar.mainMode;
						}
						if (pickupKeyDown) {
							if (eraseKeyDown) {
								pendingModeChange = delegate(int i) {
									tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Cut;
									hotkeyModeSwitchActive = true;
								};
							}
							else {
								pendingModeChange = delegate(int i) {
									tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Eyedropper;
									hotkeyModeSwitchActive = true;
								};
							}
						}
						else if (eraseKeyDown) {
							pendingModeChange = delegate(int i) {
								tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Erase;
								hotkeyModeSwitchActive = true;
							};
						}
					} else {
						if (hotkeyModeSwitchActive) {
							// Pop mode
							pendingModeChange = delegate(int i) {
								tk2dTileMapToolbar.mainMode = pushedToolbarMainMode;
								hotkeyModeSwitchActive = false;
							};
						}
					}
				}

			}
			if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color) {
				if (hotkeysPressed) {
					if (!hotkeyModeSwitchActive) {
						// Push mode
						pushedToolbarColorBlendMode = tk2dTileMapToolbar.colorBlendMode;

						if (pickupKeyDown) {
							tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Eyedropper;
							hotkeyModeSwitchActive = true;
						} else if (eraseKeyDown) {
							switch (tk2dTileMapToolbar.colorBlendMode) {
								case tk2dTileMapToolbar.ColorBlendMode.Addition:
									tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Subtraction;
									break;
								case tk2dTileMapToolbar.ColorBlendMode.Subtraction:
									tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Addition;
									break;
							}
							hotkeyModeSwitchActive = true;
						}
					}
				} else {
					if (hotkeyModeSwitchActive) {
						tk2dTileMapToolbar.colorBlendMode = pushedToolbarColorBlendMode;
						hotkeyModeSwitchActive = false;
					}
				}
			}
		}
		// Hotkeys toggle flipping, scratchpad, paint
		{
			Event ev = Event.current;
			if (ev.type == EventType.KeyDown) {
				if (ev.keyCode == KeyCode.Tab) {
					if (!tk2dTileMapToolbar.scratchpadOpen) {
						pendingModeChange = delegate(int i) {
							tk2dTileMapToolbar.scratchpadOpen = !tk2dTileMapToolbar.scratchpadOpen;
							if (tk2dTileMapToolbar.scratchpadOpen)
								openedScratchpadWithTab = true;
						};
					}
				}
				switch (ev.character) {
				case 'h':
					ev.Use();
					tk2dTileMapToolbar.workBrushFlipX = !tk2dTileMapToolbar.workBrushFlipX;
					UpdateWorkingBrush();
					break;
				case 'j':
					ev.Use();
					tk2dTileMapToolbar.workBrushFlipY = !tk2dTileMapToolbar.workBrushFlipY;
					UpdateWorkingBrush();
					break;
				case '[':
					ev.Use();
					tk2dTileMapToolbar.colorBrushRadius -= 0.5f;
					if (tk2dTileMapToolbar.colorBrushRadius < 1.0f) tk2dTileMapToolbar.colorBrushRadius = 1.0f;
					break;
				case ']':
					ev.Use();
					tk2dTileMapToolbar.colorBrushRadius += 0.5f;
					break;
				case '-': case '_':
					ev.Use();
					tk2dTileMapToolbar.colorBrushIntensity -= 0.01f;
					break;
				case '=': case '+':
					ev.Use();
					tk2dTileMapToolbar.colorBrushIntensity += 0.01f;
					break;
				}
			}
			if (scratchpadGUI.requestClose) {
				scratchpadGUI.requestClose = false;
				pendingModeChange = delegate(int i) {
					tk2dTileMapToolbar.scratchpadOpen = false;
				};
			}
		}
		// Hotkey (enter) selects scratchpad tiles
		if (scratchpadGUI.requestSelectAllTiles) {
			// fake mouse coords
			scratchpadGUI.GetTilesCropRect(out cursorX, out cursorY, out cursorX0, out cursorY0);
			PickUpBrush(editorData.activeBrush, false);
			tk2dTileMapToolbar.workBrushFlipX = false;
			tk2dTileMapToolbar.workBrushFlipY = false;

			scratchpadGUI.requestSelectAllTiles = false;
		}

		if (pendingModeChange != null && Event.current.type == EventType.Repaint) {
			pendingModeChange(0);
			pendingModeChange = null;
			UpdateWorkingBrush();
			HandleUtility.Repaint();
		}
	}
示例#2
0
    public void OnSceneGUI()
    {
        // Always draw the outline
        DrawOutline();

        if (Application.isPlaying || !tileMap.AllowEdit)
        {
            return;
        }

        if (editorData.editMode == tk2dTileMapEditorData.EditMode.Settings)
        {
            return;
        }

        if (editorData.editMode != tk2dTileMapEditorData.EditMode.Paint &&
            editorData.editMode != tk2dTileMapEditorData.EditMode.Color)
        {
            return;
        }

        if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color &&
            !tileMap.HasColorChannel())
        {
            return;
        }

        if (Event.current.type == EventType.MouseMove || Event.current.type == EventType.MouseDrag)
        {
            tooltipPos = Event.current.mousePosition;
        }

        UpdateScratchpadTileSizes();

        // Scratchpad tilesort
        scratchpadGUI.SetTileSort(tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.TopLeft,
                                  tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomRight);

        // Spritedef vars
        if (tileMap != null)
        {
            var spriteDef = tileMap.SpriteCollectionInst.FirstValidDefinition;
            if (spriteDef != null)
            {
                curSpriteDefTexelSize = spriteDef.texelSize;
            }
        }

        // Working brush / tile or paint cursor (behind scratchpad)
        switch (editorData.editMode)
        {
        case tk2dTileMapEditorData.EditMode.Paint:
            if (!scratchpadGUI.workingHere)
            {
                if (Event.current.type == EventType.Repaint)
                {
                    Matrix4x4 matrix = tileMap.transform.localToWorldMatrix;
                    // Brush mesh is offset so origin is at bottom left. Do the reverse here...
                    // Also add layer depth
                    float layerDepth = GetLayerDepth(editorData.layer);
                    matrix *= Matrix4x4.TRS(tileMapData.tileOrigin + new Vector3(0, 0, layerDepth), Quaternion.identity, Vector3.one);
                    BrushRenderer.DrawBrushInScene(matrix, WorkingBrush, 1000000);
                }
                DrawTileCursor();
            }
            break;

        case tk2dTileMapEditorData.EditMode.Color:
            DrawPaintCursor();
            break;
        }

        // Toolbar and scratchpad
        if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
        {
            Handles.BeginGUI();
            GUILayout.BeginArea(new Rect(0, 0, Screen.width, Screen.height));

            Event ev = Event.current;
            bool  mouseOverToolbar    = false;
            bool  mouseOverScratchpad = false;

            GUILayout.BeginVertical(tk2dEditorSkin.GetStyle("TilemapToolbarBG"), GUILayout.Width(20), GUILayout.Height(34));
            tk2dTileMapToolbar.ToolbarWindow();
            GUILayout.EndVertical();
            mouseOverToolbar = GUILayoutUtility.GetLastRect().Contains(ev.mousePosition);

            if (tk2dTileMapToolbar.scratchpadOpen)
            {
                GUILayout.BeginVertical(tk2dEditorSkin.GetStyle("TilemapToolbarBG"), GUILayout.Width(20), GUILayout.Height(Screen.height - 74));
                scratchpadGUI.DrawGUI();
                GUILayout.EndVertical();
                mouseOverScratchpad = GUILayoutUtility.GetLastRect().Contains(ev.mousePosition);
            }

            if (ev.type == EventType.MouseMove)
            {
                scratchpadGUI.workingHere = mouseOverToolbar || mouseOverScratchpad;
                if (scratchpadGUI.workingHere)
                {
                    ev.Use();
                }
            }

            GUILayout.EndArea();
            Handles.EndGUI();
        }
        else
        {
            scratchpadGUI.workingHere = false;
        }

        // Draw Tooltip
        string curTooltip = "";

        if (tk2dTileMapToolbar.tooltip.Length > 0)
        {
            curTooltip = tk2dTileMapToolbar.tooltip;
        }
        if (scratchpadGUI.tooltip.Length > 0)
        {
            curTooltip = scratchpadGUI.tooltip;
        }
        if (curTooltip.Length > 0 && scratchpadGUI.workingHere)
        {
            Handles.BeginGUI();
            GUI.contentColor = Color.white;
            GUIContent tooltipContent = new GUIContent(curTooltip);
            Vector2    size           = GUI.skin.GetStyle("label").CalcSize(tooltipContent);
            GUI.Label(new Rect(tooltipPos.x, tooltipPos.y + 20, size.x + 10, size.y + 5), curTooltip, "textarea");
            Handles.EndGUI();
        }

        if (tk2dTileMapToolbar.scratchpadOpen && !lastScratchpadOpen)
        {
            scratchpadGUI.FocusOnSearchFilter(openedScratchpadWithTab);
        }
        if (!tk2dTileMapToolbar.scratchpadOpen && lastScratchpadOpen)
        {
            openedScratchpadWithTab = false;
        }
        lastScratchpadOpen = tk2dTileMapToolbar.scratchpadOpen;

        int controlID = tileMapHashCode;

        if (tk2dTileMapToolbar.scratchpadOpen && scratchpadGUI.workingHere)
        {
            if (scratchpadGUI.doMouseDown)
            {
                GUIUtility.hotControl = controlID;
                Undo.RegisterUndo(editorData, "Edit scratchpad");
                randomSeed = Random.Range(0, int.MaxValue);

                cursorX0 = cursorX;
                cursorY0 = cursorY;

                PencilDrag();
                RectangleDragBegin();
            }
            if (scratchpadGUI.doMouseDrag)
            {
                UpdateCursorPosition();
                UpdateWorkingBrush();

                PencilDrag();
            }
            if (scratchpadGUI.doMouseUp)
            {
                RectangleDragEnd();

                cursorX0 = cursorX;
                cursorY0 = cursorY;
                UpdateWorkingBrush();

                GUIUtility.hotControl = 0;
            }
            if (scratchpadGUI.doMouseMove)
            {
                UpdateCursorPosition();
                cursorX0 = cursorX;
                cursorY0 = cursorY;
                UpdateWorkingBrush();
            }
        }
        else
        {
            EventType controlEventType = Event.current.GetTypeForControl(controlID);
            switch (controlEventType)
            {
            case EventType.MouseDown:
            case EventType.MouseDrag:
                if ((controlEventType == EventType.MouseDrag && GUIUtility.hotControl != controlID) ||
                    (Event.current.button != 0 && Event.current.button != 1))
                {
                    return;
                }

                // make sure we don't use up reserved combinations
                bool inhibitMouseDown = false;
                if (Application.platform == RuntimePlatform.OSXEditor)
                {
                    if (Event.current.command && Event.current.alt)                       // pan combination on mac
                    {
                        inhibitMouseDown = true;
                    }
                }

                if (Event.current.type == EventType.MouseDown && !inhibitMouseDown)
                {
                    CheckVisible(editorData.layer);

                    if (IsCursorInside() && !Event.current.shift)
                    {
                        if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
                        {
                            GUIUtility.hotControl = controlID;
                            Undo.RegisterUndo(tileMap, "Edit tile map");
                            randomSeed = Random.Range(0, int.MaxValue);

                            PencilDrag();
                            RectangleDragBegin();
                        }
                        if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color)
                        {
                            GUIUtility.hotControl = controlID;
                            Undo.RegisterUndo(tileMap, "Paint tile map");
                            if (tk2dTileMapToolbar.colorBlendMode != tk2dTileMapToolbar.ColorBlendMode.Eyedropper)
                            {
                                PaintColorBrush((float)vertexCursorX, (float)vertexCursorY);
                                host.BuildIncremental();
                            }
                        }
                    }
                }

                if (Event.current.type == EventType.MouseDrag && GUIUtility.hotControl == controlID)
                {
                    UpdateCursorPosition();
                    UpdateWorkingBrush();
                    if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
                    {
                        PencilDrag();
                    }
                    if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color)
                    {
                        if (tk2dTileMapToolbar.colorBlendMode != tk2dTileMapToolbar.ColorBlendMode.Eyedropper)
                        {
                            PaintColorBrush((float)vertexCursorX, (float)vertexCursorY);
                            host.BuildIncremental();
                        }
                    }
                }

                break;

            case EventType.MouseUp:
                if ((Event.current.button == 0 || Event.current.button == 1) && GUIUtility.hotControl == controlID)
                {
                    GUIUtility.hotControl = 0;

                    if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
                    {
                        RectangleDragEnd();
                    }
                    if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color)
                    {
                        if (tk2dTileMapToolbar.colorBlendMode == tk2dTileMapToolbar.ColorBlendMode.Eyedropper)
                        {
                            PickUpColor();
                        }
                    }

                    cursorX0 = cursorX;
                    cursorY0 = cursorY;
                    UpdateWorkingBrush();

                    HandleUtility.Repaint();
                }
                break;

            case EventType.Layout:
                //HandleUtility.AddDefaultControl(controlID);
                break;

            case EventType.MouseMove:
                UpdateCursorPosition();
                cursorX0 = cursorX;
                cursorY0 = cursorY;
                UpdateWorkingBrush();
                break;
            }
        }

        // Set cursor color based on toolbar main mode
        bool updateCursorColor = false;

        if (currentModeForBrushColor != (int)tk2dTileMapToolbar.mainMode)
        {
            currentModeForBrushColor = (int)tk2dTileMapToolbar.mainMode;
            updateCursorColor        = true;
        }
        if (tk2dPreferencesEditor.CheckTilemapCursorColorUpdate())
        {
            updateCursorColor = true;
        }
        if (updateCursorColor)
        {
            switch (tk2dTileMapToolbar.mainMode)
            {
            case tk2dTileMapToolbar.MainMode.Brush:
                tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_brush;
                break;

            case tk2dTileMapToolbar.MainMode.BrushRandom:
                tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_brushRandom;
                break;

            case tk2dTileMapToolbar.MainMode.Erase:
                tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_erase;
                break;

            case tk2dTileMapToolbar.MainMode.Eyedropper:
                tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_eyedropper;
                break;

            case tk2dTileMapToolbar.MainMode.Cut:
                tileSelectionFillColor = tk2dPreferences.inst.tileMapToolColor_cut;
                break;
            }
            tileSelectionOutlineColor = (tileSelectionFillColor + Color.white) * new Color(0.5f, 0.5f, 0.5f, 1.0f);
        }

        // Hotkeys switch the static toolbar mode
        {
            bool pickupKeyDown = (Application.platform == RuntimePlatform.OSXEditor)?Event.current.control:Event.current.alt;
            if (Event.current.button == 1)
            {
                pickupKeyDown = true;
            }
            bool eraseKeyDown = false;
            if (Application.platform == RuntimePlatform.OSXEditor)
            {
                if (Event.current.command && !Event.current.alt)
                {
                    eraseKeyDown = true;
                }
            }
            else
            {
                eraseKeyDown = Event.current.control;
            }
            bool hotkeysPressed = pickupKeyDown || eraseKeyDown;

            if (editorData.editMode == tk2dTileMapEditorData.EditMode.Paint)
            {
                if (!pencilDragActive)
                {
                    if (hotkeysPressed)
                    {
                        if (!hotkeyModeSwitchActive)
                        {
                            // Push mode
                            pushedToolbarMainMode = tk2dTileMapToolbar.mainMode;
                        }
                        if (pickupKeyDown)
                        {
                            if (eraseKeyDown)
                            {
                                pendingModeChange = delegate(int i) {
                                    tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Cut;
                                    hotkeyModeSwitchActive      = true;
                                };
                            }
                            else
                            {
                                pendingModeChange = delegate(int i) {
                                    tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Eyedropper;
                                    hotkeyModeSwitchActive      = true;
                                };
                            }
                        }
                        else if (eraseKeyDown)
                        {
                            pendingModeChange = delegate(int i) {
                                tk2dTileMapToolbar.mainMode = tk2dTileMapToolbar.MainMode.Erase;
                                hotkeyModeSwitchActive      = true;
                            };
                        }
                    }
                    else
                    {
                        if (hotkeyModeSwitchActive)
                        {
                            // Pop mode
                            pendingModeChange = delegate(int i) {
                                tk2dTileMapToolbar.mainMode = pushedToolbarMainMode;
                                hotkeyModeSwitchActive      = false;
                            };
                        }
                    }
                }
            }
            if (editorData.editMode == tk2dTileMapEditorData.EditMode.Color)
            {
                if (hotkeysPressed)
                {
                    if (!hotkeyModeSwitchActive)
                    {
                        // Push mode
                        pushedToolbarColorBlendMode = tk2dTileMapToolbar.colorBlendMode;

                        if (pickupKeyDown)
                        {
                            tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Eyedropper;
                            hotkeyModeSwitchActive            = true;
                        }
                        else if (eraseKeyDown)
                        {
                            switch (tk2dTileMapToolbar.colorBlendMode)
                            {
                            case tk2dTileMapToolbar.ColorBlendMode.Addition:
                                tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Subtraction;
                                break;

                            case tk2dTileMapToolbar.ColorBlendMode.Subtraction:
                                tk2dTileMapToolbar.colorBlendMode = tk2dTileMapToolbar.ColorBlendMode.Addition;
                                break;
                            }
                            hotkeyModeSwitchActive = true;
                        }
                    }
                }
                else
                {
                    if (hotkeyModeSwitchActive)
                    {
                        tk2dTileMapToolbar.colorBlendMode = pushedToolbarColorBlendMode;
                        hotkeyModeSwitchActive            = false;
                    }
                }
            }
        }
        // Hotkeys toggle flipping, scratchpad, paint
        {
            Event ev = Event.current;
            if (ev.type == EventType.KeyDown)
            {
                if (ev.keyCode == KeyCode.Tab)
                {
                    if (!tk2dTileMapToolbar.scratchpadOpen)
                    {
                        pendingModeChange = delegate(int i) {
                            tk2dTileMapToolbar.scratchpadOpen = !tk2dTileMapToolbar.scratchpadOpen;
                            if (tk2dTileMapToolbar.scratchpadOpen)
                            {
                                openedScratchpadWithTab = true;
                            }
                        };
                    }
                }
                switch (ev.character)
                {
                case 'h':
                    ev.Use();
                    tk2dTileMapToolbar.workBrushFlipX = !tk2dTileMapToolbar.workBrushFlipX;
                    UpdateWorkingBrush();
                    break;

                case 'j':
                    ev.Use();
                    tk2dTileMapToolbar.workBrushFlipY = !tk2dTileMapToolbar.workBrushFlipY;
                    UpdateWorkingBrush();
                    break;

                case '[':
                    ev.Use();
                    tk2dTileMapToolbar.colorBrushRadius -= 0.5f;
                    if (tk2dTileMapToolbar.colorBrushRadius < 1.0f)
                    {
                        tk2dTileMapToolbar.colorBrushRadius = 1.0f;
                    }
                    break;

                case ']':
                    ev.Use();
                    tk2dTileMapToolbar.colorBrushRadius += 0.5f;
                    break;

                case '-':
                case '_':
                    ev.Use();
                    tk2dTileMapToolbar.colorBrushIntensity -= 0.01f;
                    break;

                case '=':
                case '+':
                    ev.Use();
                    tk2dTileMapToolbar.colorBrushIntensity += 0.01f;
                    break;
                }
            }
            if (scratchpadGUI.requestClose)
            {
                scratchpadGUI.requestClose = false;
                pendingModeChange          = delegate(int i) {
                    tk2dTileMapToolbar.scratchpadOpen = false;
                };
            }
        }
        // Hotkey (enter) selects scratchpad tiles
        if (scratchpadGUI.requestSelectAllTiles)
        {
            // fake mouse coords
            scratchpadGUI.GetTilesCropRect(out cursorX, out cursorY, out cursorX0, out cursorY0);
            PickUpBrush(editorData.activeBrush, false);
            tk2dTileMapToolbar.workBrushFlipX = false;
            tk2dTileMapToolbar.workBrushFlipY = false;

            scratchpadGUI.requestSelectAllTiles = false;
        }

        if (pendingModeChange != null && Event.current.type == EventType.Repaint)
        {
            pendingModeChange(0);
            pendingModeChange = null;
            UpdateWorkingBrush();
            HandleUtility.Repaint();
        }
    }