audio clip editor: add an incomplete ruler to the display

This commit is contained in:
Paul Davis 2021-12-10 23:16:20 -07:00
parent 3753d97599
commit c233609c7c
2 changed files with 46 additions and 2 deletions

View File

@ -86,6 +86,29 @@ ClipEditorBox::register_clip_editor_actions (Bindings* clip_editor_bindings)
/* ------------ */
class ClipBBTMetric : public ArdourCanvas::Ruler::Metric
{
public:
ClipBBTMetric () { units_per_pixel = 1; }
void get_marks (std::vector<ArdourCanvas::Ruler::Mark>& marks, int64_t lower, int64_t upper, int maxchars) const {
ArdourCanvas::Ruler::Mark mark;
std::cerr << "get marks between " << lower << " .. " << upper << std::endl;
for (int64_t n = lower; n < upper; n += 4000) {
mark.style = ArdourCanvas::Ruler::Mark::Major;
mark.label = string_compose ("%1", n);
mark.position = n / 100;
marks.push_back (mark);
std::cerr << "mark at " << mark.label << " @ " << mark.position << std::endl;
}
}
private:
};
AudioClipEditor::AudioClipEditor ()
: _spp (0)
, scroll_fraction (0)
@ -107,6 +130,14 @@ AudioClipEditor::AudioClipEditor ()
waves_container = new ArdourCanvas::ScrollGroup (frame, ScrollGroup::ScrollsHorizontally);
add_scroller (*waves_container);
clip_metric = new ClipBBTMetric ();
ruler_container = new ArdourCanvas::Container (waves_container);
ruler = new ArdourCanvas::Ruler (ruler_container, *clip_metric);
ruler->name = "Clip Editor";
ruler->set_font_description (UIConfiguration::instance().get_SmallerFont());
line_container = new ArdourCanvas::Container (waves_container);
const double line_width = 3.;
@ -272,6 +303,9 @@ AudioClipEditor::set_colors ()
frame->set_outline_color (UIConfiguration::instance().color (X_("neutral:midground")));
ruler->set_fill_color (UIConfiguration::instance().color (X_("theme:bg1")));
ruler->set_outline_color (UIConfiguration::instance().color (X_("theme:contrasting less")));
start_line->set_outline_color (UIConfiguration::instance().color (X_("theme:contrasting clock")));
end_line->set_outline_color (UIConfiguration::instance().color (X_("theme:contrasting alt")));
loop_line->set_outline_color (UIConfiguration::instance().color (X_("theme:contrasting selection")));
@ -396,6 +430,9 @@ AudioClipEditor::on_size_allocate (Gtk::Allocation& alloc)
ArdourCanvas::Rect r (1, 1, alloc.get_width() - 2, alloc.get_height() - 2);
frame->set (r);
const double ruler_height = 25.;
ruler->set (Rect (2, 2, alloc.get_width() - 4, ruler_height));
const double scroll_bar_height = 10.;
const double scroll_bar_width = alloc.get_width() - 2;
const double scroll_bar_handle_left = scroll_bar_width * scroll_fraction;
@ -417,6 +454,8 @@ AudioClipEditor::set_spp (double samples_per_pixel)
{
_spp = samples_per_pixel;
ruler->set_range (0, 48000);
position_lines ();
for (auto & wave : waves) {
@ -441,12 +480,12 @@ AudioClipEditor::set_wave_heights ()
}
uint32_t n = 0;
const Distance w = frame->get().height() - scroll_bar_trough->get().height() - 2.;
const Distance w = frame->get().height() - scroll_bar_trough->get().height() - 2. - ruler->get().height();
Distance ht = w / waves.size();
for (auto & wave : waves) {
wave->set_height (ht);
wave->set_y_position (n * ht);
wave->set_y_position (ruler->get().height() + (n * ht));
++n;
}
}

View File

@ -40,6 +40,7 @@
#include "canvas/container.h"
#include "canvas/line.h"
#include "canvas/rectangle.h"
#include "canvas/ruler.h"
#include "canvas/scroll_group.h"
#include "audio_clock.h"
@ -52,6 +53,7 @@ namespace ARDOUR {
namespace ArdourCanvas {
class Text;
class Polygon;
};
namespace ArdourWaveView {
@ -106,6 +108,9 @@ class AudioClipEditor : public ArdourCanvas::GtkCanvas
ArdourCanvas::Line* loop_line;
ArdourCanvas::Rectangle* scroll_bar_trough;
ArdourCanvas::Rectangle* scroll_bar_handle;
ArdourCanvas::Container* ruler_container;
ArdourCanvas::Ruler* ruler;
ArdourCanvas::Ruler::Metric* clip_metric;
std::vector<ArdourWaveView::WaveView *> waves;
double non_wave_height;
samplepos_t left_origin;