protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); bool left = e.Button.HasFlag(MouseButtons.Left); bool middle = e.Button.HasFlag(MouseButtons.Middle) || (e.Button.HasFlag(MouseButtons.Left) && ModifierKeys.HasFlag(Keys.Alt)); bool right = e.Button.HasFlag(MouseButtons.Right); CancelDragSelection(); UpdateCursor(); if (middle) { mouseLastX = e.X; mouseLastY = e.Y; return; } // Track muting, soloing. else if ((left || right) && e.X < trackNameSizeX) { for (int i = 0; i < 5; i++) { int bit = (1 << i); if (GetTrackIconRect(i).Contains(e.X, e.Y)) { if (left) { // Toggle muted App.ChannelMask ^= bit; } else { // Toggle Solo if (App.ChannelMask == (1 << i)) { App.ChannelMask = 0x1f; } else { App.ChannelMask = (1 << i); } } ConditionalInvalidate(); break; } if (GetTrackGhostRect(i).Contains(e.X, e.Y)) { App.GhostChannelMask ^= bit; ConditionalInvalidate(); break; } } } if (left && e.X > trackNameSizeX && e.Y < headerSizeY) { int frame = (int)Math.Round((e.X - trackNameSizeX + scrollX) / (float)PatternSizeX * Song.PatternLength); App.Seek(frame); return; } if (left || right) { if (e.Y > headerSizeY) { var newChannel = Utils.Clamp((e.Y - headerSizeY) / trackSizeY, 0, Channel.Count - 1); if (newChannel != selectedChannel) { selectedChannel = newChannel; SelectedChannelChanged?.Invoke(selectedChannel); ConditionalInvalidate(); } } } bool inPatternZone = GetPatternForCoord(e.X, e.Y, out int channelIdx, out int patternIdx); if (inPatternZone) { var channel = Song.Channels[channelIdx]; var pattern = channel.PatternInstances[patternIdx]; if (left) { bool shift = ModifierKeys.HasFlag(Keys.Shift); if (pattern == null && !shift) { App.UndoRedoManager.BeginTransaction(TransactionScope.Song, Song.Id); channel.PatternInstances[patternIdx] = channel.CreatePattern(); App.UndoRedoManager.EndTransaction(); ConditionalInvalidate(); } else { if (shift && minSelectedChannelIdx >= 0 && minSelectedPatternIdx >= 0) { if (channelIdx < minSelectedChannelIdx) { maxSelectedChannelIdx = minSelectedChannelIdx; minSelectedChannelIdx = channelIdx; } else { maxSelectedChannelIdx = channelIdx; } if (patternIdx < minSelectedPatternIdx) { maxSelectedPatternIdx = minSelectedPatternIdx; minSelectedPatternIdx = patternIdx; } else { maxSelectedPatternIdx = patternIdx; } } else if (!IsPatternSelected(channelIdx, patternIdx) && pattern != null) { minSelectedChannelIdx = channelIdx; maxSelectedChannelIdx = channelIdx; minSelectedPatternIdx = patternIdx; maxSelectedPatternIdx = patternIdx; } selectionDragAnchorX = e.X - trackNameSizeX + scrollX - minSelectedPatternIdx * PatternSizeX; selectionDragStartX = e.X; if (pattern != null) { PatternClicked?.Invoke(channelIdx, patternIdx); } ConditionalInvalidate(); } } else if (right && pattern != null) { App.UndoRedoManager.BeginTransaction(TransactionScope.Song, Song.Id); channel.PatternInstances[patternIdx] = null; App.UndoRedoManager.EndTransaction(); ConditionalInvalidate(); } } }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); ControlActivated?.Invoke(); bool left = e.Button.HasFlag(MouseButtons.Left); bool middle = e.Button.HasFlag(MouseButtons.Middle) || (e.Button.HasFlag(MouseButtons.Left) && ModifierKeys.HasFlag(Keys.Alt)); bool right = e.Button.HasFlag(MouseButtons.Right); bool canCapture = captureOperation == CaptureOperation.None; CancelDragSelection(); UpdateCursor(); if (middle) { mouseLastX = e.X; mouseLastY = e.Y; Capture = true; return; } // Track muting, soloing. else if ((left || right) && e.X < trackNameSizeX) { var trackIcon = GetTrackIconForPos(e); var ghostIcon = GetTrackGhostForPos(e); if (trackIcon >= 0) { int bit = (1 << trackIcon); if (left) { // Toggle muted App.ChannelMask ^= bit; } else { // Toggle Solo if (App.ChannelMask == bit) { App.ChannelMask = 0xff; } else { App.ChannelMask = bit; } } ConditionalInvalidate(); return; } else if (ghostIcon >= 0) { App.GhostChannelMask ^= (1 << ghostIcon); ConditionalInvalidate(); return; } } if (IsMouseInHeader(e)) { if (left) { int frame = (int)Math.Round((e.X - trackNameSizeX + scrollX) / (float)patternSizeX * Song.PatternLength); App.Seek(frame); } else if (right && canCapture) { StartCaptureOperation(e, CaptureOperation.Select); UpdateSelection(e.X, true); } } else if (e.Y > headerSizeY && (left || right)) { if (e.Y > headerSizeY) { var newChannel = Utils.Clamp((e.Y - headerSizeY) / trackSizeY, 0, Song.Channels.Length - 1); if (newChannel != selectedChannel) { selectedChannel = newChannel; SelectedChannelChanged?.Invoke(selectedChannel); ConditionalInvalidate(); } } } bool inPatternZone = GetPatternForCoord(e.X, e.Y, out int channelIdx, out int patternIdx); if (inPatternZone) { var channel = Song.Channels[channelIdx]; var pattern = channel.PatternInstances[patternIdx]; if (left) { bool shift = ModifierKeys.HasFlag(Keys.Shift); if (pattern == null && !shift) { App.UndoRedoManager.BeginTransaction(TransactionScope.Song, Song.Id); channel.PatternInstances[patternIdx] = channel.CreatePattern(); PatternClicked?.Invoke(channelIdx, patternIdx); App.UndoRedoManager.EndTransaction(); ClearSelection(); ConditionalInvalidate(); } else if (canCapture) { if (pattern != null) { PatternClicked?.Invoke(channelIdx, patternIdx); } if (shift && minSelectedChannelIdx >= 0 && minSelectedPatternIdx >= 0) { if (channelIdx < minSelectedChannelIdx) { maxSelectedChannelIdx = minSelectedChannelIdx; minSelectedChannelIdx = channelIdx; } else { maxSelectedChannelIdx = channelIdx; } if (patternIdx < minSelectedPatternIdx) { maxSelectedPatternIdx = minSelectedPatternIdx; minSelectedPatternIdx = patternIdx; } else { maxSelectedPatternIdx = patternIdx; } return; } else if (!IsPatternSelected(channelIdx, patternIdx) && pattern != null) { minSelectedChannelIdx = channelIdx; maxSelectedChannelIdx = channelIdx; minSelectedPatternIdx = patternIdx; maxSelectedPatternIdx = patternIdx; } selectionDragAnchorX = e.X - trackNameSizeX + scrollX - minSelectedPatternIdx * patternSizeX; StartCaptureOperation(e, CaptureOperation.ClickPattern); ConditionalInvalidate(); } } else if (right && pattern != null) { App.UndoRedoManager.BeginTransaction(TransactionScope.Song, Song.Id); channel.PatternInstances[patternIdx] = null; App.UndoRedoManager.EndTransaction(); ClearSelection(); ConditionalInvalidate(); } } }