Move audio marker snapping logic from the audio display to the dialogue timing controller
Originally committed to SVN as r6236.
This commit is contained in:
parent
1285584e89
commit
4dcb6240d4
4 changed files with 33 additions and 31 deletions
|
@ -508,32 +508,11 @@ public:
|
||||||
{
|
{
|
||||||
if (event.Dragging())
|
if (event.Dragging())
|
||||||
{
|
{
|
||||||
int64_t sample_pos = display->SamplesFromRelativeX(event.GetPosition().x);
|
timing_controller->OnMarkerDrag(
|
||||||
|
marker,
|
||||||
if (marker->CanSnap() && (default_snap != event.ShiftDown()))
|
display->SamplesFromRelativeX(event.GetPosition().x),
|
||||||
{
|
default_snap != event.ShiftDown(),
|
||||||
SampleRange snap_sample_range(
|
display->SamplesFromAbsoluteX(snap_range));
|
||||||
display->SamplesFromRelativeX(event.GetPosition().x - snap_range),
|
|
||||||
display->SamplesFromRelativeX(event.GetPosition().x + snap_range));
|
|
||||||
const AudioMarker *snap_marker = 0;
|
|
||||||
AudioMarkerVector potential_snaps;
|
|
||||||
controller->GetMarkers(snap_sample_range, potential_snaps);
|
|
||||||
for (AudioMarkerVector::iterator mi = potential_snaps.begin(); mi != potential_snaps.end(); ++mi)
|
|
||||||
{
|
|
||||||
if (*mi != marker && (*mi)->CanSnap())
|
|
||||||
{
|
|
||||||
if (!snap_marker)
|
|
||||||
snap_marker = *mi;
|
|
||||||
else if (tabs((*mi)->GetPosition() - sample_pos) < tabs(snap_marker->GetPosition() - sample_pos))
|
|
||||||
snap_marker = *mi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (snap_marker)
|
|
||||||
sample_pos = snap_marker->GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
timing_controller->OnMarkerDrag(marker, sample_pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We lose the marker drag if the button used to initiate it goes up
|
// We lose the marker drag if the button used to initiate it goes up
|
||||||
|
|
|
@ -141,7 +141,9 @@ public:
|
||||||
/// @brief The user dragged a timing marker
|
/// @brief The user dragged a timing marker
|
||||||
/// @param marker The marker being dragged
|
/// @param marker The marker being dragged
|
||||||
/// @param new_position Sample position the marker was dragged to
|
/// @param new_position Sample position the marker was dragged to
|
||||||
virtual void OnMarkerDrag(AudioMarker *marker, int64_t new_position) = 0;
|
/// @param snap Enable snapping to other markers
|
||||||
|
/// @param snap_range Maximum snapping range in samples
|
||||||
|
virtual void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range) = 0;
|
||||||
|
|
||||||
/// @brief Destructor
|
/// @brief Destructor
|
||||||
virtual ~AudioTimingController() { }
|
virtual ~AudioTimingController() { }
|
||||||
|
|
|
@ -222,7 +222,7 @@ public:
|
||||||
bool IsNearbyMarker(int64_t sample, int sensitivity) const;
|
bool IsNearbyMarker(int64_t sample, int sensitivity) const;
|
||||||
AudioMarker * OnLeftClick(int64_t sample, int sensitivity);
|
AudioMarker * OnLeftClick(int64_t sample, int sensitivity);
|
||||||
AudioMarker * OnRightClick(int64_t sample, int sensitivity);
|
AudioMarker * OnRightClick(int64_t sample, int sensitivity);
|
||||||
void OnMarkerDrag(AudioMarker *marker, int64_t new_position);
|
void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Specific interface
|
// Specific interface
|
||||||
|
@ -522,9 +522,30 @@ AudioMarker * AudioTimingControllerDialogue::OnRightClick(int64_t sample, int se
|
||||||
return right;
|
return right;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTimingControllerDialogue::OnMarkerDrag(AudioMarker *marker, int64_t new_position)
|
void AudioTimingControllerDialogue::OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range)
|
||||||
{
|
{
|
||||||
assert(marker == &active_markers[0] || marker == &active_markers[1]);
|
assert(marker == &active_markers[0] || marker == &active_markers[1]);
|
||||||
|
|
||||||
|
if (snap)
|
||||||
|
{
|
||||||
|
SampleRange snap_sample_range(new_position - snap_range, new_position + snap_range);
|
||||||
|
const AudioMarker *snap_marker = 0;
|
||||||
|
AudioMarkerVector potential_snaps;
|
||||||
|
GetMarkers(snap_sample_range, potential_snaps);
|
||||||
|
for (AudioMarkerVector::iterator mi = potential_snaps.begin(); mi != potential_snaps.end(); ++mi)
|
||||||
|
{
|
||||||
|
if (*mi != marker && (*mi)->CanSnap())
|
||||||
|
{
|
||||||
|
if (!snap_marker)
|
||||||
|
snap_marker = *mi;
|
||||||
|
else if (tabs((*mi)->GetPosition() - new_position) < tabs(snap_marker->GetPosition() - new_position))
|
||||||
|
snap_marker = *mi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (snap_marker)
|
||||||
|
new_position = snap_marker->GetPosition();
|
||||||
|
}
|
||||||
SetMarker(static_cast<AudioMarkerDialogueTiming*>(marker), new_position);
|
SetMarker(static_cast<AudioMarkerDialogueTiming*>(marker), new_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ public:
|
||||||
bool IsNearbyMarker(int64_t sample, int sensitivity) const;
|
bool IsNearbyMarker(int64_t sample, int sensitivity) const;
|
||||||
AudioMarker * OnLeftClick(int64_t sample, int sensitivity);
|
AudioMarker * OnLeftClick(int64_t sample, int sensitivity);
|
||||||
AudioMarker * OnRightClick(int64_t sample, int sensitivity) { return 0; }
|
AudioMarker * OnRightClick(int64_t sample, int sensitivity) { return 0; }
|
||||||
void OnMarkerDrag(AudioMarker *marker, int64_t new_position);
|
void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool, int64_t);
|
||||||
|
|
||||||
AudioTimingControllerKaraoke(agi::Context *c, AssKaraoke *kara, agi::signal::Connection& file_changed);
|
AudioTimingControllerKaraoke(agi::Context *c, AssKaraoke *kara, agi::signal::Connection& file_changed);
|
||||||
};
|
};
|
||||||
|
@ -301,7 +301,7 @@ AudioMarker *AudioTimingControllerKaraoke::OnLeftClick(int64_t sample, int sensi
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTimingControllerKaraoke::OnMarkerDrag(AudioMarker *m, int64_t new_position) {
|
void AudioTimingControllerKaraoke::OnMarkerDrag(AudioMarker *m, int64_t new_position, bool, int64_t) {
|
||||||
KaraokeMarker *marker = static_cast<KaraokeMarker*>(m);
|
KaraokeMarker *marker = static_cast<KaraokeMarker*>(m);
|
||||||
// No rearranging of syllables allowed
|
// No rearranging of syllables allowed
|
||||||
new_position = mid(
|
new_position = mid(
|
||||||
|
|
Loading…
Reference in a new issue