start using Canvas::Box as intended

This commit is contained in:
Paul Davis 2018-11-16 21:13:05 -05:00
parent 2ae616bf44
commit 3fb713370f
2 changed files with 47 additions and 70 deletions

View File

@ -257,6 +257,7 @@ SequencerGrid::SequencerGrid (StepSequencer& s, Canvas* c)
: Rectangle (c)
, _sequencer (s)
, _mode (Velocity)
, step_indicator_bg (0)
{
if (current_mode_color == 0) {
current_mode_color = UIConfiguration::instance().color ("gtk_lightest");
@ -266,8 +267,9 @@ SequencerGrid::SequencerGrid (StepSequencer& s, Canvas* c)
const Duple mode_button_center (mode_button_width/2.0, mode_button_height/2.0);
no_scroll_group = new ArdourCanvas::Container (_canvas->root());
step_indicator_box = new ArdourCanvas::Container (no_scroll_group);
step_indicator_box = new ArdourCanvas::HBox (no_scroll_group);
step_indicator_box->set_position (Duple (rhs_xoffset, mode_button_height + (mode_button_spacing * 2.0)));
step_indicator_box->name = "step_indicator_box";
v_scroll_group = new ScrollGroup (_canvas->root(), ScrollGroup::ScrollsVertically);
_canvas->add_scroller (*v_scroll_group);
@ -393,22 +395,31 @@ SequencerGrid::sequencer_changed (PropertyChange const &)
set (Rect (0, 0, _width, _height));
step_indicator_box->clear (true); /* delete all existing step indicators */
step_indicators.clear ();
delete step_indicator_bg;
step_indicator_bg = new ArdourCanvas::Rectangle (step_indicator_box);
step_indicator_bg = new ArdourCanvas::Rectangle (no_scroll_group);
step_indicator_bg->set_fill_color (HSV (UIConfiguration::instance().color ("gtk_bases")).lighter (0.1));
step_indicator_bg->set_outline (false);
step_indicator_bg->set_position (Duple (rhs_xoffset, mode_button_height + (mode_button_spacing * 2.0)));
step_indicator_bg->set (Rect (0, 0, _width, _step_dimen));
step_indicator_bg->lower_to_bottom ();
/* indicator row */
for (size_t n = 0; n < nsteps; ++n) {
SequencerStepIndicator* ssi = new SequencerStepIndicator (*this, step_indicator_box, n);
ssi->set_position (Duple (n * _step_dimen, 0));
ssi->set (Rect (0, 0, _step_dimen, _step_dimen));
ssi->set_fill_color (random());
while (step_indicators.size() > nsteps) {
SequencerStepIndicator* ssi = step_indicators.back();
step_indicators.pop_back();
delete ssi;
}
size_t n = step_indicators.size();
while (step_indicators.size() < nsteps) {
SequencerStepIndicator* ssi = new SequencerStepIndicator (*this, canvas(), n);
ssi->set (Rect (0.0, 0.0, _step_dimen - 3.0, _step_dimen - 3.0));
step_indicator_box->pack_start (ssi);
step_indicators.push_back (ssi);
++n;
}
/* step views, one per step per sequence */
@ -416,25 +427,28 @@ SequencerGrid::sequencer_changed (PropertyChange const &)
clear (true);
step_views.clear ();
if (nsequences != sequence_headers.size()) {
//sequence_headers.clear (true);
while (sequence_headers.size() > nsequences) {
SequenceHeader* sh = sequence_headers.back ();
sequence_headers.pop_back ();
delete sh;
}
cerr << "Creating " << nsequences << " SH\n";
n = sequence_headers.size();
for (size_t s = 0; s < nsequences; ++s) {
SequenceHeader* sh = new SequenceHeader (*this, _sequencer.sequence (s), v_scroll_group);
sh->set_position (Duple (0, (mode_button_ydim + mode_button_spacing) + ((s+1) * _step_dimen)));
sh->set (Rect (1, 1, rhs_xoffset - 2, _step_dimen - 2));
sh->set_fill_color (UIConfiguration::instance().color ("gtk_bright_color"));
sequence_headers.push_back (sh);
}
while (sequence_headers.size() < nsequences) {
SequenceHeader* sh = new SequenceHeader (*this, _sequencer.sequence (n), v_scroll_group);
sh->set_position (Duple (0, (mode_button_ydim + mode_button_spacing) + ((n+1) * _step_dimen)));
sh->set (Rect (1, 1, rhs_xoffset - 2, _step_dimen - 2));
sh->set_fill_color (UIConfiguration::instance().color ("gtk_bright_color"));
sequence_headers.push_back (sh);
++n;
}
for (size_t s = 0; s < nsequences; ++s) {
for (size_t n = 0; n < nsteps; ++n) {
StepView* sv = new StepView (*this, _sequencer.sequence (s).step (n), this);
sv->set_position (Duple (n * _step_dimen, s * _step_dimen));
sv->set (Rect (1, 1, _step_dimen - 2, _step_dimen - 2));
sv->set (Rect (0, 0, _step_dimen - 1, _step_dimen - 1));
step_views.push_back (sv);
}
}
@ -533,45 +547,8 @@ SequencerGrid::set_mode (Mode m)
void
SequencerGrid::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
{
Rect self (item_to_window (get(), false));
const Rect draw = self.intersection (area);
if (!draw) {
return;
}
setup_fill_context (context);
context->rectangle (draw.x0, draw.y0, draw.width(), draw.height());
context->fill ();
context->set_line_width (1.0);
/* horizontal lines */
Gtkmm2ext::set_source_rgba (context, 0x000000ff);
for (size_t n = 0; n < _sequencer.nsequences(); ++n) {
double x = 0;
double y = n * _step_dimen;
Duple start = item_to_window (Duple (x, y).translate (Duple (0.5, 0.5)));
context->move_to (start.x, start.y);
context->line_to (start.x + _width, start.y);
context->stroke ();
}
/* vertical */
for (size_t n = 0; n < _sequencer.nsteps(); ++n) {
double x = n * _step_dimen;
double y = 0;
Duple start = item_to_window (Duple (x, y).translate (Duple (0.5, 0.5)));
context->move_to (start.x, start.y);
context->line_to (start.x, start.y + _height);
context->stroke ();
}
/* might do more one day */
Rectangle::render (area, context);
render_children (area, context);
}
@ -591,8 +568,8 @@ Gtkmm2ext::Color SequencerStepIndicator::current_text_color = Gtkmm2ext::Color (
Gtkmm2ext::Color SequencerStepIndicator::bright_outline_color = Gtkmm2ext::Color (0);
int SequencerStepIndicator::dragging = 0;
SequencerStepIndicator::SequencerStepIndicator (SequencerGrid& s, Item *p, size_t n)
: Rectangle (p)
SequencerStepIndicator::SequencerStepIndicator (SequencerGrid& s, Canvas* c, size_t n)
: Rectangle (c)
, grid (s)
, number (n)
, being_dragged (false)
@ -610,16 +587,16 @@ SequencerStepIndicator::SequencerStepIndicator (SequencerGrid& s, Item *p, size_
poly = new Polygon (this);
Points points;
/* half pixel shifts are to get a clean single pixel outline */
points.push_back (Duple (0.5, 0.5));
points.push_back (Duple (_step_dimen - 0.5, 0.5));
points.push_back (Duple (_step_dimen - 0.5, (_step_dimen - 1.0)/2.0));
points.push_back (Duple ((_step_dimen - 1.0)/2.0, _step_dimen - 0.5));
points.push_back (Duple (0.5, (_step_dimen - 1.0)/2.0));
points.push_back (Duple (0, 0));
points.push_back (Duple (_step_dimen - 4.0, 0));
points.push_back (Duple (_step_dimen - 4.0, (_step_dimen - 4.0)/2.0));
points.push_back (Duple ((_step_dimen - 4.0)/2.0, _step_dimen - 4.0));
points.push_back (Duple (0, (_step_dimen - 4.0)/2.0));
poly->set (points);
poly->set_fill_color (current_color);
poly->set_outline_color (other_color);
poly->set_ignore_events (true);
poly->move (Duple (0.5, 0.5));
text = new Text (this);

View File

@ -124,14 +124,14 @@ class StepView : public ArdourCanvas::Rectangle, public sigc::trackable {
void set_octave_text ();
void set_group_text ();
void set_timing_text ();
static Gtkmm2ext::Color on_fill_color;
static Gtkmm2ext::Color off_fill_color;
};
class SequencerStepIndicator : public ArdourCanvas::Rectangle, public sigc::trackable {
public:
SequencerStepIndicator (SequencerGrid&, ArdourCanvas::Item *, size_t n);
SequencerStepIndicator (SequencerGrid&, ArdourCanvas::Canvas*, size_t n);
void render (ArdourCanvas::Rect const &, Cairo::RefPtr<Cairo::Context>) const;
bool on_event (GdkEvent*);
@ -207,7 +207,7 @@ class SequencerGrid : public ArdourCanvas::Rectangle, public sigc::trackable {
ArdourCanvas::ScrollGroup* v_scroll_group;
ArdourCanvas::Container* no_scroll_group;
ArdourCanvas::Rectangle* step_indicator_bg;
ArdourCanvas::Container* step_indicator_box;
ArdourCanvas::HBox* step_indicator_box;
ArdourCanvas::Rectangle* velocity_mode_button;
ArdourCanvas::Rectangle* pitch_mode_button;