change API of Editor::get_quantize_op() and fix flaky UX when using quantize-notes

This commit is contained in:
Paul Davis 2023-09-24 15:00:28 -06:00
parent 6db28ef08d
commit 61d8ceaa85
4 changed files with 35 additions and 45 deletions

View file

@ -1391,7 +1391,7 @@ private:
void normalize_region (); void normalize_region ();
void adjust_region_gain (bool up); void adjust_region_gain (bool up);
void reset_region_gain (); void reset_region_gain ();
ARDOUR::Quantize get_quantize_op (bool force_dialog, bool& did_show_dialog); ARDOUR::Quantize* get_quantize_op ();
void apply_midi_note_edit_op (ARDOUR::MidiOperator& op, const RegionSelection& rs); void apply_midi_note_edit_op (ARDOUR::MidiOperator& op, const RegionSelection& rs);
void set_tempo_curve_range (double& max, double& min) const; void set_tempo_curve_range (double& max, double& min) const;
void quantize_region (); void quantize_region ();

View file

@ -6220,51 +6220,44 @@ Editor::quantize_regions (const RegionSelection& rs)
} }
bool ignored; bool ignored;
Quantize quant = get_quantize_op (true, ignored); Quantize* quant = get_quantize_op ();
if (!quant.empty()) { if (!quant) {
apply_midi_note_edit_op (quant, rs); return;
} }
if (!quant->empty()) {
apply_midi_note_edit_op (*quant, rs);
}
delete quant;
} }
Quantize Quantize*
Editor::get_quantize_op (bool force_dialog, bool& did_show_dialog) Editor::get_quantize_op ()
{ {
did_show_dialog = false;
if (!quantize_dialog) { if (!quantize_dialog) {
quantize_dialog = new QuantizeDialog (*this); quantize_dialog = new QuantizeDialog (*this);
force_dialog = true;
} }
if (quantize_dialog->get_mapped()) { quantize_dialog->present ();
/* in progress already */ int r = quantize_dialog->run ();
return Quantize (false, false, Temporal::Beats(), Temporal::Beats(), 0., 0., Temporal::Beats()); quantize_dialog->hide ();
if (r != Gtk::RESPONSE_OK) {
return nullptr;
} }
int r = Gtk::RESPONSE_OK; return new Quantize (quantize_dialog->snap_start(),
quantize_dialog->snap_end(),
if (force_dialog) { quantize_dialog->start_grid_size(),
quantize_dialog->present (); quantize_dialog->end_grid_size(),
r = quantize_dialog->run (); quantize_dialog->strength(),
quantize_dialog->hide (); quantize_dialog->swing(),
did_show_dialog = true; quantize_dialog->threshold());
}
if (r == Gtk::RESPONSE_OK) {
return Quantize (quantize_dialog->snap_start(),
quantize_dialog->snap_end(),
quantize_dialog->start_grid_size(),
quantize_dialog->end_grid_size(),
quantize_dialog->strength(),
quantize_dialog->swing(),
quantize_dialog->threshold());
}
return Quantize (false, false, Temporal::Beats(), Temporal::Beats(), 0., 0., Temporal::Beats());
} }
void void
Editor::legatize_region (bool shrink_only) Editor::legatize_region (bool shrink_only)
{ {

View file

@ -4737,23 +4737,20 @@ MidiRegionView::note_to_y(uint8_t note) const
void void
MidiRegionView::quantize_selected_notes () MidiRegionView::quantize_selected_notes ()
{ {
std::cerr << "QSN!\n";
RegionSelection rs; RegionSelection rs;
rs.push_back (this); rs.push_back (this);
bool did_show_dialog; Quantize* quant = trackview.editor().get_quantize_op ();
Quantize quant = trackview.editor().get_quantize_op (false, did_show_dialog);
bool success;
if (!did_show_dialog) { if (!quant) {
/* use global grid */ return;
quant.set_start_grid (trackview.editor().get_grid_type_as_beats (success, midi_region()->source_position()));
if (!success) {
return;
}
quant.set_end_grid (quant.start_grid());
} }
trackview.editor().apply_midi_note_edit_op (quant, rs); trackview.editor().apply_midi_note_edit_op (*quant, rs);
delete quant;
} }
void void

View file

@ -579,7 +579,7 @@ public:
virtual void queue_redisplay_track_views () = 0; virtual void queue_redisplay_track_views () = 0;
virtual ARDOUR::Quantize get_quantize_op (bool force_dialog, bool& did_show_dialog) = 0; virtual ARDOUR::Quantize* get_quantize_op () = 0;
virtual void apply_midi_note_edit_op (ARDOUR::MidiOperator& op, const RegionSelection& rs) = 0; virtual void apply_midi_note_edit_op (ARDOUR::MidiOperator& op, const RegionSelection& rs) = 0;
virtual void set_tempo_curve_range (double& max, double& min) const = 0; virtual void set_tempo_curve_range (double& max, double& min) const = 0;