public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType) { Seconds = seconds; Paragraph = p; BeforeParagraph = b; MouseDownParagraphType = mouseDownParagraphType; }
/// <summary> /// Initializes a new instance of the <see cref="ParagraphEventArgs"/> class. /// </summary> /// <param name="seconds"> /// The seconds. /// </param> /// <param name="p"> /// The p. /// </param> /// <param name="b"> /// The b. /// </param> /// <param name="mouseDownParagraphType"> /// The mouse down paragraph type. /// </param> public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType) { this.Seconds = seconds; this.Paragraph = p; this.BeforeParagraph = b; this.MouseDownParagraphType = mouseDownParagraphType; }
public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType, bool movePreviousOrNext) { Seconds = seconds; Paragraph = p; BeforeParagraph = b; MouseDownParagraphType = mouseDownParagraphType; MovePreviousOrNext = movePreviousOrNext; }
private void WaveformMouseMove(object sender, MouseEventArgs e) { if (_wavePeaks == null) return; int oldMouseMoveLastX = _mouseMoveLastX; if (e.X < 0 && StartPositionSeconds > 0.1 && _mouseDown) { if (e.X < _mouseMoveLastX) { StartPositionSeconds -= 0.1; if (_mouseDownParagraph == null) { _mouseMoveEndX = 0; _mouseMoveStartX += (int)(_wavePeaks.SampleRate * 0.1); OnPositionSelected.Invoke(this, new ParagraphEventArgs(StartPositionSeconds, null)); } } _mouseMoveLastX = e.X; Invalidate(); return; } if (e.X > Width && StartPositionSeconds + 0.1 < _wavePeaks.LengthInSeconds && _mouseDown) { //if (e.X > _mouseMoveLastX) // not much room for moving mouse cursor, so just scroll right { StartPositionSeconds += 0.1; if (_mouseDownParagraph == null) { _mouseMoveEndX = Width; _mouseMoveStartX -= (int)(_wavePeaks.SampleRate * 0.1); OnPositionSelected.Invoke(this, new ParagraphEventArgs(StartPositionSeconds, null)); } } _mouseMoveLastX = e.X; Invalidate(); return; } _mouseMoveLastX = e.X; if (e.X < 0 || e.X > Width) return; if (e.Button == MouseButtons.None) { double seconds = RelativeXPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); if (IsParagrapBorderHit(milliseconds, NewSelectionParagraph)) Cursor = Cursors.VSplit; else if (IsParagrapBorderHit(milliseconds, _selectedParagraph) || IsParagrapBorderHit(milliseconds, _displayableParagraphs)) { Cursor = Cursors.VSplit; } else { Cursor = Cursors.Default; } } else if (e.Button == MouseButtons.Left) { if (oldMouseMoveLastX == e.X) return; // no horizontal movement if (_mouseDown) { if (_mouseDownParagraph != null) { double seconds = RelativeXPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); var subtitleIndex = _subtitle.GetIndex(_mouseDownParagraph); _prevParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex - 1); _nextParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex + 1); if (_firstMove && Math.Abs(oldMouseMoveLastX - e.X) < Configuration.Settings.General.MinimumMillisecondsBetweenLines && GetParagraphAtMilliseconds(milliseconds) == null) { if (_mouseDownParagraphType == MouseDownParagraphType.Start && _prevParagraph != null && Math.Abs(_mouseDownParagraph.StartTime.TotalMilliseconds - _prevParagraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) return; // do not decide which paragraph to move yet if (_mouseDownParagraphType == MouseDownParagraphType.End && _nextParagraph != null && Math.Abs(_mouseDownParagraph.EndTime.TotalMilliseconds - _nextParagraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) return; // do not decide which paragraph to move yet } if (ModifierKeys != Keys.Alt) { // decide which paragraph to move if (_firstMove && e.X > oldMouseMoveLastX && _nextParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.End) { if (milliseconds >= _nextParagraph.StartTime.TotalMilliseconds && milliseconds < _nextParagraph.EndTime.TotalMilliseconds) { _mouseDownParagraph = _nextParagraph; _mouseDownParagraphType = MouseDownParagraphType.Start; } } else if (_firstMove && e.X < oldMouseMoveLastX && _prevParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.Start) { if (milliseconds <= _prevParagraph.EndTime.TotalMilliseconds && milliseconds > _prevParagraph.StartTime.TotalMilliseconds) { _mouseDownParagraph = _prevParagraph; _mouseDownParagraphType = MouseDownParagraphType.End; } } } _firstMove = false; if (_mouseDownParagraphType == MouseDownParagraphType.Start) { if (_mouseDownParagraph.EndTime.TotalMilliseconds - milliseconds > MinimumSelectionMilliseconds) { if (AllowMovePrevOrNext) SetMinAndMaxMoveStart(); else SetMinAndMax(); _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) { _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; } if (NewSelectionParagraph != null) { NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; if (PreventOverlap && NewSelectionParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) { NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; } _mouseMoveStartX = e.X; } else { if (OnTimeChanged != null) OnTimeChanged.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); Refresh(); return; } } } else if (_mouseDownParagraphType == MouseDownParagraphType.End) { if (milliseconds - _mouseDownParagraph.StartTime.TotalMilliseconds > MinimumSelectionMilliseconds) { if (AllowMovePrevOrNext) SetMinAndMaxMoveEnd(); else SetMinAndMax(); _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) { _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; } if (NewSelectionParagraph != null) { NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; if (PreventOverlap && NewSelectionParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) { NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; } _mouseMoveEndX = e.X; } else { //SHOW DEBUG MSG SolidBrush tBrush = new SolidBrush(Color.Turquoise); //var g = this.CreateGraphics(); //g.DrawString("AllowMovePrevOrNext: " + AllowMovePrevOrNext.ToString() + ", GapStart: " + _gapAtStart.ToString(), Font, tBrush, new PointF(100, 100)); //tBrush.Dispose(); //g.Dispose(); if (OnTimeChanged != null) OnTimeChanged.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); Refresh(); return; } } } else if (_mouseDownParagraphType == MouseDownParagraphType.Whole) { double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds; _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds - _moveWholeStartDifferenceMilliseconds; _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) { _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; _mouseDownParagraph.StartTime.TotalMilliseconds = _mouseDownParagraph.EndTime.TotalMilliseconds - durationMilliseconds; } else if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) { _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; } if (OnTimeChanged != null) OnTimeChanged.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); } } else { _mouseMoveEndX = e.X; if (NewSelectionParagraph == null && Math.Abs(_mouseMoveEndX - _mouseMoveStartX) > 2) { if (AllowNewSelection) NewSelectionParagraph = new Paragraph(); } if (NewSelectionParagraph != null) { int start = Math.Min(_mouseMoveStartX, _mouseMoveEndX); int end = Math.Max(_mouseMoveStartX, _mouseMoveEndX); var startTotalSeconds = RelativeXPositionToSeconds(start); var endTotalSeconds = RelativeXPositionToSeconds(end); if (PreventOverlap && endTotalSeconds * TimeCode.BaseUnit >= _wholeParagraphMaxMilliseconds) { NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; Invalidate(); return; } if (PreventOverlap && startTotalSeconds * TimeCode.BaseUnit <= _wholeParagraphMinMilliseconds) { NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; Invalidate(); return; } NewSelectionParagraph.StartTime.TotalSeconds = startTotalSeconds; NewSelectionParagraph.EndTime.TotalSeconds = endTotalSeconds; } } Invalidate(); } } }
private void WaveformMouseDown(object sender, MouseEventArgs e) { if (_wavePeaks == null) return; Paragraph oldMouseDownParagraph = null; _mouseDownParagraphType = MouseDownParagraphType.None; _gapAtStart = -1; _firstMove = true; if (e.Button == MouseButtons.Left) { _buttonDownTimeTicks = DateTime.Now.Ticks; Cursor = Cursors.VSplit; double seconds = RelativeXPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); if (SetParagrapBorderHit(milliseconds, NewSelectionParagraph)) { if (_mouseDownParagraph != null) oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); if (_mouseDownParagraphType == MouseDownParagraphType.Start) { _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; _mouseMoveStartX = e.X; _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - StartPositionSeconds); } else { _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - StartPositionSeconds); _mouseMoveEndX = e.X; } SetMinMaxViaSeconds(seconds); } else if (SetParagrapBorderHit(milliseconds, _selectedParagraph) || SetParagrapBorderHit(milliseconds, _displayableParagraphs)) { if (_mouseDownParagraph != null) oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); NewSelectionParagraph = null; int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); if (_mouseDownParagraphType == MouseDownParagraphType.Start) { if (curIdx > 0) { var prev = _subtitle.Paragraphs[curIdx - 1]; if (prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < milliseconds) _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; } else { _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; } } else { if (curIdx < _subtitle.Paragraphs.Count - 1) { var next = _subtitle.Paragraphs[curIdx + 1]; if (milliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; } else { _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; } } SetMinAndMax(); } else { Paragraph p = GetParagraphAtMilliseconds(milliseconds); if (p != null) { _oldParagraph = new Paragraph(p); _mouseDownParagraph = p; oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); _mouseDownParagraphType = MouseDownParagraphType.Whole; _moveWholeStartDifferenceMilliseconds = (RelativeXPositionToSeconds(e.X) * TimeCode.BaseUnit) - p.StartTime.TotalMilliseconds; Cursor = Cursors.Hand; SetMinAndMax(); } else if (!AllowNewSelection) { Cursor = Cursors.Default; } if (p == null) SetMinMaxViaSeconds(seconds); NewSelectionParagraph = null; _mouseMoveStartX = e.X; _mouseMoveEndX = e.X; } if (_mouseDownParagraphType == MouseDownParagraphType.Start) { if (_subtitle != null && _mouseDownParagraph != null) { int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); //if (curIdx > 0) // _gapAtStart = _subtitle.Paragraphs[curIdx].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; if (curIdx > 0) _gapAtStart = oldMouseDownParagraph.StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; } } else if (_mouseDownParagraphType == MouseDownParagraphType.End) { if (_subtitle != null && _mouseDownParagraph != null) { int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); //if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1) // _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx].EndTime.TotalMilliseconds; if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1) _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - oldMouseDownParagraph.EndTime.TotalMilliseconds; } } _mouseDown = true; } else { if (e.Button == MouseButtons.Right) { double seconds = RelativeXPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); double currentRegionLeft = RelativeXPositionToSeconds(Math.Min(_mouseMoveStartX, _mouseMoveEndX)); double currentRegionRight = RelativeXPositionToSeconds(Math.Max(_mouseMoveStartX, _mouseMoveEndX)); if (OnNewSelectionRightClicked != null && seconds > currentRegionLeft && seconds < currentRegionRight) { if (_mouseMoveStartX >= 0 && _mouseMoveEndX >= 0) { if (currentRegionRight - currentRegionLeft > 0.1) // not too small subtitles { var paragraph = new Paragraph { StartTime = TimeCode.FromSeconds(currentRegionLeft), EndTime = TimeCode.FromSeconds(currentRegionRight) }; if (PreventOverlap) { if (paragraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) paragraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; if (paragraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) paragraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; } OnNewSelectionRightClicked.Invoke(this, new ParagraphEventArgs(paragraph)); NewSelectionParagraph = paragraph; RightClickedParagraph = null; _noClear = true; } } } else { Paragraph p = GetParagraphAtMilliseconds(milliseconds); RightClickedParagraph = p; RightClickedSeconds = seconds; if (p != null) { if (OnParagraphRightClicked != null) { NewSelectionParagraph = null; OnParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, p)); } } else { if (OnNonParagraphRightClicked != null) { OnNonParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, null)); } } } } Cursor = Cursors.Default; } }
private bool SetParagrapBorderHit(int milliseconds, Paragraph paragraph) { if (paragraph == null) return false; if (IsParagrapBorderStartHit(milliseconds, paragraph.StartTime.TotalMilliseconds)) { _oldParagraph = new Paragraph(paragraph); _mouseDownParagraph = paragraph; _mouseDownParagraphType = MouseDownParagraphType.Start; return true; } if (IsParagrapBorderEndHit(milliseconds, paragraph.EndTime.TotalMilliseconds)) { _oldParagraph = new Paragraph(paragraph); _mouseDownParagraph = paragraph; _mouseDownParagraphType = MouseDownParagraphType.End; return true; } return false; }
private bool SetParagrapBorderHit(int milliseconds, Paragraph paragraph) { if (paragraph == null) return false; if (Math.Abs(milliseconds - paragraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection) { _oldParagraph = new Paragraph(paragraph); _mouseDownParagraph = paragraph; _mouseDownParagraphType = MouseDownParagraphType.Start; return true; } if (Math.Abs(milliseconds - paragraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection) { _oldParagraph = new Paragraph(paragraph); _mouseDownParagraph = paragraph; _mouseDownParagraphType = MouseDownParagraphType.End; return true; } return false; }
private void WaveFormMouseDown(object sender, MouseEventArgs e) { if (_wavePeaks == null) return; Paragraph oldMouseDownParagraph = null; _mouseDownParagraphType = MouseDownParagraphType.None; _gapAtStart = -1; _firstMove = true; if (e.Button == MouseButtons.Left) { _buttonDownTimeTicks = DateTime.Now.Ticks; Cursor = Cursors.VSplit; double seconds = XPositionToSeconds(e.X); int milliseconds = (int)(seconds * 1000.0); if (SetParagrapBorderHit(milliseconds, NewSelectionParagraph)) { if (_mouseDownParagraph != null) oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); if (_mouseDownParagraphType == MouseDownParagraphType.Start) { _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; _mouseMoveStartX = e.X; _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds); } else { _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds); _mouseMoveEndX = e.X; } SetMinMaxViaSeconds(seconds); } else if (SetParagrapBorderHit(milliseconds, _selectedParagraph) || SetParagrapBorderHit(milliseconds, _currentParagraph) || SetParagrapBorderHit(milliseconds, _previousAndNextParagraphs)) { if (_mouseDownParagraph != null) oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); NewSelectionParagraph = null; if (_mouseDownParagraphType == MouseDownParagraphType.Start) _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; else _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; SetMinAndMax(); } else { Paragraph p = GetParagraphAtMilliseconds(milliseconds); if (p != null) { _oldParagraph = new Paragraph(p); _mouseDownParagraph = p; oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); _mouseDownParagraphType = MouseDownParagraphType.Whole; _moveWholeStartDifferenceMilliseconds = (XPositionToSeconds(e.X) * 1000.0) - p.StartTime.TotalMilliseconds; Cursor = Cursors.Hand; SetMinAndMax(); } else if (!AllowNewSelection) { Cursor = Cursors.Default; } if (p == null) SetMinMaxViaSeconds(seconds); NewSelectionParagraph = null; _mouseMoveStartX = e.X; _mouseMoveEndX = e.X; } if (_mouseDownParagraphType == MouseDownParagraphType.Start) { if (_subtitle != null && _mouseDownParagraph != null) { int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); //if (curIdx > 0) // _gapAtStart = _subtitle.Paragraphs[curIdx].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; if (curIdx > 0) _gapAtStart = oldMouseDownParagraph.StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; } } else if (_mouseDownParagraphType == MouseDownParagraphType.End) { if (_subtitle != null && _mouseDownParagraph != null) { int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); //if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1) // _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx].EndTime.TotalMilliseconds; if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1) _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - oldMouseDownParagraph.EndTime.TotalMilliseconds; } } _mouseDown = true; } else { if (e.Button == MouseButtons.Right) { double seconds = XPositionToSeconds(e.X); int milliseconds = (int)(seconds * 1000.0); double currentRegionLeft = Math.Min(_mouseMoveStartX, _mouseMoveEndX); double currentRegionRight = Math.Max(_mouseMoveStartX, _mouseMoveEndX); currentRegionLeft = XPositionToSeconds(currentRegionLeft); currentRegionRight = XPositionToSeconds(currentRegionRight); if (OnNewSelectionRightClicked != null && seconds > currentRegionLeft && seconds < currentRegionRight) { if (_mouseMoveStartX >= 0 && _mouseMoveEndX >= 0) { if (currentRegionRight - currentRegionLeft > 0.1) // not too small subtitles { Paragraph paragraph = new Paragraph(); paragraph.StartTime = new TimeCode(TimeSpan.FromSeconds(currentRegionLeft)); paragraph.EndTime = new TimeCode(TimeSpan.FromSeconds(currentRegionRight)); if (PreventOverlap) { if (paragraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) paragraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; if (paragraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) paragraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; } OnNewSelectionRightClicked.Invoke(this, new ParagraphEventArgs(paragraph)); NewSelectionParagraph = paragraph; RightClickedParagraph = null; _noClear = true; } } } else { Paragraph p = GetParagraphAtMilliseconds(milliseconds); RightClickedParagraph = p; RightClickedSeconds = seconds; if (p != null) { if (OnParagraphRightClicked != null) { NewSelectionParagraph = null; OnParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, p)); } } else { if (OnNonParagraphRightClicked != null) { OnNonParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, null)); } } } } Cursor = Cursors.Default; } }
/// <summary> /// The waveform mouse down. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="e"> /// The e. /// </param> private void WaveformMouseDown(object sender, MouseEventArgs e) { if (this._wavePeaks == null) { return; } Paragraph oldMouseDownParagraph = null; this._mouseDownParagraphType = MouseDownParagraphType.None; this._gapAtStart = -1; this._firstMove = true; if (e.Button == MouseButtons.Left) { this._buttonDownTimeTicks = DateTime.Now.Ticks; this.Cursor = Cursors.VSplit; double seconds = this.XPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); if (this.SetParagrapBorderHit(milliseconds, this.NewSelectionParagraph)) { if (this._mouseDownParagraph != null) { oldMouseDownParagraph = new Paragraph(this._mouseDownParagraph); } if (this._mouseDownParagraphType == MouseDownParagraphType.Start) { this._mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; this.NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; this._mouseMoveStartX = e.X; this._mouseMoveEndX = this.SecondsToXPosition(this.NewSelectionParagraph.EndTime.TotalSeconds); } else { this._mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; this.NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; this._mouseMoveStartX = this.SecondsToXPosition(this.NewSelectionParagraph.StartTime.TotalSeconds); this._mouseMoveEndX = e.X; } this.SetMinMaxViaSeconds(seconds); } else if (this.SetParagrapBorderHit(milliseconds, this._selectedParagraph) || this.SetParagrapBorderHit(milliseconds, this._currentParagraph) || this.SetParagrapBorderHit(milliseconds, this._previousAndNextParagraphs)) { if (this._mouseDownParagraph != null) { oldMouseDownParagraph = new Paragraph(this._mouseDownParagraph); } this.NewSelectionParagraph = null; int curIdx = this._subtitle.Paragraphs.IndexOf(this._mouseDownParagraph); if (this._mouseDownParagraphType == MouseDownParagraphType.Start) { if (curIdx > 0) { var prev = this._subtitle.Paragraphs[curIdx - 1]; if (prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < milliseconds) { this._mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; } } else { this._mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; } } else { if (curIdx < this._subtitle.Paragraphs.Count - 1) { var next = this._subtitle.Paragraphs[curIdx + 1]; if (milliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) { this._mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; } } else { this._mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; } } this.SetMinAndMax(); } else { Paragraph p = this.GetParagraphAtMilliseconds(milliseconds); if (p != null) { this._oldParagraph = new Paragraph(p); this._mouseDownParagraph = p; oldMouseDownParagraph = new Paragraph(this._mouseDownParagraph); this._mouseDownParagraphType = MouseDownParagraphType.Whole; this._moveWholeStartDifferenceMilliseconds = (this.XPositionToSeconds(e.X) * TimeCode.BaseUnit) - p.StartTime.TotalMilliseconds; this.Cursor = Cursors.Hand; this.SetMinAndMax(); } else if (!this.AllowNewSelection) { this.Cursor = Cursors.Default; } if (p == null) { this.SetMinMaxViaSeconds(seconds); } this.NewSelectionParagraph = null; this._mouseMoveStartX = e.X; this._mouseMoveEndX = e.X; } if (this._mouseDownParagraphType == MouseDownParagraphType.Start) { if (this._subtitle != null && this._mouseDownParagraph != null) { int curIdx = this._subtitle.Paragraphs.IndexOf(this._mouseDownParagraph); // if (curIdx > 0) // _gapAtStart = _subtitle.Paragraphs[curIdx].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; if (curIdx > 0) { this._gapAtStart = oldMouseDownParagraph.StartTime.TotalMilliseconds - this._subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; } } } else if (this._mouseDownParagraphType == MouseDownParagraphType.End) { if (this._subtitle != null && this._mouseDownParagraph != null) { int curIdx = this._subtitle.Paragraphs.IndexOf(this._mouseDownParagraph); // if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1) // _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx].EndTime.TotalMilliseconds; if (curIdx >= 0 && curIdx < this._subtitle.Paragraphs.Count - 1) { this._gapAtStart = this._subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - oldMouseDownParagraph.EndTime.TotalMilliseconds; } } } this._mouseDown = true; } else { if (e.Button == MouseButtons.Right) { double seconds = this.XPositionToSeconds(e.X); var milliseconds = (int)(seconds * TimeCode.BaseUnit); double currentRegionLeft = Math.Min(this._mouseMoveStartX, this._mouseMoveEndX); double currentRegionRight = Math.Max(this._mouseMoveStartX, this._mouseMoveEndX); currentRegionLeft = this.XPositionToSeconds(currentRegionLeft); currentRegionRight = this.XPositionToSeconds(currentRegionRight); if (this.OnNewSelectionRightClicked != null && seconds > currentRegionLeft && seconds < currentRegionRight) { if (this._mouseMoveStartX >= 0 && this._mouseMoveEndX >= 0) { if (currentRegionRight - currentRegionLeft > 0.1) { // not too small subtitles var paragraph = new Paragraph { StartTime = TimeCode.FromSeconds(currentRegionLeft), EndTime = TimeCode.FromSeconds(currentRegionRight) }; if (this.PreventOverlap) { if (paragraph.StartTime.TotalMilliseconds <= this._wholeParagraphMinMilliseconds) { paragraph.StartTime.TotalMilliseconds = this._wholeParagraphMinMilliseconds + 1; } if (paragraph.EndTime.TotalMilliseconds >= this._wholeParagraphMaxMilliseconds) { paragraph.EndTime.TotalMilliseconds = this._wholeParagraphMaxMilliseconds - 1; } } this.OnNewSelectionRightClicked.Invoke(this, new ParagraphEventArgs(paragraph)); this.NewSelectionParagraph = paragraph; this.RightClickedParagraph = null; this._noClear = true; } } } else { Paragraph p = this.GetParagraphAtMilliseconds(milliseconds); this.RightClickedParagraph = p; this.RightClickedSeconds = seconds; if (p != null) { if (this.OnParagraphRightClicked != null) { this.NewSelectionParagraph = null; this.OnParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, p)); } } else { if (this.OnNonParagraphRightClicked != null) { this.OnNonParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, null)); } } } } this.Cursor = Cursors.Default; } }