forked from mia/Aegisub
Update the audio scroll position at most once every 50ms when dragging markers
Originally committed to SVN as r6736.
This commit is contained in:
parent
1558aa2dad
commit
2ef7ed98c0
2 changed files with 36 additions and 11 deletions
|
@ -591,6 +591,7 @@ AudioDisplay::AudioDisplay(wxWindow *parent, AudioController *controller, agi::C
|
||||||
Bind(wxEVT_MOTION, &AudioDisplay::OnMouseEvent, this);
|
Bind(wxEVT_MOTION, &AudioDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_ENTER_WINDOW, &AudioDisplay::OnMouseEvent, this);
|
Bind(wxEVT_ENTER_WINDOW, &AudioDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_LEAVE_WINDOW, &AudioDisplay::OnMouseEvent, this);
|
Bind(wxEVT_LEAVE_WINDOW, &AudioDisplay::OnMouseEvent, this);
|
||||||
|
scroll_timer.Bind(wxEVT_TIMER, &AudioDisplay::OnScrollTimer, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1026,6 +1027,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
if (!dragged_object->OnMouseEvent(event))
|
if (!dragged_object->OnMouseEvent(event))
|
||||||
{
|
{
|
||||||
|
scroll_timer.Stop();
|
||||||
SetDraggedObject(0);
|
SetDraggedObject(0);
|
||||||
SetCursor(wxNullCursor);
|
SetCursor(wxNullCursor);
|
||||||
}
|
}
|
||||||
|
@ -1234,18 +1236,17 @@ void AudioDisplay::OnSelectionChanged()
|
||||||
|
|
||||||
if (audio_marker)
|
if (audio_marker)
|
||||||
{
|
{
|
||||||
int rel_x = RelativeXFromTime(audio_marker->GetPosition());
|
if (!scroll_timer.IsRunning())
|
||||||
int width = GetClientSize().GetWidth();
|
|
||||||
|
|
||||||
// If the dragged object is outside the visible area, scroll it into
|
|
||||||
// view with a 5% margin
|
|
||||||
if (rel_x < 0)
|
|
||||||
{
|
{
|
||||||
ScrollBy(rel_x - width / 20);
|
// If the dragged object is outside the visible area, start the
|
||||||
}
|
// scroll timer to shift it back into view
|
||||||
else if (rel_x >= width)
|
int rel_x = RelativeXFromTime(audio_marker->GetPosition());
|
||||||
{
|
if (rel_x < 0 || rel_x >= GetClientSize().GetWidth())
|
||||||
ScrollBy(rel_x - width + width / 20);
|
{
|
||||||
|
// 50ms is the default for this on Windows (hardcoded since
|
||||||
|
// wxSystemSettings doesn't expose DragScrollDelay etc.)
|
||||||
|
scroll_timer.Start(50, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (OPT_GET("Audio/Auto/Scroll")->GetBool() && sel.end() != 0)
|
else if (OPT_GET("Audio/Auto/Scroll")->GetBool() && sel.end() != 0)
|
||||||
|
@ -1256,6 +1257,25 @@ void AudioDisplay::OnSelectionChanged()
|
||||||
RefreshRect(scrollbar->GetBounds(), false);
|
RefreshRect(scrollbar->GetBounds(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioDisplay::OnScrollTimer(wxTimerEvent &event)
|
||||||
|
{
|
||||||
|
if (!audio_marker) return;
|
||||||
|
|
||||||
|
int rel_x = RelativeXFromTime(audio_marker->GetPosition());
|
||||||
|
int width = GetClientSize().GetWidth();
|
||||||
|
|
||||||
|
// If the dragged object is outside the visible area, scroll it into
|
||||||
|
// view with a 5% margin
|
||||||
|
if (rel_x < 0)
|
||||||
|
{
|
||||||
|
ScrollBy(rel_x - width / 20);
|
||||||
|
}
|
||||||
|
else if (rel_x >= width)
|
||||||
|
{
|
||||||
|
ScrollBy(rel_x - width + width / 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AudioDisplay::OnStyleRangesChanged()
|
void AudioDisplay::OnStyleRangesChanged()
|
||||||
{
|
{
|
||||||
if (!controller->GetTimingController()) return;
|
if (!controller->GetTimingController()) return;
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include <wx/gdicmn.h>
|
#include <wx/gdicmn.h>
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
|
#include <wx/timer.h>
|
||||||
#include <wx/window.h>
|
#include <wx/window.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -131,6 +132,9 @@ class AudioDisplay: public wxWindow {
|
||||||
void SetDraggedObject(AudioDisplayInteractionObject *new_obj);
|
void SetDraggedObject(AudioDisplayInteractionObject *new_obj);
|
||||||
|
|
||||||
|
|
||||||
|
/// Timer for scrolling when markers are dragged out of the displayed area
|
||||||
|
wxTimer scroll_timer;
|
||||||
|
|
||||||
/// Leftmost pixel in the virtual audio image being displayed
|
/// Leftmost pixel in the virtual audio image being displayed
|
||||||
int scroll_left;
|
int scroll_left;
|
||||||
|
|
||||||
|
@ -213,6 +217,7 @@ class AudioDisplay: public wxWindow {
|
||||||
void OnFocus(wxFocusEvent &event);
|
void OnFocus(wxFocusEvent &event);
|
||||||
/// wxWidgets keypress event
|
/// wxWidgets keypress event
|
||||||
void OnKeyDown(wxKeyEvent& event);
|
void OnKeyDown(wxKeyEvent& event);
|
||||||
|
void OnScrollTimer(wxTimerEvent &event);
|
||||||
|
|
||||||
// AudioControllerAudioEventListener implementation
|
// AudioControllerAudioEventListener implementation
|
||||||
void OnAudioOpen(AudioProvider *provider);
|
void OnAudioOpen(AudioProvider *provider);
|
||||||
|
|
Loading…
Reference in a new issue